Запуск индикатора не дожидаясь 1го тика

 
Здравствуйте уважаемые профессионалы MQL. Скажите пожалуйста как создать индикатор, чтобы он отрисовывался на истории сразу после перемещения на график не дожидаясь тиков? 
 
Ekaterina Belova:
Здравствуйте уважаемые профессионалы MQL. Скажите пожалуйста как создать индикатор, чтобы он отрисовывался на истории сразу после перемещения на график не дожидаясь тиков? 

У индикатора обработчик OnCalculate() запускается сразу после выполнения обработчика OnInit(), не дожидаясь тика. Это у советника по-другому. Таким образом, непонятно, о чем вопрос. Приведите более полное описание проблемы. Или, может быть, проблема с каким-то конкретным индикатором. Тогда нужен его код.

 
Ihor Herasko #:

У индикатора обработчик OnCalculate() запускается сразу после выполнения обработчика OnInit(), не дожидаясь тика. Это у советника по-другому. Таким образом, непонятно, о чем вопрос. Приведите более полное описание проблемы. Или, может быть, проблема с каким-то конкретным индикатором. Тогда нужен его код.

Нужно чтобы сразу отрисовывался индикатор iMA вот инициализация

      sma1=iMA(Symbol(),PERIOD_CURRENT,nMA1Period,nMA1Sdvig,MODE_SMA,PRICE_CLOSE);

      sma2=iMA(Symbol(),PERIOD_CURRENT,nMA2Period,nMA2Sdvig,MODE_SMA,PRICE_CLOSE);

      sma3=iMA(Symbol(),PERIOD_CURRENT,nMA3Period,nMA3Sdvig,MODE_SMA,PRICE_CLOSE);

      atr1=iATR(Symbol(),PERIOD_CURRENT,nATR);


      SetIndexBuffer(0,ma1,INDICATOR_DATA);

      SetIndexBuffer(1,ma2,INDICATOR_DATA);

      SetIndexBuffer(2,ma3,INDICATOR_DATA);

      SetIndexBuffer(3,atr,INDICATOR_CALCULATIONS);


      PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrMA1Color);

      PlotIndexSetInteger(1,PLOT_LINE_COLOR,clrMA2Color);

      PlotIndexSetInteger(2,PLOT_LINE_COLOR,clrMA3Color);

      ENUM_DRAW_TYPE enDrawType=DRAW_LINE;

      if(!bShowMA)

        {

         enDrawType=DRAW_NONE;

        }


      PlotIndexSetInteger(0,PLOT_DRAW_TYPE,enDrawType);

      PlotIndexSetInteger(1,PLOT_DRAW_TYPE,enDrawType);

      PlotIndexSetInteger(2,PLOT_DRAW_TYPE,enDrawType);

      

      ArraySetAsSeries(ma1, true);

      ArraySetAsSeries(ma2, true);

      ArraySetAsSeries(ma3, true);

      ArraySetAsSeries(atr, true);


А вот работа в OnCalculate(...)

int limit = rates_total - prev_calculated;

if(limit>1)

        {

         CopyBuffer(sma1,0,0,limit,ma1);

         CopyBuffer(sma2,0,0,limit,ma2);

         CopyBuffer(sma3,0,0,limit,ma3);

         CopyBuffer(sma4,0,0,limit,ma4);

         CopyBuffer(atr1,0,0,limit,atr);

.......

       }

Но картинку я вижу только по 1му тику

 
Ekaterina Belova #:

Нужно чтобы сразу отрисовывался индикатор iMA вот инициализация

Но картинку я вижу только по 1му тику

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

 
Ihor Herasko #:

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

разве что оно так не работает :-)

сколько баров доступно в sma1 ?? "а хрен его знает..." но копируем limit..и к тому-же в индикаторный буфер, а не в динамический массив

 
Ekaterina Belova:
Здравствуйте уважаемые профессионалы MQL. Скажите пожалуйста как создать индикатор, чтобы он отрисовывался на истории сразу после перемещения на график не дожидаясь тиков? 

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

придется заморочиться, раз уж так необходимо не ждать прихода тика.

или в OnCalculate как обычно делаете и отдельно свою функцию для однократного вызова в OnInit, но конечно будет код пообъёмнее.

 
Ekaterina Belova #:

int limit = rates_total - prev_calculated;

if(limit>1)

в каком месте все подобрали ЭТО и таскаете от места к месту ? ЭТО ведь даже не 4-ка..это что-то дремучее, mql3

и ArraySetAsSeries() - надо делать почти всегда перед началом обращений к массивам, в OnCalculate так точно. И точно не в конце OnInit. Непосредственно ПЕРЕД ОБРАЩЕНИЯМИ. А не после инициализации

 
Maxim Kuznetsov #:

в каком месте все подобрали ЭТО и таскаете от места к месту ? ЭТО ведь даже не 4-ка..это что-то дремучее, mql3

и ArraySetAsSeries() - надо делать почти всегда перед началом обращений к массивам, в OnCalculate так точно. И точно не в конце OnInit. Непосредственно ПЕРЕД ОБРАЩЕНИЯМИ. А не после инициализации

ArraySetAsSeries для буферов можно делать только один раз в ините. а вот прайсы в онкалькулейт действительно, нужно в ArraySetAsSeries превращать каждый раз.
 
Andrey Dik #:
ArraySetAsSeries для буферов можно делать только один раз в ините. а вот прайсы в онкалькулейт действительно, нужно в ArraySetAsSeries превращать каждый раз.

а можно вызвать перед обращениями и быть уверенным в дальнейшем результате. Что ни один метод после OnInit не перекинул серийность как ему(и авторам терминала в разных билдах) вздумается. 

1 вызов функции, который изменяет 1 флажок. Но нервы спокойны и ошибки минимизированы

 
Maxim Kuznetsov #:

в каком месте все подобрали ЭТО и таскаете от места к месту ? ЭТО ведь даже не 4-ка..это что-то дремучее, mql3

https://www.mql5.com/ru/docs/series/copybuffer в примере ищите to_copy

 
Andrey F. Zelinsky #:

https://www.mql5.com/ru/docs/series/copybuffer в примере ищите to_copy

не читайте советских газет :-)