Почему тестер закрывает незакрытые позиции по окончании теста изподтишка, а не через установку ордера на закрытие ? - страница 2

 
Yedelkin:
Дык, может в таком случае переименовать тему в соответствии с обсуждением?
А как это сделать ?
 

Valmars:
А как это сделать ? 

Попробуйте в первом сообщении темы выбрать опцию "Правка". С течением времени такая возможность пропадает, но в данном случае у Вас - совершенно свежая тема.
 
Yedelkin:
Попробуйте в первом сообщении темы выбрать опцию "Правка". С течением времени такая возможность пропадает, но в данном случае у Вас - совершенно свежая тема.
Увы, 'Правка' в первом сообщении недоступна.
 

Вчера не было времени заниматься, а сегодня во всём разобрался. Сделал кое-какие выводы:

1. При закрытии позиций тестером по 'end of test' событие Trade не генерируется, хотя ордер на закрытие и сделка по нему фиксируются в истории. Думаю, разработчики сделали так, потому, что закрытие по концу теста не является торговой операцией в полном смысле и не инициируется тестируемым советником.

Замечание: Всё это заработало после вчерашнего обновления терминала, ранее же вызов HistoryOrdersTotal() из Deinit() возвращал число ордеров без учёта 'end of test'. Это видно из первого поста.

2. Замена TimeCurrent() на TimeTradeServer() ни в OnTrade(), ни в Deinit() не имеет смысла, так как TimeLocal() моделируется в тестере и равно серверному времени TimeCurrent().

3. Учёт сделок, закрываемых по 'end of test', необходимо проводить в Deinit()-е, там они доступны.

 Для иллюстрации всего вышесказанного приведу код, включаемый в Deinit() для учёта 'end of test' сделок с отладочными принтами и распечатку его выполнения из лога тестера:

if(MQL5InfoInteger(MQL5_TESTING))
     {
      HistorySelect(0,TimeCurrent());
      Print("Для TimeCurrent() - HistoryOrdersTotal=",HistoryOrdersTotal());
      HistorySelect(0,TimeTradeServer());
      Print("Для TimeTradeServer() - HistoryOrdersTotal=",HistoryOrdersTotal());
      ulong ticket=HistoryOrderGetTicket(HistoryOrdersTotal()-1);
      Print("Последний ордер в истории: ",ticket);
      if(HistoryOrderSelect(ticket))
         Print("Comment: ",HistoryOrderGetString(ticket,ORDER_COMMENT));
      int total=HistoryDealsTotal();
      uint i=0;      
      do
        {
         i++;
         Print("i=",i);
         ticket=HistoryDealGetTicket(total-i);
         Print("DealTicket=",ticket);
         if(HistoryDealGetString(ticket,DEAL_COMMENT)=="end of test")
           {
            string symbol=HistoryDealGetString(ticket,DEAL_SYMBOL);
            for(uint j=0;j<SymbolsNumber;j++)
              {
                if(symbol!=m_symbol[j].Name())
                  continue;
                else
                 {
                  m_Profit[j]=m_Profit[j]+HistoryDealGetDouble(ticket,DEAL_PROFIT)+
                              HistoryDealGetDouble(ticket,DEAL_COMMISSION)+HistoryDealGetDouble(ticket,DEAL_SWAP);
                  break;
                 }
              }
           }
         else
            break;
        }
      while(i<SymbolsNumber);
     }

 
2010.08.08 13:14:13    Core 1    disconnected
2010.08.08 13:14:12    Core 1    log file "E:\Program Files\MetaTrader 5\Tester\Agent-127.0.0.1-3000\logs\20100808.log" written
2010.08.08 13:14:12    Core 1    2010.08.06 22:59:59   All Profit  = 58869.35
2010.08.08 13:14:12    Core 1    2010.08.06 22:59:59   Profit EURAUD = 23910.64
2010.08.08 13:14:12    Core 1    2010.08.06 22:59:59   Profit USDJPY = 6834.11
2010.08.08 13:14:12    Core 1    2010.08.06 22:59:59   Profit AUDUSD = 12011.00
2010.08.08 13:14:12    Core 1    2010.08.06 22:59:59   Profit EURUSD = 16113.60
2010.08.08 13:14:12    Core 1    2010.08.06 22:59:59   DealTicket=1606
2010.08.08 13:14:12    Core 1    2010.08.06 22:59:59   i=4
2010.08.08 13:14:12    Core 1    2010.08.06 22:59:59   DealTicket=1607
2010.08.08 13:14:12    Core 1    2010.08.06 22:59:59   i=3
2010.08.08 13:14:12    Core 1    2010.08.06 22:59:59   DealTicket=1608
2010.08.08 13:14:12    Core 1    2010.08.06 22:59:59   i=2
2010.08.08 13:14:12    Core 1    2010.08.06 22:59:59   DealTicket=1609
2010.08.08 13:14:12    Core 1    2010.08.06 22:59:59   i=1
2010.08.08 13:14:12    Core 1    2010.08.06 22:59:59   Comment: end of test
2010.08.08 13:14:12    Core 1    2010.08.06 22:59:59   Последний ордер в истории: 1609
2010.08.08 13:14:12    Core 1    2010.08.06 22:59:59   Для TimeTradeServer() - HistoryOrdersTotal=1608
2010.08.08 13:14:12    Core 1    2010.08.06 22:59:59   Для TimeCurrent() - HistoryOrdersTotal=1608
2010.08.08 13:14:12    Core 1    2010.08.06 22:59:59   Balance=68869.35 Equite=68869.35 Profit=0.00
2010.08.08 13:14:12    Core 1    2010.08.06 22:59:59   Ошибок открытия: 0 Ошибок закрытия: 0 Ошибок модификации: 0 Реквоты: 7
2010.08.08 13:14:12    Core 1    2010.08.06 22:59:59   Время работы: 4 min. 36 сек.
2010.08.08 13:14:12    Core 1    2010.08.06 22:59:59   Эксперт PriceChannel_multi_ChNew закончил работу в 2010.08.06 22:59 на графике EURUSD период H1
2010.08.08 13:14:12    Core 1    EURUSD,H1: 7319091 ticks (3695 bars) generated within 266543 ms (total bars in history 9842)
2010.08.08 13:14:12    Core 1    OnTester result 0

Как видно из распечатки, теперь расчётное значение общей прибыли, являющееся суммой прибыли по отдельным инструментам, совпадает с прибылью тестера.

У меня всё, тема закрыта.

 
Valmars:

Замечание: Всё это заработало после вчерашнего обновления терминала, ранее же вызов HistoryOrdersTotal() из Deinit() возвращал число ордеров без учёта 'end of test'. Это видно из первого поста.

2. Замена TimeCurrent() на TimeTradeServer() ни в OnTrade(), ни в Deinit() не имеет смысла, так как TimeLocal() моделируется в тестере и равно серверному времени TimeCurrent().

ненене)

Попробуйте тож самое с датой окончания теста 2010.08.01

 
Swan:

ненене)

Попробуйте тож самое с датой окончания теста 2010.08.01

2010.08.08 16:25:12    Core 1    disconnected
2010.08.08 16:25:11    Core 1    log file "E:\Program Files\MetaTrader 5\Tester\Agent-127.0.0.1-3000\logs\20100808.log" written
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   All Profit  = 58745.85
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Profit EURAUD = 24640.07
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Profit USDJPY = 7687.28
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Profit AUDUSD = 12055.80
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Profit EURUSD = 14362.70
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   DealTicket=1560
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   i=4
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   DealTicket=1561
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   i=3
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   DealTicket=1562
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   i=2
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   DealTicket=1563
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   i=1
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Comment: end of test
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Последний ордер в истории: 1563
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Для TimeTradeServer() - HistoryOrdersTotal=1562
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Для TimeCurrent() - HistoryOrdersTotal=1558
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Balance=68745.85 Equite=68745.85 Profit=0.00
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Ошибок открытия: 0 Ошибок закрытия: 0 Ошибок модификации: 0 Реквоты: 7
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Время работы: 4 min. 20 сек.
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Эксперт PriceChannel_multi_ChNew закончил работу в 2010.07.30 22:59 на графике EURUSD период H1
2010.08.08 16:25:11    Core 1    EURUSD,H1: 7143114 ticks (3576 bars) generated within 250132 ms (total bars in history 9723)
2010.08.08 16:25:11    Core 1    OnTester result 0


Действительно. А почему в предыдущем случае был одинаковый результат ?

Значит, TimeCurrent() не катит, надо применять TimeTradeServer().
Документация по MQL5: Дата и время / TimeTradeServer
Документация по MQL5: Дата и время / TimeTradeServer
  • www.mql5.com
Дата и время / TimeTradeServer - Документация по MQL5
 
Valmars:
2010.08.08 16:25:12    Core 1    disconnected
2010.08.08 16:25:11    Core 1    log file "E:\Program Files\MetaTrader 5\Tester\Agent-127.0.0.1-3000\logs\20100808.log" written
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   All Profit  = 58745.85
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Profit EURAUD = 24640.07
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Profit USDJPY = 7687.28
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Profit AUDUSD = 12055.80
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Profit EURUSD = 14362.70
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   DealTicket=1560
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   i=4
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   DealTicket=1561
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   i=3
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   DealTicket=1562
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   i=2
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   DealTicket=1563
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   i=1
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Comment: end of test
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Последний ордер в истории: 1563
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Для TimeTradeServer() - HistoryOrdersTotal=1562
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Для TimeCurrent() - HistoryOrdersTotal=1558
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Balance=68745.85 Equite=68745.85 Profit=0.00
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Ошибок открытия: 0 Ошибок закрытия: 0 Ошибок модификации: 0 Реквоты: 7
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Время работы: 4 min. 20 сек.
2010.08.08 16:25:11    Core 1    2010.07.31 23:59:50   Эксперт PriceChannel_multi_ChNew закончил работу в 2010.07.30 22:59 на графике EURUSD период H1
2010.08.08 16:25:11    Core 1    EURUSD,H1: 7143114 ticks (3576 bars) generated within 250132 ms (total bars in history 9723)
2010.08.08 16:25:11    Core 1    OnTester result 0


Действительно. А почему в предыдущем случае был одинаковый результат ?

Значит, TimeCurrent() не катит, надо применять TimeTradeServer().

Я так понимаю что датой окончание предыдущего теста было выставлено 07/08/2010. С окончанием торгов 06/08/2010 в 23:59:59 (по правилам тестирования)?

Мне так показалось, что нужно проверить результаты нескольких вариантов у которых дата окончания теста попадает на субботу и воскресенье.

Для чистоты эксперимента я бы еще и посмотрел результаты по четвергу (так чтобы тесты заканчивались в среду в 23:59:59)....

 
Valmars:

Действительно. А почему в предыдущем случае был одинаковый результат ?

а хз) Возможно, время "end of test" не может быть больше времени последней котировки всей имеющейся истории, тогда с началом сессии в понедельник и в предыдущем тесте будет отличие.
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 
Interesting:

Я так понимаю что датой окончание предыдущего теста было выставлено 07/08/2010. С окончанием торгов 06/08/2010 в 23:59:59 (по правилам тестирования)?

Мне так показалось, что нужно проверить результаты нескольких вариантов у которых дата окончания теста попадает на субботу и воскресенье.

Для чистоты эксперимента я бы еще и посмотрел результаты по четвергу (так чтобы тесты заканчивались в среду в 23:59:59)....

2010.08.08 22:56:09    Core 1    disconnected
2010.08.08 22:56:08    Core 1    log file "E:\Program Files\MetaTrader 5\Tester\Agent-127.0.0.1-3000\logs\20100808.log" written
2010.08.08 22:56:08    Core 1    2010.08.04 23:59:59   All Profit  = 59717.11
2010.08.08 22:56:08    Core 1    2010.08.04 23:59:59   Profit EURAUD = 24631.26
2010.08.08 22:56:08    Core 1    2010.08.04 23:59:59   Profit USDJPY = 6931.95
2010.08.08 22:56:08    Core 1    2010.08.04 23:59:59   Profit AUDUSD = 12310.30
2010.08.08 22:56:08    Core 1    2010.08.04 23:59:59   Profit EURUSD = 15843.60
2010.08.08 22:56:08    Core 1    2010.08.04 23:59:59   DealTicket=1590
2010.08.08 22:56:08    Core 1    2010.08.04 23:59:59   i=4
2010.08.08 22:56:08    Core 1    2010.08.04 23:59:59   DealTicket=1591
2010.08.08 22:56:08    Core 1    2010.08.04 23:59:59   i=3
2010.08.08 22:56:08    Core 1    2010.08.04 23:59:59   DealTicket=1592
2010.08.08 22:56:08    Core 1    2010.08.04 23:59:59   i=2
2010.08.08 22:56:08    Core 1    2010.08.04 23:59:59   DealTicket=1593
2010.08.08 22:56:08    Core 1    2010.08.04 23:59:59   i=1
2010.08.08 22:56:08    Core 1    2010.08.04 23:59:59   Comment: end of test
2010.08.08 22:56:08    Core 1    2010.08.04 23:59:59   Последний ордер в истории: 1593
2010.08.08 22:56:08    Core 1    2010.08.04 23:59:59   Для TimeTradeServer() - HistoryOrdersTotal=1592
2010.08.08 22:56:08    Core 1    2010.08.04 23:59:59   Для TimeCurrent() - HistoryOrdersTotal=1592
2010.08.08 22:56:08    Core 1    2010.08.04 23:59:59   Balance=69717.11 Equite=69717.11 Profit=0.00
2010.08.08 22:56:08    Core 1    2010.08.04 23:59:59   Ошибок открытия: 0 Ошибок закрытия: 0 Ошибок модификации: 0 Реквоты: 7
2010.08.08 22:56:08    Core 1    2010.08.04 23:59:59   Время работы: 4 min. 34 сек.
2010.08.08 22:56:08    Core 1    2010.08.04 23:59:59   Эксперт PriceChannel_multi_ChNew закончил работу в 2010.08.04 23:59 на графике EURUSD период H1
2010.08.08 22:56:08    Core 1    EURUSD,H1: 7249198 ticks (3648 bars) generated within 265171 ms (total bars in history 9795)
2010.08.08 22:56:08    Core 1    OnTester result 0


Окончание теста = в среду, HistoryOrdersTotal совпадает и корректно.

Документация по MQL5: Дата и время / TimeTradeServer
Документация по MQL5: Дата и время / TimeTradeServer
  • www.mql5.com
Дата и время / TimeTradeServer - Документация по MQL5