cTradeとMqlTradeRequestに 違いはなく、PositionSelect()が再実行される前にクライアント側が更新されるようにSleep関数ですべてを遅延させるべきだと強く感じています。ジャーナルタブで確認すると、 >2013.12.20 08:35:00Trades'800****': Exchange buy 0.01 EURUSD at market placed for execution in 313 ms <
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.
//-------------------------------------------------- Check for new bar staticdatetime 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
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)で回転する場合、この余分な時間の遅れは、特にマクロ経済イベントの間、悪い実行価格の原因となる可能性があるのです。
"サーバー(ブローカー側)がリクエストを処理する際に、クライアント側で更新されない遅延が発生するため、PositionSelect()が再度実行されることが問題の原因ではないかと強く感じています。"
私もこれが二重入力の原因だと思います。私のコードでは、現在のポジションサイズが最大許容ポジションサイズ以上であれば、新規注文を出すことは理論的に不可能です。したがって、PositionSelect()が現在のポジションの状態を時間内に受け取らない場合、私のEAは再び新規注文を出します。
"スリープを400以上入れると安全ですか?"
時間間隔が大きければ大きいほど良いのですが、問題があります。もし、あなたのポジションが2つのステップ(LONGからSHORT、SHORTからLONG)で回転する場合、この余分な時間の遅れは、特にマクロ経済イベントの間、悪い実行価格の原因となる可能性があるのです。
私はブローカーがここで離れて再生するかどうかは知らないが、それは我々のブローカーが同じであると思われる。Alpari.
2013年10月3日以降、ダブルエントリーが1件増えました。私は注文の送信に両方の方法を使用しています。以前の投稿をご覧ください。
これは私が実装したもので、問題が解決されることを期待しています。
これは私が実装したもので、問題が解決されることを期待しています。
この問題の背後にある理由を見つけることは非常に重要だと思います。もちろん、何が起こっているのかを完全に理解するまでの回避策(スリープ?そこで、状況を再開してみます。
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にアドバイスを求めるのが一番だと思います。私はそれを試してみます。
各ティック "に関する行は、それが起こらなくなった理由かもしれません。
この関数は、新しいバーが表示されたときだけ実行されます。ですから、おそらく、バーの最初のティックだけが取引を実行することができます。最初のバーの後、新しいバーが現れるまで、コードは「戻り」を得ます。多分これで解決しました。
私はこのコードの部分は、記事からだと思います。
各ティック " に関する行は、それが起こらなくなった理由かもしれません 。
この関数は、新しいバーが表示されたときにのみ実行されます。ですから、おそらく、バーの最初のティックだけが取引を実行することができます。最初のバーの後、新しいバーが現れるまで、コードは'return'を取得します。多分これで解決しました。
このコードの一部は、記事からだと思います。
を修正してください。二重に「Position opened in...」があり、2 つの トレードが開かれています。