アラート:MT4ターミナルがエキスパートから送信された注文を複製しています。 - ページ 5

 

こんにちは、フレンズです。

今まで回答しなくてすみませんでした。Metaquotesから通知が来なかったので、あなたの投稿に気づきませんでした。確かにRaptorUKが勧めるようにチケッティングを開きましたが、全く回答がありませんでした。私は、必要なときはJamesMaddenと 同じようにしています。注文をクローズして、スプレッドをなくすだけです。それほど危険でなければ、そのままにしておきます。(私のEAが利益を上げているなら、長い目で見れば、スプレッドより利益の方が大きいでしょう)しかし、もちろん、私はこのバグが好きではありません。

今、build600で新たな問題が発生しています。もし、どなたかご存知でしたら、どのようにして回答を得ることができるでしょうか?)

PD: この投稿が更新されたら、このウェブアプリケーションがメールを送ってくれるようにするにはどうしたらいいですか?私はすでにこのトピックを購読しています。

 
Ricardo1:

こんにちは、フレンズです。

今まで回答しなくてすみませんでした。Metaquotesから通知が来ないので、あなたの投稿を知りませんでした。確かにRaptorUKが勧めるようにチケッティングを開きましたが、全く返事がありません。私は、必要なときはJamesMaddenと 同じようにしています。注文をクローズして、スプレッドをなくすだけです。それほど危険でなければ、そのままにしておきます。(私のEAが利益を上げているなら、長い目で見れば、緩むより勝つ方が多いでしょう) しかし、もちろん、私はこのバグが好きではありません。

今、ビルド600で新たな問題が発生しています。もし、どなたかご存知でしたら、どのようにして回答を得ることができるのでしょうか?)

もし見つかったら教えてください. 私は2013年3月からの未解決のチケットを持っていますが、一度も返信がありません。 このような場合、新しいコメントを追加して、ニュースや返信を求めることをお勧めします。


PD: この投稿が更新されたときに、このウェブアプリケーションからメールを送ってもらうにはどうしたらいいでしょうか?私はすでにこのトピックを購読しています。

メール通知はここ数年機能していません ...サービスデスクに報告 することもできます。
 
RaptorUK:
わかったら教えてください ... ...2013年3月からの未解決チケットがあるのですが、一度も返信がありません。 メール通知はここ数年機能していません ... サービスデスクに報告することができるかもしれません





こんにちは。

このトピックを見つけたのは、まさにこの問題を検索していたからです。以前はこの問題に気がつかなかったのですが、今日それが起こりました。

エキスパートログはトレードを記録しますが、メタトレーダー・ジャーナルはEAまたは個人によって行われたすべてのトレードを記録します。今日、私のポートフォリオで、ほんの数秒前に行われた取引と重複する取引を見つけましたが、2番目の取引はエキスパートログにもメタトレーダー・ジャーナルにも表示されませんでした。

ブローカーに受信リクエストと約定した取引のログを比較するよう依頼しましたが、ログを保存していないか、調査する気がないのだと思います。

EAが2つの注文を出したのであれば、ジャーナルに両方が表示されることを期待します。デスクトップアプリケーションが何らかの理由でリクエストを複製したとしても、私はサーバーが応答して2番目の取引を記録することを期待します。取引はクライアントではなく、サーバーから実行されているようです。

この問題に気づいたのは今回が初めてで、問題を再現する方法が見当たりません。私が現在扱っている金額は非常に小さいので、値は重要ではありませんが、それはMetaTraderの実行可能性についての懸念を提起しています。

ただ、しばらくの間、このトピックに私の考えを貸すつもりです。

編集

さらに調べてみたところ、別の事例を発見しました。この注文はすでにストップロス で決済されていたので、気がつきませんでした。どちらのケースもEAが想定した注文を出した。ジャーナルにはすぐにログインメッセージが表示され、それがファントムオーダーが発注されたことに対応します。

もし他の人がファントム注文が発生したと思ったら、ジャーナルにログインメッセージがあるかどうか確認してください。それは重要なことかもしれません。

 

この厄介な問題の影響を受けているのは私だけではなさそうです。Spikedogと同じように、私のEAは成行注文を要求し、その結果、数ミリ秒以内に同じロットサイズの別の重複したエントリーが発生し、重複注文ログがJournalに表示されましたが、Expertsタブには表示されませんでした。

この重複取引の問題は初めてです。その後、3つのブローカーで500以上の取引を行いましたが、今まで問題はありませんでした。また、その後の取引も問題なくできています。

添付したのは、重複問題が発生したときにOrderSend()を処理する私のコードです。私のEAが重複注文の原因であるとは思えません。今考えられる唯一の理由は、おそらく非常に稀なケースで、サーバーが私のOrderSendを処理していたのに、何らかの理由で"-1 "を返し、私のEAが1回目の注文を再注文として扱って 別のリクエストを行うことだ。単なる私の推測です。


            bool Buy_Ticket = false;
            while(Buy_Ticket==false){     //Loop to solve Requote issues
               for(int BT_count=0; BT_count < RequoteTries; BT_count++){
                  if (!IsTradeAllowed()) Sleep(RequoteTries_WaitingTime);
                  RefreshRates();

                  int B_Spread = MarketInfo(Symbol(), MODE_SPREAD);  //TO CAPTURE EXACT SPREAD UPON BUY ORDER FOR SL
                  Buy_Ticket = OrderSend(Symbol(),0,order_lotsize,Ask,Slippage,0,0,EntryCode_comment,Magic,0,Blue) > 0;

               
                  if (Buy_Ticket==true){     //Modify to give SL & TP if new buy order executed
                     for(int buyMod=0; buyMod < OrdersTotal(); buyMod++){
                        if (OrderSelect(buyMod,SELECT_BY_POS,MODE_TRADES)){
                           if ((OrderSymbol()!=Symbol()) || (OrderType()!=OP_BUY)) continue;
                           if ((OrderStopLoss()==0) && (OrderTakeProfit()==0)){
                              double B_SL = NormalizeDouble((OrderOpenPrice()-((B_Spread*Point)+stoploss)),Digits);
                              double B_TP = NormalizeDouble((OrderOpenPrice()+takeprofit),Digits);

                              bool buy_ModSL_succeed = false;
                              while(buy_ModSL_succeed==false){     //Loop to solve SL+TP modify Requote issues   
                                 for(int buyMod_count=0; buyMod_count < RequoteTries; buyMod_count++){
                                    if (!IsTradeAllowed()) Sleep(5000);
                                    RefreshRates();                                 
                                    if (OrderModify(OrderTicket(), OrderOpenPrice(), B_SL, B_TP, 0, Red)==false) continue;
                                    buy_ModSL_succeed = true;
                                    Print(entrycode_txt," initiated Long trade successfully modified SL & TP.");
                                    break;                        
                                 }  //End FOR loop for requote handling
                                 if (buy_ModSL_succeed == false){
                                    getError = GetLastError();
                                    Alert("Error: ",getError," in Buy order#:",OrderTicket()," modify for SL:",B_SL," & TP:",B_TP," after ",RequoteTries," attempts.");
                                    break;
                                 }
                              }  //End WHILE loop for SL+TP modify requote handling
                           }  //End IF statement to select new orders without SL & TP
                        }  //End IF orderselect
                     }  //End FOR loop to modify new orders without SL & TP 
                  }  //End IF statement when buy order accepted & need SL+TP modify

                  if (Buy_Ticket==false) continue;
                  else break;
               }  //----------------------------//End FOR loop to carry out ordersend for buy trade when requote
               if (Buy_Ticket==false) break;    //Exit WHILE loop to handle Requote issues, fail to buy
            }  //-------------------------------//End WHILE loop to solve Requote issues
 
BigFisherman:

私のEAが重複注文の原因とは思えません。

それはあなたのコードのこのエラーに関連しているかもしれません、あなたはそれを修正し、再びテストする必要があります ... ...

                  Buy_Ticket = OrderSend(Symbol(),0,order_lotsize,Ask,Slippage,0,0,EntryCode_comment,Magic,0,Blue) > 0;

               
                  if (Buy_Ticket==true){     //Modify to give SL & TP if new buy order executed

OrderSend()boolではなく intを 返すので、戻り値が "true "であるかどうかをチェックするのは間違っています。

 

大漁マン

B.T.W.あなたのコードはどうなっているのですか?

if (Buy_Ticket==true){     //Modify to give SL & TP if new buy order executed
if (Buy_Ticket==false) continue;

そしてまた?

else break;
 
RaptorUK:

あなたのコードのこのエラーに関連している可能性があります。

OrderSend()bool ではなくint を返すので、戻り値が "true" であるかどうかをチェックするのは正しくありません。


raptorukさん、ご指摘ありがとうございます。おっしゃるとおりです :)
 
BigFisherman:

raptorukさん、ご指摘ありがとうございます。それは承知しています。しかし、提示されたコードは有効であるため、それが重複取引の原因とは思えません。少し分かりにくいですが、 。
OrderSend() が成功すれば、0より大きい値、つまりチケット番号が返され、失敗すれば、-1が返されます。
 
RaptorUK:
OrderSend()が成功すれば0以上の値、つまりチケット番号が返され、失敗すれば-1が返されます。



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

乾杯

 
RaptorUK:
OrderSend() が成功すれば、0より大きい値、つまりチケット番号が返され、失敗すれば-1が返されます。


こんにちは、RaptorUKです。



このスレッドのトピックとはちょっと違うのですが、私の前の投稿を例にして、mql4コーディングの理解を深め、また私のような他の初心者の助けになればと思い質問します(もし、トピックから外れていて新しいスレッドが必要なら、これを削除して私に知らせてください)。

私は最初、Buy_Ticketをintではなくboolとして宣言する私の最初の方法について少し混乱していましたので、私はそれについてさらにテストしました。 OrderSend()をboolとして読む私の最初の方法が良いコーディング方法でない(混乱する)ことに同意しながら、私のテストはそれが有効であることを示しています。 読みやすくするために、以下のようにコーディングしてみましたので、アドバイスをお願いします。


追伸:アドバイス通り、OrderSend()をintとして読むように私のEAを既に修正しました。



//+------------------------------------------------------------------+
//|                                                    Test_Bool.mq4 |
//|                                     Copyright 2014, BigFisherman |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, BigFisherman"

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
{
//---
   
   for (int SimRun=0; SimRun<3; SimRun++){
      bool Buy_Ticket = 0;
      int Ordersend = 0;            //AS AN EXAMPLE TO SIMULATE OrderSend() RETURNED CODE

      switch (SimRun)
      {
         case 0: break;             //FOR Ordersend==0
         case 1:
         {
            Ordersend = 1;          //SIMULATE SUCCESSFUL ORDERSEND() RETURNING TICKET NO. > 0
            break;
         }
         case 2:
         {
            Ordersend = -1;         //SIMULATE FAILED ORDERSEND() RETURNING "-1"
            break;
         }
      }
      
      
      // (MY ORIGINAL WAY OF CODING)   Buy_Ticket = OrderSend(Symbol(),0,order_lotsize,Ask,Slippage,0,0,EntryCode_comment,Magic,0,Blue) > 0;
      Buy_Ticket = Ordersend > 0;   //SIMPLIFIED CODE FOR EASIER READING
      
      
      if (Buy_Ticket==true){
         Print("** Buy_Ticket returns true  **  SimRun: "+SimRun+"  Ordersend: "+Ordersend+"  Buy_Ticket: "+Buy_Ticket);
      }
      else{                         //if (Buy_Ticket==false)
         Print("** Buy_Ticket returns false **  SimRun: "+SimRun+"  Ordersend: "+Ordersend+"  Buy_Ticket: "+Buy_Ticket);
      }
   }
   return(0);
}
//+------------------------------------------------------------------+


ジャーナル

2014.03.30 12:57:31.223 2014.03.25 23:30  Test_Bool AUDJPY,M30: ** Buy_Ticket returns false **  SimRun: 0  Ordersend: 0  Buy_Ticket: 0
2014.03.30 12:57:31.223 2014.03.25 23:30  Test_Bool AUDJPY,M30: ** Buy_Ticket returns true  **  SimRun: 1  Ordersend: 1  Buy_Ticket: 1
2014.03.30 12:57:31.223 2014.03.25 23:30  Test_Bool AUDJPY,M30: ** Buy_Ticket returns false **  SimRun: 2  Ordersend: -1  Buy_Ticket: 0