Исправил ошибку в коде

16 марта 2016, 08:31
Andrey Kotrin
0
152

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

Суть вопроса: 

Вчера 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