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?
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 ); }
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?
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.
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.
Evet elbette. İşte uzmanların günlükleri.
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
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...
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?
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.
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,
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.
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
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);
}