Вчера обнаружил ошибку в коде и, хотя непосредственно на торговое поведение она влияет незначительно, сегодня утром ее исправил и выставил всех роботов уже в новом варианте.
Суть вопроса:
Вчера 14.03.2016 в 16.58 была открыта позиция по GAZR-3.16.
Ниже фрагмент протокола сервера:
2016.03.14 14:03:55.499 Terminal '14072': 6 charts, 6 EAs, 0 custom indicators, last known ping to Access Server II is 3.63 ms
2016.03.14 14:12:23.598 Virtual Hosting flush logs command received
2016.03.14 14:58:23.100 Trades '14072': buy limit 2.00 GAZR-3.16 at 14234 sl: 14160 tp: 14863
2016.03.14 14:58:23.108 Trades '14072': buy limit 2.00 GAZR-3.16 at 14234 sl: 14160 tp: 14863 placed for execution in 8 ms
2016.03.14 14:58:23.226 Trades '14072': deal #22886939 buy 1.00 GAZR-3.16 at 14234 done (based on order #30570775)
2016.03.14 14:58:23.228 Trades '14072': deal #22886940 buy 1.00 GAZR-3.16 at 14234 done (based on order #30570775)
2016.03.14 14:58:23.256 Trades '14072': modify buy 2.00 GAZR-3.16 sl: 14160, tp: 14863 -> sl: 14160, tp: 14873
2016.03.14 14:58:23.265 Trades '14072': modify buy 2.00 GAZR-3.16 sl: 14160, tp: 14873 -> sl: 14160, tp: 14873 done in 9 ms
2016.03.14 14:58:23.365 Trades '14072': modify buy 2.00 GAZR-3.16 sl: 14160, tp: 14873 -> sl: 14160, tp: 14875
2016.03.14 14:58:23.377 Trades '14072': modify buy 2.00 GAZR-3.16 sl: 14160, tp: 14873 -> sl: 14160, tp: 14875 done in 12 ms
2016.03.14 14:58:23.865 Trades '14072': modify buy 2.00 GAZR-3.16 sl: 14160, tp: 14875 -> sl: 14160, tp: 14884
2016.03.14 14:58:23.878 Trades '14072': modify buy 2.00 GAZR-3.16 sl: 14160, tp: 14875 -> sl: 14160, tp: 14884 done in 13 ms
По не вполне ясной причине на сервере работающем в Москве и, очевидно, ориентированном на Московскую Биржу используется среднеевропейское время.
Поскольку в настройках робота по Газпрому используется следящий стоп, немедленно началась модификация стопов. Алгоритмом предусмотрена модификация stop-loss только по достижению ценой заданного порога по отношению к цене открытия позиции (в данном случае 1.85% от цены открытия, при условии, что стоп будет переставлен в точку не хуже начальной 0.05% - условный безубыток) take-profit модифицируется немедленно с тем, чтобы он не мог сработать до того как цена дойдет до порога активации следящего стопа. При использовании следящего стопа выход из позиции осуществляется по стопу либо таймеру. Тэйк выставляется на случай форс-мажора - проблем с сервером робота, либо со связью между ним и сервром брокера.
Позиция оставалась открытой во время вечернего клиринга - хотя открытие позиций на вечерней сессии запрещено моими настройками, но уже отрытые позиции поддерживаются до 23.34, после чего закрываются по таймеру.
Ниже фрагмент протокола сервера до, после и во время вечернего клиринга:
2016.03.14 16:30:00.927 Trades '14072': modify buy 2.00 GAZR-3.16 sl: 14160, tp: 15078 -> sl: 14160, tp: 15082 done in 10 ms
2016.03.14 16:55:13.572 Trades '14072': deal #22895944 sell 2.00 GAZR-3.16 at 14334 done (based on order #0)
2016.03.14 16:55:13.572 Trades '14072': deal #22895945 buy 2.00 GAZR-3.16 at 14334 done (based on order #0)
2016.03.14 16:55:13.608 Trades '14072': modify buy 2.00 GAZR-3.16 sl: 14160, tp: 15082 -> sl: 14160, tp: 121660
2016.03.14 16:55:13.806 Notifications notification 'Adagio 2.6 JustLevels 14072 SBRF-3.16 Account lot hasn't been calculated' sent to '81F75BFF,A5B6B51F'
2016.03.14 16:55:13.851 Notifications notification 'Adagio 2.6 JustLevels 14072 GAZR-3.16 Account lot hasn't been calculated' sent to '81F75BFF,A5B6B51F'
2016.03.14 16:55:13.895 Notifications notification 'Adagio 2.6 JustLevels 14072 SBRF-3.16 Automated trading by SBRF-3.16 has been suspended due to incorrect server response Equity: 25010.00 RUR Halt time: 2016.03.14 18:44:59' sent to '81F75BFF,A5B6B51F'
2016.03.14 16:55:13.940 Notifications notification 'Adagio 2.6 JustLevels 14072 GAZR-3.16 Automated trading by GAZR-3.16 has been suspended due to incorrect server response Equity: 25010.00 RUR Halt time: 2016.03.14 18:44:59' sent to '81F75BFF,A5B6B51F'
2016.03.14 16:55:14.034 Trades '14072': modify buy 2.00 GAZR-3.16 sl: 14160, tp: 15082 -> sl: 14160, tp: 121660 done in 426 ms
2016.03.14 16:55:15.624 Notifications notification 'Adagio 2.6 JustLevels 14072 GAZR-3.16 Automated trading by GAZR-3.16 Has been renewed at: 2016.03.14 18:54:17 Equity: 25010.00 RUR' sent to '81F75BFF,A5B6B51F'
2016.03.14 16:55:15.669 Notifications notification 'Adagio 2.6 JustLevels 14072 SBRF-3.16 Automated trading by SBRF-3.16 Has been renewed at: 2016.03.14 18:54:17 Equity: 25010.00 RUR' sent to '81F75BFF,A5B6B51F'
2016.03.14 16:56:06.419 Virtual Hosting flush logs command received
2016.03.14 17:03:56.118 Terminal '14072': 6 charts, 6 EAs, 0 custom indicators, last known ping to Access Server II is 3.63 ms
В какой-то момент клиринга сервер выдает нулевые значения и защита от деления на ноль приостанавливает работу робота. Менее чем через секунду работа возобновляется, однако в период приостановки эксперта была осуществлена модификация стопов:
2016.03.14 16:55:14.034 Trades '14072': modify buy 2.00 GAZR-3.16 sl: 14160, tp: 15082 -> sl: 14160, tp: 121660 done in 426 ms
Однако запрос на модификацию был послан раньше:
2016.03.14 16:55:13.608 Trades '14072': modify buy 2.00 GAZR-3.16 sl: 14160, tp: 15082 -> sl: 14160, tp: 121660
В результате значение take-profit было установлено 121660:
Я сразу понял, что произошло. Поскольку в существующих настройках отношение TP/SL=8.5, то 121660/8.5= 14312.94 - что соответствует цене контракта. В текущих настройках был использован стоп на основе индикатора ParabolicSAR, при этом в качестве величины стопа берется абсолютная величина разницы между ценой и значением индикатора и если получено нулевое значение индикатора, что, по всей вероятности, и произошло, то эта разница будет равна цене.
Для исключения подобных ошибок модифицировал два модуля - запретил модификацию стопов во время приостановки работы робота и ввел проверку, что значение индикатора больше нуля. Добавилось 4 строки кода - теперь их 7587 в 57 модулях.
Сама позиция тоже порадовала - после прохождения порога активации вновь началась модификация стопов и take-profit был установлен в нормальное значение:
2016.03.14 19:36:21.663 Trades '14072': modify buy 2.00 GAZR-3.16 sl: 14160, tp: 121660 -> sl: 14446, tp: 14979
2016.03.14 19:36:21.671 Trades '14072': modify buy 2.00 GAZR-3.16 sl: 14160, tp: 121660 -> sl: 14446, tp: 14979 done in 8 ms
А в 21.54 по Москве позиция была закрыта по следящему стопу:
2016.03.14 19:51:34.972 Trades '14072': modify buy 2.00 GAZR-3.16 sl: 14462, tp: 14953 -> sl: 14462, tp: 14954 done in 7 ms
2016.03.14 19:54:22.849 Trades '14072': deal #22910574 sell 2.00 GAZR-3.16 at 14462 done (based on order #30627834)
2016.03.14 20:03:56.868 Terminal '14072': 6 charts, 6 EAs, 0 custom indicators, last known ping to Access Server II is 3.59 ms
2016.03.14 20:55:42.685 Virtual Hosting flush logs command received