Неизбежная 4108

 

Получается, что полностью избежать ошибки 4108 невозможно?

Смотрите:

Что такое OrderSelect() ? Это сперва запрос к серверу, потом ответ от сервера.

То есть, до тех пор, пока будет получено true, пройдет какое-то время.

Потом мы шлем OrderModify(). И это тоже время, пока пакет дойдут до сервера.

Так вот, до момента, пока сервер получит OrderModify(),  цена прыгнет, сработает sl или tp, и ордер закроется.

В результате сервер получит команду на неверный тикет, и справедливо вернет 4108.

В итоге, даже если программист сперва проверил, что данный тикет существует и открыт, нет никакой

гарантии, что советник не выплюнет 4108 !


Поправьте меня, если я что-то неправильно понимаю?

 
Dmitriy Susloparov:

Получается, что полностью избежать ошибки 4108 невозможно?

Смотрите:

Что такое OrderSelect() ? Это сперва запрос к серверу, потом ответ от сервера.

То есть, до тех пор, пока будет получено true, пройдет какое-то время.

Потом мы шлем OrderModify(). И это тоже время, пока пакет дойдут до сервера.

Так вот, до момента, пока сервер получит OrderModify(),  цена прыгнет, сработает sl или tp, и ордер закроется.

В результате сервер получит команду на неверный тикет, и справедливо вернет 4108.

В итоге, даже если программист сперва проверил, что данный тикет существует и открыт, нет никакой

гарантии, что советник не выплюнет 4108 !


Поправьте меня, если я что-то неправильно понимаю?

Конечно не правильно. Вы выбираете ордер, который уже есть в торговом окружении терминала. А торговое окружение вы должны обновить перед выполнением торгового запроса на сервер. Всё это делается за один тик.
 
Artyom Trishkin:
Конечно не правильно. Вы выбираете ордер, который уже есть в торговом окружении терминала. А торговое окружение вы должны обновить перед выполнением торгового запроса на сервер. Всё это делается за один тик.

Артём, это на уровне "очевидное невероятное", но я натыкался на такую проблему даже в тестере.

Даже OrderSelect() выбирает ордер, а в этот момент он уже по стопу\тейку закрылся.

 
Alexey Viktorov:

Артём, это на уровне "очевидное невероятное", но я натыкался на такую проблему даже в тестере.

Даже OrderSelect() выбирает ордер, а в этот момент он уже по стопу\тейку закрылся.

Странно. Ни разу за много-много лет не сталкивался с таким поведением. Может зависит от очерёдности действий?
 
Artyom Trishkin:
Странно. Ни разу за много-много лет не сталкивался с таким поведением. Может зависит от очерёдности действий?

Я не заморачивался над этим. Это такая редкая ситуация, что не стоит над этим ломать свои мозги. Хотя да, возможно от последовательности действий.

 

Функция OrderSelect() не отправляет запрос на сервер. Это всего лишь интерфейс для доступа к элементам списка. Функция отрабатывает практически мгновенно. По крайней мере замерить ее быстродействие еще не удавалось - всегда 0 получался.

 

То то и оно. Если OrderSeklect() берет инфу из терминала, и работает мгновенно, значит он ТОЧНО работает с устаревшими данными.

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

Однако, даже после обновления, торговое окружение отстает от сервера на время пинга.

Пусть OrderSelect() работает мгновенно, но берет данные, которые в принципе не могут бвть

более свежими, чем пинг.

OrderModify() - еще время. В результате у сервера появляется шанс успеть отработать sl или tp.

Как часто оно может быть?

Пока sl или tp далеко, действительно можно не ломать над этим голову.

А если алгоритм намеренно тралит sl настолько близко к рынку, насколько позволяет StopLevel,

чтобы закрыть ордер именно по sl, а не по рынку, тогда 4108 будет.

Пусть не всегда, пусть не часто, но под корень ее не вытравить.

 

а в чём проблема?
получили ошибку - проверили - если ордер закрылся, больше не пытаемся модифицировать ордер

пс. подскажу еще одну "неизбежную" ошибку - если в момент открытия ордера пропадет связь (или наоборот - только появится), то скорее всего у вас откроется Два ордера вместо одного.

 
Taras Slobodyanik:
а в чём проблема?
получили ошибку - проверили - если ордер закрылся, больше не пытаемся модифицировать ордер


Проблема в том, что минимум один раз ошибка все-таки выскочит.

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

Другие ошибки можно предотвратить заранее, если грамотно писать.

А 4108 - особая. Пока ее нет - можно даже ничего о ней и не знать.

Но полностью предотвратить ее появление невозможно в принципе.

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

Строго говоря, каждое обращение к серверу, заставляющее возвращать ошибку - это создание непроизводительного трафика.

А потому даже однократная ошибка - признак криворукости программиста.

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

ни разу не встречал такую ошибку ни на реале, ни на демо.

Про тестер я вообще молчу - идеальнее авто-торговли не бывает ).

Причина обращения: