![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
могу ли я спросить, PositionSelect() проверяет клиентскую сторону или сторону сервера?
У меня есть сильное ощущение, что проблема вызвана задержкой, когда сервер (сторона брокера) обрабатывает запрос и не обновляет клиентскую сторону, поэтому PositionSelect() запускается снова.
Я действительно чувствую, что нет никакой разницы, когда мы используем cTrade против MqlTradeRequest, и функция Sleep должна помочь задержать все, чтобы наша клиентская сторона была "обновлена" до того, как PositionSelect() будет запущен снова, вызывая двойную запись. Проверяю на вкладке журнала, >2013.12.20 08:35:00 Trades '800****': exchange buy 0.01 EURUSD at market placed for execution in 313 ms <
если ставить сон более 400, то это должно быть безопасно?
Что вы думаете?
"У меня сильное чувство, что проблема вызвана задержкой, когда сервер (сторона брокера) обрабатывает запрос и не обновляет клиентскую сторону, поэтому PositionSelect() запускается снова"
Я также думаю, что это и есть причина двойной записи. В моем коде теоретически невозможно отправить новый ордер, если размер текущей позиции равен или больше максимально допустимого размера позиции, поэтому когда PositionSelect() не получает вовремя статус текущей позиции, мой советник снова отправляет новый ордер.
"Постановка sleep более 400 должна быть безопасной????"
Чем больше временной интервал, тем лучше, но есть проблема. Если вы разворачиваете позицию в два этапа (LONG в SHORT или SHORT в LONG), эта дополнительная временная задержка может стать причиной плохой цены исполнения, особенно во время макроэкономического события.
"У меня есть сильное ощущение, что проблема вызвана задержкой, когда сервер (сторона брокера) обрабатывает запрос и не обновляет клиентскую сторону, поэтому PositionSelect() запускается снова"
Я также думаю, что это и есть причина двойной записи. В моем коде теоретически невозможно отправить новый ордер, если размер текущей позиции равен или больше максимально допустимого размера позиции, поэтому когда PositionSelect() не получает вовремя статус текущей позиции, мой советник снова отправляет новый ордер.
"Если ставить sleep больше 400, это должно быть безопасно????"
Чем больше временной интервал, тем лучше, но есть проблема. Если вы разворачиваете позицию в два этапа (LONG в SHORT или SHORT в LONG), эта дополнительная временная задержка может стать причиной плохой цены исполнения, особенно во время макроэкономического события.
Я не знаю, играет ли брокер здесь разную роль, но похоже, что наш брокер один и тот же. Альпари.
С 03-10-2013 у меня была еще 1 двойная запись. Я использую оба метода для отправки заказа. См. мое предыдущее сообщение.
вот что я только что реализовал. надеюсь, это поможет решить проблему
вот что я только что реализовал. надеюсь, это поможет решить проблему
Я думаю, что очень важно найти причину этой проблемы, конечно, также важно иметь обходной путь (Sleep ?), пока мы не сможем полностью понять, что происходит. Итак, я попытаюсь восстановить ситуацию:
Я согласен с snella_moda, что лучшим объяснением является:
I think the problem is the (to slow) execution of the PositionSelect(Symbol()) function. Maybe, the new ticks come in so fast, the EA sends in a new order before it receives a response of the PositionSelect(Symbol()). So the current position size is not calculated properly. In my code, its theoretically impossible to send in a new/double order if the current position size is equal or greater than the max allowed position size, see code.
Но это трудно проверить.
Я думаю, что лучше всего обратиться за советом к Metaquotes. Я попробую это сделать.
Строка о "каждом тике" может быть причиной того, что этого больше не происходит.
Функция выполняется только при появлении нового бара. Поэтому, скорее всего, только первый тик бара может привести к исполнению сделки. После первого бара код получает "возврат" до появления нового бара. Возможно, это решило мою проблему.
Я думаю, что этот кусок кода взят из статей:
Строка о "каждом тике" может быть причиной того, что этого больше не происходит.
Функция выполняется только при появлении нового бара. Поэтому, скорее всего, только первый тик бара может привести к совершению сделки. После первого бара код получает "возврат" до появления нового бара. Возможно, это решило мою проблему.
Я думаю, что этот кусок кода взят из статей:
исправление. Есть двойная"Позиция открыта в..." и 2 сделки были открыты.