0

私は、注文BUYSTOPSELLSTOPペアを配置し、それらの注文がトリガーされない場合は次のバーに配置し、それらを削除して新しい注文を配置する必要があるプロジェクトに取り組んでいます。

これが私のコードです:

if(logic == true && OrdersTotal() == 0)
  {bool res = OrderSend(....);}
if(OrdersTotal() != 0)
  {
  if(ordertype == OP_BUY || ordertype == OP_SELL)
     {
      bool del = OrderDelete(....);
     }
  }

このコードは、テスト中に適切に注文を出したり削除したりしています。

しかし、ライブ サーバーで EA がアクティブな場合、プラットフォームには他の商品の注文が既に開かれているため、EA は注文を開きません。

これを回避するための非常に簡単な方法があると確信していますが、私は初心者なので、それを理解することはできません.

4

2 に答える 2

1

マジックナンバーとシンボルチェックを使っているかどうかは不明です。次のようにチェックする必要があります

int _ordersTotal = OrdersTotal()-1;
for (int i = _ordersTotal; i >= 0; i--){
   if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;
   ....
}

つまり、指定されたシンボルの約定待ち注文があるかどうかを確認する関数 (文字列シンボル) を作成できます。

于 2015-07-01T12:42:01.330 に答える
0

古いことわざは次のように述べています。
Measure twice before cut once
OrderDelete()

注文を処理するように定義されて{ OP_{BUY|SELL}STOP }いるように、チェックする項目は次の 3 つです。

  • Symbol()一致 (他の EA または手動注文を削除することによって望ましくない副作用を引き起こさない)
  • OrderType()一致 (注文の実際の状態{ PENDING | AT_MARKET }と方向{ BUY | SELL }を無視しない)
  • OrderMagicNumber()UUID一致 (個人ごとに設定できるセレクタ ユーティリティを無視しないOrderSend())

それでは、検出プロセスをスケッチしましょう。

int myEaContextAwareMagicNUMBER = ...;

for ( int ii  = OrdersTotal();
          ii >= 0;
          ii--
      )
      if OrderSelect( ii, SELECT_BY_POS, MODE_TRADES )
      {
          if (      OrderSymbol()       != _Symbol
             &&     OrderMagicNumber()  != myEaContextAwareMagicNUMBER
             &&     OrderOpenTime()     >= Time[1]                    // Prev. Bar 
             && !(  OrderType()         == OP_BUYSTOP
                 || OrderType()         == OP_SELLSTOP
                 )
             ) continue;                // __^ __^ __^ __^ __^ __^ loop for next test

          // -------------------------------------------+
          // FINALLY PROCESS THE MATCHING OrderDelete() |
          // -------------------------------------------+
             ...
             ..
             .
          // -------------------------------------------+
      }
      else Print( "WARN: OrderSelect() failed at db.POOL.SELECT(), RECORD_NUMBER == ", ii );

トリガーされていない保留を削除する方法は完了です。


についてのコメントが続きます。

「... EA がライブ サーバー上でアクティブな場合、プラットフォームは既に他の商品の注文を開いているため、EA は注文を開きません。」

{ GetLastError() | _LastError }正確な値を提供せずに提供されるアドバイスはほとんどありません。

一部の口座タイプの一部のブローカーは、実際にOrderSend()受け入れポリシーを制限しているため、GetLastError()値に加えて、それぞれのブローカー利用規約が適用されます。

さらに質問することを躊躇しないでください。ドメイン内の他の質問/回答をお楽しみくださいMQL4

于 2016-08-20T10:28:12.067 に答える