Allarme: Terminale MT4 che duplica gli ordini inviati dagli esperti - pagina 5

 

Ciao amici:

Mi dispiace di non aver risposto prima: Non ero a conoscenza dei tuoi post perché non ho ricevuto alcuna notifica da Metaquotes. Ho infatti aperto una spunta, come consigliato da RaptorUK, ma non mi hanno mai risposto. Faccio come JamesMadden quando è necessario: Chiudo l'ordine e perdo lo spread. Se non è così rischioso, lo lascio lì! (se il mio EA è redditizio, vincerà più che perdere nel lungo periodo) Tuttavia, ovviamente non mi piace il bug.

Ora sto avendo nuovi problemi con la build 600 e vorrei sapere, se qualcuno lo sa, come si fa a fargli rispondere :)

PD: Come posso fare in modo che questa applicazione web mi mandi un'email quando questo post viene aggiornato? Sono già iscritto all'argomento.

 
Ricardo1:

Ciao amici:

Mi dispiace di non aver risposto prima: Non ero a conoscenza dei tuoi post perché non ho ricevuto alcuna notifica da Metaquotes. Ho infatti aperto una spunta, come consigliato da RaptorUK, ma non mi hanno mai risposto. Faccio come JamesMadden quando è necessario: Chiudo l'ordine e perdo lo spread. Se non è così rischioso, lo lascio lì! (se il mio EA è redditizio, vincerà più che perdere nel lungo periodo) Tuttavia, ovviamente non mi piace il bug.

Ora sto avendo nuovi problemi con la build 600 e mi piacerebbe sapere, se qualcuno lo sa, come si fa a farsi rispondere? :)

quando lo scoprirai fammelo sapere... Ho un ticket aperto da marzo 2013 che non ha mai avuto una risposta. Tutto quello che posso suggerire è di continuare ad aggiungere nuovi commenti ogni volta chiedendo notizie o una risposta.


PD: Come faccio a far sì che questa applicazione web mi mandi una mail quando questo post viene aggiornato? Sono già iscritto all'argomento.

Le notifiche via email non funzionano più da qualche anno. . . forse potresti segnalarlo al Service Desk
 
RaptorUK:
Quando lo scoprirete fatemelo sapere... Ho un ticket aperto da marzo 2013 che non ha mai avuto una risposta. Tutto quello che posso suggerire è di continuare ad aggiungere nuovi commenti ogni volta chiedendo notizie o una risposta.

notifiche e-mail non hanno funzionato per alcuni anni . . . forse si potrebbe segnalare al Service Desk



Ciao,

Ho appena trovato questo topic perché ho cercato esattamente questo problema. Non ho notato il problema prima, ma oggi è successo a me.

A prescindere dal log degli esperti, che come detto prima registra i trade, c'è il diario di MetaTrader che registra tutti i trade fatti, da EA o da persona. Oggi ho trovato un trade nel mio portafoglio che era un duplicato di un trade piazzato solo pochi secondi prima, ma il secondo trade non è apparso nel log degli esperti o nel giornale MetaTrader.

Ho chiesto al mio broker di confrontare i loro log delle richieste in entrata con i trade eseguiti ma ho il sospetto che non tengano i log o che non vogliano indagare.

Se l'EA ha piazzato 2 ordini, mi aspetterei di vederli entrambi nel giornale. Anche se l'applicazione desktop per qualche motivo duplicasse la richiesta, mi aspetterei che il server rispondesse e registrasse la seconda operazione. Sembra più che il trade venga eseguito dal server e non dal client.

Questa è la prima volta che ho notato il problema e non riesco a trovare alcun modo per riprodurre il problema. Gli importi con cui sto lavorando ora sono molto piccoli, quindi il valore non è importante, ma mi preoccupa la fattibilità di MetaTrader.

Ho solo pensato di prestare i miei pensieri a un argomento che è rimasto in sospeso per un po'.

Modifica:

Ho controllato ulteriormente e ho trovato un altro caso. L'ordine era già stato chiuso dallo stop loss quindi non l'ho notato. In entrambi i casi l'EA ha piazzato un ordine atteso. Questo viene mostrato nel diario immediatamente seguito da un messaggio di login che corrisponde all'ordine fantasma che viene piazzato.

Se qualcun altro pensa che si sia verificato un ordine fantasma, controlli il messaggio di login nel diario. Potrebbe essere significativo.

 

Sembra che io non sia l'unico colpito da questo fastidioso problema. Come spikedog, il mio EA ha richiesto un ordine a mercato che ha portato a un'altra entrata duplicata della stessa dimensione del lotto entro pochi millisecondi, il log dell'ordine duplicato è stato mostrato nel Journal ma non nella scheda Experts; da allora ho modificato leggermente il mio codice, sperando di proteggermi meglio da questo problema, filtrando il doppio trade all'interno della stessa barra (trading solo su barre aperte) subito prima di OrderSend().

È la prima volta che ho avuto questo problema di trade duplicato; ho aperto più di 500 trade con 3 broker da allora e nessun problema fino ad ora. Btw, i trade successivi funzionano di nuovo bene.

In allegato c'è il mio codice per elaborare OrderSend() quando si verifica il problema del duplicato. Non riesco a capire come il mio EA sia la causa dell'ordine duplicato. L'unica ragione possibile che mi viene in mente in questo momento è che forse, in rare occasioni, il server stava elaborando il mio OrderSend ma restituisce "-1" in qualche modo e il mio EA procede a fare un'altra richiesta trattando la prima come un requote. Solo la mia semplice speculazione.


            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:

Non vedo come il mio EA sia la causa dell'ordine duplicato.

Potrebbe essere collegato a questo errore nel tuo codice, dovresti correggerlo e testare di nuovo.

                  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() restituisce un int , non un bool, quindi controllare se il valore di ritorno è "true" non è corretto.

 

@Grande Pescatore

B.T.W. che succede con il tuo codice?

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

e ancora?

else break;
 
RaptorUK:

Potrebbe essere collegato a questo errore nel tuo codice, dovresti correggerlo e testare di nuovo.

OrderSend() restituisce un int , non un bool, quindi controllare se il valore di ritorno è "true" non è corretto.


Grazie raptoruk per il suggerimento. Hai ragione :)
 
BigFisherman:

Grazie raptoruk per il suggerimento. Ne sono consapevole. Tuttavia non credo che sia la causa del commercio duplicato perché il codice presentato è valido, anche se un po' confuso.
Come fa il codice ad essere valido? Se OrderSend() funziona ti restituisce un valore maggiore di 0, cioè il numero del biglietto, se fallisce ti restituisce -1, stai testando per vero o falso... correggi il tuo codice e rimuovi l'incertezza.
 
RaptorUK:
Come è valido il codice? Se OrderSend() funziona si ottiene un valore maggiore di 0 restituito, cioè il numero del biglietto, se fallisce si ottiene -1 si sta testando per vero o falso . . . fix your code and remove the uncertainty.



Grazie ancora.

Salute!

 
RaptorUK:
Come è valido il codice? Se OrderSend() funziona ti restituisce un valore maggiore di 0, cioè il numero del biglietto, se fallisce ti restituisce -1, stai testando per vero o falso . . . correggi il tuo codice e togli l'incertezza.


Ciao RaptorUK,



Ho una domanda che non riguarda esattamente l'argomento di questo thread, ma spero di usare il mio post precedente come esempio per approfondire la mia comprensione della codifica di mql4 e forse può anche aiutare altri principianti come me (se pensi che sia fuori tema e ha bisogno di un nuovo thread, per favore cancella questo e fammi sapere).

All'inizio ero un po' confuso sul mio modo iniziale di dichiarare Buy_Ticket come bool piuttosto che int, così ho fatto ulteriori test su di esso. Anche se sono d'accordo che il mio modo originale di leggere OrderSend() come bool non è un buon modo di codificare (confonde), ma il mio test mostra che è valido. Per renderlo più semplice per la lettura, ho codificato quanto segue, per favore consigliate e grazie per il vostro tempo.


P.S.: Come consigliato, ho già modificato il mio EA per leggere OrderSend() come 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);
}
//+------------------------------------------------------------------+


Giornale

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