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

 
doshur:

PositionSelect()はクライアント側とサーバー側のどちらをチェックするのでしょうか?

この問題は、サーバー(ブローカー側)がリクエストを処理する際に、クライアント側を更新しないために、PositionSelect()が再び実行される遅延が原因であると、私は強く感じています。

cTradeとMqlTradeRequestに 違いはなく、PositionSelect()が再実行される前にクライアント側が更新されるようにSleep関数ですべてを遅延させるべきだと強く感じています。ジャーナルタブで確認すると、 >2013.12.20 08:35:00 Trades '800****': Exchange buy 0.01 EURUSD at market placed for execution in 313 ms <

400以上のスリープを置くことは安全であるべきですか?

どうなんでしょう?


"この問題は、サーバー(ブローカー側)がリクエストを処理する際に、クライアント側で更新されない遅延が原因で、PositionSelect()が再度実行されているのではないかと強く感じています。"

私もこれが二重入力の原因だと思います。私のコードでは、現在のポジションサイズが最大許容ポジションサイズ以上であれば、新規注文を出すことは理論的に不可能です。したがって、PositionSelect()が現在のポジションの状態を時間内に受け取らない場合、私のEAは再び新規注文を出します。


"スリープを400以上にすると安全ですか?"

時間間隔が大きければ大きいほど良いのですが、問題があります。もし、あなたのポジションが2つのステップ(LONGからSHORT、SHORTからLONG)で回転する場合、この余分な時間の遅れは、特にマクロ経済イベントの間、悪い実行価格の原因となる可能性があるのです。

 
snelle_moda:


"サーバー(ブローカー側)がリクエストを処理する際に、クライアント側で更新されない遅延が発生するため、PositionSelect()が再度実行されることが問題の原因ではないかと強く感じています。"

私もこれが二重入力の原因だと思います。私のコードでは、現在のポジションサイズが最大許容ポジションサイズ以上であれば、新規注文を出すことは理論的に不可能です。したがって、PositionSelect()が現在のポジションの状態を時間内に受け取らない場合、私のEAは再び新規注文を出します。


"スリープを400以上入れると安全ですか?"

時間間隔が大きければ大きいほど良いのですが、問題があります。もし、あなたのポジションが2つのステップ(LONGからSHORT、SHORTからLONG)で回転する場合、この余分な時間の遅れは、特にマクロ経済イベントの間、悪い実行価格の原因となる可能性があるのです。

私は問題ないと思っています。私のEAは、売り買いのリクエストを送っただけでは、すぐに反転しません。スリープを800ミリ秒にして、ブローカーの更新を待つ時間を十分に確保するようにしています。スリープがこの問題を解決してくれることを願っています。
 
doshur:
私はブローカーがここで離れて再生するかどうかは知らないが、それは我々のブローカーが同じであると思われる。Alpari.

Plsは、必要に応じてブローカー名を削除します。
はい、ブローカーは同じです。
 
snelle_moda:


2013年10月3日以降、ダブルエントリーが1件増えました。私は注文の送信に両方の方法を使用しています。以前の投稿をご覧ください。

あぁ...予想通りだ...。
 

これは私が実装したもので、問題が解決されることを期待しています。

if(m_Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, LotSize, Price, 0, 0))
            {
               Sleep(800);

               if(m_Trade.ResultRetcode() == 10009)
               {
                  Print("Position opened in ", Symbol());

                  return;
               }
               else
               {
                  Print("Error opening position in ", Symbol(), " - ", m_Trade.ResultComment(), "\n", "Return Code Desc - ", m_Trade.ResultRetcodeDescription());
               }
            }
            else
            {
               Print("Error with PositionOpen in ", Symbol(), " - ", m_Trade.ResultComment(), "\n", "Return Code Desc - ", m_Trade.ResultRetcodeDescription());
            }
 
doshur:

これは私が実装したもので、問題が解決されることを期待しています。

私の知る限り、結果コード= 10008は、取引がうまく配置されていることを示すものです。
 

