МТ4 проблема с подгрузкой котировок при работе с разными тф

 
Программа работает с разными тф в МТ4 и при простое начинает гнать чушь(хотя вроде текущии котировки по этим тф ходят синхронно), пока не пощёлкаю тф, всё перерисовывается как надо, как с этим бороться?
 
Maksim Mihajlov:
Программа работает с разными тф в МТ4 и при простое начинает гнать чушь(хотя вроде текущии котировки по этим тф ходят синхронно), пока не пощёлкаю тф, всё перерисовывается как надо, как с этим бороться?

На каждом тике обращаться к другому ТФ. Хотя бы так:

iTime(NULL, eTF, 1);

А лучше всего проверять доступность данных другого ТФ:

bool IsTFDataReady(const ENUM_TIMEFRAMES eTF)
{
   ResetLastError();
   iTime(NULL, eTF, 1);
   return GetLastError() == ERR_NO_ERROR;   
}
 
Ihor Herasko:

На каждом тике обращаться к другому ТФ. Хотя бы так:

я обычно  первый раз в OnInit() вызываю загрузку данных с других ТФ, затем в таймере 1 раз в 50 секунд поддергиваю все ТФ которые необходимы

примерно так все в коде:

вверху кода:
const ENUM_TIMEFRAMES PeriodTF[9]={PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
....

int OnInit()
  {
   OnTimer();           // вызываю ф-цию таймера принудительно
   ......
//--- create timer
   EventSetTimer(49);
   return(INIT_SUCCEEDED);
  }
....
void OnTimer()
  {
   static int count=0;
   datetime t[];
   int i,startpos=0;
   if(count<6)
     {
      for(i=0;i<9;i++) CopyTime(_Symbol,PeriodTF[i],startpos,iBars(_Symbol,PeriodTF[i]),t);                     //  загружаем всю доступную историю первые 5 минут
      count++;
        }else{
      for(i=0;i<9;i++) CopyTime(_Symbol,PeriodTF[i],startpos,2,t);                                              //  загружаем 0 и 1-й бар в дальнейшем
     }
  }

проверок доступности ТФ не делаю, в теории это плохо, но на практике все работало без проблем

 

Терминал гарантирует наличие истории только по открытым графикам.

В Вашем случае, если на графике М1, то по нему история всегда в кэше терминала. По остальным таймфреймам, она подгружается при поступлении запроса и там может получиться по разному, никто Вам ничего не гарантирует, вся информация есть в спецификации, раздел: "Доступ к таймсериям и данным индикаторов".

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

 
Vladimir Simakov:

 а через 49 с Вы опять пытаетесь их получить, а их опять нет

если речь идет о моем примере, то у меня была задачка сделать полуавтоматическую панель для ручной торговли, делал из классов из поставки МТ4, была проблема, что при переключении ТФ иногда могли графические элементы "разьединиться", искал причину - оказалось, что подгрузка истории иногда была с притормаживанием, а иногда нет

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

Если речь идет о вызове индикаторов или просто данных OHLC из другого ТФ, тут да - лучше каждый тик "дергать" все ТФ которые будут использованы, тогда все будет корректно работать

ЗЫ: не найду топик обсуждения похожего вопроса - месяца 3-4 назад был, модератор Слава однозначно указал, что в МТ4 нет механизма проверки загрузки истории по другим ТФ, т.е. запросить историю можно, а вот проверить скачалась и готова она нельзя. Я у меня был вопрос почему результат возвращаемых ф-циями CopyXXX() если по ТФ вообще отсутствует история будет = 2048, мне ответили, что это размер порции данных за одно обращение к серверу, т.е. при следующем вызове CopyXXX() будет подгружены еще 2048... и так пока все не скачается, проверить эту ситуацию невозможно, только запрашивать и ждать

ЗЫЗЫ: в МТ4 нужна помощь пользователя для корректной работы с несколькими ТФ: нужно открыть график символа, попереключать все ТФ и кликать мышью обновить, а лишь затем запускать эксперта который вызывает несколько ТФ. При таком запуске все будет без проблем работать в дальнейшем. Держать несколько графиков с разными ТФ не обязательно, но каждый тик нужно обращаться ко всем ТФ через CopyXXX() - второй пост этого топика пример

 
Спасибо что откликнулись, буду пробовать метод Игоря, надеюсь всё заработает как надо! )))
С уважением, Макс
 
Igor Makanu:

модератор Слава однозначно указал, что в МТ4 нет механизма проверки загрузки истории по другим ТФ, т.е. запросить историю можно, а вот проверить скачалась и готова она нельзя.

Тоже с этим столкнулся, пытаясь автоматизировать подкачку истории.

Удивляет такой 19-й век в технологиях. В то время как космические корабли бороздят просторы вселенной)

 
secret:

Тоже с этим столкнулся, пытаясь автоматизировать подкачку истории.

Удивляет такой 19-й век в технологиях. В то время как космические корабли бороздят просторы вселенной)

увы, разработчики не дополняют функционал МТ4, в МТ5 есть механизмы проверки доступности и проверки подкачки истории

но в целом, МТ4 все равно годная штука ;)

PS: в кодобазе есть примеры автоматической подкачки истории https://www.mql5.com/ru/code/9888

FastHistory
FastHistory
  • www.mql5.com
Скрипт создает файл истории исходного символа, на которой достигается увеличение в разы скорости тестирования/оптимизации стратегий на модели "Все тики", при идентичных результатах. Входные параметры: Трансформация истории: Удаляются бары, не участвующие в существенном движении цены (особенно актуально для Pips < Spread). Изменяется...