Ошибки при модификации ордера.

 
Сюда перенесены вопросы из "Ошибки, баги, вопросы".
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Alix11, 2016.01.28 10:13

Приветствую всех!

Вот какая проблемка. Есть советник(прикрепляю), который модифицирует отложенный байлимит ордер. Когда пишу его в таймере, то выдает ошибку - вот такую -

2016.01.28 13:07:36.063 Trades : failed modify order #9296101 buy limit 1.00  at 1.08990 sl: 0.00000 tp: 0.00000 -> 1.09000, sl: 0.00000 tp: 0.00000 [Invalid request]
2016.01.28 13:07:36.050 Trades : failed modify order #9296101 buy limit 1.00  at 1.08990 sl: 0.00000 tp: 0.00000 -> 1.09000, sl: 0.00000 tp: 0.00000 [Invalid request]
2016.01.28 13:07:36.050 Trades : modify order #9296101 buy limit 1.00 ED-3.16 at 1.0899 sl: 0.0000 tp: 0.0000 -> 1.0900, sl: 0.0000 tp: 0.0000 placed for execution in 36 ms
2016.01.28 13:07:36.013 Trades : modify order #9296101 buy limit 1.00 ED-3.16 at 1.0899 sl: 0.0000 tp: 0.0000 -> 1.0900, sl: 0.0000 tp: 0.0000

То есть после первой успешной модификации, идет модификация на ту же цену, но уже почему то пятизначную(котировки в терминале четырехзначные).

А вот когда делаю советника в тике, то все отлично работает - без ошибок проходит модификация. Но мне нужно именно в таймере чтоб он был. Подскажите, пожалуйста, как сделать, чтоб и в таймере было без ошибок.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Alix11, 2016.01.28 12:18

Спасибо. Но symbol_info.NormalizePrice - это то же самое, что и NormilizeDouble. Пробовал и им тоже - все равно ошибка есть.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Karputov Vladimir, 2016.01.28 12:30

Вы зачем терминал терзаете каждую миллисекунду?

...
EventSetMillisecondTimer(1);
...

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Alix11, 2016.01.28 12:33

Я ставлю условие, чтоб сов не модифицировал на ту же самую цену - if (OrderGetDouble(ORDER_PRICE_OPEN) != (opb)) - только тогда разрешена модификация. Но почему то в таймере сов этого не понимает и после успешной модификации производит еще одну - со старой цены на уже произошедшую цену

2016.01.28 13:07:36.050 Trades : failed modify order #9296101 buy limit 1.00  at 1.08990 sl: 0.00000 tp: 0.00000 -> 1.09000, sl: 0.00000 tp: 0.00000 [Invalid request]
2016.01.28 13:07:36.050 Trades : modify order #9296101 buy limit 1.00 ED-3.16 at 1.0899 sl: 0.0000 tp: 0.0000 -> 1.0900, sl: 0.0000 tp: 0.0000 placed for execution in 36 ms

Видно, что цена была 1.0899 - прошла модификация на 1.0900, и после этого уже попытка с прошедшей уже цены 1.08990(уже пятизнак почему то) опять же на 1.09000.


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Alix11, 2016.01.28 12:35

В итоге каждые 20мс получается. Ну так задумано-то. Но  у меня же запрет на модификацию на ту же цену.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Alix11, 2016.01.28 13:30

Таймер поставил 200 - нормально модифицировать начал советник - за это спасибо большое. Только вот проблема другая - на демо счете все отлично, а вот как только перехожу на реал того же брокера, то опять же ошибку выдает. Разве это уже проблемы советника? Разве не сам брокер виноват?

Сделал - не помогает. И самое интересное, что на реале ордер устанавливается, потом ошибка модификации - и ордер просто исчезает.

2016.01.28 16:42:11.489 Trades : failed modify order #9138610 buy limit 1.00  at 0.99200 sl: 0.00000 tp: 0.00000 -> 1.08210, sl: 0.00000 tp: 0.00000 [Invalid request]
2016.01.28 16:42:11.489 Trades : buy limit 1.00 RTSEDH6 at 0.9920 placed for execution in 73 ms
2016.01.28 16:42:11.416 Trades : buy limit 1.00 RTSEDH6 at 0.9920

Вот после Invalid request - ордер исчезает из терминала, как будто его кто-то удалил, но в журнале никаких записей.


 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Karputov Vladimir, 2016.01.28 14:58

Это не то. Для проверки не мешает проверять цену, которая оправляется:

         if(OrderGetDouble(ORDER_PRICE_OPEN)!=(opb))
           {
            Print("Bid=",Bid,"; BUYLIMIT ORDER_PRICE_OPEN=",OrderGetDouble(ORDER_PRICE_OPEN),"; opb=",opb);
            g=trade.OrderModify(tiket,opb,0,0,ORDER_TIME_DAY,expiration);
           }

 Результат Вас поразит.


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Alix11, 2016.01.28 15:04

И это сделал - но тут уже вообще чудеса начинаются - после установки просто удаляется байлимит ордер. Убрал функцию модификации - оставил только установку ордера - ставится ордер и тут же удаляется.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Alix11, 2016.01.28 15:08

Нет, тут уже моя вина - ставлю отступ от цены бид слишком большим - уменьшил и нормально ставится

2016.01.28 18:22:52.561 BUYLIMIT(Modif) (RTSEDH6,M1) CTrade::OrderSend: modify #9141101 at 1.08710 (sl: 0.00000 tp: 0.00000) [invalid request]
2016.01.28 18:22:52.561 BUYLIMIT(Modif) (RTSEDH6,M1) Bid=1.0921; BUYLIMIT ORDER_PRICE_OPEN=1.0869; opb=1.0871
2016.01.28 18:22:52.358 BUYLIMIT(Modif) (RTSEDH6,M1) Bid=1.0921; BUYLIMIT ORDER_PRICE_OPEN=1.0869; opb=1.0871

Вот лог.


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Alix11, 2016.01.28 15:44

2016.01.28 18:42:46.236 BUYLIMIT(Modif) (RTSEDH6,M1) Метод OrderModify() потерпел неудачу. Код возврата=10013. Описание кода: invalid request
2016.01.28 18:42:46.236 BUYLIMIT(Modif) (RTSEDH6,M1) CTrade::OrderSend: modify #9142254 at 1.08780 (sl: 0.00000 tp: 0.00000) [invalid request]
2016.01.28 18:42:46.236 BUYLIMIT(Modif) (RTSEDH6,M1) Bid=1.0928; BUYLIMIT ORDER_PRICE_OPEN=1.0879; opb=1.0878
2016.01.28 18:42:46.098 BUYLIMIT(Modif) (RTSEDH6,M1) Метод OrderModify() выполнен успешно. Код возврата=10008 (placed)
2016.01.28 18:42:46.031 BUYLIMIT(Modif) (RTSEDH6,M1) Bid=1.0928; BUYLIMIT ORDER_PRICE_OPEN=1.0879; opb=1.0878
2016.01.28 18:22:52.358 BUYLIMIT(Modif) (RTSEDH6,M1) Bid=1.0921; BUYLIMIT ORDER_PRICE_OPEN=1.0869; opb=1.0871

Так?


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Alix11, 2016.01.28 15:47

 Мне кажется, что вроде бы цена ордера BUYLIMIT ORDER_PRICE_OPEN и opb отличаются тогда, когда модификация уже произошла, и поэтому происходит попытка еще одной модификации, что и вызывает ошибку. 

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Karputov Vladimir, 2016.01.28 15:50

"Если кажется, нужно проверять" - поговорка программиста.

Вставьте счётчик заходов и принтуйте его до кучи. 


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Alix11, 2016.01.28 15:53

Вот этого я не смогу - я только начал программировать, так что не представляю как это сделать. Может, Вы вставите этот счетчик в код советника.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Karputov Vladimir, 2016.01.28 16:01

В первой строке функции добавить:

static int counter;
counter ++;

 

А в цикле, где Вы принтуете, выводите значение "counter". Таким образом если Вы в один заход в таймере попытаетесь более одного раза модифицировать ордер, это будет видно.


 
Karputov Vladimir:



