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

 

При мультивалютном тестировании желательно знать вклад каждой валюты в общий результат. Для этого в OnTrade() ведём подсчёт прибыли по отдельным инструментам, а в Deinit-е выводим окончательный результат. Так вот, те ордера и сделки, которые помечены в комментарии, как 'end of test', не входят ни в историю ордеров и сделок, ни в открытые позиции. И их невозможно учесть при окончательном расчёте прибыли. Почему бы не закрывать их аналогично стопам, а в комментарии оставить 'end of test' ?

Журнал тестера:

2010.08.07 13:57:53    Core 1    disconnected
2010.08.07 13:57:52    Core 1    log file "E:\Program Files\MetaTrader 5\Tester\Agent-127.0.0.1-3000\logs\20100807.log" written
2010.08.07 13:57:52    Core 1    2010.08.05 23:59:59   All Profit  = 106660.30
2010.08.07 13:57:52    Core 1    2010.08.05 23:59:59   Profit EURAUD = 38487.71
2010.08.07 13:57:52    Core 1    2010.08.05 23:59:59   Profit USDJPY = 11790.16
2010.08.07 13:57:52    Core 1    2010.08.05 23:59:59   Profit AUDUSD = 37251.48
2010.08.07 13:57:52    Core 1    2010.08.05 23:59:59   Profit EURUSD = 19130.95
2010.08.07 13:57:52    Core 1    2010.08.05 23:59:59   HistoryOrdersTotal=1631
2010.08.07 13:57:52    Core 1    2010.08.05 23:59:59   Balance=115340.25 Equite=115340.25 Profit=0.00

2010.08.07 13:57:52    Core 1    2010.08.05 23:59:59   Ошибок открытия: 0 Ошибок закрытия: 0 Ошибок модификации: 0 Реквоты: 2

Сделки в результатах тестера:

2010.08.05 16:001630USDJPYsellout5.6085.93916300.0091.59-2 521.79116 660.30PriceChannel_multi_Ch_Timetr H1
2010.08.05 22:461631USDJPYsellin6.0085.82116310.000.000.00116 660.30PriceChannel_multi_Ch_Timetr H1
2010.08.05 22:511632EURAUDsellin4.301.4396516320.000.000.00116 660.30PriceChannel_multi_Ch_Timetr H1
2010.08.05 23:591633EURAUDbuyout4.301.4407616330.0031.65-437.00116 254.95end of test
2010.08.05 23:591634USDJPYbuyout6.0085.87116340.00-16.70-349.36115 888.89end of test
2010.08.05 23:591635AUDUSDsellout7.200.9152316350.00135.36-684.00115 340.25end of test

0.00 -1 086.36 106 426.61 115 340.25

Разница между балансом и расчётом как раз на величину последних 3-х сделок.

 
Valmars:

Скорее всего время "end of test" больше TimeCurrent().

нуно как-то так:

HistorySelect(0,TimeTradeServer());
 
Swan:

Скорее всего время "end of test" больше TimeCurrent().

нуно как-то так:

И что, это поможет выцарапать сделки, закрытые тестером принудительно ? Как, ЕСЛИ ИХ ВООБЩЕ НЕТ В ИСТОРИИ ?
 
Пробовал даже такой вариант: постоянно мониторим  прибыль открытых позиций по инструментам. По тем позициям, что не были закрыты советником, прибыль в деините суммируем с  прибылью закрытых позиций. Всё равно разница, так как последний обработанный экспертом тик, не является таковым по другим инструментам.
 
Valmars:
И что, это поможет выцарапать сделки, закрытые тестером принудительно ? Как, ЕСЛИ ИХ ВООБЩЕ НЕТ В ИСТОРИИ ?

Поможет. С какого, простите за мой французский, их вобще нет? Они таки есть :)


зы: поможет таки в OnTester. Почему при "end of test" не выполняется OnTrade(), это к разработчикам..

зыы: в OnDeinit помогает)

 
Swan:

Поможет. С какого, простите за мой французский, их вобще нет? Они таки есть :)


зы: поможет таки в OnTester. Почему при "end of test" не выполняется OnTrade(), это к разработчикам..

Да, Вы правы, я так и считал, что раз в OnTrade "end of test" не обрабатывается , то и ордера не выставляются.

Сейчас проверил в деините

2010.08.07 18:57:02    Core 1    2010.08.05 23:59:59   HistoryOrdersTotal=1642

2010.08.07 18:57:02    Core 1    2010.08.05 23:59:59   HistoryOrdersTotal=1642

Выдаёт одно и то же значение с учётом ордеров 'end of test'. Странно.


   HistorySelect(0,TimeCurrent());
   Print("HistoryOrdersTotal=",HistoryOrdersTotal());
   HistorySelect(0,TimeTradeServer());
   Print("HistoryOrdersTotal=",HistoryOrdersTotal());   
 
Valmars:

Да, Вы правы, я так и считал, что раз в OnTrade "end of test" не обрабатывается , то и ордера не выставляются.

Сейчас проверил в деините

2010.08.07 18:57:02    Core 1    2010.08.05 23:59:59   HistoryOrdersTotal=1642

2010.08.07 18:57:02    Core 1    2010.08.05 23:59:59   HistoryOrdersTotal=1642

Выдаёт одно и то же значение с учётом ордеров 'end of test'. Странно.


Да наверное нет ничего странного, просто все время в тестере (как я понял) приравнивается к TimeCurrent().

Исходя из этого нет ничего странного в том что результаты совпадают (уверен в том, что если заменить TimeCurrent на TimeGMT они тоже совпадут)...

 
Interesting:

Да наверное нет ничего странного, просто все время в тестере (как я понял) приравнивается к TimeCurrent().

Исходя из этого нет ничего странного в том что результаты совпадают (уверен в том, что если заменить TimeCurrent на TimeGMT они тоже совпадут)...

Да, это так. А вот функция TimeTradeServer()  не совсем понятна. Что значит 'расчетное текущее время торгового сервера' ?

А странно не то, что они совпадают, а то что HistoryOrdersTotal в данном случае выдал результат с учётом сделок "end of test", хотя до этого мне не разу не удавалось.

Наверное, это связано с тем, что в данном прогоне эксперт работает не по тикам , а по таймеру.

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

Да, это так. А вот функция TimeTradeServer()  не совсем понятна. Что значит 'расчетное текущее время торгового сервера' ?

А странно не то, что они совпадают, а то что HistoryOrdersTotal в данном случае выдал результат с учётом сделок "end of test", хотя до этого мне не разу не удавалось.

Наверное, это связано с тем, что в данном прогоне эксперт работает не по тикам , а по таймеру.

В тестере, по окончании, TimeTradeServer() выдает время окончания теста 23:59:59. т.е. время end of test, а время последней котировки в пятницу обычно меньше..

HistorySelect(0,TimeCurrent()); это умело поставленные грабли :)


 

Ну что-ж, хоть первоначальный вопрос был задан неверно, но в ходе обсуждения многое прояснилось (лично для меня). Поэтому не считаю данную ветку бесполезной. Может, ещё кому-то поможет.

Особая благодарность Swan, который направил на путь истинный.


 
Valmars:

Ну что-ж, хоть первоначальный вопрос был задан неверно...

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