偉大で恐ろしいMT4の永遠(または移行の戦略方法) - ページ 13

 
JRandomTrader:

以下、ドキュメントより。

"これらの取引が端末に到着する順序は保証されていないため、ある取引取引が到着した後に他の取引が到着するのを待つという取引アルゴリズムをベースに することはできません。" https://www.mql5.com/ru/docs/event_handlers/ontradetransaction

また、経験上、TRADE_TRANSACTION_ORDER_DELETETRADE_TRANSACTION_DEAL_ADDTRADE_TRANSACTION_HISTORY_ADD トランザクションはどの順序で 到着してもかまいません。

それゆえ、歴史上まだ取引や秩序が存在しないのに、秩序がすでに存在しているという状況があるのです。またはその逆で、注文は残っているが、取引はすでに実行されている。しかし、履歴だけでなく、アクティブにも秩序が存在する場合の状況は、ほとんどありえない。

事象を捉えるのではなく、新しいティックで全貌を見る。


JRandomTrader:

実際、私が CTrade クラスの使用を拒否しているのはそのためで、これらの落とし穴をすべて踏みつけているのです。

各EAは注文のリストを保持し、その状態を監視しています。これには、「注文は送信されたが、まだ有効な注文に存在しない」(これは二重になっている可能性がある)、「注文は削除されたが、履歴に存在しない」などの「非標準」状態が含まれる。これは、網掛けをする際に、同じシンボルでの同時作業にも役立ちます。

つい最近まで、注文が漏れていないかをチェックする万能松葉杖を使っていました。しかし、ある時期から失敗するようになりました。

Expert Advisorが自分の注文を別々に監視するようになったので、個人的にもう一つひつようなものを追加しました。

松葉杖が多いな...。

 
Andrey Khatimlianskii:

松葉杖が多いな...。

課題を研究している。OrderSend market order true, thenPositionsTotal= 0, OrdersTotal = 0, historical tables unchanged.私はさらに次のことに出くわしました:OrderSend market order true, thenPositionsTotal= 0, OrdersTotal = 0, historical tables unchanged.

IsSynchronized()を書くことに成功したようです。コードがちょっと重いんです。どのような形で掲載するかはまだ決めていません。

 
// Демонстрация открытия дубля позиции в MT5.

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.
    if (PositionsTotal() == 1)
      Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
    else if (!OrdersTotal())
      Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
}

このコードを空のデモ口座で実行し、数秒後に2つのポジションが開くかどうかを確認します。


MT4で同じロジックを組むと次のようになります。

void OnStart()
{
  while (!IsStopped() && (OrdersTotal() <= 1)) // Закончим, когда появится более одной позиции.
    if (OrderSelect(0, SELECT_BY_POS))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0) // Если есть позиция - закрываем.
    else
      OrderSend(_Symbol, OP_BUY, 0.01, Ask, 0, 0, 0) // Если нет позиции и ордера - открываем позицию.
}

MT4でこのようなコードを使用しても、ポジションの反転が起こらないことは明らかです。しかし、MT5ではダメです。

 
fxsaber:

このコードを空のデモ口座で実行し、数秒後に2つのポジションが開くかどうかを確認します。


MT4で同じロジックを組むと次のようになります。

MT4でこのようなコードを使用しても、ポジションの反転が起こらないことは明らかです。しかし、MT5ではダメです。

ようやく、発見されたのでしょうか?この問題は、端末と同じくらい古くからある。しかし、ついに端末ユーザーがそれに気づいてしまった...。10年後に

自分でトレードアクションを行う場合は、アクションを行った後にSleep()を 1秒だけ挿入するという簡単な方法で解決することができます。しかし、ストップロス/スタックプロフィットやマーケットクローズを使用するEAでは、この問題に遭遇する危険性があり、この場合、解決策がありません。

 
Dmitry Fedoseev:

ついに!今頃発見したのか?この問題は、端末と同じくらい古くからある。しかし、端末ユーザーはついにそれに気づいてしまった...。10年後に

この問題は、以前から議論されていた。ほとんどの人が遭遇したことがあるのではないでしょうか。それを着実に再現するコードは初めてです。

自分でトレードアクションを行う場合、アクションが実行された後、1秒間Sleep() を挿入するという簡単な方法で解決することができます。しかし、Stop Loss/StackProfitとマーケットクローズをEAで使用する場合、この問題に遭遇する危険性があり、この場合解決策はありません。

その解決策が見つかったのです。

 
fxsaber:

このコードを空のデモ口座で実行し、数秒後に2つのポジションが開くかどうかを確認します。

不思議ですね。再現性がないんです。MQからデモで確認、ビルド2900、EURUSD、スプレッド0。5分ほど待った。

もしかしたら、MQサーバーではなく、実際のDC/ブローカーの特定のサーバーを使用する必要があるのでしょうか?

 
Ihor Herasko:

不思議ですね。再現性がないんです。MQからデモで確認、ビルド2900、EURUSD、スプレッド0。5分ほど待った。

もしかしたら、MQサーバーではなく、実際のDC/ブローカーの特定のサーバーを使用する必要があるのでしょうか?

ForexTimeFXTM-Demo01

 
fxsaber:

ForexTimeFXTM-Demo01

はい、これでスクリプトは停止しました。しかし、まだ1つポジションが残っている。2枚目は閉じる時間があるのでは?

 
Ihor Herasko:

はい、これでスクリプトは停止しました。しかし、まだ1つポジションが残っている。2枚目は閉じる時間が必要?

いつも2つ残っているんです。1つでも残っていれば、なおさら虫の息です。

  1. PositionsTotal= 1 - クローズするためのオーダーを送信します。
  2. そして、PositionsTotal = 2となり、ポイント1からの注文はクローズされます。
 
fxsaber:

いつも2つ残っているんです。1つでも残っていれば、さらに大きなバグになります。

  1. PositionsTotal= 1 - クローズするためのオーダーを送信します。
  2. そして、PositionsTotal = 2となり、ポイント1からの注文はクローズされます。

はい、そういうことです。このスクリプトは、実際には2つあるポジションのうち1つを閉じることに成功していますが、PositionsTotal()は1を返し、そして閉じた後にループ終了の条件が満たされる、つまりPositionsTotal()は2を返すことが判明しています。

理由: