Предупреждение: терминал MT4 дублирует ордера, отправленные экспертами - страница 5

 

Привет друзья!

Извините, что не ответил раньше: Я не знал о ваших сообщениях, потому что не получал уведомления от Metaquotes. Я действительно открыл тикет, как рекомендовал RaptorUK, но они так и не ответили на него. Я делаю то же самое, что и JamesMadden, когда это необходимо: Я просто закрываю ордер и теряю спред. Если это не так рискованно, я просто оставляю его там! (если мой советник прибыльный, то в долгосрочной перспективе он больше выиграет, чем потеряет) Однако, конечно, мне не нравится этот баг.

Сейчас у меня новые проблемы с билдом 600 и я хотел бы узнать, если кто-то знает, как заставить их ответить? :)

PD: Как мне заставить это веб-приложение отправлять мне электронное письмо, когда это сообщение обновляется? Я уже подписан на эту тему.

 
Ricardo1:

Привет друзья!

Извините, что не ответил раньше: Я не знал о ваших сообщениях, потому что не получал уведомления от Metaquotes. Я действительно открыл тикет, как рекомендовал RaptorUK, но они так и не ответили на него. Я делаю то же самое, что и JamesMadden, когда это необходимо: Я просто закрываю ордер и теряю спред. Если это не так рискованно, я просто оставляю его там! (если мой советник прибыльный, то в долгосрочной перспективе он больше выиграет, чем проиграет) Однако, конечно, мне не нравится этот баг.

Сейчас у меня новые проблемы с билдом 600, и я хотел бы узнать, если кто-то знает, как заставить их ответить? :)

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


PD: Как мне заставить это веб-приложение отправлять мне электронное письмо, когда это сообщение обновляется? Я уже подписан на эту тему.

Уведомления по электронной почте не работают уже несколько лет... возможно, вы могли бы сообщить об этом в службу поддержки.
 
RaptorUK:
Когда вы это обнаружите, дайте мне знать... У меня есть открытый тикет от марта 2013 года, на который так и не было ответа. Все, что я могу предложить, это продолжать добавлять новые комментарии, каждый раз спрашивая о новостях или ответе.

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


.


Здравствуйте,

Я только что нашел эту тему, потому что искал именно эту проблему. Раньше я не замечал этой проблемы, но сегодня она возникла.

Помимо журнала экспертов, который, как уже упоминалось, записывает сделки, есть журнал MetaTrader, который записывает все сделки, совершенные советником или человеком. Сегодня я обнаружил в своем портфеле сделку, которая была дубликатом сделки, размещенной всего несколькими секундами ранее, но вторая сделка не появилась ни в журнале экспертов, ни в журнале MetaTrader.

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

Если бы советник действительно разместил 2 ордера, я бы ожидал увидеть оба в журнале. Даже если настольное приложение по какой-то причине продублировало запрос, я бы ожидал, что сервер ответит и зарегистрирует вторую сделку. Похоже, что сделка выполняется с сервера, а не с клиента.

Это первый раз, когда я заметил эту проблему, и я не могу найти способ воспроизвести ее. Суммы, с которыми я сейчас работаю, очень малы, поэтому значение не так важно, но это вызывает опасения по поводу жизнеспособности MetaTrader.

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

Редактировать:

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

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

 

Похоже, я не единственный, кто страдает от этой раздражающей проблемы. Как и spikedog, мой советник запросил рыночный ордер, который привел к еще одной дублированной записи с тем же размером лота в течение миллисекунд, журнал дублированных ордеров был показан в журнале, но не на вкладке Experts; с тех пор я немного изменил свои коды, чтобы, надеюсь, лучше защититься от этой проблемы путем фильтрации двойной торговли в пределах одного бара (торговля только на открытии бара) прямо перед OrderSend().

Это первый раз, когда я столкнулся с этой проблемой дублирования сделок; с тех пор я открыл более 500 сделок у 3 брокеров, и до сих пор никаких проблем не возникало. При этом последующие сделки снова работают нормально.

В приложении мой код для обработки OrderSend(), когда происходит проблема дублирования. Я не могу понять, как мой советник может быть причиной дублирования ордеров. Единственная возможная причина, о которой я могу сейчас думать, это, возможно, очень редкий случай, когда сервер обрабатывает мой OrderSend, но возвращает "-1", и мой советник делает еще один запрос, рассматривая первый как реквот. Это всего лишь мое предположение.


            bool Buy_Ticket = false;
            while(Buy_Ticket==false){     //Loop to solve Requote issues
               for(int BT_count=0; BT_count < RequoteTries; BT_count++){
                  if (!IsTradeAllowed()) Sleep(RequoteTries_WaitingTime);
                  RefreshRates();

                  int B_Spread = MarketInfo(Symbol(), MODE_SPREAD);  //TO CAPTURE EXACT SPREAD UPON BUY ORDER FOR SL
                  Buy_Ticket = OrderSend(Symbol(),0,order_lotsize,Ask,Slippage,0,0,EntryCode_comment,Magic,0,Blue) > 0;

               
                  if (Buy_Ticket==true){     //Modify to give SL & TP if new buy order executed
                     for(int buyMod=0; buyMod < OrdersTotal(); buyMod++){
                        if (OrderSelect(buyMod,SELECT_BY_POS,MODE_TRADES)){
                           if ((OrderSymbol()!=Symbol()) || (OrderType()!=OP_BUY)) continue;
                           if ((OrderStopLoss()==0) && (OrderTakeProfit()==0)){
                              double B_SL = NormalizeDouble((OrderOpenPrice()-((B_Spread*Point)+stoploss)),Digits);
                              double B_TP = NormalizeDouble((OrderOpenPrice()+takeprofit),Digits);

                              bool buy_ModSL_succeed = false;
                              while(buy_ModSL_succeed==false){     //Loop to solve SL+TP modify Requote issues   
                                 for(int buyMod_count=0; buyMod_count < RequoteTries; buyMod_count++){
                                    if (!IsTradeAllowed()) Sleep(5000);
                                    RefreshRates();                                 
                                    if (OrderModify(OrderTicket(), OrderOpenPrice(), B_SL, B_TP, 0, Red)==false) continue;
                                    buy_ModSL_succeed = true;
                                    Print(entrycode_txt," initiated Long trade successfully modified SL & TP.");
                                    break;                        
                                 }  //End FOR loop for requote handling
                                 if (buy_ModSL_succeed == false){
                                    getError = GetLastError();
                                    Alert("Error: ",getError," in Buy order#:",OrderTicket()," modify for SL:",B_SL," & TP:",B_TP," after ",RequoteTries," attempts.");
                                    break;
                                 }
                              }  //End WHILE loop for SL+TP modify requote handling
                           }  //End IF statement to select new orders without SL & TP
                        }  //End IF orderselect
                     }  //End FOR loop to modify new orders without SL & TP 
                  }  //End IF statement when buy order accepted & need SL+TP modify

                  if (Buy_Ticket==false) continue;
                  else break;
               }  //----------------------------//End FOR loop to carry out ordersend for buy trade when requote
               if (Buy_Ticket==false) break;    //Exit WHILE loop to handle Requote issues, fail to buy
            }  //-------------------------------//End WHILE loop to solve Requote issues
 
BigFisherman:

Я не могу понять, как мой советник является причиной дублирования ордера.

Это может быть связано с этой ошибкой в вашем коде, вы должны исправить ее и протестировать снова. ...

                  Buy_Ticket = OrderSend(Symbol(),0,order_lotsize,Ask,Slippage,0,0,EntryCode_comment,Magic,0,Blue) > 0;

               
                  if (Buy_Ticket==true){     //Modify to give SL & TP if new buy order executed

OrderSend() возвращает int , а не bool, поэтому проверка, является ли возвращаемое значение "true", некорректна.

 

@BigFisherman

B.T.W что происходит с вашим кодом?

if (Buy_Ticket==true){     //Modify to give SL & TP if new buy order executed
if (Buy_Ticket==false) continue;

и снова?

else break;
 
RaptorUK:

Это может быть связано с этой ошибкой в вашем коде, вы должны исправить ее и протестировать снова. ...

OrderSend() возвращает int , а не bool, поэтому проверка того, что возвращаемое значение равно "true", некорректна.


Спасибо raptoruk за предложение. Вы правы :)
 
BigFisherman:

Спасибо raptoruk за предложение. Я знаю об этом. Однако я не думаю, что это причина дублирующейся торговли, потому что представленный код действителен, хотя и немного запутан.
Как код является корректным? Если OrderSend() работает, вы получаете значение больше 0, т.е. номер билета, если он не работает, вы получаете -1, вы тестируете на истину или ложь ... исправьте свой код и устраните неопределенность.
 
RaptorUK:
Как код действителен? Если OrderSend() работает, вы получаете значение больше 0, т.е. номер билета, если он не работает, вы получаете -1 Вы тестируете на true или false ... исправьте свой код и уберите неопределенность.



Еще раз спасибо.

Ваше здоровье!

 
RaptorUK:
Как код является действительным? Если OrderSend() работает, вы получаете значение больше 0, т.е. номер билета, если он не работает, вы получаете -1, вы тестируете на истину или ложь ... исправьте свой код и уберите неопределенность.


Привет RaptorUK,



У меня вопрос не совсем по теме этой темы, но я надеюсь использовать мое предыдущее сообщение в качестве примера, чтобы углубить мое понимание кодирования mql4 и, возможно, помочь другим новичкам, как я (если вы считаете, что это не по теме и требует новой темы, пожалуйста, удалите эту и дайте мне знать).

Сначала я был немного смущен своим первоначальным способом объявления Buy_Ticket как bool, а не int, поэтому я провел дальнейшие тесты. Хотя я согласен, что мой первоначальный способ чтения OrderSend() как bool не является хорошим способом кодирования (запутанный), но мой тест показывает, что он верен. Чтобы упростить чтение, я сделал следующее, пожалуйста, посоветуйте и спасибо за ваше время.


P.S.: Как и советовали, я уже модифицировал своего эксперта, чтобы он читал OrderSend() как int.



//+------------------------------------------------------------------+
//|                                                    Test_Bool.mq4 |
//|                                     Copyright 2014, BigFisherman |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, BigFisherman"

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
{
//---
   
   for (int SimRun=0; SimRun<3; SimRun++){
      bool Buy_Ticket = 0;
      int Ordersend = 0;            //AS AN EXAMPLE TO SIMULATE OrderSend() RETURNED CODE

      switch (SimRun)
      {
         case 0: break;             //FOR Ordersend==0
         case 1:
         {
            Ordersend = 1;          //SIMULATE SUCCESSFUL ORDERSEND() RETURNING TICKET NO. > 0
            break;
         }
         case 2:
         {
            Ordersend = -1;         //SIMULATE FAILED ORDERSEND() RETURNING "-1"
            break;
         }
      }
      
      
      // (MY ORIGINAL WAY OF CODING)   Buy_Ticket = OrderSend(Symbol(),0,order_lotsize,Ask,Slippage,0,0,EntryCode_comment,Magic,0,Blue) > 0;
      Buy_Ticket = Ordersend > 0;   //SIMPLIFIED CODE FOR EASIER READING
      
      
      if (Buy_Ticket==true){
         Print("** Buy_Ticket returns true  **  SimRun: "+SimRun+"  Ordersend: "+Ordersend+"  Buy_Ticket: "+Buy_Ticket);
      }
      else{                         //if (Buy_Ticket==false)
         Print("** Buy_Ticket returns false **  SimRun: "+SimRun+"  Ordersend: "+Ordersend+"  Buy_Ticket: "+Buy_Ticket);
      }
   }
   return(0);
}
//+------------------------------------------------------------------+


Журнал

2014.03.30 12:57:31.223 2014.03.25 23:30  Test_Bool AUDJPY,M30: ** Buy_Ticket returns false **  SimRun: 0  Ordersend: 0  Buy_Ticket: 0
2014.03.30 12:57:31.223 2014.03.25 23:30  Test_Bool AUDJPY,M30: ** Buy_Ticket returns true  **  SimRun: 1  Ordersend: 1  Buy_Ticket: 1
2014.03.30 12:57:31.223 2014.03.25 23:30  Test_Bool AUDJPY,M30: ** Buy_Ticket returns false **  SimRun: 2  Ordersend: -1  Buy_Ticket: 0