Массивы Time, Open, High, Low, etc. в MQL 5
При переносе из MQL 4 в MQL 5, новых разработках на MQL 5, разработчик сталкивается с отсутствием привычных средств разработки. Ничего страшного в этом нет, некоторых средств разработки нет, т.к. они устарели, в них исчезла необходимость, или имеются лучшие аналоги. Однако, в некоторых случаях хотелось бы иметь под рукой что то уже привычное, пусть даже и имеющее чисто внешнее сходство с ранее использовавшимися средствами.
Возьмем, для примера, массивы таймсерий Time, High, Low и проч. Трудно встретить индикатор, или советник, в котором не использовались бы эти массивы. Однако, в MQL 5 этих массивов нет! Вместо них приходится писать пачку кода, связанную с копированием. Вместе с тем, несколько не сложных манипуляций добавит поддержку массивов таймсерий из MQL 4 в любую программу на MQL5.
Для этого нужно вспомнить о поддержке ООП в MQL вообще и в MQL 5 в частности, а именно о перегрузке операций. А если еще точнее, о перегрузке индексного оператора [ ]. Например, для поддержки массива Time[ ] создадим такой класс:
class cTime {
public:
void cTime() {
symbol = _Symbol;
tf = PERIOD_CURRENT;
}
virtual void ~cTime() {}
datetime operator[] (int i) {
datetime _Time[];
ArraySetAsSeries(_Time,true);
int _copied = CopyTime(symbol, tf, 0, Bars(symbol, tf), _Time);
if(_copied > 0) return _Time[i];
return (-1);
}
protected:
private:
string symbol;
ENUM_TIMEFRAMES tf;
};
Далее, где то в теле программы, действуем таким образом:
cTime Time;
//Теперь к Time можно обращаться, как к обычному массиву
Print("0 ",TimeToString(Time[0])," 1: ", TimeToString(Time[1])," 2: ", TimeToString(Time[2]) );
Аналогичным образом можно получить поддержку и прочих массивов таймсерий.