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

 

Cari utenti di MQL5.

Attualmente sto riscontrando alcuni problemi di esecuzione di ordini multipli con il mio EA ma solo per un broker specifico.

Il mio EA funziona perfettamente in strategy tester. Funziona anche con altri broker in modalità live trading.

Con un broker specifico, il mio EA a volte spesso 10 ordini della stessa dimensione allo stesso tempo.

Sembra che il problema sia causato dalla comunicazione tra broker e terminale.

Di seguito è riportato il mio codice attuale e il codice attuale controlla 10 volte se l'ordine viene eseguito.

Se l'EA riceve retcode==10009 o retcode==10008 subito dopo che l'ordine è stato inviato, allora il ciclo si fermerà e verrà aperto solo 1 ordine. Questo è un caso ideale e un buon scenario di lavoro.

Tuttavia può aprire 10 ordini della stessa dimensione se il terminale non riceve retcode==10009 o retcode==10008 immediatamente dopo l'invio dell'ordine. Ho sentito che anche altre persone stanno riscontrando lo stesso problema.

Come posso fermare questo problema di inserimento di ordini multipli.

Qualsiasi suggerimento sarà molto apprezzato.

Cordiali saluti.

   for(int i=0;i<10;i++)
   {
     
      volume=NormalizeDouble(volume, lotDigit);
      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=DoubleToString(Money,2)+"$";
     
      if(!OrderCheck(request,check))
      {
         if(check.margin_level<100) volume-=SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_STEP);
         Print("OrderCheck Code: ",check.retcode);
         continue;
      }
     
     
      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;
      }
     
     

      Sleep(1000);
   }
  

 

 
FinanceEngineer:

Cari utenti di MQL5.

Attualmente sto riscontrando alcuni problemi di esecuzione di ordini multipli con il mio EA ma solo per un broker specifico.

Il mio EA funziona perfettamente in strategy tester. Funziona anche con altri broker in modalità live trading.

Con un broker specifico, il mio EA a volte spesso 10 ordini della stessa dimensione allo stesso tempo.

Sembra che il problema sia causato dalla comunicazione tra broker e terminale.

Di seguito è riportato il mio codice attuale e il codice attuale controlla 10 volte se l'ordine viene eseguito.

Se l'EA riceve retcode==10009 o retcode==10008 subito dopo che l'ordine è stato inviato, allora il ciclo si fermerà e verrà aperto solo 1 ordine. Questo è un caso ideale e un buon scenario di lavoro.

Tuttaviapuò aprire 10 ordini della stessa dimensione se il terminale non riceve retcode==10009 o retcode==10008 immediatamente dopo l'invio dell'ordine. Ho sentito che anche altre persone stanno riscontrando lo stesso problema.

Come posso fermare questo problema di inserimento di ordini multipli.

Qualsiasi suggerimento sarà molto apprezzato.

Cordiali saluti.

Quale codice hai ricevuto quando ha aperto 10 ordini?

Forum sul trading, sistemi di trading automatizzati e strategie di trading di prova


Si prega di utilizzare il pulsante SRC quando si invia il codice. Grazie.




 
angevoyageur:

Quale codice hai ricevuto quando apre 10 ordini?

Ciao

Ho ricevuto il retcode==10008 per ogni ordine. L'ha ripetuto per 10 volte. Cordiali saluti.


 


   for(int i=0;i<10;i++)
   {
      
      volume=NormalizeDouble(volume, lotDigit);
      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=DoubleToString(Money,2)+"$";
      
      if(!OrderCheck(request,check))
      {
         if(check.margin_level<100) volume-=SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_STEP);
         Print("OrderCheck Code: ",check.retcode);
         continue;
      }
      
      
      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;
      }
      
      

      Sleep(1000);
   }
   

 
 
FinanceEngineer:

Ciao

Ho ricevuto il retcode==10008 per ogni ordine. L'ha ripetuto per 10 volte. Cordiali saluti.

Non lo ripete nello stesso ciclo allora, visto che hai una pausa qui:

      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;
      }

Puoi postare i log dei tuoi esperti per confermare?

Prima di questo ciclo dovresti avere un PositionSelect(Symbol()) ?

 
angevoyageur:

Allora non lo ripete nello stesso ciclo, perché hai una pausa qui:

Puoi postare i log dei tuoi esperti per confermare?

Prima di questo ciclo dovresti avere un PositionSelect(Symbol())?

Sì, naturalmente. Ecco i log degli esperti.

PF 0 00:00:02.348 EA_v (EURJPY,H1) OrderSend Code: 10008
CE 0 00:00:03.520 EA_v (EURJPY,H1) OrderSend Code: 10008
DI 0 00:00:04.692 EA_v (EURJPY,H1) OrderSend Code: 10008
FL 0 00:00:05.864 EA_v (EURJPY,H1) OrderSend Code: 10008
HS 0 00:00:07.020 EA_v (EURJPY,H1) Codice OrdineInvio: 10008
PF 0 00:00:08.177 EA_v (EURJPY,H1) OrderSend Code: 10008
QJ 0 00:00:09.348 EA_v (EURJPY,H1) Codice OrdineInvio: 10008
KI 0 00:00:10.489 EA_v (EURJPY,H1) Codice OrdineInvio: 10008
HL 0 00:00:11.630 EA_v (EURJPY,H1) Codice OrdineInvio: 10008

QS 0 00:00:12.786 EA_v (EURJPY,H1) OrderSend Code: 10008

Anche la tua ipotesi è giusta. Ho usato PositionSelect(Symbol()) prima di questo codice per controllare il volume della posizione corrente.

Cordiali saluti.

 
FinanceEngineer:

Sì, certo, ecco i registri degli esperti.

PF 0 00:00:02.348 EA_v (EURJPY,H1) OrderSend Code: 10008
CE 0 00:00:03.520 EA_v (EURJPY,H1) OrderSend Code: 10008
DI 0 00:00:04.692 EA_v (EURJPY,H1) OrderSend Code: 10008
FL 0 00:00:05.864 EA_v (EURJPY,H1) OrderSend Code: 10008
HS 0 00:00:07.020 EA_v (EURJPY,H1) Codice OrdineInvio: 10008
PF 0 00:00:08.177 EA_v (EURJPY,H1) OrderSend Code: 10008
QJ 0 00:00:09.348 EA_v (EURJPY,H1) Codice OrdineInvio: 10008
KI 0 00:00:10.489 EA_v (EURJPY,H1) Codice OrdineInvio: 10008
HL 0 00:00:11.630 EA_v (EURJPY,H1) Codice OrdineInvio: 10008

QS 0 00:00:12.786 EA_v (EURJPY,H1) OrderSend Code: 10008

Anche la tua ipotesi è giusta. Ho usato PositionSelect(Symbol()) prima di questo codice per controllare il volume della posizione corrente.

Cordiali saluti.

Ok, allora è proprio lo stesso problema di cui stiamo parlando in alcuni topic. PositionSelect() viene aggiornato dal database locale del terminale, e i tick arrivano troppo rapidamente perché questo possa essere aggiornato. Sleep() non è un metodo affidabile, devi trovare un workaround per essere sicuro che la tua posizione sia aperta prima di inviare un nuovo ordine.

Forum sul trading, sistemi di trading automatizzati e test di strategie di trading

Il mio EA fa una doppia entrata

doshur, 2013.12.21 03:21

Mi ricordo di qualcuno che ha avuto lo stesso problema e utilizzare xxxx.

Non sono riuscito a trovare quel thread, se qualcuno può aiutarmi sarebbe un grande grazie...


 
angevoyageur:

Ok, allora è proprio lo stesso problema di cui si parla in alcuni topic. PositionSelect() viene aggiornato dal database locale del terminale, e i tick arrivano troppo rapidamente perché questo possa essere aggiornato. Sleep() non è un metodo affidabile, devi trovare un workaround per essere sicuro che la tua posizione sia aperta prima di inviare un nuovo ordine.

Capisco. Grazie mille. Se PositionSelect() non funziona, che ne dici di limitare l'ordine usando PositionsTotal()? PositionsTotal() è aggiornato dal database del Broker?

 
FinanceEngineer:

Capisco. Grazie mille. Se PositionSelect() non funziona, che ne dite di limitare l'ordine usando PositionsTotal()? PositionsTotal() è aggiornato dal database del Broker?

Non credo, ma puoi provare e farci sapere.
 
angevoyageur:
Non credo, ma puoi provare e farci sapere.
Certo che lo farò. Saluti.
 

Ciao

Qualcuno ha trovato una soluzione funzionante a questo problema?

È frustrante avere più ordini eseguiti quando si hanno controlli adeguati.

Non ha senso avere PositionSelect aggiornato da un database locale quando tutte le esecuzioni di trade avvengono su un server broker remoto.

Credo che questo dovrebbe essere affrontato nelle future versioni di build.

Per favore, pubblica la tua soluzione.

Grazie,

 
BlindMist:

Forum sul trading, sistemi di trading automatizzati e strategie di trading di prova

Problema di inserimento di ordini multipli per un conto live con un broker specifico

BlindMist, 2014.05.15 02:00

Ciao

Qualcuno ha trovato una soluzione funzionante a questo problema?

È frustrante avere ordini multipli eseguiti quando si hanno controlli adeguati.

Non ha senso avere PositionSelect aggiornato da un database locale quando tutte le esecuzioni degli scambi avvengono su un server remoto del broker.

Credo che questo dovrebbe essere affrontato nelle future versioni di build.

Per favore pubblica la tua soluzione.

Grazie,

CiaoBlindMist, ha senso controllare il tuo database locale per verificare se il tuo account è sincronizzato con il server del broker.

Per favore dai un'occhiata al post suggerito per affrontare questo problema.

Motivazione: