Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
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
То есть после первой успешной модификации, идет модификация на ту же цену, но уже почему то пятизначную(котировки в терминале четырехзначные).
А вот когда делаю советника в тике, то все отлично работает - без ошибок проходит модификация. Но мне нужно именно в таймере чтоб он был. Подскажите, пожалуйста, как сделать, чтоб и в таймере было без ошибок.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Vasyl Nosal, 2016.01.28 12:15
NormilizeDouble надо делатьФорум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
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мс получается. Ну так задумано-то. Но у меня же запрет на модификацию на ту же цену.Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Vasyl Nosal, 2016.01.28 13:28
Цену ордера тоже нормализируй.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Alix11, 2016.01.28 13:30
Таймер поставил 200 - нормально модифицировать начал советник - за это спасибо большое. Только вот проблема другая - на демо счете все отлично, а вот как только перехожу на реал того же брокера, то опять же ошибку выдает. Разве это уже проблемы советника? Разве не сам брокер виноват?Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Alix11, 2016.01.28 13:36
Сделал - все равно на реале ошибка - на демо - все ок.Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Vasyl Nosal, 2016.01.28 13:37
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Alix11, 2016.01.28 13:44
Сделал - не помогает. И самое интересное, что на реале ордер устанавливается, потом ошибка модификации - и ордер просто исчезает.
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:11
Установите дополнительную проверку: текущая цена ордера != вашей новой цене ордераФорум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Vasyl Nosal, 2016.01.28 14:21
Там так и есть.Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Karputov Vladimir, 2016.01.28 14:32
Вы путаете текущую рыночную цену символа и цену ордера.Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Vasyl Nosal, 2016.01.28 14:53
if (OrderGetDouble(ORDER_PRICE_OPEN) != (opb))Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
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
Нет, тут уже моя вина - ставлю отступ от цены бид слишком большим - уменьшил и нормально ставитсяФорум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Alix11, 2016.01.28 15:24
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
Вот лог.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Karputov Vladimir, 2016.01.28 15:34
А проверьте-ка результат выполнения торгового запроса:
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
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". Таким образом если Вы в один заход в таймере попытаетесь более одного раза модифицировать ордер, это будет видно.
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: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
А вот как идеально модифицируется на демо счете того же брокера.
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
А вот как идеально модифицируется на демо счете того же брокера.
В общем резюме такое: нефиг не нужно очень часто модифицировать ордер.
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. Ну вроде нормально все, как кажется, - редко модифицирую - и успешно. Но ведь вот загвоздка - при каждой модификации ордер в терминале исчезает и снова появляется. Тогда при чем здесь с какой частотой я модифицирую, если вылезает такой косяк?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования