Problema dell'inserimento di ordini multipli per un conto live con un broker specifico - pagina 3

 
figurelli:
CiaoFinanceEngineer, forse sarebbe meglio iniziare a controllare il tuo codice originale il problema degli ordini multipli, dato che se lo facciamo probabilmente affronteremo altri punti critici qui e non perderemo il focus, cosa ne pensi?

Ciao figurelli

Questo è il mio nuovo codice. Ho cambiato da quando ho sollevato il problema degli ordini multipli su questo thread.

Finora questo codice funziona bene con diversi broker. Nessun problema di ordine multiplo trovato dopo il cambiamento. BlindMist può provare questo codice per vedere se può evitare il problema di ordine multiplo con quel broker.

for(int i=0;i<10;i++)
   {

      
 
      if(volume<=0.0) break;
      

      if(Type==POSITION_TYPE_SELL)
      {
         request.type=ORDER_TYPE_SELL;
         request.price=SymbolInfoDouble(mSymbol,SYMBOL_BID);
         
         if(TP!=0) takeprofit = request.price-TP*mPoint;
         if(SL!=0) stoploss = request.price+SL*mPoint;
      }
      
      
      if(Type==POSITION_TYPE_BUY)
      {
         request.type=ORDER_TYPE_BUY;
         request.price=SymbolInfoDouble(mSymbol,SYMBOL_ASK);

         if(TP!=0) takeprofit = request.price+TP*mPoint;
         if(SL!=0) stoploss = request.price-SL*mPoint;
      }
      
      
      
      
      request.action          = TRADE_ACTION_DEAL;
      request.symbol        = mSymbol;
      request.volume        = MathMin(volume,SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_MAX));
      request.sl                = stoploss;
      request.tp               = takeprofit;
      request.deviation     = SymbolInfoInteger(mSymbol,SYMBOL_SPREAD);
      request.type_filling   = ORDER_FILLING_FOK;
      request.comment     = strComment;
      request.magic         = EAMagic;
      
      
      
      if(!OrderCheck(request,check))
      {
         if(check.margin_level<100) volume-=SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_STEP);
         Print("OrderCheck Code: ",check.retcode);
         continue;
      }
      

      
      bool checkOrderSend = OrderSend(request, result);
      
      if(result.retcode==10009 || result.retcode==10008)
      { 
          Print("OrderSend was successful. Code: ",result.retcode);
          volume-=result.volume; //If order was successful then reduce volume to 0.0, then the loop will be terminated.

          
          break;
      }
      else
      {
          Print(ResultRetcodeDescription(result.retcode));
      }
      

      Sleep(1000);
      
   }
   

 

 
 
FinanceEngineer:

Ciao figurelli

Questo è il mio nuovo codice. Ho cambiato da quando ho sollevato il problema degli ordini multipli su questo thread.

Finora questo codice funziona bene con diversi broker. BlindMist può provare questo codice per vedere se può evitare il problema dell'ordine multiplo con quel broker.

Si prega di utilizzare il pulsante SRC quando si pubblica il codice.

Il codice che hai postato non può evitare (tutti) i doppi ordini, e al contrario può provocare doppi ordini in alcuni casi.

 
angevoyageur:

Si prega di utilizzare il pulsante SRC quando si pubblica il codice.

Il codice che hai postato non può evitare (tutti) i doppi ordini, e al contrario può provocare doppi ordini in alcuni casi.

Quale sarebbe il modo migliore, se c'è una soluzione là fuori, a parte impostare 10 ore di sonno all'interno del ciclo?
 
FinanceEngineer:

Ciao figurelli

Questo è il mio nuovo codice. Ho cambiato da quando ho sollevato il problema degli ordini multipli su questo thread.

Finora questo codice funziona bene con diversi broker. Nessun problema di ordine multiplo trovato dopo il cambiamento. BlindMist può provare questo codice per vedere se può evitare il problema di ordine multiplo con quel broker.

CiaoFinanceEngineer, nota che nel tuo codice originale hai Print("OrderSend Code: "...) in if { } e else { }.

Ma else { } ha una pausa, e il tuo codice di debug mostra retcode = 10008 (TRADE_RETCODE_PLACED) x 10.

Quindi, per deduzione, stavi stampando il debug della condizione if { } e la tua pausa non è mai stata usata.

if(!OrderSend(request,result) || result.deal==0 )
      {
         Print("OrderSend Code: ",result.retcode);
         if(result.retcode==TRADE_RETCODE_TRADE_DISABLED) break;
         if(result.retcode==TRADE_RETCODE_MARKET_CLOSED) break;
         if(result.retcode==TRADE_RETCODE_NO_MONEY) break;
         if(result.retcode==TRADE_RETCODE_TOO_MANY_REQUESTS) Sleep(5000);
         if(result.retcode==TRADE_RETCODE_FROZEN) break;
         if(result.retcode==TRADE_RETCODE_CONNECTION) Sleep(15000);
         if(result.retcode==TRADE_RETCODE_LIMIT_VOLUME) break;
         
      }
      else if(result.retcode==10009 || result.retcode==10008)
      { 
          Print("OrderSend Code: ",result.retcode);
          volume-=result.volume; //If order was successful then reduce volume to 0.0, then the loop will be terminated.
          
          if(Type == POSITION_TYPE_BUY) {mBuyPositionCnt = mBuyPositionCnt + 1.0; cntLotCalculation = cntLotCalculation + 1;}
          if(Type == POSITION_TYPE_SELL) {mSellPositionCnt = mSellPositionCnt + 1.0; cntLotCalculation = cntLotCalculation + 1;}
          break;
      }

Ora hai cambiato il tuo codice, e sembra più chiaro, ma nota che non testi più il valore di ritorno di OrderSend(), solo il result.retcode. Potresti correggere questo usando la variabile checkOrderSend (*** guarda qui), che ho chiesto prima:

      bool checkOrderSend=OrderSend(request,result);

      if(checkOrderSend) // (*** look here)
        {
         if(result.retcode==10009 || result.retcode==10008)
           {
            Print("OrderSend was successful. Code: ",result.retcode);
            volume-=result.volume; //If order was successful then reduce volume to 0.0, then the loop will be terminated.
            break;
           }
         else
           {
            Print(ResultRetcodeDescription(result.retcode));
           }
        }
      else 
        {
         Print("OrderSend execution error.");
        }

Quindi, a mio parere, la prima cosa da fare è correggere questo test e controllare di nuovo utilizzando lo stesso broker problematico che hai segnalato. Se il problema non si ripete, congratulazioni, hai davvero risolto il bug, cioè, questo non indica che il tuo codice è a prova di futuro o il più sicuro, ma che abbiamo trovato il bug.

In realtà, puoi dimenticare o evitare di cambiare di nuovo il tuo codice, dato che il bug non si verifica più, tuttavia, in questo caso, devi fare attenzione che non stai più testando il valore di ritorno di OrderSend().

Spero che queste informazioni possano aiutarvi.

 
figurelli:

CiaoFinanceEngineer, nota che nel tuo codice originale hai Print("OrderSend Code: "...) in if { } e else { }.

Ma else { } ha una pausa, e il tuo codice di debug mostra retcode = 10008 (TRADE_RETCODE_PLACED) x 10.

Quindi, per deduzione, stavi stampando il debug della condizione if { } e la tua pausa non è mai stata usata.

Ora hai cambiato il tuo codice, e sembra più chiaro, ma nota che non testi più il valore di ritorno di OrderSend(), solo il result.retcode. Potresti correggere questo usando la variabile checkOrderSend (*** guarda qui), di cui ho chiesto prima:

Quindi, a mio parere, la prima cosa da fare è correggere questo test e controllare di nuovo utilizzando lo stesso broker problematico che hai segnalato. Se il problema non si ripete, congratulazioni, hai davvero risolto il bug, cioè, questo non indica che il tuo codice è a prova di futuro o il più sicuro, ma che abbiamo trovato il bug.

In realtà, puoi dimenticare o evitare di cambiare di nuovo il tuo codice, dato che il bug non si verifica più, tuttavia, in questo caso, devi fare attenzione che non stai più testando il valore di ritorno di OrderSend().

Spero che queste informazioni possano aiutarvi.

Che mi dici del codice restituito 10010?

L'ordine a doppia entrata può verificarsi su qualsiasi broker, la probabilità di ottenerlo con Alpari è semplicemente maggiore poiché si ricevono molti più tick.

 
angevoyageur:

E il codice restituito 10010?

L'ordine a doppia entrata può verificarsi su qualsiasi broker, la probabilità di ottenerlo con Alpari è semplicemente maggiore poiché si ricevono molti più tick.

Se lo stai chiedendo a me, come ho detto prima, non considero questo codice a prova di futuro e abbastanza sicuro e questo è solo un esempio della mancanza di codice di ritorno, quindi per favore leggi di nuovo.

Comunque, se stai chiedendo all'autore del codice, che ne dici di chiedere direttamente a lui?

 
figurelli:

CiaoFinanceEngineer, nota che nel tuo codice originale hai Print("OrderSend Code: "...) in if { } e else { }.

Ma else { } ha una pausa, e il tuo codice di debug mostra retcode = 10008 (TRADE_RETCODE_PLACED) x 10.

Quindi, per deduzione, stavi stampando il debug della condizione if { } e la tua pausa non è mai stata usata.

Ora hai cambiato il tuo codice, e sembra più chiaro, ma nota che non testi più il valore di ritorno di OrderSend(), solo il result.retcode. Potresti correggere questo usando la variabile checkOrderSend (*** guarda qui), che ho chiesto prima:

Quindi, a mio parere, la prima cosa da fare è correggere questo test e controllare di nuovo utilizzando lo stesso broker problematico che hai segnalato. Se il problema non si ripete, congratulazioni, hai davvero risolto il bug, cioè, questo non indica che il tuo codice è a prova di futuro o il più sicuro, ma che abbiamo trovato il bug.

In realtà, potete dimenticarvi o evitare di cambiare nuovamente il vostro codice, dato che il bug non si verifica, tuttavia, in questo caso, dovete fare attenzione che non state più testando il valore di ritorno di OrderSend().

Spero che queste informazioni ti possano aiutare.

Ciao

So che sembra strano. Quando ho controllato il valore restituito di OrderSend(request,result) nel codice precedente, ho avuto il problema dell'ordine multiplo. Ora nel mio nuovo codice, non controllo il valore restituito di OrderSend(request,result) ( ma ho ancora assegnato il valore restituito a qualche variabile per evitare l'errore sulla nuova build del terminale.

Con il nuovo codice, non ho problemi di ordini multipli. Ho usato l'Alpari UK che ha la reputazione di inviare un sacco di tick. Il mio codice potrebbe non essere perfetto, ma pensa in questo modo. Ci sono un certo numero di codici restituiti che devono essere controllati in Meta Trader 5.

Il primo è il valore restituito da OrderCheck, il secondo è il valore restituito da OrderSend e il terzo è il valore restituito assegnato a result.retcode. Penso che qualunque siano i primi due valori restituiti, quello che dovrebbe interessarci di più è l'ultimo più l'ammontare del volume effettivamente eseguito.

Quindi, sulla base di questo fatto, ho reso il mio codice più semplice andando direttamente a controllare result.retcode. Per favore correggetemi se mi sbaglio. Penso che l'esecuzione degli ordini in MT5 sia certamente molto più sofisticata di MT4 e molti di noi sono confusi.

Se non possiamo costruire un caso chiaro usando solo la logica, allora possiamo costruire un caso chiaro usando gli esperimenti. Quindi consiglio a BlindMist o a qualsiasi altra persona di provare questo codice con il proprio broker per vedere se saltare il controllo della funzione OrderSend potrebbe essere effettivamente utile.

Cordiali saluti.

 
figurelli:
Se lo stai chiedendo a me, come ho detto prima, non considero questo codice a prova di futuro e abbastanza sicuro e questo è solo un esempio della mancanza di codice di ritorno, quindi per favore leggi di nuovo.

Comunque, se stai chiedendo all'autore del codice, che ne dici di chiedere direttamente a lui?

Ho chiesto a tutti coloro che partecipano a questo argomento. Ho perso il tuo messaggio sul codice 10010, dov'è?

 
angevoyageur:

Ho chiesto a tutti coloro che partecipano a questo argomento. Ho perso il tuo messaggio sul codice 10010, dove si trova?

Ciao Alain,

Non mi è chiaro cosa hai bisogno di sapere, dato che stiamo parlando solo del nuovo codice di FinanceEngineer, e di un consiglio sul test del codice di ritorno di OrderSend() che è stato cambiato dal codice originale.

Nota che sia il suo codice originale che quello nuovo non hanno il test del codice 10010, quindi se è rilevante per te perché non l'hai chiesto dal primo post di lui?

Comunque, puoi spiegare perché avresti bisogno del test del codice 10010 per una polizza di riempimento FOK?

Visto che non è la prima volta che vedo te e altri moderatori parlare, conosci qualche caso in cui è davvero necessario questo test del codice per gli ordini FOK (Fill Or Kill), che potresti condividere con noi?

Grazie in anticipo.

 
FinanceEngineer:

Ciao

So che sembra strano. Quando ho controllato il valore restituito di OrderSend(request,result) nel codice precedente, ho avuto il problema degli ordini multipli. Ora nel mio nuovo codice, non controllo il valore restituito di OrderSend(request,result) ( ma ho ancora assegnato il valore restituito a qualche variabile per evitare l'errore sulla nuova build del terminale.

Con il nuovo codice, non ho problemi di ordini multipli. Ho usato l'Alpari UK che ha la reputazione di inviare un sacco di tick. Il mio codice potrebbe non essere perfetto, ma pensa in questo modo. Ci sono un certo numero di codici restituiti che devono essere controllati in Meta Trader 5.

Il primo è il valore restituito da OrderCheck, il secondo è il valore restituito da OrderSend e il terzo è il valore restituito assegnato a result.retcode. Penso che qualunque siano i primi due valori restituiti, quello che dovrebbe interessarci di più è l'ultimo più l'ammontare del volume effettivamente eseguito.

Quindi, sulla base di questo fatto, ho reso il mio codice più semplice andando direttamente a controllare result.retcode. Per favore correggetemi se mi sbaglio. Penso che l'esecuzione degli ordini in MT5 sia certamente molto più sofisticata di MT4 e molti di noi sono confusi.

Se non possiamo costruire un caso chiaro usando solo la logica, allora possiamo costruire un caso chiaro usando gli esperimenti. Quindi consiglio a BlindMist o a qualsiasi altra persona di provare questo codice con il proprio broker per vedere se saltare il controllo della funzione OrderSend potrebbe essere effettivamente utile.

Cordiali saluti.

  • Saltare il codice di ritorno di OrderSend() è irrilevante per il problema dei doppi ordini. Una semplice coincidenza.
  • Anche OrderCheck() è irrilevante, poiché serve solo a prevenire alcuni errori PRIMA di inviare un ordine.
  • Se OrderSend() restituisce false, si sa che c'è un problema, quindi si può controllare quale e trattarlo secondo le proprie esigenze.
  • Se OrderSend() restituisce true, qui iniziano le difficoltà...vedi il prossimo messaggio.