Belirli bir komisyoncu ile gerçek hesap için Çoklu Sipariş Girişi Sorunu

Young Ho Seo  

Sevgili MQL5 kullanıcıları.

Şu anda EA'mda, ancak yalnızca belirli bir komisyoncu için bazı çoklu sipariş yürütme sorunları yaşıyorum.

My EA, strateji test cihazında mükemmel çalışıyor. Ayrıca canlı ticaret modunda diğer brokerlerle de çalışır.

Belirli bir komisyoncu ile, EA'm bazen aynı anda aynı boyutta 10 sipariş.

Sorunun komisyoncular ve terminal arasındaki iletişimden kaynaklandığı görülüyor.

Aşağıda mevcut kodum var ve mevcut kod, siparişin yürütülüp yürütülmediğini 10 kez kontrol ediyor.

EA, sipariş gönderildikten hemen sonra retcode==10009 veya retcode==10008 alırsa, döngü durur ve yalnızca 1 sipariş açılır. Bu ideal bir durum ve iyi bir çalışma senaryosu.

Ancak, sipariş gönderildikten hemen sonra terminal retcode==10009 veya retcode==10008 almazsa aynı boyutta 10 siparişi açabilir. Başkalarının da aynı sorunları yaşadığını duydum.

Bu çoklu sipariş girişi sorununu nasıl durdurabilirim.

Herhangi bir öneri gerçekten takdir edilecektir.

Saygılarımla.

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

 

Alain Verleyen  
FinanceEngineer :

Sevgili MQL5 kullanıcıları.

Şu anda EA'mda, ancak yalnızca belirli bir komisyoncu için bazı çoklu sipariş yürütme sorunları yaşıyorum.

My EA, strateji test cihazında mükemmel çalışıyor. Ayrıca canlı ticaret modunda diğer brokerlerle de çalışır.

Belirli bir komisyoncu ile, EA'm bazen aynı anda aynı boyutta 10 sipariş.

Sorunun komisyoncular ve terminal arasındaki iletişimden kaynaklandığı görülüyor.

Aşağıda mevcut kodum var ve mevcut kod, siparişin yürütülüp yürütülmediğini 10 kez kontrol ediyor.

EA, sipariş gönderildikten hemen sonra retcode==10009 veya retcode==10008 alırsa, döngü durur ve yalnızca 1 sipariş açılır. Bu ideal bir durum ve iyi bir çalışma senaryosu.

Ancak, sipariş gönderildikten hemen sonra terminal retcode==10009 veya retcode==10008 almazsa aynı boyutta 10 siparişi açabilir . Başkalarının da aynı sorunları yaşadığını duydum.

Bu çoklu sipariş girişi sorununu nasıl durdurabilirim.

Herhangi bir öneri gerçekten takdir edilecektir.

Saygılarımla.

10 sipariş açıldığında hangi kodu aldınız?

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum


Lütfen kod gönderirken SRC butonunu kullanın. Teşekkür ederim.




Young Ho Seo  
angevoyageur :

10 sipariş açıldığında hangi kodu aldınız?

Merhaba

Her sipariş için retcode==10008 aldım. 10 defa tekrarladı. Saygılarımla.


 


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

 
Alain Verleyen  
FinanceEngineer :

Merhaba

Her sipariş için retcode==10008 aldım. 10 defa tekrarladı. Saygılarımla.

Burada bir ara verdiğiniz için aynı döngüde tekrar etmez:

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

Onaylamak için uzman günlüklerinizi gönderebilir misiniz?

Bu döngüden önce bir PositionSelect(Symbol())'e sahip olmalısınız?

Young Ho Seo  
angevoyageur :

Burada bir ara verdiğiniz için aynı döngüde tekrar etmez:

Onaylamak için uzman günlüklerinizi gönderebilir misiniz?

Bu döngüden önce bir PositionSelect(Symbol())'a sahip olmalısınız?

Evet elbette. İşte uzmanların günlükleri.

PF 0 00:00:02.348 EA_v (EURJPY,H1) SiparişGönder Kodu: 10008
CE 0 00:00:03.520 EA_v (EURJPY,H1) SiparişGönder Kodu: 10008
DI 0 00:00:04.692 EA_v (EURJPY,H1) SiparişGönder Kodu: 10008
FL 0 00:00:05.864 EA_v (EURJPY,H1) SiparişGönder Kodu: 10008
HS 0 00:00:07.020 EA_v (EURJPY,H1) SiparişGönder Kodu: 10008
PF 0 00:00:08.177 EA_v (EURJPY,H1) SiparişGönder Kodu: 10008
QJ 0 00:00:09.348 EA_v (EURJPY,H1) SiparişGönder Kodu: 10008
KI 0 00:00:10.489 EA_v (EURJPY,H1) SiparişGönder Kodu: 10008
HL 0 00:00:11.630 EA_v (EURJPY,H1) SiparişGönder Kodu: 10008

QS 0 00:00:12.786 EA_v (EURJPY,H1) SiparişGönder Kodu: 10008

Ayrıca tahminin doğru. Mevcut pozisyonun hacmini kontrol etmek için bu koddan önce PositionSelect(Symbol()) kullandım.

Saygılarımla.

Alain Verleyen  
FinanceEngineer :

Evet elbette. İşte uzmanların günlükleri.

PF 0 00:00:02.348 EA_v (EURJPY,H1) SiparişGönder Kodu: 10008
CE 0 00:00:03.520 EA_v (EURJPY,H1) SiparişGönder Kodu: 10008
DI 0 00:00:04.692 EA_v (EURJPY,H1) SiparişGönder Kodu: 10008
FL 0 00:00:05.864 EA_v (EURJPY,H1) SiparişGönder Kodu: 10008
HS 0 00:00:07.020 EA_v (EURJPY,H1) SiparişGönder Kodu: 10008
PF 0 00:00:08.177 EA_v (EURJPY,H1) SiparişGönder Kodu: 10008
QJ 0 00:00:09.348 EA_v (EURJPY,H1) SiparişGönder Kodu: 10008
KI 0 00:00:10.489 EA_v (EURJPY,H1) SiparişGönder Kodu: 10008
HL 0 00:00:11.630 EA_v (EURJPY,H1) SiparişGönder Kodu: 10008

QS 0 00:00:12.786 EA_v (EURJPY,H1) SiparişGönder Kodu: 10008

Ayrıca tahminin doğru. Mevcut pozisyonun hacmini kontrol etmek için bu koddan önce PositionSelect(Symbol()) kullandım.

Saygılarımla.

Tamam, bu yüzden bazı konularda konuştuğumuz aynı problem. PositionSelect(), terminalin yerel veritabanından güncellenir ve onay işaretleri, bunun güncellenmesi için çok hızlı gelir. Sleep() güvenilir bir yöntem değildir, yeni bir emir göndermeden önce pozisyonunuzun açık olduğundan emin olmak için bir geçici çözüm bulmanız gerekir.

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

EA'm çift giriş yapıyor

doşur , 2013.12.21 03:21

Aynı sorunu yaşayan ve xxxx kullanan birini hatırlıyorum.

Konuyu bulamadım, yardımcı olabilecek varsa çok teşekkurler...


Young Ho Seo  
angevoyageur :

Tamam, bu yüzden bazı konularda konuştuğumuz aynı problem. PositionSelect(), terminalin yerel veritabanından güncellenir ve onay işaretleri, bunun güncellenmesi için çok hızlı gelir. Sleep() güvenilir bir yöntem değildir, yeni bir emir göndermeden önce pozisyonunuzun açık olduğundan emin olmak için bir geçici çözüm bulmanız gerekir.

Anlıyorum. Çok teşekkürler. PositionSelect() çalışmıyorsa, PositionsTotal() kullanarak sıralamayı sınırlamaya ne dersiniz? PositionsTotal(), Broker'ın veritabanından güncellendi mi?

Alain Verleyen  
FinanceEngineer :

Anlıyorum. Çok teşekkürler. PositionSelect() çalışmıyorsa, PositionsTotal() kullanarak sıralamayı sınırlamaya ne dersiniz? PositionsTotal(), Broker'ın veritabanından güncellendi mi?

Sanmıyorum ama deneyip haber verebilirsiniz.
Young Ho Seo  
angevoyageur :
Sanmıyorum ama deneyip haber verebilirsiniz.
Emin ol yapacağım. Saygılarımızla.
Sergei Krupich  

Merhaba

Bu soruna çalışan bir çözüm bulan var mı?

Uygun kontrollere sahip olduğunuzda birden fazla siparişin yürütülmesi sinir bozucu.

Tüm ticari işlemler uzak bir komisyoncu sunucusunda gerçekleştiğinde, PositionSelect'in yerel bir veritabanından güncellenmesi mantıklı değildir.

Bunun gelecekteki derleme sürümlerinde ele alınması gerektiğine inanıyorum.

Lütfen çözümünüzü gönderin.

Teşekkür ederim,

Rodrigo Malacarne  
BlindMist :

siparişin yürütülmesi sinir bozucu.

Tüm ticari işlemler uzak bir aracı sunucusunda gerçekleştiğinde, PositionSelect'in yerel bir veritabanından güncellenmesi mantıklı değildir.

Bunun gelecekteki derleme sürümlerinde ele alınması gerektiğine inanıyorum.

Lütfen çözümünüzü gönderin.

Teşekkür ederim,

Merhaba BlindMist , hesabınızın aracı sunucusuyla senkronize olup olmadığını doğrulamak için yerel veritabanınızı kontrol etmeniz mantıklıdır .

Lütfen bu sorunu çözmek için önerilen gönderiye bir göz atın.

Neden: