mq4ファイルを複製する
移動平均のカスタムインジケータを作成するのですが、
以前紹介したMQLウィザードは使用しません。
前回作成した終値ラインのカスタムインジケータのソースコードを複製して、それをベースにします。
まずはメタエディターのメニューから
ファイル ⇒ データフォルダを開く
を選択します。
データフォルダが開かれますので、MQL4フォルダを開きます。
MQL4フォルダを開いたらIndicatorsフォルダを開きます。
Indicatorsフォルダの下に前回作成したTestCloseLine.mq4ファイルがありますので、これをコピー&ペーストして複製します。
TestCloseLine.mq4ファイルを複製したら、TestMALine.mq4に名前を変更します。
メタエディターのナビゲータにTestMALine.mq4ファイルが追加されます。
単純にコピーしただけなので、ソースコード内のコメントは直しておきましょう
(コメントは変更しなくても問題ありませんが、動作に影響しない部分なのでうっかり直し忘れる事があります)。
移動平均線インジケータを表示する
終値ラインを表示するインジケータのソースコードを基に作成するので、これを移動平均線に変更するのは非常に簡単です。
インジケータ1表示用動的配列に終値を設定していた行を
コメントアウトし、
代わりに移動平均の価格を設定します。
移動平均の価格はMQL4で事前に用意されている
テクニカルインジケータ関数
の
iMA関数を使用して算出します。
コンパイルしTestMALine.ex4ファイルをチャートに適用すると
25MAのチャートが表示されます。
テクニカルインジケータ関数
先程使用した
テクニカルインジケータ関数
の
iMA関数の引数について説明しましょう。
プログラミング未経験者の人は、引数の多い関数を見ると挫折しそうになりますが、
一つずつ説明するので投げ出さずに読んで下さい。
まず、MQL4で事前に用意されている関数は、その関数毎に戻り値や引数がある為、必ずリファレンスを確認する必要があります。
このリファレンス確認の作業は一生続きます。
勿論、頻繁に使用する関数で覚えてしまっているものはリファレンスを確認する必要はありません。
プログラミング未経験者はリファレンスを確認せずに「XXXの関数のパラメータに何を設定すればいいですか?」という類の問い合わせをしてくる事が多い(MQL4に限らずIT企業に入社した社員や外注プログラマーもリファレンスやマニュアルを見ずに似たような質問をして来ます)です。
このページではプログラミング未経験者にも分かるように細かく説明していますが、他テクニカルインジケータ関数を使用する際には自身で
テクニカルインジケータ関数のリファレンスを調べる必要があります。
iMA関数
の第1引数には、移動平均を算出する通貨ペアを設定する必要があります。
ここでは
Symbol()を指定します、
Symbol()は現在の通貨ペアの値を返します。
もし違う通貨ペアを指定した場合、指定した通貨ペアの移動平均を算出する事になります。
iMA関数
の第2引数には、移動平均を算出する時間軸を設定する必要があります。
ここでは
Period()を指定します、
Period()は現在の時間軸の値を返します。
もし違う時間軸を指定した場合、指定した時間軸の移動平均を算出する事になります。
違う時間軸を指定したい場合は
ENUM_TIMEFRAMES列挙の値を使用します。
iMA関数
の第3引数には、移動平均を算出する期間を設定する必要があります。
ここでは25を指定していますので、過去25本の移動平均を算出する事になります。
まさか「移動平均って何?」という人はいないと思いますが(昔現場で外注プログラマーが「移動平均って何?」と聞いてきた人がいました)、そもそも
移動平均が分からないという人は
Wikipediaで調べて下さい。
iMA関数
の第4引数には、移動平均を算出するインデックスのオフセット設定します。
ちょっとややこしいのですが、算出するインデックスでは無く、
インデックスのオフセットである事に注意して下さい。
オフセットする必要が無い場合は0を指定します。
理解するのが難しかったら0固定で指定して下さい。
ちなみにオフセット1を指定した場合
水色の移動平均線が1オフセット指定したインジケータです。
このように指定したインデックス+1オフセットした移動平均が算出されます。
iMA関数
の第5引数には、移動平均の算出方法(単純移動平均や指数移動平均等)を指定します。
MQL4で用意されている移動平均メソッド用インジケータ定数リストの
ENUM_MA_METHODを使って設定します。
ここでは
MODE_SMAを指定していますので、単純移動平均が算出されます。
iMA関数
の第6引数には、どの価格を基に移動平均を算出するかを指定します。
MQL4で用意されている価格定数用インジケータ定数リストの
ENUM_APPLIED_PRICEを使って設定します。
ここではPRICE_CLOSEを指定していますので、終値を基に移動平均を算出します。
iMA関数
の第7引数には、どのバーの移動平均を算出するかを指定します。
ここではforループカウンターのicountを指定していますので、バーインデックスが指定されます。
このバーインデックスを起点に過去25本のバーから移動平均が算出される事になります。
これら全ての引数の設定値から、
現在表示されているチャートの通貨ペアと時間軸で、終値を基に25本の単純移動平均が算出される事が分かります。
インプットパラメータ設定(input変数)
移動平均線は終値ラインと違って算出期間等のパラメータで使用用途を広げられるので、
input変数を追加してこのインジケータにパラメータを追加します。
input変数は、関数の外で宣言した変数にinput修飾子を付けます。
ソースコード:
input int _InputMAPeriod = 25;
関数の外に、_InputMAPeriodという
int型の変数を宣言して、先頭に
input修飾子をつけます。
インジケータのプロパティを確認すると、"パラメータの入力タグ"に"移動平均期間"という変数が追加されています。
当然ですが、未だこの
input変数は宣言しただけなので、
この値を変更しても何も変わりません。
何故かこのインプットパラメータを追加しただけで勝手に機能が追加されると思い込む人がいるのですが、
最初に説明した通りコンピュータは賢くないので1~10まで全て指示しなければなりません。
つまりこのインプットパラメータに対して何をさせたいのか?という事を全て指示する必要があります。
iMA関数の引数に25というマジックナンバーを使用していたので、マジックナンバーの代わりにこの
input変数の_InputMAPeriodを使用するように変更しましょう。
コンパイルして、パラメータの移動平均期間を5に変更してみましょう。
5本の単純移動平均が表示されました。
完成したサンプルソースコード
最後に出来上がったソースコードをまとめると、
ソースコード:
#property copyright "yuki"
#property link "https://yukifx.web.fc2.com/"
#property version "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 clrWhite
#property indicator_width1 2
#define IND_MIN_INDEX 2
double _IndBuffer1[];
input int _InputMAPeriod = 25;
int OnInit()
{
SetIndexBuffer( 0, _IndBuffer1 );
return( INIT_SUCCEEDED );
}
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
int end_index = Bars - prev_calculated;
if ( end_index <= IND_MIN_INDEX ) {
end_index = IND_MIN_INDEX;
}
if ( Bars <= IND_MIN_INDEX ) {
return 0;
}
for( int icount = 0 ; icount < end_index ; icount++ ) {
double get_ma = iMA (
Symbol(),
Period(),
_InputMAPeriod,
0,
MODE_SMA,
PRICE_CLOSE,
icount
);
_IndBuffer1[icount] = get_ma;
}
return( rates_total );
}
コメントアウトしていた終値ラインの行は削除しました。
iMA関数の引数を分かり易いように複数行で書きましたが、あれは1行でも書けるので、
実質変更したソースコードは4行だけです。
iMA関数を使っている部分を他の
テクニカルインジケータ関数に変える事で、
簡単に他インジケータを作る事が出来ます。
課題
上記サンプルソースコード変更して、指数移動平均(EMA)のカスタムインジケータを作成して下さい。
■ヒント
・
ENUM_MA_METHOD