RefreshRates() внутри OnTick()

 

Подскажите, можно ли реализовать аналог RefreshRates() и дождаться обновления цен внутри OnTick()? В тестере этого сделать не получилось. 

Если это невозможно, то как проще всего реализовать обработку ошибок торговых операций с проверкой котировок на обновление?

 
MoneyJinn:

Подскажите, можно ли реализовать аналог RefreshRates() и дождаться обновления цен внутри OnTick()?

А смысл? Функция SymbolInfoTick() всего лишь возвращает текущие цены  для указанного символа в переменной типа MqlTick. Вам нужно, чтобы текущие цены отображались именно  в переменной типа MqlTick? Для иных случаев следует учитывать, что событие NewTick генерируется при поступлении нового тика по символу, к графику которого прикреплен эксперт.
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура для получения текущих цен
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура для получения текущих цен
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура для получения текущих цен - Документация по MQL5
 
 
Yedelkin:
А смысл? Функция SymbolInfoTick() всего лишь возвращает текущие цены  для указанного символа в переменной типа MqlTick. Вам нужно, чтобы текущие цены отображались именно  в переменной типа MqlTick? Для иных случаев следует учитывать, что событие NewTick генерируется при поступлении нового тика по символу, к графику которого прикреплен эксперт.

Пока все выглядит так, что до завершения обработки последнего события OnTick() сколько бы она ни продолжалась, терминал в режиме тестирования котировки не обновляет

и новые значения котировок с помощью структуры MqlTick и функции SymbolInfoTick(), а также SymbolInfoDouble() не получить.

Как быть, если до завершения OnTick() при обработке ошибок необходимо дождаться новых новых цен и использовать их?

Вешать эксперт на график стороннего символа? 

 
Rosh:
Вы читали статью Основы тестирования в MetaTrader 5?

К сожалению, нужной информации я там не нашел.

Из документации:

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

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

Котировки игнорируются - это понятно. Но почему они остаются недоступными - непонятно совсем. 

 

Что подразумевается под этим?

MoneyJinn:

Подскажите, можно ли реализовать аналог RefreshRates() и дождаться обновления цен внутри OnTick()?

 
Rosh:

Что подразумевается под этим?

Имеется в виду обновление и получение самых свежих котировок по инструменту.

Необходимо для получения котировок, появившихся уже после начала обработки события NewTick. 

 
MoneyJinn:

Имеется в виду обновление и получение самых свежих котировок по инструменту.

Необходимо для получения котировок, появившихся уже после начала обработки события NewTick. 

Давайте еще раз - что означает "обновление и получение самых свежих котировок по инструменту", учитывая что OnTick() всегда вызывается по факту обновления котировок. Как в тестере могут появиться котировки, "появившиеся уже после начала обработки события NewTick" ?
 
Rosh:
Давайте еще раз - что означает "обновление и получение самых свежих котировок по инструменту", учитывая что OnTick() всегда вызывается по факту обновления котировок. Как в тестере могут появиться котировки, "появившиеся уже после начала обработки события NewTick" ?

OnTick() вызывается по факту обновления котировок.

OnTick() может обрабатываться сколько угодно долго.

Необходимо получить новые котировки которые появляются во время обработки OnTick(). 

 

Если это невозможно сделать, то как вообще обрабатывать ошибки типа: "10020 - Цены изменились", если новую цену получить нельзя?

Может это косяк только тестера и в реале котировки получить все-таки можно?

 

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

Произвольная задержка

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

Имитация задержки осуществляется для всех торговых запросов, отсылаемых из терминала (выставление ордеров, изменение стоп-уровней, и т.д.). Задержка исполнения осуществляется по следующему принципу: случайным образом выбирается число от 0 до 9, и на такое число секунд осуществляется задержка; если выбранное число равно 9, то случайным образом выбирается еще одно число из такого же диапазона и прибавляется к первому. Таким образом, вероятность задержки исполнения на 0-8 секунд составляет 90%, а вероятность задержки на 9-18 секунд составляет 10%.

 

Как уже было отмечено ранее, информация в SymbolInfoDouble() также не обновляется!

Терминал не заносит данные о котировках на текущий момент времени в информацию об инструменте, если по этому инструменту не завершена обработка последнего события NewTick.

Получается, что это тупик и нормальную обработку ошибок в MT5 не реализовать? 

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