ここでは、Multi Lot ScalperというEAのコードを解読していきます。
ダウンロード元はこちら↓
https://www.mql5.com/en/code/9330
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 は何に使うんでしょうね。ワクワクしますね!
このワクワクは、次回まで持ち越しましょうか。
StartYear、EndMonthとかはEA有料化するため、期限を設定する用ですね。
Bogie-ATC2007-1もそういう風に期限付きのバージョンを売ってますね。
ですよね!
ありがとうございます。