Ошибки, баги, вопросы - страница 480

 
papaklass:
Cейчас обновился и пытаюсь опять с этим разобраться. Принты поставил почти на каждой строчке. Результаты сообщу.

Вот прогон с Вашей вставкой, момент фиксации стоп-лосса:

2011.08.09 00:41:08    Core 1    2011.01.14 01:41:27   Long position by EURUSD to be closed of stop-loss
2011.08.09 00:41:08    Core 1    2011.01.14 01:41:27   -----------------Deal #63 sl 1.33328
2011.08.09 00:41:08    Core 1    2011.01.14 01:41:27   oldDealsTotal=62 newDealsTotal=63
2011.08.09 00:41:08    Core 1    2011.01.14 01:41:27   CSampleExpert::Trade
2011.08.09 00:41:08    Core 1    2011.01.14 01:41:27   order performed sell 0.15 at 1.33328 [#63 sell 0.15 EURUSD at 1.33328]
2011.08.09 00:41:08    Core 1    2011.01.14 01:41:27   deal performed [#63 sell 0.15 EURUSD at 1.33328]
2011.08.09 00:41:08    Core 1    2011.01.14 01:41:27   deal #63 sell 0.15 EURUSD at 1.33328 done (based on order #63)
2011.08.09 00:41:08    Core 1    2011.01.14 01:41:27   stop loss triggered buy 0.15 EURUSD 1.32127 sl: 1.33328 tp: 1.35139 [#63 sell 0.15 EURUSD at 1.33328]
2011.08.09 00:41:08    Core 1    2011.01.13 18:32:00   Long position by EURUSD to be modified trailing
 
Очевидно, разный результат - разная обработка в OnTrade, я ищу только сделки, только они меня интересуют, Вы же, как я понял, обрабатываете все события, классифицируя их, и где-то тут что-то напутали.
 
Я так понимаю, что стакан по фьючерсам он тоже демо? Брал стакан из ММВБ реальный, лоты не совпадают.
 
papaklass:

Выставляю отложенные ордера со сроком жизни 1 час. Через час ордера, которые не были активизированы, закрываются по времени истечения ордера. Если одновременно закрывается несколько ордеров и перед закрытием функция HistoryOrdersTotal() имела не нулевое значение, то она теряет некоторые ордера. Например, перед закрытием 8-ми ордеров, функция имела значение = 4, то после закрытия, она имеет значение 10. Два ордера потерялись.


Что значит "ордера потерялись"? Необходимо иметь ввиду, что сообщения, поступающие в OnTrade(), могут нести информацию не об одном торговом событии. Кроме того, если одновременно валится несколько сообщений, то при обработке первого сообщения исторический кеш может уже измениться, и у вам может появиться ощущение "потери событий".

Почитайте статью Торговые события в MetaTrader 5:

Заключение

Все операции в торгово-аналитической платформе MetaTrader 5 производятся асинхронно и отсылка сообщений обо всех изменениях на торговом счете производятся независимо друг от друга. Поэтому не нужно пытаться отслеживать одиночное событие по правилу "Один запрос - Одно торговое событие". Если требуется точно определить что именно изменилось по приходу события Trade, то нужно на каждом вызове обработчика OnTrade анализировать все сделки, позиции и ордера и сравнивать с тем состоянием, что было до его появления.
 
papaklass:
Я специально до закрытия ордеров запросил значение HistoryOrdersTotal(), которое было равно 4. После закрытия 8-ми ордеров, значение HistoryOrdersTotal() должно было быть равно 12 (4+8), а оно равно 10. Я приложил лог файл, аналогичные ситуации в нем встречаются неоднократно. Также приложил эксперт, с помощью которого это получено. Сделайте это сами, и все увидете.

Попробуйте изменить функцию, что будет?

void OnTrade(){
//---
   HistorySelect(dayStart,TimeTradeServer());      
   Print("              ",__FUNCTION__,"  :  historyOrdersTotal = ",HistoryOrdersTotal(),"   ",TimeTradeServer()); 
}
     
 
HTML-отчет по результатам прогона тестера не всегда сохраняется в файл?!
 
zigan:
HTML-отчет по результатам прогона тестера не всегда сохраняется в файл?!

Опишите точнее. ПРи каких обстоятельствах.

 
alexvd:

Опишите точнее. ПРи каких обстоятельствах.

редко, примерно один из 20-30 прогонов тестера - открываю вкладку "Результаты"

 

клик сохранить отчет XML - получаю файл отчета, все ОК!

клик сохранить отчет HTML - всплывает окно сохранения файла, какое-то время(недолго) висит с пустым ProgressBar, потом ProgressBar быстро заполняется и окно закрывается... но файла отчета при этом не создается!

Ни каких закономерностей, когда именно это происходит указать не могу.

 
Rosh:

Попробуйте изменить функцию, что будет?

Не думаю, что это поможет. В OnTrade принципиально нельзя работать так, как это делает papaklass.

Ключевым является "нужно на каждом вызове обработчика OnTrade анализировать все сделки, позиции и ордера и сравнивать с тем состоянием, что было до его появления ". В рассматриваемом примере с отложниками это относится только к ордерам в истории. Чтобы ордера не терялись, я бы так изменил код:

Вводим глобальную переменную int  oldHistoryOrders; а в Ontrade примерно так:

//--------------------------ТОРГОВЫЕ СОБЫТИЯ-------------------------------------------------------------+
void OnTrade(){
//---
   Print(__FUNCTION__);
   HistorySelect(0,TimeCurrent()+1);      
   int newHistoryOrders=HistoryOrdersTotal();
   if(oldHistoryOrders==newHistoryOrders) return;
   Print("oldHistoryOrders=",oldHistoryOrders," newHistoryOrders=",newHistoryOrders);
   for(int i=oldHistoryOrders;i<newHistoryOrders;i++)
      Print("Order ",i," #",HistoryOrderGetTicket(i));
   oldHistoryOrders=newHistoryOrders;    
//   Print("              ",__FUNCTION__,"  :  historyOrdersTotal = ",newHistoryOrders,"   ",dayStart); 
}
Файлы:
 
papaklass:

Я не так работаю с OnTrade() как Вы описали. В своем приложенном коде, я все убрал, оставив только ту часть, которая подчеркивает косяк функции. У меня в советнике практически нет циклов. Советник обрабатывает на одном тике один инструмент. Поэтому мне циклы не нужны. За 12 тиков, я обрабатываю все инструменты.

ПС: OnTrade() сообщает мне о торговом событии. А какое событие произошло, определяют мои функции без циклов.

Ну, хорошо, я говорил только о Вашем примере, доказывающем, якобы, потерю ордеров функцией OnTrade. OnTrade работает не по тикам , а асинхронно, так что ей до-лампочки, сколько символов Вы обрабатываете в тике, один или все. У Вас вот, в одно время истекают сразу пачка неисполнившихся ордеров, так что без цикла обработки тут не обойтись. Я изменил Ваш код так, чтобы было видно, что OnTrade ничего не пропускает. Даже запустил в тестере, вроде всё на месте. Тиккеты всех удалённых по-истечению ордеров, выводимых  принтом из OnTrade, присутствуют в логе. А Вы пробовали запускать мой вариант ?
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
Причина обращения: