Проблема в тестере : визуальное тестирование мультитаймфрейменных индикаторов : решено

 

Столкнулся с забавной проблемой :-)

Имеем: тестер, окошко на 3 января.

Бросаем индикатор на движущийся график.

.

В индикаторе: от 0 до iBars я заполняю массив arr[][6] данными iTime, iOpen, ..., iVol - 

единственная тонкость- это то, что с графика М15 я беру данные с таймфрейма H4.

Почему-то в массиве в индексе 0 хранится сегодняшняя дата :-).

Это я так пытался обойти то, что ArrayCopyRates() точно так же копирует не данные,

соответствующие моменту тестирования, а данные инструмента на сегодняшний день.

.

Подскажите, пожалуйста, как-нибудь кроме перехода на МТ5 ;-)

можно сделать, чтобы дата была правильная?

.

Код прилагаю.

.

.

// {...}  (i) полностью код приведен в приложении
void ArrayCopyRatesBL(double & to[][], string whom, int period) // <-- вместо ArrayCopyRates()
{
    int bars = iBars(whom,period);
    datetime d0 = Time[0];
    int bar = 0;
    ArrayResize(to, bars);
    ArraySetAsSeries(to, true);
    for(int i = bar; i < bars; i++)
    {
        to[i][0] = iTime(whom, period, i);
        
        to[i][1] = iOpen(whom, period, i);
        to[i][2] = iLow(whom, period, i);
        to[i][3] = iHigh(whom, period, i);
        to[i][4] = iClose(whom, period, i);
        
        to[i][5] = iVolume(whom, period, i);
    }
    Alert(TimeToStr(to[0][0]) + " / " + DoubleToStr(to[0][1], 4));
}
int start() {
deinit();
    string whoAmI = Symbol();
    double r[][6];
    ArrayCopyRatesBL(r, whoAmI, PERIOD_H4);
    return (0);
}
Файлы:
oo.mq4  2 kb
 
Попробуйте Time[] вместо iTime().
 
Reshetov >>:
Попробуйте Time[] вместо iTime().

Юрий, спасибо за ответ. Не прокатит :-(. Нужен H4 на графике M15.

 

Обычно для работы с другими таймфреймами в индикаторе нужна синхронизация по времени. Посмотри любой мультитаймфреймный индикатор.

Не найдешь, то могу свои подкинуть.

При визульном тестирование обращение к другому таймфрейму - это обращение к существующим историческим данным. Поэтому ты и получаешь на нулевом баре текущее время.

 
Vinin >>:

Обычно для работы с другими таймфреймами в индикаторе нужна синхронизация по времени. Посмотри любой мультитаймфреймный индикатор.

Не найдешь, то могу свои подкинуть.

При визульном тестирование обращение к другому таймфрейму - это обращение к существующим историческим данным. Поэтому ты и получаешь на нулевом баре текущее время.

Спасибо, Виктор! Об особенности не знал.

.

Индикатор с результатом своего "открытия" приложил.

.

Код

void ArrayCopyRatesBL(double & to[][], string whom, int period)
{
    int bars = iBars(whom,period);
    
    datetime d0 = Time[0];
    int periodAlign = period*60;
    datetime d0Aligned = d0 - d0%periodAlign;
    int whereBar = iBarShift(whom, period, d0Aligned, false);
    
    // whereBar - это старт нашей истории, однако
    int actualBars = bars - whereBar + 1;
    
    ArrayResize(to, actualBars);
    ArraySetAsSeries(to, true);
    
    int j = 0;
    int i = whereBar;
    
    for(; i < bars; i++, j++)
    {
        to[j][0] = iTime(whom, period, i);
        
        to[j][1] = iOpen(whom, period, i);
        to[j][2] = iLow(whom, period, i);
        to[j][3] = iHigh(whom, period, i);
        to[j][4] = iClose(whom, period, i);
        
        to[j][5] = iVolume(whom, period, i);
    }

    // чтобы было нескучно    
    to[j][0] = iTime(whom, period, i);
    
    to[j][1] = iOpen(whom, period, i);
    to[j][2] = -100;
    to[j][3] = -100;
    to[j][4] = -100;
    to[j][5] = 1;
    
    Alert(TimeToStr(d0) + " .. " + TimeToStr(to[0][0]) + " .. " + DoubleToStr(to[0][1], 4));
}
Файлы:
oo_1.mq4  2 kb
Причина обращения: