Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Не можешь разобраться в коде? Статьи помогут!
Andrey Vasiliev
7843
Andrey Vasiliev 2011.07.31 16:40 

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

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

Yedelkin
4532
Yedelkin 2011.07.31 17:51  
MoneyJinn:

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

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

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

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

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

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

Andrey Vasiliev
7843
Andrey Vasiliev 2011.07.31 18:20  
Rosh:
Вы читали статью Основы тестирования в MetaTrader 5?

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

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

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

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

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

Rashid Umarov
Админ
11826
Rashid Umarov 2011.07.31 18:55  

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

MoneyJinn:

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

Andrey Vasiliev
7843
Andrey Vasiliev 2011.07.31 19:08  
Rosh:

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

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

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

Rashid Umarov
Админ
11826
Rashid Umarov 2011.07.31 19:28  
MoneyJinn:

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

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

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

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

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

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

 

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

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

Rashid Umarov
Админ
11826
Rashid Umarov 2011.07.31 20:05  

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

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

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

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



Andrey Vasiliev
7843
Andrey Vasiliev 2011.07.31 20:07  

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

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

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

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий