私のEAではダブルエントリーを行います - ページ 9

 

こんにちは

この方法は、現在のポジションサイズがゼロで、新しい取引が希望のポジションサイズで正常に実行される場合にのみ機能します。

コードをご覧ください。

#include <Trade\Trade.mqh>

//--- global variables
CTrade trade;
bool position_opened=false;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   bool conditions_to_open;
   ENUM_ORDER_TYPE order_type;
   double lot;
   double price,sl,tp;

//---...set variables

//--- inside OnTick()
   if(conditions_to_open && !position_opened) //-- Or position_opened==false
     {
      if(trade.PositionOpen(_Symbol,order_type,lot,price,sl,tp,"comment")
         && 
         (trade.ResultRetcode()==10009 || trade.ResultRetcode()==10008)) //-- Or others condition according to your needs
        {
         //--- set the global variable to true to avoid duplicate orders
         position_opened=true;
         Print("Success!");
        }
      else
        {
         Print("Error = ",GetLastError(), "trade error = ", trade.ResultRetcode());
         //--- Sets the global variable to false
         // position_opened=false;                                         //-- Not needed as position_opened is already false
         return;
        }

     }
//--- 
  }


しかし、あなたのEAがポジションを転換している場合:ロングポジションからショートポジションへ、またはその逆で、このアクションが2つの異なる取引で実行されている場合はどうでしょうか?

最初の取引の後、"position_opened" boolean は "TRUE" に設定され、EAは2番目の取引を開くことができません。これは、条件が"if(conditions_to_open && !position_opened)" をチェックしているためです。

また、ポジションサイズが一部しか開いていない場合はどうでしょうか?ポジションサイズを正しいサイズにするために、2回目のトレードが必要です。


結局、「長い話を短くする」ためには、現在のポジションサイズを計算するためにPositionSelect(Symbol())関数が常に必要で、これが問題のすべての始まりです(そしてこのフォーラムスレッドもそうです)。

EAがPositionSelect(Symbol())を呼び出す重要な瞬間に、端末はまだ現在のポジションサイズを更新しておらず、EAは間違ったポジションサイズで動作し、トレードサーバーに新しいダブルオーダーを送信してしまいます。


EAがPositionSelect(Symbol())関数を正しいポジションサイズに更新するまで待たされるため、(figlli)のアプローチの方が良いと思います。


bool fatalError=false; // atention: declare this as global

....

if(fatalError == false) 
      {
      if(m_Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, LotSize, Price, 0, 0)) 
            {
            Print("Position opened in ", Symbol());
            int maxTimeout=0;
            while(!PositionSelect(Symbol())) 
                     {
                     Sleep(100);
                     maxTimeout++;
                     if(maxTimeout > 100) 
                           {
                           Print("### PositionSelect fatal error!");
                           fatalError = true;
                           break;
                           }
                     }
            Print("--> PositionSelect delay=",maxTimeout * 100);
            break;
            }
      }
 
snelle_moda:

こんにちは

この方法は、現在のポジションサイズがゼロで、新しい取引が希望のポジションサイズで正常に実行される場合にのみ機能します。

コードをご覧ください。


しかし、あなたのEAがポジションを転換している場合:ロングポジションからショートポジションへ、またはその逆で、このアクションが2つの異なる取引で実行されている場合はどうでしょうか?

最初の取引の後、"position_opened" boolean は "TRUE" に設定され、EAは2番目の取引を開くことができません。これは、条件が"if(conditions_to_open && !position_opened)" をチェックしているためです。

また、ポジションサイズが一部しか開いていない場合はどうでしょうか?ポジションサイズを正しいサイズにするために、2回目のトレードが必要です。


結局、「長い話を短くする」ためには、現在のポジションサイズを計算するためにPositionSelect(Symbol())関数が常に必要で、これが問題のすべての始まりです(そしてこのフォーラムスレッドもそうです)。

EAがPositionSelect(Symbol())を呼び出す重要な瞬間に、端末はまだ現在のポジションサイズを更新しておらず、EAは間違ったポジションサイズで動作し、トレードサーバーに新しいダブルオーダーを送信してしまいます。


EAがPositionSelect(Symbol())関数を更新するまで待たされるため、(figlli)のアプローチの方が良いと思います。


おっしゃるとおり、どちらのアプローチにも限界があります。

この問題の原点がはっきりしました。各自が自分の戦略に応じてコードを適応させなければなりません。すべてのケースに適用できる一般的な方法はないと思います。

 
Great & Powerful mql5のOrderSendReliable()ライブラリは必要ですか?
 
Ubzen:
偉そうにmql5のOrderSendReliable()ライブラリが必要なのか?
皮肉は何の役にも立たないと思います。このような複雑さをもたらすのは、明らかに設計が悪いのですが。
 
angevoyageur:

おっしゃるとおり、どちらのアプローチにも限界があります。

この問題の原点は、今や明確に特定されています。各自が自分の戦略に応じてコードを適応させなければなりません。すべてのケースに適用できる一般的な方法があるとは思えません。


あるいは、Metaquotes社自身からの「公式声明」を待つしかないでしょう。

サービスデスクからの回答はすでにあるのでしょうか?

 
angevoyageur: 皮肉は何の役にも立たないと思います。しかし、このような複雑さをもたらすのは、明らかに悪い設計 です。

もし私があなたに同意したら、あなたはそれが役に立たないと思うだろうか?.

私は、Sleeping until Terminating Tradingの解決策が、OrderSendReliable()を連想させることを教えただけです。これらはもっとエレガントに対処されていただろうと教えました。

また、old_documentsの処理...ここで{とすべての取引が停止されるべきである}になることを私に思い出させる。

とにかく、謝罪は、mql5を選ぶことを意図していませんでした。

 
snelle_moda:


それとも、Metaquotesの人たち自身からの「公式声明」を待つ必要があるのでしょうか。

サービスデスクからの回答は既にあるのでしょうか?

いや、ちょうどそのことを考えていたところです...関係者全員がこの問題についてServiceDeskにチケットを書けば、おそらく役に立つでしょう。しかし、私は、MQがこのデザインを変更する気があるかどうか、非常に懐疑的です。しかし、私たちは試すことができます。

人々はServiceDeskに 手紙を書いて、そのチケット番号をここで報告することができます。私のは

エラーMetaTrader 5 MQLOpenStart。2013.12.23 19:08,#916435
Get in touch with developers using Service Desk!
Get in touch with developers using Service Desk!
  • www.mql5.com
We therefore attach great importance to all user reports about issues in our programs and try to answer each one of them.
 
Ubzen:

もし私があなたに同意したら、役に立たないと思われますか?

私は、取引終了まで寝るという解決策が、OrderSendReliable()を連想させることを教えただけです。私は、これらがよりエレガントに対処されているだろうと教えました。

それはまた、私にold_documentsの処理を思い出させる...それは{とすべての取引が停止されるべきである}になる場所です。

とにかく、謝罪は、mql5を選ぶことを意図していませんでした。

mql4でも同じような問題は存在しないのでしょうか。私は、mql4のフォーラムで、ダブルトレードについて不満を持つユーザーから、この数ヶ月で少なくとも2つのトピックを読みました。それが関連しているかどうかは分かりませんが、これらのトピックをチェック する価値はあるでしょう。あなたはこれらのトピックを読んでいますか?
 
angevoyageur: mql4でも同じような問題は存在しないのでしょうか。私は、mql4フォーラムで、この数ヶ月間に少なくとも2つのトピックで、二重取引について不満を持つユーザーからの情報を読みました。それが関連しているかどうかは分かりませんが、これらのトピックをチェックする価値はあるでしょう。あなたはこれらのトピックを読んでいますか?

そうですね、でもコーディングが悪いからかどうかはわかりません。二重売買は多重売買スレッド以前から問題になっていました。その伝統的な処理方法は、snelle_modaが処理する方法です。

 
Ubzen:

そうですね、でもコーディングが悪いからかどうかはわかりません。二重売買は多重売買スレッド以前から問題になっていました。その伝統的な処理方法は、snelle_modaの処理方法です。

意味がよくわからないのですが。このトピックで話しているこの問題は、コーディングが悪いのではなく、mql5の設計が悪いのです(これは私の意見ですが、単にバグかも しれませんね)。複数の取引スレッド」とはどういう意味ですか?
Get in touch with developers using Service Desk!
Get in touch with developers using Service Desk!
  • www.mql5.com
We therefore attach great importance to all user reports about issues in our programs and try to answer each one of them.