Применение RefreshRates()?

 
Чтобы избежать работы со старыми историческими данными при длительных задержках в эксперте, мы рекомендуем использовать (например не чаще чем раз в секунду) функцию RefreshRates( ).

Так вот почему при запуске Metatradera с работающими Экспертами после длительного отключения у меня сразу же открывались позиции случайнам образом - не повинуясь алгоритму? Он просто не успевал обновить базу данных индикаторов по которым открывались позиции? Или я не прав? А я - то грешил на свой код...
Получается, что в начале каждого Эксперта дожна обязательно стоять функция RefreshRates( )? Или ставить задержку Sleep(10000)? Или... что делать-то?

Спасибо.
 
присоединяюсь к вопросу и хочу добавить:
можете рассказать, что именно происходит при RefreshRates? Что значит "обновление данных во встроенных переменных и series массивах"?
Если я использую для открытия
double ask = MarketInfo( Symbol(), MODE_ASK );

, то при Рефреше переменная ask обновится?

Returns true if data is refreshed, otherwise false


false возвращается только если ошибка обновления или если таковое не требуется тоже?

 
Чтобы избежать работы со старыми историческими данными при длительных задержках в эксперте, мы рекомендуем использовать (например не чаще чем раз в секунду) функцию RefreshRates( ).

Так вот почему при запуске Metatradera с работающими Экспертами после длительного отключения у меня сразу же открывались позиции случайнам образом - не повинуясь алгоритму? Он просто не успевал обновить базу данных индикаторов по которым открывались позиции? Или я не прав? А я - то грешил на свой код...

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

Получается, что в начале каждого Эксперта дожна обязательно стоять функция RefreshRates( )? Или ставить задержку Sleep(10000)? Или... что делать-то?

Неправильно. Если эксперт работает быстро, без внутренних задержек, без Sleep'ов, то не нужно делать никаких RefreshRates. Если же эксперт тратит больше секунды, то надо бы (только по явной необходимости, а не всегда) после задержки вызывать RefreshRates чтобы обновить данные (график, цены bid/ask и тд), которые были закешированы на входе в эксперт.
 
присоединяюсь к вопросу и хочу добавить:
можете рассказать, что именно происходит при RefreshRates? Что значит "обновление данных во встроенных переменных и series массивах"?

Обновляются закешированные серийные массивы Open/High/Low/Close/Volume и значения Bid/Ask/Bars и тд.

Если я использую для открытия
double ask = MarketInfo( Symbol(), MODE_ASK );

, то при Рефреше переменная ask обновится?


Конечно нет.

Returns true if data is refreshed, otherwise false


false возвращается только если ошибка обновления или если таковое не требуется тоже?


На код возврата тут внимание можно не обращать.
 
Если я использую для открытия
double ask = MarketInfo( Symbol(), MODE_ASK );

, то при Рефреше переменная ask обновится?


Конечно нет.

Ренат, а как поступать? Я не совсем понимаю....
Если обновляются Ask и Bid ( кстати, по всем инструментам? ), значит ли это что обновляются значения MarketInfo( Symbol(), MODE_ASK ) и MarketInfo( Symbol(), MODE_BID ) ?

Помните ситуацию, которая случилась пару дней назад ( в ветке 159 билда обсуждали ), когда при установке ордера инвалид стоп получился? Можно ли избежать подобного поставив перед проверками RefreshRates() для "освежения" цены?


________
зы: если это уже где-то обсуждалось, киньте ссылочку, плз........
 
Если я использую для открытия
double ask = MarketInfo( Symbol(), MODE_ASK );

, то при Рефреше переменная ask обновится?


Конечно нет.

Ренат, а как поступать? Я не совсем понимаю....

А что тут сложного? Я вот тоже не могу понять - почему Вы не понимаете?
Многократно повторено - обновляются закешированные графики + предопределенные (тоже закешированные) переменные Bid/Ask. И ничего более.

Если обновляются Ask и Bid ( кстати, по всем инструментам? ), значит ли это что обновляются значения MarketInfo( Symbol(), MODE_ASK ) и MarketInfo( Symbol(), MODE_BID ) ?

MarketInfo - это _функция_, которая выдаст текущее точные незакешированные данные из окна MarketWatch.

Помните ситуацию, которая случилась пару дней назад ( в ветке 159 билда обсуждали ), когда при установке ордера инвалид стоп получился? Можно ли избежать подобного поставив перед проверками RefreshRates() для "освежения" цены?

Еще раз повторю - если Ваш эксперт тратит время (а закешированные данные замораживаются!), а потом как ни в чем не бывало пытается (секунд через 3, 5, 10) использовать старые данные, то кто тут виноват? Похоже что программист, который вообще упустил из виду то, что после задержки _рыночная_ситуация_поменялась_ и требуется _переоценка_. То есть, надо бы вызвать RefreshRates и подумать - надо ли дальше пытаться совершить сделку?

Кеширование состояние текущего графика и рыночных цен при входе в эксперта является "остановкой времени" для эксперта. Это сделано для того, чтобы эксперт работал с зафиксированным срезом состояния рынка, а не постоянно изменяющейся моделью, когда может сработать такое условие: Ask != Ask.
Именно для обновления состояния рынка используется Refresh.