RefreshRates() внутри OnTick() - страница 2

 
MoneyJinn:

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

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

Шо то Вы странное спрашиваете)

Тестер обрабатывает все тики. На реальном счёте таки используйте RefreshRates перед получением данных.

 
Swan:

Шо то Вы странное спрашиваете)

Тестер обрабатывает все тики. 

Речь идет о получении данных котировок, которые возникают в то время, пока экспертом обрабатывается тик.

В MT4 для этого была функция RefreshRates(), она обновляла данные по инструменту.

В МТ5 обновить данные по инструменту во время обработки тика не получается.

 
MoneyJinn:
а, в 5ке таки нет RefreshRates. SymbolInfoTick иль SymbolInfoDouble должны получать последние данные, в понедельник можно проверить
 
Swan:
а, в 5ке таки нет RefreshRates. SymbolInfoTick иль SymbolInfoDouble должны получать последние данные, в понедельник можно проверить
В классе CSymbolInfo есть соответствующий метод, всегда использую при реквотах.
//+------------------------------------------------------------------+
//| Refresh cached data                                              |
//| INPUT:  no.                                                      |
//| OUTPUT: no.                                                      |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
bool CSymbolInfo::RefreshRates()
  {
   return(SymbolInfoTick(m_name,m_tick));
  }

RefreshRates

Обновляет котировки по символу

 
Valmars:
В классе CSymbolInfo есть соответствующий метод, всегда использую при реквотах.

RefreshRates

Обновляет котировки по символу

Использовал аналогичный метод:

MqlTick tick;
SymbolInfoTick(Symbol(),tick);
double Bid=tick.bid;

 Но суть проблемы в том, что в тестере он не работает и соответственно протестировать обработку ошибок в тестере невозможно.

 

Для воспроизведения ошибки набросал код: 

void OnTick()
  {

   MqlTick tick;
   SymbolInfoTick(Symbol(),tick);
   double Bid=tick.bid;
   while (Bid==tick.bid)
   {
   Sleep(100000);
   SymbolInfoTick(Symbol(),tick);
   Print("Time: ",TimeToString(TimeTradeServer()),"  current value: ",DoubleToString(tick.bid,_Digits));
   }
   
...

Результат:


 

Тоже самое через информацию об инструменте:

void OnTick()
  {
   
   MqlTick tick;
   SymbolInfoTick(Symbol(),tick);
   double Bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
   while (Bid==SymbolInfoDouble(Symbol(),SYMBOL_BID))
   {
   Sleep(100000);
   SymbolInfoTick(Symbol(),tick);
   Print("Time: ",TimeToString(TimeTradeServer()),"  current value: ",DoubleToString(SymbolInfoDouble(Symbol(),SYMBOL_BID),_Digits));
   }

...

Результат: 


 
MoneyJinn:

Использовал аналогичный метод:

 Но суть проблемы в том, что в тестере он не работает и соответственно протестировать обработку ошибок в тестере невозможно.



В тестере реквоты моделируются при выборе режима торговли 'Произвольная задержка'. Выдержки из журнала агента:

2011.08.02 05:29:44    Core 1    2011.03.31 23:59:59   ---------------Report-------------------
2011.08.02 05:29:44    Core 1    2011.03.31 23:59:59   Balance=10000.00 Equite=13685.27 Profit=0.00 MarginLevel=0.00
2011.08.02 05:29:44    Core 1    2011.03.31 23:59:59   Ошибок открытия: 1 Ошибок закрытия: 0 Ошибок модификации: 13 Реквоты: 8
2011.08.02 05:29:44    Core 1    2011.03.31 23:59:59   Время работы: 1 min. 2 сек.


2011.08.02 05:29:06    Core 1    2011.01.25 21:22:20   vol= 0.1
2011.08.02 05:29:06    Core 1    2011.01.25 21:22:27   requote 1.36893 / 1.36908 / 1.36893 (instant sell 0.10 EURUSD at 1.36860 tp: 1.33926)
2011.08.02 05:29:06    Core 1    2011.01.25 21:22:27   CTrade::PositionOpen: instant sell 0.10 EURUSD at 1.36860 tp: 1.33926 [requote (1.36893/1.36908)]
2011.08.02 05:29:06    Core 1    2011.01.25 21:22:27   Error opening Short position by EURUSD : 'Requote'
2011.08.02 05:29:06    Core 1    2011.01.25 21:22:27   Open parameters : price=1.368600,TP=1.339260,SL=0.000000
2011.08.02 05:29:06    Core 1    2011.01.25 21:22:28   instant sell 0.10 EURUSD at 1.36893 tp: 1.33926 (1.36893 / 1.36908 / 1.36893)
2011.08.02 05:29:06    Core 1    2011.01.25 21:22:28   deal #121 sell 0.10 EURUSD at 1.36893 done (based on order #122)
2011.08.02 05:29:06    Core 1    2011.01.25 21:22:28   deal performed [#121 sell 0.10 EURUSD at 1.36893]
2011.08.02 05:29:06    Core 1    2011.01.25 21:22:28   order performed sell 0.10 at 1.36893 [#122 sell 0.10 EURUSD at 1.36893]
2011.08.02 05:29:06    Core 1    2011.01.25 21:22:28   CTrade::PositionOpen: instant sell 0.10 EURUSD at 1.36893 tp: 1.33926 [done at 0.00000]
2011.08.02 05:29:06    Core 1    2011.01.25 21:22:28   ShortPosition by EURUSD to be opened
2011.08.02 05:29:06    Core 1    2011.01.25 21:22:28   Margin Level= 612.22
2011.08.02 05:29:06    Core 1    2011.01.25 21:22:28   oldDealsTotal=120 newDealsTotal=121
2011.08.02 05:29:06    Core 1    2011.01.25 21:22:28   -----------------Deal #121 EURUSD Position Reopened


Тот же тест для 'Обычного' режима торговли:

2011.08.02 05:39:13    Core 1    2011.03.31 23:59:59   ---------------Report-------------------
2011.08.02 05:39:13    Core 1    2011.03.31 23:59:59   Balance=10000.00 Equite=13717.80 Profit=0.00 MarginLevel=0.00
2011.08.02 05:39:13    Core 1    2011.03.31 23:59:59   Ошибок открытия: 0 Ошибок закрытия: 0 Ошибок модификации: 0 Реквоты: 0
2011.08.02 05:39:13    Core 1    2011.03.31 23:59:59   Время работы: 1 min. 5 сек.
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 
Valmars:

В тестере реквоты моделируются при выборе режима торговли 'Произвольная задержка'. Выдержки из журнала агента:

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

 

 
MoneyJinn:

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

Всё прекрасно обновляется, посмотрите мой пример, там получаем реквоту, обновляем цены, посылаем повторный запрос с новыми ценами, сделка совершается. И всё это в одном цикле, хоть в OnTick, хоть в OnTimer.

 
Valmars:

Приведенные выше примеры описывают конкретные случаи, когда при тестировании обновление данных не работает.

Так что "всё прекрасно обновляется" - как минимум не правда...

 
MoneyJinn:

Приведенные выше примеры описывают конкретные случаи, когда при тестировании обновление данных не работает.

Так что "всё прекрасно обновляется" - как минимум не правда...

Читайте документацию:

Режим торговли

В данном поле указывает режим торговли, которая эмулируется тестером стратегий. На данный момент предусмотрены два режим торговли:

Обычный режим

В данном режиме все ордера исполняются по запрошенным ценам, отсутствуют реквоты и т.д.

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

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

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

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

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