特定のブローカーのライブ口座における複数注文入力の問題

 

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

 

 
FinanceEngineer:

MQL5ユーザーの皆様へ。

現在、私のEAで特定のブローカーに対してのみ、複数注文が実行 される問題が発生しています。

私のEAはstrategy testerでは完璧に動作します。また、ライブ取引モードでは他のブローカーでも動作します。

あるブローカーでは、同じサイズの注文が同時に10件も出ることがあります。

ブローカーとターミナル間の通信に問題があるようです。

以下は私の現在のコードで、注文が実行されたかどうかを10回チェックするコードです。

もしEAが注文送信直後にretcode==10009またはretcode==10008を受信したら、ループは停止し、1つの注文だけが開かれることになります。これは理想的なケースであり、良い作業シナリオです。

しかし、注文送信直後にretcode==10009またはretcode==10008を受信しなかった場合、同じサイズの注文を10 件開くことができます。 他の人も同じ問題を経験していると聞いています。

どうしたら、この複数注文を止めることができるでしょうか。

何か提案があれば、本当に感謝します。

よろしくお願いします。

10個の注文を出すとき、どのコードを受け取りましたか?

取引、自動取引システム、取引戦略のテストに関するフォーラム


コードを投稿する際は、SRCボタンを 使用してください。ありがとうございます。




 
angevoyageur:

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

 
 
FinanceEngineer:

こんにちは

注文のたびに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())があるはずなのですが?

 
angevoyageur:

同じループで繰り返されるわけではありません。

確認のため、エキスパートのログを投稿していただけますか?

このループの前にPositionSelect(Symbol())があるはずなのですが?

はい、もちろんです。以下はエキスパートのログです。

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) OrderSend Code:10008
PF 0 00:00:08.177 EA_v (EURJPY,H1) OrderSend Code:10008
QJ 0 00:00:09.348 EA_v (EURJPY,H1) OrderSend Code:10008
KI 0 00:00:10.489 EA_v (EURJPY,H1) OrderSend Code:10008
HL 0 00:00:11.630 EA_v (EURJPY,H1) OrderSend Code:10008

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

また、あなたの推測は正しいです。このコードの前にPositionSelect(Symbol())を使って、現在のポジションの出来高を確認 しました。

よろしくお願いします。

 
FinanceEngineer:

もちろんです。 エキスパートのログはこちらです。

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) OrderSend Code:10008
PF 0 00:00:08.177 EA_v (EURJPY,H1) OrderSend Code:10008
QJ 0 00:00:09.348 EA_v (EURJPY,H1) OrderSend Code:10008
KI 0 00:00:10.489 EA_v (EURJPY,H1) OrderSend Code:10008
HL 0 00:00:11.630 EA_v (EURJPY,H1) OrderSend Code:10008

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

また、あなたの推測は正しいです。このコードの前にPositionSelect(Symbol())を使って、現在のポジションの出来高を確認しました。

よろしくお願いします。

なるほど、いくつかのトピックで話しているのと同じ問題ですね。PositionSelect()は端末のローカルデータベースから更新されるのですが、ティックがあまりに早く来るので更新が追いつきません。Sleep()は信頼できる方法ではないので、新しい注文を送る前にポジションがオープンであることを確認する回避策を見つけなければなりません。

取引、自動取引システム、取引戦略のテストに関するフォーラム

私のEAがダブルエントリーをする

doshur, 2013.12.21 03:21

同じ問題でxxxxを使っている人がいたのを覚えています。

私はそのスレッドを見つけることができませんでした、誰かが私を助けることができれば、それは大きな感謝になります...


 
angevoyageur:

なるほど、いくつかのトピックで話しているのと同じ問題ですね。PositionSelect()は端末のローカルデータベースから更新されるのですが、ティックがあまりにも速く来るので、これが更新されないのです。Sleep()は信頼できる方法ではないので、新しい注文を送る前にポジションがオープンであることを確認する回避策を見つけなければなりません。

なるほど。 どうもありがとうございます。PositionSelect()がうまくいかない場合、PositionsTotal() を使って注文を制限するのはどうでしょうか?PositionsTotal()は、ブローカーのデータベースから更新されるのですか?

 
FinanceEngineer:

なるほど。 どうもありがとうございます。PositionSelect()がうまくいかない場合、PositionsTotal() を使って注文を制限するのはどうでしょうか?PositionsTotal()は、ブローカーのデータベースから更新されるのですか?

私はそうは思わないが、あなたはそれを試して、私たちに知らせることができます。
 
angevoyageur:
私はそうは思わないが、試してみて教えてほしい。
もちろん、そうします。 Regards.
 

こんにちは

どなたか、この問題に対する有効な解決策を見つけられた方はいらっしゃいますか?

適切なチェックが行われているのに、複数の注文が実行 されるのは不満です。

すべての取引実行がリモートブローカーサーバーで行われる場合、PositionSelectがローカルデータベースから更新されるのは理にかなっていません。

これは、将来のビルドリリースで対処されるべきだと思います。

解決策を投稿してください。

ありがとうございました。

 
BlindMist:

取引、自動取引システム、取引戦略のテストに関するフォーラム

特定のブローカーのライブ口座での複数注文入力の問題

ブラインドミスト, 2014.05.15 02:00

こんにちは

この問題に対する有効な解決策を見つけた方はいらっしゃいますか?

きちんとチェックをしているのに、複数の注文が約定して しまうのはもどかしいですね。

すべての取引実行がリモートブローカーサーバーで行われるのに、PositionSelectがローカルデータベースから更新されるのは意味がありません。

これは、将来のビルドリリースで対処されるべきだと思います。

解決策を投稿してください。

ありがとうございます。

BlindMist さん、あなたのアカウントがブローカーサーバーと同期しているかどうかを確認するために、ローカルデータベースをチェックすることは理にかなっています

この問題に対処するための提案されたポストを ご覧ください。

理由: