Что обновляет функция RefreshRates() - страница 7

 
Mikhail Nazarenko:

Спасибо, это по делу. А терминал реально дает ошибку 4066 после обращения через iTime к необновленной таймсерии? Я столкнулся с тем что iClose отдает необновленную информацию вместо нуля.

В том и дело, это ключевой момент, из-за которого у тебя затык.

Ошибка 4066 - когда истории по этому ТФ нет, не готова, надо обращаться к серваку.

А когда она уже есть, но обновляется она, только когда обращаешься к ней, т.е. ошибку не выдает, просто отдаёт тебе что есть сейчас, и одновременно с запросом начинает обновлять тайм-серию.

Если запрашиваешь редко и нерегулярно,то иногда получаешь старьё. Если обращаешься к каждому нужному ТФ регулярно, вплоть до каждого тика - то всё ок.

Если открыт график этого ТФ, то обновляется регулярно на графике. Кстати наверное можно из советников просто пооткрывать графики всех нужных ТФ, если обращение нерегулярное, но это ненадёжно, т.к. их же могут вручную закрыть/сменить ТФ.

 
Evgeniy Chumakov:


А зачем прибавлять 0  в [i + 0] ?

вместо нуля подставлял 1 и 2, 1 или 2. Оставил 0, то есть 1 бар. Код не подчистил, это и не принципиально для логики.

 
Aleksey Mavrin:

В том и дело, это ключевой момент, из-за которого у тебя затык.

Ошибка 4066 - когда истории по этому ТФ нет, не готова, надо обращаться к серваку.

А когда она уже есть, но обновляется она, только когда обращаешься к ней, т.е. ошибку не выдает, просто отдаёт тебе что есть сейчас, и одновременно с запросом начинает обновлять тайм-серию.

Если запрашиваешь редко и нерегулярно,то иногда получаешь старьё. Если обращаешься к каждому нужному ТФ регулярно, вплоть до каждого тика - то всё ок.

Если открыт график этого ТФ, то обновляется регулярно на графике. Кстати наверное можно из советников просто пооткрывать графики всех нужных ТФ, если обращение нерегулярное, но это ненадёжно, т.к. их же могут вручную закрыть/сменить ТФ.

Когда должна получиться ошибка он отдает старые данные, зашибись. Это одна из причин почему брокеры любят MT4 и не переходят на MT5.))

Тоесть обращаемся за нужным таймфремом каждый тик или sleep, до тех пор пока ошибки 4066 не будет. Я правильно понял?

 
Mikhail Nazarenko:

Когда должна получиться ошибка он отдает старые данные, зашибись. Это одна из причин почему брокеры любят MT4 и не переходят на MT5.))

Тоесть обращаемся за нужным таймфремом каждый тик или sleep, до тех пор пока ошибки 4066 не будет. Я правильно понял?

Почти. Вот готовая функция:

bool IsTFDataReady(ENUM_TIMEFRAMES eTF)
{
   ResetLastError();
   iTime(NULL, eTF, 1);
   return GetLastError() == ERR_NO_ERROR;
}
Вставляете ее в OnTick() и, если возвращает true, то к таймфрейму eTF можно обращаться, данные валидные.
 
Mikhail Nazarenko:

Когда должна получиться ошибка он отдает старые данные, зашибись. Это одна из причин почему брокеры любят MT4 и не переходят на MT5.))

Тоесть обращаемся за нужным таймфремом каждый тик или sleep, до тех пор пока ошибки 4066 не будет. Я правильно понял?

sleep использовать лучше только в ОнИнит конечно, и он по идее нужен только в индикаторах. В остальных случаях обращение в ОнТик, как выше Игорь привёл - достаточно.

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

з.ы. а если функцию Игоря использовать не на каждом тике, а по каким то там редким условиям, то тоже будет рассинхрон.
Основы тестирования в MetaTrader 5
Основы тестирования в MetaTrader 5
  • www.mql5.com
В чем различия между тремя режимами тестирования в MetaTrader 5 и на что обратить внимание? Как происходит тестирование эксперта, торгующего одновременно на нескольких инструментах? Когда и как вычисляются значения индикаторов при тестировании и как обрабатываются события? Как синхронизировать бары с разных инструментов при тестировании в режиме "Только цены открытия"? Статья призвана дать ответы на эти и многие другие вопросы.
 
Aleksey Mavrin:

sleep использовать лучше только в ОнИнит конечно, и он по идее нужен только в индикаторах. В остальных случаях обращение в ОнТик, как выше Игорь привёл - достаточно.

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

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

Sleep не работает в индикаторах

 
Ihor Herasko:

Почти. Вот готовая функция:

Вставляете ее в OnTick() и, если возвращает true, то к таймфрейму eTF можно обращаться, данные валидные.

Все гениальное просто. Спасибо. Почему разработчикам это не описать в мануале на функции iClose и тп? Или поправить логику обновления котировок MT4, чтобы не создавать теории заговора.

 
Mikhail Nazarenko:

Когда должна получиться ошибка он отдает старые данные, зашибись. Это одна из причин почему брокеры любят MT4 и не переходят на MT5.))

Тоесть обращаемся за нужным таймфремом каждый тик или sleep, до тех пор пока ошибки 4066 не будет. Я правильно понял?

В МТ5 с этим на порядок сложнее.

В четверке достаточно раз в 2 минуты запросить iTime со всех используемых ТФ, и все данные будут актуальными.

 
Mikhail Nazarenko:

Все гениальное просто. Спасибо. Почему разработчикам это не описать в мануале на функции iClose и тп? Или поправить логику обновления котировок MT4, чтобы не создавать теории заговора.

Потому что практически все ЕА делают проверки нужных условий на каждом тике, и всё обновляется само собой.

 
Vitaly Muzichenko:

Sleep не работает в индикаторах

Если очень надо. то работает :)

void SleepA(int msec)
 {
   uint now=GetTickCount();
   while (GetTickCount()<(now+msec))
      {
      for(int i=0;i<10000;i++)
         {
          double f=1;
          f*=f;
          f+=f;
         }
       }
   return;
 }  
Andrey Khatimlianskii:

В МТ5 с этим на порядок сложнее.

В четверке достаточно раз в 2 минуты запросить iTime со всех используемых ТФ, и все данные будут актуальными.

Именно

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