Как правильно вызывать iCustom/iMA?

 

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

Новая версия платформы MetaTrader 5 build 3620: улучшения веб-терминала, поддержка ONNX и ускоренное умножение матриц в MQL5

Renat Fatkhullin, 2023.03.19 20:08

iCustom будет просчитан на тех данных, которые будут в главной базе терминала на этот момент.

Все процессы независимы/асинхронны и запрос ArrayCopy никак не связан с последующими операциями. То есть, ни терминал, ни среда исполнения MQL5 не "тормозят мир" во время OnXXXX обработчиков.


Советник запущен на M15. Я хочу получить значения iMA для бара 1 таймфреймов M30 и H1. Для этого я 2 раза вызываю iMA: для M30 и H1 соответственно.

  1. OnTick() начал выполняться в 11:59. Мне нужны значения iMA с баров 11:30 M30 и 10:00 H1 - бары с индексом 1 для этих таймфреймов
  2. Я вызываю iMA для М30 и получаю нужное мне значение для бара 11:30
  3. Прежде, чем я вызову iMA еще раз, приходит новый тик, который формирует новый бар H1 со временем открытия 12:00
  4. Я вызываю iMA для H1 и получаю значение для бара 11:00 вместо 10:00. По тому, что между двумя вызовами iMA пришел тик

И никак ведь не обработаешь эту ситуацию по тому, что нет возможности узнать, на каких данных вычислился индикатор - цитата сверху тому доказательство. Ладно машку можно самому посчитать. А если это пользовательский индикатор и исходника нет...

На сколько возможна такая ситуация? Кто-нибудь об этом задумывался?

 
Vladislav Boyko:

Советник запущен на M15. Я хочу получить значения iMA для бара 1 таймфреймов M30 и H1. Для этого я 2 раза вызываю iMA: для M30 и H1 соответственно.

  1. OnTick() начал выполняться в 11:59. Мне нужны значения iMA с баров 11:30 M30 и 10:00 H1 - бары с индексом 1 для этих таймфреймов
  2. Я вызываю iMA для М30 и получаю нужное мне значение для бара 11:30
  3. Прежде, чем я вызову iMA еще раз, приходит новый тик, который формирует новый бар H1 со временем открытия 12:00
  4. Я вызываю iMA для H1 и получаю значение для бара 11:00 вместо 10:00. По тому, что между двумя вызовами iMA пришел тик

И никак ведь не обработаешь эту ситуацию по тому, что нет возможности узнать, на каких данных вычислился индикатор - цитата сверху тому доказательство. Ладно машку можно самому посчитать. А если это пользовательский индикатор и исходника нет...

На сколько возможна такая ситуация? Кто-нибудь об этом задумывался?

А кто вам мешает определить номер бара по времени вместо указания конкретно первого бара?

 
Alexey Viktorov #:

А кто вам мешает определить номер бара по времени вместо указания конкретно первого бара?

Наверное, вы неправильно меня поняли. Мне не нужно время/номер бара. Я хочу, что бы индикаторы на разных таймфреймах вычислялись на одних данных.

Вот эта ситуация другими словами:

void OnTick()
  {
   double ma1M30 = iMA(_Symbol, PERIOD_M30, 14, 0, MODE_SMA, PRICE_CLOSE, 1); // На графике H1 1000 баров
   // Между этими вызовами приходит тик, который формирует новый бар на H1
   double ma1H1 = iMA(_Symbol, PERIOD_H1, 14, 0, MODE_SMA, PRICE_CLOSE, 1);   // На графике H1 1001 бар
  }

Наверное, вероятность этого - как получить метеорит на голову. И никто об этом не задумывается вообще

 
Vladislav Boyko #:

Наверное, вы неправильно меня поняли. Мне не нужно время/номер бара. Я хочу, что бы индикаторы на разных таймфреймах вычислялись на одних данных.

Вот эта ситуация другими словами:

Наверное, вероятность этого - как получить метеорит на голову. И никто об этом не задумывается вообще

Я об этом и сказал. В этом случае вы берёте бар № 1, а если вырос новый бар, то вам надо брать бар № 2. Я и предложил по времени посчитать какой будет это бар, первый или второй.

 
Alexey Viktorov #:

Я об этом и сказал. В этом случае вы берёте бар № 1, а если вырос новый бар, то вам надо брать бар № 2. Я и предложил по времени посчитать какой будет это бар, первый или второй.

Понял, спасибо.

Я пришел к следующему:

  1. Запросить и сохранить время бара 0 для обеих таймфреймов
  2. Вычислить обе iMA
  3. Еще раз запросить время баров 0 и сравнить с тем временем, которое сохранили в пункте 1. Если совпадает - все ок. Не совпадает - счесть некорректными результаты вычислений пункта 2.
Коротко: если time[0] до и после вычислений совпадают, то за время вычислений новый бар не был сформирован
 
Vladislav Boyko #:

Понял, спасибо.

Я пришел к следующему:

  1. Запросить и сохранить время бара 0 для обеих таймфреймов
  2. Вычислить обе iMA
  3. Еще раз запросить время баров 0 и сравнить с тем временем, которое сохранили в пункте 1. Если совпадает - все ок. Не совпадает - счесть некорректными результаты вычислений пункта 2.
Коротко: если time[0] до и после вычислений совпадают, то за время вычислений новый бар не был сформирован

Боюсь, что не правильно поняли. Я имел ввиду функцию iBarShift()

 
Alexey Viktorov #:

Боюсь, что не правильно поняли. Я имел ввиду функцию iBarShift()

Я правильно понял, но между вызовом iBarShift() и iMA() тоже может прийти новый тик😄

Я просто немного параноик, наверное😄 Ищу железобетонное решение)

P.S. Я крайне сомневаюсь, что даже целенаправленно когда-нибудь удалось бы поймать ситуацию, когда между двумя вызовами iMA/iCustom формируется новый бар на одном из таймфреймов. Поэтому, похоже, я занимаюсь решением проблем, которые существуют только у меня в голове.