multi lot scalper image

ここでは、Multi Lot ScalperというEAのコードを解読していきます。

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

Multi Lot Scalperのソースコード

EAのコードを解読

パラメーター用変数

まずは、どんなパラメータがあるかサラッと見ましょう!

extern double TakeProfit = 40;
extern double Lots = 0.1;
extern double InitialStop = 0;
extern double TrailingStop = 20;
extern int MaxTrades = 10;
extern int Pips = 15;
extern int SecureProfit = 10;
extern int AccountProtection = 1;
extern int OrderstoProtect = 3;
extern int ReverseCondition = 0;
extern double EURUSDPipValue = 10;
extern double GBPUSDPipValue = 10;
extern double USDCHFPipValue = 10;
extern double USDJPYPipValue = 9.715;
extern int StartYear = 2005;
extern int StartMonth = 1;
extern int EndYear = 2006;
extern int EndMonth = 12;
extern int EndHour = 22;
extern int EndMinute = 30;
extern int mm = 0;
extern int risk = 12;
extern int AccountisNormal = 0;

変数名で役割がなんとなく分かるものとそうでないものがありますが、先に進めば役割が分かってきますので、サラッとみます^^;

グローバル変数

グローバル変数もサラッ!と見ましょう。

int  OpenOrders = 0, cnt = 0;
int  slippage = 5;
double sl = 0, tp = 0;
double BuyPrice = 0, SellPrice = 0;
double lotsi = 0, mylotsi = 0;
int mode = 0, myOrderType = 0;
bool ContinueOpening = True;
double LastPrice = 0;
int  PreviousOpenOrders = 0;
double Profit = 0;
int LastTicket = 0, LastType = 0;
double LastClosePrice = 0, LastLots = 0;
double Pivot = 0;
double PipValue = 0;
string text = "", text2 = "";

今のところは、「こんな変数をここで宣言しているんだな~」程度で良いと思います。

start()関数内の処理

では早速start()関数の中身を見ていきましょう!

ロット数関係の処理

   if(AccountisNormal == 1)
	      if(mm != 0) 
	          lotsi = MathCeil(AccountBalance()*risk/10000); 
		     else 
		         lotsi=Lots; 
   else 
       // then is mini
       if(mm != 0) 
           lotsi = MathCeil(AccountBalance()*risk / 10000) / 10; 
		     else 
		         lotsi = Lots; 

このコードは、次のように変形すると分かりやすいと思います。

   lotsi = Lots;
   
   if (mm != 0)
   {
      if (AccountisNormal == 1)
         lotsi = MathCeil(AccountBalance() * risk / 10000);
      else
         lotsi = MathCeil(AccountBalance() * risk / 10000) / 10; 
   }
lotsi に Lots を代入
もし、mm が0以外なら
   AccountisNormal が1なら lotsi は、[残高×risk÷10000]小数以下切り上げ
   そうでないなら lotsi は、[残高×risk÷10000]小数以下切り上げ の10分の1

mmは、マネーマネジメントON/OFF用パラメーターで、AccountisNormalは、口座タイプNormal(1ロット単位)/mini(0.1ロット単位)切り替え用パラメーターということがわかります。

そして、次のコードで100ロットを超えないように制限しています。

   if(lotsi > 100) lotsi = 100; 

保有ポジション数確認

EA稼働チャートの通貨ペアでの保有ポジション数がOpenOrdersに格納されるようにしています。

   OpenOrders = 0;
   
   for(cnt = 0; cnt < OrdersTotal(); cnt++)   
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == Symbol()) OpenOrders++;
   }

稼働期間の指定

パラメーター StartYear, StartMonth, EndYear, EndMonth で指定した期間外で保有ポジションが無い場合は、ここで終了になるようにしようとしています。

   if(OpenOrders < 1) 
   {
      if(TimeYear(CurTime()) < StartYear) return(0);  
      if(TimeMonth(CurTime()) < StartMonth) return(0); 
      if(TimeYear(CurTime()) > EndYear) return(0); 
      if(TimeMonth(CurTime()) > EndMonth) return(0); 
   }

しかし、StartMonthにEndMonth以上の値が入力された場合、常にここで終了となってしまいますので、次のように修正しておくといいと思います。

   if(OpenOrders < 1) 
   {
      double now = TimeCurrent();
      if (TimeYear(now) < StartYear) return(0);
      if (TimeYear(now) > EndYear) return(0);
      if (TimeYear(now) == StartYear)
         if (TimeMonth(now) < StartMonth) return(0);
      if (TimeYear(now) == EndYear)
         if (TimeMonth(now) > EndMonth) return(0);
   }

謎の変数PipValue

次のコードでグローバル変数PipValueに値を代入します。

   if(Symbol() == "EURUSD") PipValue = EURUSDPipValue;
   if(Symbol() == "GBPUSD") PipValue = GBPUSDPipValue;
   if(Symbol() == "USDJPY") PipValue = USDJPYPipValue;
   if(Symbol() == "USDCHF") PipValue = USDCHFPipValue;
   if(PipValue == 0) PipValue = 5;

EA稼働チャートの通貨ペアに対応したパラメーター「通貨ペア名PipValue」の値を代入しています。
PipValue が0(それ以外の通貨ペア)の時には5を代入しています。もし PipValue が正の数じゃないとマズい時はif(PipValue <= 0) とした方がいいかもですね。

それにしても、PipValue は何に使うんでしょうね。ワクワクしますね!
このワクワクは、次回まで持ち越しましょうか。