EAが買い注文と売り注文を混在させる

 
こんにちは。

EAを作ろうとしているのですが、コード内のある場所で、開いた注文と保留中の注文の ストップロスを更新する必要があります。注文に関する情報とともにアラートを表示しています。

それを実行すると、次のようなメッセージが表示されます: "Count:2 Stoploss 1.44705 for buy order:46450421 orderType:1".

orderType:1は、46450421がOP_SELL注文であることを意味しており、その通りなのですが、なぜ「if ((orderType == OP_BUY || orderType == OP_BUYSTOP))」ではなく「if (orderType == OP_SELL || orderType == OP_SELLSTOP)」のテストを発動させるのですか?

int orderType;
   for(cnt = total-1; cnt >= 0; cnt--)
   {
      while (!OrderSelect(cnt, SELECT_BY_POS)) {Sleep(500);}
      orderType = OrderType();
      if(/*OrderMagicNumber()==Magic &&*/ OrderSymbol()==Symbol())
      {      
         if ((orderType == OP_BUY || orderType == OP_BUYSTOP)) {
            if (!(isSLinTheZone && areBuyOrdersInProfitAt(NormalizeDouble(Low[1] - NbPipsTolerance*Point*10,Digits))))
               if (NormalizeDouble(OrderStopLoss(), Digits) != longSL) { 
                  if (Debug) {
                     Alert("LongSL: " + longSL);
                     Alert("Order SL: " + NormalizeDouble(OrderStopLoss(), Digits));
                     Alert("Modif required");
                     Alert("Count: " + cnt + " Stoploss " + longSL + " for buy order: " + OrderTicket() + " orderType: " +OrderType());
                  }
                  OrderModify(OrderTicket(), OrderOpenPrice(), longSL, OrderTakeProfit(),0, Yellow);
                  //cnt = total-1;
               }
         }
         
         if ((orderType == OP_SELL || orderType == OP_SELLSTOP)) { 
            if (!(isSLinTheZone && areSellOrdersInProfitAt(NormalizeDouble(High[1] + NbPipsTolerance*Point*10 + Spread*Point*10,Digits))))
               if (NormalizeDouble(OrderStopLoss(), Digits) != shortSL) { 
                  if (Debug) {
                     Alert("ShortSL: " + shortSL);
                     Alert("Order SL: " + NormalizeDouble(OrderStopLoss(), Digits));
                     Alert("Modif required");
                     Alert("Count: " + cnt + " Stoploss " + shortSL + " for sell order: " + OrderTicket() + " orderType: " +OrderType());
                  }
                  OrderModify(OrderTicket(), OrderOpenPrice(), shortSL, OrderTakeProfit(),0, Yellow);
                  //cnt = total-1; 
               }
         }   
      } // end of if
   } // end of for


よろしくお願いします :-)

ダニエル
 

 
ubzen:


記事を更新しました。
 

手始めに、Integer表現を使ってみて、もう一度テストを実行してみてください。それで問題が解決するかどうか確認してから、もう少し話をしましょう。Edit: これは、ordertypeが0から始まることと関係があると思います。また、orderselectは最後に選択されたオーダーを そのまま保持します。

 
ubzen:

手始めに、Integer表現を使ってみて、もう一度テストを実行してみてください。それで問題が解決するかどうか確認してから、もう少し話をしましょう。

何も変わりませんでした。アラートメッセージでOrderType()が1になっているのは、売り注文 ということです。本当に迷っています。上のコードにあるように、OrderSelect(...)がtrueを返すまでループさせようとしたのです。もしかしたら、注文を選択できないのかもしれないと思いました。しかし、それを使っても使わなくても全く同じです。
 
ubzen:

Edit: これは、ordertypeが0から始まることと関係があると思います。そして、orderselectは最後に選択されたオーダーをそのまま維持します。

可能性があります......

それはすることはできません何かとしてorderTypeを 宣言してみてください... ... 例えば。

int orderType = 10;

もし何もメッセージが出なければ、注文の選択が 機能していないことになります。

 
RaptorUK:

可能性があります ... ...

orderTypeを ありえないものとして 宣言してみる. .. ... 例えば。

もし何もメッセージが出なければ、注文の選択が機能していないことになります。


最初にint orderType = 10と宣言しても全く同じように動作します。

また、変数を宣言する代わりに、常にOrderType()を使用してみましたが、同じ問題があります。

また、注文を変更する直前にOrderSelect(...)を呼んで みましたが、変化なし。

 
バックテスターやデモアカウントでテストしているのでしょうか?
 
ubzen:
バックテスターかデモアカウントでテストしているのですか?

ライブでテストしています。EAをチャート上に置いて、何をするか見ています。「確認を求める」チェック ボックスを使っています。
 

Print();ステートメントをいくつか追加して、何が間違っているのか分かるようにしてください ... ... 例

if(/*OrderMagicNumber()==Magic &&*/ OrderSymbol()==Symbol())
      {      
         Print("orderType = ",orderType);
         if ((orderType == OP_BUY || orderType == OP_BUYSTOP)) {

.その後、「エキスパート」タブで見てみましょう。

 
サレジオの手動確認を使っていることに起因している可能性はありませんか?
理由: