Ошибки, баги, вопросы - страница 3029

 
Igor Makanu:

это не должно корректно работать в индикаторах:

если не ошибаюсь, то в справке есть разбор скрипта для подкачки данных по всем ТФ и должно быть предупреждение, что нельзя так запрашивать исторические данные из индикатора по причине того, что индикатор работает асинхронно

да и BarsCalculated() рекомендуют использовать один раз после связывания хэндла


UPD: скрипт для подкачки истории и объяснение, почему это не работает в индикаторах: https://www.mql5.com/ru/docs/series/timeseries_access

В этой статье написано только, что в индике нежелательно запрашивать данные из таймсерии (или запрашивать SeriesInfoInteger в цикле)


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


Если же просто запросить SeriesInfoInteger и, в случае false выйти из OnCalculate, то как здесь может наступить клинч?

 

Вопрос ко всем:

в справке https://www.mql5.com/ru/docs/series/timeseries_access   сказано:

"При вызове функций, осуществляющих копирование любых данных из таймсерий, необходимо иметь в виду то, что параметр start (номер бара, с которого начинать копирование ценовых данных) всегда должен быть в пределах доступной истории терминала. Если у нас имеется только 100 баров, то не имеет смысла пытаться скопировать 300 баров, начиная с бара с индексом 500. Такой запрос будет воспринят как ошибочный и не будет обработан, т.е. никакая история с торгового сервера подгружена не будет."

Что CopyTime выдаст -1, это понятно, но - будет ли инициирован сам процесс  на построение таймсерии/ подкачки с сервера баров вплоть до 800го (500+300) или нет?

Подскажите, плиз.

Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным
Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным
  • www.mql5.com
Организация доступа к данным - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
mktr8591:


1. В этой статье написано только, что в индике нежелательно запрашивать данные из таймсерии (или запрашивать SeriesInfoInteger в цикле)


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


2. Если же просто запросить SeriesInfoInteger и, в случае false выйти из OnCalculate, то как здесь может наступить клинч?

1. Да, потому что нельзя тормозить поток индикатора, потому что запрос статуса синхронизации приведёт к подкачке истории, а ждать нельзя.

2. Верно. Если данные не готовы, то просто произойдет выход из онкалк, при этом запуститься терминалом синхронизации но при этом поток индикатора не будет заторможен. Следующий онкальк сможет выполниться полностью и без тормозов только когда данные будут готовы а запрашиваемый индикатор полностью посчитан. Выше в коде добавил принт, демонстрирующий, что запрашиваемый индикатор готов далеко не всегда, но для максимально быстрого расчета всех индикаторов мы можем себе позволить обсчитывать бар новый лишь один раз, а не на каждом тике.

 
Andrey Dik:

Спасибо.

еще, посмотрите мой вопрос :https://www.mql5.com/ru/forum/1111/page3028#comment_22557528

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2021.05.28
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 

Andrey Dik:

посмотрите код выше,

Исправьте свой код, добавьте распечатку

  if(SeriesInfoInteger(Symbol(), OldTF, SERIES_SYNCHRONIZED))
   {
    if(iBars(Symbol(), OldTF) != BarsCalculated(Handle))
     {
      Print("Баров ", iBars(Symbol(), OldTF));
      Print("посчитано", BarsCalculated(Handle));
      return 0;
     }
   }
  else
   {
    Print("Период ", OldTF, " не синхронизирован.");
    return 0;
   }

и когда увидите своих тараканов, сверните монитор в трубочку и засуньте… сами знаете куда.

 
mktr8591:

Спасибо.

еще, посмотрите мой вопрос :https://www.mql5.com/ru/forum/1111/page3028#comment_22557528

я не уверен по этому вопросу на 100% (нужно проверять), убедившись, что запрашиваемая дата свежее, чем есть на сервере самая первая в истории, можно запрашивать данные, история будет подкачена.

 
Andrey Dik:

я не уверен по этому вопросу на 100% (нужно проверять), убедившись, что запрашиваемая дата свежее, чем есть на сервере самая первая в истории, можно запрашивать данные, история будет подкачена.

Спасибо,

я спрашивал про другой свой пост, еще раз ссылка : https://www.mql5.com/ru/forum/1111/page3028#comment_22557528

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2021.05.28
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
Alexey Viktorov:

Исправьте свой код, добавьте распечатку

и когда увидите своих тараканов, сверните монитор в трубочку и засуньте… сами знаете куда.

вы ж подтверждаете мои слова, товарисч.

 
mktr8591:

Спасибо,

я спрашивал про другой свой пост, еще раз ссылка : https://www.mql5.com/ru/forum/1111/page3028#comment_22557528

Не совсем понял ваш код. Что должно происходить после "return 0;" на следующем вызове OnCalculate?

возвращаем 0, тем самым заявляя, что мы ещё ничего не посчитали и прев калк не будет увеличиваться на 1 на следующем баре.

то есть, будем на баре, на котором начали запрашивать данные со старшего тф до тех пор, пока не вернём return(rates_total)

 
Andrey Dik:

вы ж подтверждаете мои слова, товарисч.

1. Спасибо всем - я стал маленько более грамотен в индикаторах )))

2. Андрей, если кто-то не понимает твоих измышлений (и я в том числе), то это значит только одно: ТЫ не правильно рисуешь картинку! Точнее - ты её рисуешь так, что многие не понимают...

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