Мой эксперт выполняет двойную запись - страница 9

 

Привет

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

См. код:

#include <Trade\Trade.mqh>

//--- global variables
CTrade trade;
bool position_opened=false;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   bool conditions_to_open;
   ENUM_ORDER_TYPE order_type;
   double lot;
   double price,sl,tp;

//---...set variables

//--- inside OnTick()
   if(conditions_to_open && !position_opened) //-- Or position_opened==false
     {
      if(trade.PositionOpen(_Symbol,order_type,lot,price,sl,tp,"comment")
         && 
         (trade.ResultRetcode()==10009 || trade.ResultRetcode()==10008)) //-- Or others condition according to your needs
        {
         //--- set the global variable to true to avoid duplicate orders
         position_opened=true;
         Print("Success!");
        }
      else
        {
         Print("Error = ",GetLastError(), "trade error = ", trade.ResultRetcode());
         //--- Sets the global variable to false
         // position_opened=false;                                         //-- Not needed as position_opened is already false
         return;
        }

     }
//--- 
  }


Но что если ваш советник разворачивает позицию: из LONG в SHORT или наоборот, и это действие выполняется в двух разных сделках?

После первой сделки булево "position_opened" устанавливается в "TRUE", и советник не может открыть вторую сделку, потому что проверяется условие"if(conditions_to_open && !position_opened)", поэтому вторая сделка будет заблокирована.

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


В итоге, если говорить "коротко", вам всегда нужна функция PositionSelect(Symbol()) для расчета КРУГЛОГО размера позиции, и именно с этого началась вся проблема (и эта тема на форуме).

В критический момент, когда советник вызывает PositionSelect(Symbol()), терминал еще не обновил размер КУРРЕНТНОЙ позиции, и советник работает с неправильным размером позиции и посылает новый двойной ордер на торговый сервер.


Я думаю, что подход из(figurelli) лучше, потому что вы вынуждены ждать, пока советник обновит функцию PositionSelect(Symbol()) до правильного размера позиции.


bool fatalError=false; // atention: declare this as global

....

if(fatalError == false) 
      {
      if(m_Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, LotSize, Price, 0, 0)) 
            {
            Print("Position opened in ", Symbol());
            int maxTimeout=0;
            while(!PositionSelect(Symbol())) 
                     {
                     Sleep(100);
                     maxTimeout++;
                     if(maxTimeout > 100) 
                           {
                           Print("### PositionSelect fatal error!");
                           fatalError = true;
                           break;
                           }
                     }
            Print("--> PositionSelect delay=",maxTimeout * 100);
            break;
            }
      }
 
snelle_moda:

Привет

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

См. код:


Но что если ваш советник разворачивает позицию: из LONG в SHORT или наоборот, и это действие выполняется в двух разных сделках?

После первой сделки булево "position_opened" устанавливается в "TRUE", и советник не может открыть вторую сделку, потому что проверяется условие"if(conditions_to_open && !position_opened)", поэтому вторая сделка будет заблокирована.

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


В итоге, если говорить "коротко", вам всегда нужна функция PositionSelect(Symbol()) для расчета КРУГЛОГО размера позиции, и именно с этого началась вся проблема (и эта тема на форуме).

В критический момент, когда советник вызывает PositionSelect(Symbol()), терминал еще не обновил размер КУРРЕНТНОЙ позиции, и советник работает с неправильным размером позиции и посылает новый двойной ордер на торговый сервер.


Я думаю, что подход из(figurelli) лучше, потому что вы вынуждены ждать, пока советник обновит функцию PositionSelect(Symbol()).


Вы правы, оба подхода имеют свои ограничения.

Теперь источник этой проблемы четко определен. Каждый должен адаптировать свой код в зависимости от своей стратегии. Я не думаю, что существует общий метод, который можно применить во всех случаях.

 
Нужна ли нам библиотека OrderSendReliable() для великого и могучего mql5?
 
Ubzen:
Нужна ли нам библиотека OrderSendReliable() для великого и могучего mql5?
Я не думаю, что сарказм может быть полезен. Хотя это явно плохой дизайн, который приводит к такой сложности.
 
angevoyageur:

Вы правы, оба подхода имеют свои ограничения.

Теперь происхождение этого вопроса определено четко. Каждый должен адаптировать свой код в зависимости от своей стратегии. Я не думаю, что существует общий метод, который может быть применим во всех случаях.


Или нам придется ждать "официального заявления" от самих ребят из Metaquotes.

Есть ли уже ответ от службы поддержки?

 
angevoyageur: Я не думаю, что сарказм может быть полезен. Хотя это явно плохой дизайн, который приводит к такой сложности.

Если бы я согласился с вами, вы бы посчитали это бесполезным? .

Я просто учил, что решение Sleeping until Terminating Trading напомнило мне OrderSendReliable(). Я учил, что это можно было бы решить более элегантно.

Это также напоминает мне обработку old_documents ... где идет { и вся торговля должна быть остановлена }.

В любом случае, извините, я не хотел придираться к mql5.

 
snelle_moda:


Или нам придется ждать "официального заявления" от самих ребят из Metaquotes.

Есть ли уже ответ от службы поддержки?

Нет. Я как раз думал об этом... Возможно, было бы полезно, если бы все заинтересованные люди написали тикет в ServiceDesk по этому вопросу. Однако я очень скептически отношусь к тому, что MQ захочет изменить этот дизайн. Но мы можем попробовать.

Люди могут написать в ServiceDesk и сообщить номер тикета здесь. Мой

Ошибки, MetaTrader 5 MQL, Открыть, Начать: 2013.12.23 19:08, #916435
Get in touch with developers using Service Desk!
Get in touch with developers using Service Desk!
  • www.mql5.com
We therefore attach great importance to all user reports about issues in our programs and try to answer each one of them.
 
Ubzen:

Если бы я согласился с вами, вы бы посчитали это бесполезным?

Я просто учил, что решение Sleeping until Terminating Trading напомнило мне OrderSendReliable(). Я учил, что это можно было бы решить более элегантно.

Это также напоминает мне обработку old_documents ... где идет { и вся торговля должна быть остановлена }.

В любом случае, извините, я не хотел придираться к mql5.

Интересно, не может ли подобная проблема существовать и в mql4, я читал по крайней мере 2 темы за последние месяцы на форуме mql4 от пользователей, которые жаловались на двойные сделки. Не уверен, что это связано, но может быть стоит проверить эти темы. Вы тоже читаете эти темы?
 
angevoyageur: Интересно, не может ли подобная проблема существовать и в mql4, я читал по крайней мере 2 темы за последние месяцы на форуме mql4 от пользователей, которые жаловались на двойные сделки. Не уверен, что это связано, но может быть стоит проверить эти темы. Вы тоже читаете эти темы?

Да, но трудно сказать, связано ли это с плохим кодированием. Двойная торговля была проблемой еще до появления темы о множественной торговле. Традиционно с ней справляется snelle_moda.

 
Ubzen:

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

Не уверен, что понимаю, что вы имеете в виду. Проблема, о которой мы говорим в этой теме, вызвана не плохим кодированием, а плохим дизайном в mql5 (это мое мнение, а может это просто ошибка?). Что вы имеете в виду под "несколькими торговыми потоками"?
Get in touch with developers using Service Desk!
Get in touch with developers using Service Desk!
  • www.mql5.com
We therefore attach great importance to all user reports about issues in our programs and try to answer each one of them.