multi lot scalper image

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

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

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

Multi Lot Scalperのソースコード

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

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

1ティック1ポジ決済の全決済仕掛け

   if(PreviousOpenOrders > OpenOrders)
   {
      for(cnt = OrdersTotal(); cnt >= 0; cnt--)
      {
         OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
         mode = OrderType();
         if(OrderSymbol() == Symbol())
         {
            if(mode == OP_BUY)
               OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), slippage, Blue);
            if(mode == OP_SELL)
               OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), slippage, Red); 
            return(0);
         }
      }
   }
   PreviousOpenOrders = OpenOrders;

このコードの一番最後に、グローバル変数PreviousOpenOrdersに現在の保有ポジション数が代入されています。次のティックではPreviousOpenOrdersの値は、最後に保有ポジション数が代入された時の値となります。

それを踏まえて、このコードの上から見ていくと、

最後にポジション数が代入された時の値より現在ポジション数が少ない場合、
   取引タブの下から順にポジションを選択していき、
      EA稼働通貨ペアと同じ通貨ペアのポジションなら
         それを決済して、start()関数終了

また、次のティックでも同じ処理をして、EA稼働通貨ペアと同じ通貨ペアの保有ポジションが無くなるまで毎ティック続けます。

保有ポジションが無くなれば、ここでのstart()関数終了は実行されず、PreviousOpenOrdersにOpenOrdersの値すなわち0が代入されます。

最大ポジション数制限によるエントリー許可判定

保有ポジション数とパラメーターMaxTradesの値の比較によって、エントリー許可フラグContinueOpeningの切り替えをしています。

   if(OpenOrders >= MaxTrades)
      ContinueOpening = False;
   else
      ContinueOpening = True;

最新ポジションのエントリー価格取得と売買別判定

次のコードでは、最新ポジションのエントリー価格をLastPriceに格納、買いポジションか売りポジションかをmyOrderTypeでわかるように値を代入しています。

   if(LastPrice == 0)
   {
      for(cnt = 0; cnt < OrdersTotal(); cnt++)
      {	
         OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
         mode = OrderType();	
         if(OrderSymbol() == Symbol())
         {
            LastPrice = OrderOpenPrice();
            if(mode == OP_BUY) myOrderType = 2;
            if(mode == OP_SELL) myOrderType = 1;
         }
      }
   }
LastPrice が0なら、
   取引タブの上から順にポジションを選択して、
      EA稼働チャートの通貨ペアと同じ通貨ペアのポジションがあれば、
         そのエントリー価格をLastPriceに代入
         買いポジションなら、myOrderTypeに2を代入
         売りポジションなら、myOrderTypeに1を代入

取引タブでは、ソートの仕方で取引した順に並ばない場合があるので、OrderOpenTime()でエントリー時間を取得して比較する方法の方がよさそうですね。

ポジション無しの時の売買方向を決定

次のコードは、ポジションが無い時の売買方向を決めるコードです。MACDが上昇なら買い、下降なら売り、そしてReverseConditionが1のときは、それを逆にしています。

   if(OpenOrders < 1)
   {
      myOrderType = 3;
      if(iMACD(NULL, 0, 14, 26, 9, PRICE_CLOSE, MODE_MAIN, 0) >
         iMACD(NULL, 0, 14, 26, 9, PRICE_CLOSE, MODE_MAIN, 1)) myOrderType = 2;
      if(iMACD(NULL, 0, 14, 26, 9, PRICE_CLOSE, MODE_MAIN, 0) <
         iMACD(NULL, 0, 14, 26, 9, PRICE_CLOSE, MODE_MAIN, 1)) myOrderType = 1;
      
      if(ReverseCondition == 1)
      {
         if(myOrderType == 1)
            myOrderType = 2;
         else if(myOrderType == 2)
            myOrderType=1;
      }
   }

LastPrice や myOrderType が、この先のプログラムで重要な役割を果たしそうですね!
ワクワクしてきたところですが、今回はこの辺で。