multi lot scalper image

ここでは、Multi Lot ScalperというEAのコードを解読していきます。前回記事【Multi_Lot_Scalperの解読2】の続きからです。

前回記事【Multi_Lot_Scalperの解読2】へ

ダウンロード元はこちら↓
https://www.mql5.com/en/code/9330

Multi Lot Scalperのソースコード

EAのコードを解読(続き)

では、早速続きを見ていきましょう!

トレーリングストップ

続きのコードがこちら。

   for(cnt = OrdersTotal(); cnt >= 0; cnt--)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == Symbol())
      {
         if(OrderType() == OP_SELL)
            if(TrailingStop > 0)
               if(OrderOpenPrice() - Ask >= (TrailingStop + Pips)*Point)
                  if(OrderStopLoss() > (Ask + Point*TrailingStop))
                  {
                     OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point*TrailingStop,
                        OrderClosePrice() - TakeProfit*Point - TrailingStop*Point, 800, Purple);
                     return(0);
                  }
         if(OrderType() == OP_BUY)
            if(TrailingStop > 0)
               if(Bid - OrderOpenPrice() >= (TrailingStop + Pips)*Point)
                  if(OrderStopLoss() < (Bid - Point*TrailingStop))
                  {
                     OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point*TrailingStop,
                        OrderClosePrice() + TakeProfit*Point + TrailingStop*Point, 800, Yellow);
                     return(0);
                  }
      }
   }

なんだかややこしいのですね。少し変形したコードがこちら。

   if (TrailingStop > 0)
   {
      for(cnt = OrdersTotal(); cnt >= 0; cnt--)
      {
         OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
         if(OrderSymbol() != Symbol()) continue;
         
         if(OrderType() == OP_SELL)
            if(Ask <= OrderOpenPrice() - (TrailingStop + Pips) * Point)
               if(OrderStopLoss() > Ask + TrailingStop * Point)
               {
                  OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TrailingStop*Point,
                     OrderClosePrice() - TakeProfit*Point - TrailingStop*Point, 800, Purple);
                  return(0);
               }
         if(OrderType() == OP_BUY)
            if(Bid >= OrderOpenPrice() + (TrailingStop + Pips) * Point)
               if(OrderStopLoss() < Bid - TrailingStop * Point)
               {
                  OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TrailingStop*Point,
                     OrderClosePrice() + TakeProfit*Point + TrailingStop*Point, 800, Yellow);
                  return(0);
               }
      }
   }
もし TrailingStop が0より大きい場合
   取引タブの下からポジションを選択して、通貨ペアが一致したポジションなら

      売りポジションの場合、
         Ask が エントリー価格 - (TrailingStop + Pips)ポイント 以下で
         現在SL が Ask + TrailingStopポイント より大きい場合、
            SLを Ask + TrailingStopポイント に
            TPを 決済価格(Ask) - TakeProfitポイント - TrailingStopポイント に変更
            start()関数終了。

      買いポジションの場合、
         Bid が エントリー価格 + (TrailingStop + Pips)ポイント 以上で
         現在SL が Bid - TrailingStopポイント より小さい場合、
            SLを Bid - TrailingStopポイント に
            TPを 決済価格(Bid) + TakeProfitポイント + TrailingStopポイント に変更
            start()関数終了。

ざっくり言うと、パラメーター「Pips」ポイント利益方向から始まるTrailingStopポイント幅のトレーリングです。それと同時にTPを現在価格から(TakeProfit+TrailingStop)ポイント離れた価格に再設定しています。

このコードのままだと、売りポジションのSL設定なし(OrderStopLoss() == 0)のとき、トレーリングが発動しません。
if(OrderStopLoss() > Ask + TrailingStop * Point)

if(OrderStopLoss() == 0 || OrderStopLoss() > Ask + TrailingStop * Point)
というように修正が必要です。

あと実数の比較の際には、できれば価格表示小数桁数で丸めて比較した方が良いです。

また、OrderModify()関数の有効期限には、日時を指定するようにしますが、予約注文の為のパラメーターで約定済みのポジションには指定できません。

他にも気になる点がありますが、まだまだ先がありますので今日はこの辺で。