初心者向けに、MQL4言語を使ったプログラミングについて解説しています。
今回は、MT4のサンプルEA「MACD Sample.mq4」のソースコードの一部を書き換えて「複利システム」を実装します。
仕組みさえわかれば、あなたの自作EAにも簡単に実装できます。
ぜひあなたの勝てるEA作りに役立ててください。
複利とは?単利との違い
複利効果とは、トレードで得た利益を再び投資することにより、利息が利息を生んで大きくふくらんでいく効果のことです。
例えば、トレードにあたり、口座資金の一定割合でロット数を決めるとすると、口座資金の増減に応じてロット数が変動します。
もし勝ちトレードで利益が出れば、口座資金の増加に応じて次のトレードのロット数が増えることになります。
一般的な単利の計算は「足し算」ですが、複利の計算は「掛け算」です。
資産に対してどのような割合でロット数を決めるかにもよりますが、この方式で資産が増えていく場合には、グラフのように二次曲線的に資産が増えます。
ということは、逆の場合には、負けも大きくなるので注意が必要です。
MetaEditor の起動
サンプルコード「MACD Sample.mq4」の一部を書き換えて、複利システムを実装させます。
MT4の「メタクォーツ言語エディタ」をクリックします。
MeTaEditorが立ち上がったら、画面左側の「Navigater」内のツリーから「Experts」をダブルクリックします。
「Experts」のツリーから「MACD Sample.mq4」をダブルクリックすると、ソースコードが開きます。
複利システムの自作
それでは、いよいよソースコードを書き換えていきます。
パラメーターの変更
カーソルを10行目に移動させます。
ここでは、ユーザーが変更可能なパラメーターを設定しています。
【変更前】
input double TakeProfit =50;
input double Lots =0.1;
input double TrailingStop =30;
input double MACDOpenLevel =3;
input double MACDCloseLevel=2;
input int MATrendPeriod =26;
【変更後】
input bool AccountUSD =true; input double TakeProfit =50; input double Leverage =10; input double TrailingStop =30; input double MACDOpenLevel =3; input double MACDCloseLevel=2; input int MATrendPeriod =26;
新たに変数「AccountUSD」を宣言し、ドル建て口座(true)なのか円建て口座(false)なのかを確認します。
変数「Lots」を削除し、新たに変数「Leverage」を宣言します。
ロット数は、サンプルコードでは外部パラメーター「Lots」で自分で決めていましたが、複利システムでは口座残高とレバレッジに応じて内部関数で計算します。
テクニカルインジケーター変数の宣言の追加
カーソルを下に移動させます。
ここでは、テクニカルインジケーター変数の宣言を記述しています。
double MacdCurrent,MacdPrevious;
double SignalCurrent,SignalPrevious;
double MaCurrent,MaPrevious;
int cnt,ticket,total;
double Lots;
ロット数の計算結果を入れる変数として「Lots」を宣言しました。
複利システムの追加
カーソルを下に移動させます。
テクニカルインジケーター変数の宣言の前あたりに、新たに複利システムのコードを記述していきます。
if(AccountUSD==true)
Lots=NormalizeDouble(AccountFreeMargin()*Leverage/1000,1)*0.01;
else Lots=NormalizeDouble(AccountFreeMargin()*Leverage/(10000*Ask),1)*0.01;
if(Lots<=0.01) Lots=0.01; if(Lots>=10) Lots=10;
//--- to simplify the coding and speed up access data are put into internal variables
まず、if文(条件分岐) で、口座タイプがドル建てなのか円建てなのかを確認します。
パラメーター「AccountUSA」を「true」にした場合は、ドル建て口座なので、
Lots=NormalizeDouble(AccountFreeMargin()*Leverage/1000,1)*0.01;
NormalizeDouble関数は、指定された精度で丸められた浮動小数点数を返します。
ここでは、口座残高にレバレッジを乗じたものを最低取引単位(1000通貨)で割った値を、小数点以下第1位で丸めています。
さらに、1ロットは10万通貨、最低取引単位(1000通貨)は0.01ロットなので、0.01をかけています。
パラメーター「AccountUSA」を「false」にした場合は、
Lots=NormalizeDouble(AccountFreeMargin()*Leverage/(1000*Ask),1)*0.01;
こちらは、買値(Ask)を乗じて円建て口座の場合のロット数を計算しています。
さらに、取引の安全を考え、ロット数が小さくなりすぎたり大きくなりすぎるのを避けるため、0.01ロット以下の場合のロット数は0.01ロットとし、10ロット以上の場合は10ロットとしました。
ソースコードの書き換えは以上です。
複利システムの注意点
最初の方で、複利は負けも大きいので注意が必要だと書きましたが、ちょっと説明します。
複利システムは、当然ですが、勝てるEAに使うのが前提です。
ただし、勝てるEAであっても、ドローダウンが大きいEAにも向いていません。
そんなEAに複利システムを使えば、ドローダウンの負けはより大きくなり、ドローダウン後の回復にはより時間がかかってしまいます。
複利システムを実装する場合は、EAの特性を理解した上で使いましょう。
まとめ
MQL4言語入門として、MT4のサンプルEA「MACD Sample.mq4」のソースコードの一部を書き換えて「複利システム」を実装させました。
仕組みさえわかれば、自作EAに簡単に実装できます。
ぜひあなたの勝てるEA作りに役立ててください。
ただし、くれぐれも、EAの特性を理解した上で、複利システム向きのEAに使いましょう。