2016.01.28 19:12:26.060 BUYLIMIT(Modif) (RTSEDH6,M1) Bid=1.0935; BUYLIMIT ORDER_PRICE_OPEN=1.0835; opb=1.0885
2016.01.28 19:12:26.051 BUYLIMIT(Modif) (RTSEDH6,M1) Метод OrderModify() потерпел неудачу. Код возврата=10013. Описание кода: invalid request
2016.01.28 19:12:26.051 BUYLIMIT(Modif) (RTSEDH6,M1) CTrade::OrderSend: modify #9143981 at 1.08900 (sl: 0.00000 tp: 0.00000) [invalid request]
2016.01.28 19:12:26.051 BUYLIMIT(Modif) (RTSEDH6,M1) counter=4
2016.01.28 19:12:26.051 BUYLIMIT(Modif) (RTSEDH6,M1) Bid=1.094; BUYLIMIT ORDER_PRICE_OPEN=1.0835; opb=1.089
2016.01.28 19:12:25.762 BUYLIMIT(Modif) (RTSEDH6,M1) Метод OrderModify() выполнен успешно. Код возврата=10008 (placed)
2016.01.28 19:12:25.687 BUYLIMIT(Modif) (RTSEDH6,M1) counter=3

Как я понимаю, в каждый заход в таймере по одному разу модифицируется ордер. Только один раз успешно, а другой нет.
 
2016.01.28 19:20:27.620 BUYLIMIT(Modif) (RTSEDH6,M1) Bid=1.0949; BUYLIMIT ORDER_PRICE_OPEN=1.0898; opb=1.0899
2016.01.28 19:20:26.925 BUYLIMIT(Modif) (RTSEDH6,M1) Метод OrderModify() выполнен успешно. Код возврата=10009 (done)
2016.01.28 19:20:26.639 BUYLIMIT(Modif) (RTSEDH6,M1) counter=13
2016.01.28 19:20:26.639 BUYLIMIT(Modif) (RTSEDH6,M1) Bid=1.0948; BUYLIMIT ORDER_PRICE_OPEN=1.0899; opb=1.0898
2016.01.28 19:20:26.624 BUYLIMIT(Modif) (RTSEDH6,M1) Метод OrderModify() выполнен успешно. Код возврата=10009 (done)
2016.01.28 19:20:26.335 BUYLIMIT(Modif) (RTSEDH6,M1) counter=12
2016.01.28 19:20:26.335 BUYLIMIT(Modif) (RTSEDH6,M1) Bid=1.0949; BUYLIMIT ORDER_PRICE_OPEN=1.0898; opb=1.0899
2016.01.28 19:20:26.014 BUYLIMIT(Modif) (RTSEDH6,M1) Метод OrderModify() выполнен успешно. Код возврата=10009 (done)
2016.01.28 19:20:25.729 BUYLIMIT(Modif) (RTSEDH6,M1) counter=10
А вот как идеально модифицируется на демо счете того же брокера.
 
Alix11:
2016.01.28 19:12:26.060 BUYLIMIT(Modif) (RTSEDH6,M1) Bid=1.0935; BUYLIMIT ORDER_PRICE_OPEN=1.0835; opb=1.0885
2016.01.28 19:12:26.051 BUYLIMIT(Modif) (RTSEDH6,M1) Метод OrderModify() потерпел неудачу. Код возврата=10013. Описание кода: invalid request
2016.01.28 19:12:26.051 BUYLIMIT(Modif) (RTSEDH6,M1) CTrade::OrderSend: modify #9143981 at 1.08900 (sl: 0.00000 tp: 0.00000) [invalid request]
2016.01.28 19:12:26.051 BUYLIMIT(Modif) (RTSEDH6,M1) counter=4
2016.01.28 19:12:26.051 BUYLIMIT(Modif) (RTSEDH6,M1) Bid=1.094; BUYLIMIT ORDER_PRICE_OPEN=1.0835; opb=1.089
2016.01.28 19:12:25.762 BUYLIMIT(Modif) (RTSEDH6,M1) Метод OrderModify() выполнен успешно. Код возврата=10008 (placed)
2016.01.28 19:12:25.687 BUYLIMIT(Modif) (RTSEDH6,M1) counter=3

Как я понимаю, в каждый заход в таймере по одному разу модифицируется ордер. Только один раз успешно, а другой нет.
В общем резюме такое: нефиг не нужно очень часто модифицировать ордер.
 
Alix11:
2016.01.28 19:20:27.620 BUYLIMIT(Modif) (RTSEDH6,M1) Bid=1.0949; BUYLIMIT ORDER_PRICE_OPEN=1.0898; opb=1.0899
2016.01.28 19:20:26.925 BUYLIMIT(Modif) (RTSEDH6,M1) Метод OrderModify() выполнен успешно. Код возврата=10009 (done)
2016.01.28 19:20:26.639 BUYLIMIT(Modif) (RTSEDH6,M1) counter=13
2016.01.28 19:20:26.639 BUYLIMIT(Modif) (RTSEDH6,M1) Bid=1.0948; BUYLIMIT ORDER_PRICE_OPEN=1.0899; opb=1.0898
2016.01.28 19:20:26.624 BUYLIMIT(Modif) (RTSEDH6,M1) Метод OrderModify() выполнен успешно. Код возврата=10009 (done)
2016.01.28 19:20:26.335 BUYLIMIT(Modif) (RTSEDH6,M1) counter=12
2016.01.28 19:20:26.335 BUYLIMIT(Modif) (RTSEDH6,M1) Bid=1.0949; BUYLIMIT ORDER_PRICE_OPEN=1.0898; opb=1.0899
2016.01.28 19:20:26.014 BUYLIMIT(Modif) (RTSEDH6,M1) Метод OrderModify() выполнен успешно. Код возврата=10009 (done)
2016.01.28 19:20:25.729 BUYLIMIT(Modif) (RTSEDH6,M1) counter=10
А вот как идеально модифицируется на демо счете того же брокера.
Чем отличается Код возврата=10009 на демо от Код возврата=10008 на реале?
 
Karputov Vladimir:
В общем резюме такое: нефиг не нужно очень часто модифицировать ордер.
Так на МТ4 по тикам спокойно модифицируется и на пятизнаке без проблем. А тут на четырехзнаке и по тикам не получается, что ли?
 

2016.01.28 20:35:05.059 Trades : modify order #9145665 buy limit 1.00 RTSEDH6 at 1.0914 sl: 0.0000 tp: 0.0000 -> 1.0913, sl: 0.0000 tp: 0.0000 placed for execution in 66 ms
2016.01.28 20:35:04.993 Trades : modify order #9145665 buy limit 1.00 RTSEDH6 at 1.0914 sl: 0.0000 tp: 0.0000 -> 1.0913, sl: 0.0000 tp: 0.0000
2016.01.28 20:35:04.045 Trades : modify order #9145664 buy limit 1.00 RTSEDH6 at 1.0913 sl: 0.0000 tp: 0.0000 -> 1.0914, sl: 0.0000 tp: 0.0000 placed for execution in 65 ms
2016.01.28 20:35:03.980 Trades : modify order #9145664 buy limit 1.00 RTSEDH6 at 1.0913 sl: 0.0000 tp: 0.0000 -> 1.0914, sl: 0.0000 tp: 0.0000
2016.01.28 20:35:02.020 Trades : modify order #9145661 buy limit 1.00 RTSEDH6 at 1.0914 sl: 0.0000 tp: 0.0000 -> 1.0913, sl: 0.0000 tp: 0.0000 placed for execution in 67 ms
2016.01.28 20:35:01.953 Trades : modify order #9145661 buy limit 1.00 RTSEDH6 at 1.0914 sl: 0.0000 tp: 0.0000 -> 1.0913, sl: 0.0000 tp: 0.0000
2016.01.28 20:34:47.822 Trades : modify order #9145660 buy limit 1.00 RTSEDH6 at 1.0913 sl: 0.0000 tp: 0.0000 -> 1.0914, sl: 0.0000 tp: 0.0000 placed for execution in 65 ms
2016.01.28 20:34:47.757 Trades : modify order #9145660 buy limit 1.00 RTSEDH6 at 1.0913 sl: 0.0000 tp: 0.0000 -> 1.0914, sl: 0.0000 tp: 0.0000

Вот это успешная модификация ордера на реале при таймере равном 1000. Ну вроде нормально все, как кажется, - редко модифицирую - и успешно. Но ведь вот загвоздка - при каждой модификации ордер в терминале исчезает и снова появляется. Тогда при чем здесь с какой частотой я модифицирую, если вылезает такой косяк?