Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 534

 
MikeZv:

Владимир, спасибо за ответ на первый вопрос, я пропустил эти функции.

Один и тот же индикатор ставлю в МТ4 и в МТ5 (код конечно адаптирован для каждой платформы).
До нулевого бара у них значения совпадают, так что видимо с одного конца ... :)
А при отключении расчета на текущем баре в МТ4 под текущим баром ничего не рисуется, в МТ5 - неправильные значения.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Вопросы от начинающих

Karputov Vladimir, 2016.03.08 15:13

... на время отладки ставьте проверку - какое значение содержится в массиве-таймсерии time[i] - так Вы поймёт с какого конца Вы начинаете обсчёт баров и где у Вас "нулевой" бар.


 
MikeZv:
А как ставить такую проверку ?

В MetaEditore добавить точку останова и запустить отладку. Когда на точке останова будет остановка, добавьте в наблюдение time[0]:

Отладка

 
Karputov Vladimir:

В MetaEditore добавить точку останова и запустить отладку. Когда на точке останова будет остановка, добавьте в наблюдение time[0]:


Я уже в коде вставил вывод

МТ4 2016.03.08 18:37:04.710 mvt_Vlt EURUSD,H1: time[0] = 2016.03.08 17:00:00 time[rates_total-1] = 1971.01.04 00:00:00

МТ5 2016.03.08 18:36:23.565 mvt_Vlt (EURUSD,H1) time[0] = 2010.01.04 00:00:00 time[rates_total-1] = 2016.03.08 17:00:00

 

Вставил в код МТ5  ArraySetAsSeries(time,true);
Теперь вывод:

МТ5 2016.03.08 18:45:05.402 mvt_Vlt (EURUSD,H1) time[0] = 2016.03.08 17:00:00 time[rates_total-1] = 2010.01.04 00:00:00

А массивы цен тоже также делать ?

 


 
MikeZv:
Я уже в коде вставил вывод

МТ4 2016.03.08 18:37:04.710 mvt_Vlt EURUSD,H1: time[0] = 2016.03.08 17:00:00 time[rates_total-1] = 1971.01.04 00:00:00

МТ5 2016.03.08 18:36:23.565 mvt_Vlt (EURUSD,H1) time[0] = 2010.01.04 00:00:00 time[rates_total-1] = 2016.03.08 17:00:00
 А что делать теперь ?

В обе версии индикатора добавить ArraySetAsSeries - для тех массивов, которые Вы используете для своих расчётов: high[], low[] и временно для массива time[] - это поможет понять, где же "нулевой" бар. Таким образом "нулевой" бар в обоих версиях будет с одинаковой стороны графика (справа или слева - в зависимости от того, что вы выставите в ArraySetAsSeries) и Вы получите одинаковую расчётную часть индикатора.

 

Добавлено: пока я печатал, Вы нащупали верный путь :) 

 
Karputov Vladimir:


Добавлено: пока я печатал, Вы нащупали верный путь :) 

Путь нащупал, а считается все равно неправильно.  :)
Вставил в код МТ5:
   ArraySetAsSeries(ExtCalcVlBuffer,true); 
   ArraySetAsSeries(ExtMovingBuffer,true);
   ArraySetAsSeries(ExtStdDevBuffer,true);
   ArraySetAsSeries(time,true);             
   ArraySetAsSeries(low,true);              
   ArraySetAsSeries(high,true); 

Выводит:

 

Это только  ExtCalcVlBuffer выводит, а среднюю и отклонение не считает...
И все равно на текущем баре выводит,хотя и не должно.

 
MikeZv:
...

И все равно на текущем баре выводит,хотя и не должно.

Это ещё почему не должно?
 
Karputov Vladimir:
Это ещё почему не должно?
Я же его отключал   i<rates_total-1
 
MikeZv:
Я же его отключал   i<rates_total-1
ЗАЧЕМ?!
 
Karputov Vladimir:
ЗАЧЕМ?!
А не надо на текущем считать, только зря процессор загружать, да и просто не нужно это значение.
 
MikeZv:
А не надо на текущем считать, только зря процессор загружать, да и просто не нужно это значение.

Так нужно такую хотелку сразу оговаривать :) .

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

Причина обращения: