MQL5ユーザーの皆様へ。
現在、私のEAで特定のブローカーに対してのみ、複数注文が実行 される問題が発生しています。
私のEAはstrategy testerでは完璧に動作します。また、ライブ取引モードでは他のブローカーでも動作します。
あるブローカーでは、同じサイズの注文が同時に10件も出ることがあります。
ブローカーとターミナル間の通信に問題があるようです。
以下は私の現在のコードで、注文が実行されたかどうかを10回チェックするコードです。
もしEAが注文送信直後にretcode==10009またはretcode==10008を受信したら、ループは停止し、1つの注文だけが開かれることになります。これは理想的なケースであり、良い作業シナリオです。
しかし、注文送信直後にretcode==10009またはretcode==10008を受信しなかった場合、同じサイズの注文を10 件開くことができます。 他の人も同じ問題を経験していると聞いています。
どうしたら、この複数注文を止めることができるでしょうか。
何か提案があれば、本当に感謝します。
よろしくお願いします。
10個の注文を出すとき、どのコードを受け取りましたか?
10件の注文を開始したときに受け取ったコードは何ですか?
こんにちは。
注文のたびにretcode==10008を受け取りました。それを10回繰り返しました。 よろしくお願いします。
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); }
こんにちは
注文のたびにretcode==10008が表示されました。10回ほど繰り返しました。 よろしくお願いします。
ここで一区切りしているので、同じループで繰り返されることはありません。
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; }
確認のため、エキスパートのログを投稿していただけませんか?
このループの前にPositionSelect(Symbol())があるはずなのですが?
同じループで繰り返されるわけではありません。
確認のため、エキスパートのログを投稿していただけますか?
このループの前にPositionSelect(Symbol())があるはずなのですが?
はい、もちろんです。以下はエキスパートのログです。
QS 0 00:00:12.786 EA_v (EURJPY,H1) OrderSend Code:10008
また、あなたの推測は正しいです。このコードの前にPositionSelect(Symbol())を使って、現在のポジションの出来高を確認 しました。
よろしくお願いします。
もちろんです。 エキスパートのログはこちらです。
QS 0 00:00:12.786 EA_v (EURJPY,H1) OrderSend Code:10008
また、あなたの推測は正しいです。このコードの前にPositionSelect(Symbol())を使って、現在のポジションの出来高を確認しました。
よろしくお願いします。
なるほど、いくつかのトピックで話しているのと同じ問題ですね。PositionSelect()は端末のローカルデータベースから更新されるのですが、ティックがあまりに早く来るので更新が追いつきません。Sleep()は信頼できる方法ではないので、新しい注文を送る前にポジションがオープンであることを確認する回避策を見つけなければなりません。
doshur, 2013.12.21 03:21
同じ問題でxxxxを使っている人がいたのを覚えています。
私はそのスレッドを見つけることができませんでした、誰かが私を助けることができれば、それは大きな感謝になります...
なるほど、いくつかのトピックで話しているのと同じ問題ですね。PositionSelect()は端末のローカルデータベースから更新されるのですが、ティックがあまりにも速く来るので、これが更新されないのです。Sleep()は信頼できる方法ではないので、新しい注文を送る前にポジションがオープンであることを確認する回避策を見つけなければなりません。
なるほど。 どうもありがとうございます。PositionSelect()がうまくいかない場合、PositionsTotal() を使って注文を制限するのはどうでしょうか?PositionsTotal()は、ブローカーのデータベースから更新されるのですか?
なるほど。 どうもありがとうございます。PositionSelect()がうまくいかない場合、PositionsTotal() を使って注文を制限するのはどうでしょうか?PositionsTotal()は、ブローカーのデータベースから更新されるのですか?
私はそうは思わないが、試してみて教えてほしい。
BlindMist さん、あなたのアカウントがブローカーサーバーと同期しているかどうかを確認するために、ローカルデータベースをチェックすることは理にかなっています。
この問題に対処するための提案されたポストを ご覧ください。
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
MQL5ユーザーの皆様へ。
現在、私のEAで特定のブローカーに対してのみ、複数注文が実行 される問題が発生しています。
私のEAはstrategy testerでは完璧に動作します。また、ライブ取引モードでは他のブローカーでも動作します。
あるブローカーでは、同じサイズの注文が同時に10件も出ることがあります。
ブローカーとターミナル間の通信に問題があるようです。
以下は私の現在のコードで、注文が実行されたかどうかを10回チェックするコードです。
もしEAが注文送信直後にretcode==10009またはretcode==10008を受信したら、ループは停止し、1つの注文だけが開かれることになります。これは理想的なケースであり、良い作業シナリオです。
しかし、注文送信直後にretcode==10009またはretcode==10008を受信しなかった場合、同じサイズの注文を10件開くことができます。 他の人も同じ問題を経験していると聞いています。
どうしたら、この複数注文を止めることができるでしょうか。
何か提案があれば、本当に感謝します。
よろしくお願いします。
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);
}