К содержимому
Форекс
на автомате

Таймаут на OrderSend, повтор, и у меня две позиции вместо одной

Bormotun7с 11.2022
Автор разборов
33сообщения
Автор темы#1
Мне, с моими лимитами на всё, странно такое писать, но наступил. MT5, хеджинговый счёт, советник открывает одну позицию по сигналу. Во вторник в 16:30 OrderSend вернул 10012, запрос отменён по таймауту. Моя обёртка считает неудачей всё, кроме «исполнено», и повторяет до трёх раз с паузой 300 мс. Второй запрос прошёл. А через пару секунд в терминале две позиции: первый запрос, оказывается, тоже исполнился на сервере, просто ответ до терминала вовремя не дошёл.
Вторую позицию закрыл руками, потерял немного на спреде, но сам факт неприятный. Лимит на число заявок у меня есть, а правила «не отправлять повтор, пока не ясно, что стало с первой» не было.
Как вы проверяете перед повтором? Ждёте OnTradeTransaction, лезете в историю, что-то ещё?
armen_72с 07.2021
Испытатель
13сообщений
#2
Я перед любым повтором после неясного ответа делаю сверку: нет ли уже позиции или сделки с моей меткой. Метку ставлю в комментарий заявки, уникальную на каждый сигнал, плюс мэджик. Сначала открытые позиции:
Код:
bool AlreadyOpened(const string tag, const long magic) { for(int i = PositionsTotal() - 1; i >= 0; i--) { if(PositionGetTicket(i) == 0) continue; if(PositionGetInteger(POSITION_MAGIC) == magic && PositionGetString(POSITION_COMMENT) == tag) return true; } return false; }
потом через HistorySelect за последние минуты сделки с той же меткой, на случай если позиция успела закрыться. Перед сверкой жду пару секунд, событие от сервера может прийти позже, чем вернулся таймаут. Если и через 5 секунд ничего нет, только тогда повтор, и один, не три.
spartakс 07.2023
Первый прогон
4сообщения
#3
Комментарий как метка ненадёжен: один мой брокер обрезал его до 16 символов, другой переписывал своим. Я храню метку в файле вместе с тикетом.
Bormotun7с 11.2022
Автор разборов
33сообщения
Автор темы#4
Переписал обёртку, коды возврата теперь делю на три группы:
- повторяю сразу с новой ценой, не больше двух раз: 10004 реквот, 10020 цена изменилась, 10021 нет котировок;
- без сверки не повторяю никогда: 10012 таймаут, 10031 нет связи и любой ответ, после которого непонятно, дошла ли заявка;
- остальное считаю отказом, вход пропускается с записью в журнал.
Метку сигнала храню в файле, как spartak. И пока есть неразобранная заявка, новая по символу не уходит. Неделю на демо, дублей нет.
Продолжить обсуждение

Для ответа войдите в свой аккаунт.

Войти
← Предыдущая темаСледующая тема →