この問題の背後にある理由を見つけることは非常に重要だと思います。もちろん、何が起こっているのかを完全に理解するまでの回避策(スリープ?そこで、状況を再開してみます。

  • CTradeクラスのPositionOpenメソッドを使用すると、少なくとも3人のユーザーが同じ方向で2つの取引を行い、その結果、期待されるものより2倍のボリュームでポジションを取得しました。
  • doshurさんが最初に投稿されたコードで、取引が開始されていないのに、ログに「Position opened in...」と表示される理由を説明できます。これは、PositionOpen() が true を返しても、取引が行われたことにはならないからです。ドキュメントを 参照してください。しかし、なぜ「ダブル」トレードが行われたのかを説明することはできません。
  • この「ダブル」取引には、2つの説明しかありません。
  1. PositionSelect()が常にポジションの真の状況を返すとは限りません。ポジションが開かれたのにPositionSelectがfalseを返す。それならPositionSelectのバグ。
  2. 取引は行われたが、次のティックでPositionSelect()が呼ばれたとき、そのポジションはまだ存在しない。このようなことが起こりうるかどうかを理解するためには、取引が行われたときの動作の流れを知る必要があります。
  • この問題は、同じブローカーで、Depth of Marketが有効になっているシンボルで発生するようです(関係者の方、確認お願いします)。
  • 同期注文で発生し、非同期注文は使用していない(ご確認ください)。
  • この問題はランダムに発生します。
  • Klammeraffeの報告では、この問題は発生しなく なりましたが、彼の投稿したコードでどのように説明 できるのかわかりません。 このコードは各ティックで実行されるのでしょうか?このコードはPositionSelect()の使用後に実行されるのでしょうか?ということは、彼がエラーの原因を取り除いたか、あるいは単なるランダムなものなのかもしれません。
  • コードを確認したところ、CTradeクラスやMqlTradeRequestをOrderSendで直接使用するのと違いは見当たりません。

snella_modaさんと同意見で、一番良い説明は、:

I think the problem is the (to slow) execution of the PositionSelect(Symbol()) function. Maybe, the new ticks come in so fast, the EA sends in a new order before it receives a response of the PositionSelect(Symbol()). So the current position size is not calculated properly. In my code, its theoretically impossible to send in a new/double order if the current position size is equal or greater than the max allowed position size, see code. 

しかし、確認するのは難しいです。

Metaquotesにアドバイスを求めるのが一番だと思います。私はそれを試してみます。

 
angevoyageur:
  • Klammeraffeのレポートにはもう 問題はありませんが、彼が投稿したコードがどのようにそれを説明 するのかわかりません。 このコードは各ティックで実行されるのでしょうか?このコードはPositionSelect()を使用した後に実行されるのでしょうか?ということは、彼がエラーの原因を取り除いたのか、それとも単なるランダムなのか。

各ティック "に関する行は、それが起こらなくなった理由かもしれません。

この関数は、新しいバーが表示されたときだけ実行されます。ですから、おそらく、バーの最初のティックだけが取引を実行することができます。最初のバーの後、新しいバーが現れるまで、コードは「戻り」を得ます。多分これで解決しました。

私はこのコードの部分は、記事からだと思います。

//-------------------------------------------------- Check for new bar     
         static datetime OldTime;
         datetime NewTime[1];
         bool newBar=false;
         
         int copied=CopyTime(Symbol(),Period(),0,1,NewTime);
         if (copied>0)
           {
             if (OldTime != NewTime[0])
               {  
                 newBar=true;
                 OldTime=NewTime[0];
               }
           }
         else
           {
            Print("Error in copying historical times data, error =",GetLastError());
            ResetLastError();
            return;
           }  
         if(newBar==false) return;      
//-------------------------------------------------- Check for new bar
 
Klammeraffe:

各ティック " に関する行は、それが起こらなくなった理由かもしれません

この関数は、新しいバーが表示されたときにのみ実行されます。ですから、おそらく、バーの最初のティックだけが取引を実行することができます。最初のバーの後、新しいバーが現れるまで、コードは'return'を取得します。多分これで解決しました。

このコードの一部は、記事からだと思います。

はい、私はそう思います。ありがとうございます。
 
  • doshur氏が最初に投稿したコードで、取引が開始されていないのに、ログに「Position opened in...」と表示される理由を説明することができます。これは、PositionOpen() が true を返しても、取引が行われたことにはならないからです。ドキュメントを参照して ください。しかし、なぜ「ダブル」トレードが行われたのかを説明することはできません。

を修正してください。二重に「Position opened in...」があり、2 つの トレードが開かれています。

  • この問題は、同じブローカーで、Depth of Marketが有効になっているシンボルで発生するようです(関係者の方、確認してください)。
他の人はどうかわかりませんが、私のところはDOMがあります。

  • この問題は同期注文で発生し、非同期注文は使用していません(確認お願いします)。
cTradeの設定はデフォルトで使用しています。

  • この問題はランダムに発生します。
はい、ランダムです。