【MT4】MQLプログラミング組み込み指標関数による移動平均線の作成
【動画】組み込み指標関数による移動平均線の作成
移動平均線インジケーターのソースコード
//+------------------------------------------------------------------+ //| ma2.mq4 | //| Copyright 2020, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2020, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict #property indicator_chart_window #property indicator_buffers 2 #property indicator_plots 2 //--- plot Label1 #property indicator_label1 "Label1" #property indicator_type1 DRAW_LINE #property indicator_color1 clrYellow #property indicator_style1 STYLE_SOLID #property indicator_width1 3 //--- plot Label2 #property indicator_label2 "Label2" #property indicator_type2 DRAW_LINE #property indicator_color2 clrAqua #property indicator_style2 STYLE_SOLID #property indicator_width2 3 //--- indicator buffers double Buf_0[]; double Buf_1[]; extern int MA_F=50; extern int MA_S=200; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,Buf_0); SetIndexBuffer(1,Buf_1); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ 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 i,limit; limit=rates_total-prev_calculated; for(i=limit-1 ; i>=0 ; i--) { Buf_0[i]=iMA(NULL,0,MA_F,0,MODE_SMA,PRICE_CLOSE,i); Buf_1[i]=iMA(NULL,0,MA_S,0,MODE_SMA,PRICE_CLOSE,i); } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
MT4の組み込み指標関数で移動平均線を作成する
MetaEditorを開いて、作業してみましょう。
ファイルメニューから新規作成、カスタムインディケータ―を選びます。
名前はma2として次へ、ここは好きな名前で大丈夫です。
イベントハンドラはそのままで次へ、描画プロパティは、今回移動平均線を2本作りますので、2回追加して、色は見やすい黄色と水色にしておきます。
そして完了。
これまで初期値のまま使ってきましたが、計算した指標の数値を直接入れるバッファの名前が長いので短くします。
26行目と27行目、Buf_0、Buf_1にしました。
そうすると、これを活性化させるSetIndexBufferも変更する必要がありますので、34行目と35行目、Label1BufferとLabel2BufferのところをBuf_0、Buf_1に変更します。
ここまでが、準備段階です。
下へスクロールし、内容の記述は、55行目からになります。
int i,limit;
limit=rates_total-prev_calculated;
この次は、for文を記述します。
for(i=limit-1; i>=0; i–)
{
}
この、空いている部分には、移動平均線の組み込み指標関数を記述します。
このfor文、インジケーターをチャートに挿入したときは、「prev_calculated=0」となっているので、「limit=rates_total」となり、for文でループさせて-1ずつ減らし、最終的に0に減らすことでチャート全体の指標を計算することができます。
ここで、次にチャートが動いて新しくバーが出ると、Oncalculateで再計算、rates_totalには全体のバーの数+1が入り、prev_calculatedには全体のローソク足の数が入るので、引き算すると結果は1、それを次のfor文に入れます。
ここで、limit-1で-1された答えの0が変数iに入るので、最新のバーだけ描画されます。MQLでは、1ではなく0番目が、最新のバーでした。
最後に、
今回の目玉である組み込み指標関数を記述します。
記述ルールはこちら。
iMA(①symbol,②timeframe,③period,④ma_Shift,⑤ma_method,⑥applied_price,⑦shift)
中身は引数と言いますが英語なので、日本語にするとこうなります。
iMA(①通貨ペア,②時間枠,③移動平均の期間,④移動平均を右方向にシフトするバーの数,⑤移動平均の種類,⑥移動平均を算出する位置,⑦移動平均の算出バー)
組み込み指標関数iMAの説明
①symbol 通貨ペア
通貨ペアを設定します。「NULL」と書けば、プログラムを挿入したチャートの通貨ペアを使用します
②timeframe 時間枠
計算に使用する時間枠を設定します。「0」で現在のチャート上の時間を使用、1時間足なら60、4時間足なら240、日足なら1440という風に設定します。
③Period 移動平均を算出するバーの本数
5日移動平均なら5、200日移動平均なら200と入力します。
ただ、これだと固定されてしまうので、今回のプログラムでは変数にしてパラメーターで数値を変更可能にします。
そのため、いったん上に戻って、
28、29行目に
エクスターンで変数を宣言しておきます。
ここでは移動平均線を2本引くので、
短期移動平均線をMA_F、
長期移動平均線をMA_Sとしておきます。
extern int MA_F=50;
extern int MA_S=200;
④MA_Shift 移動平均を右方向へずらすバーの数
一目均衡線の遅行線のように右方向へずらす場合、その数を指定します。
特になければ「0」で大丈夫です。
⑤ma_method 移動平均の種類
移動平均の種類を4つの中から選びます。
MODE_SMA 単純移動平均(SMA)
MODE_EMA 指数移動平均(EMA)
MODE_SMMA 平滑移動平均(SMMA)
MODE_LWMA 線形加重移動平均(LWMA)
になります。
今回は、 単純移動平均なのでMODE_SMAです。
⑥applied_Price 適応する価格
計算にどの価格を使うかを指定します。移動平均線では基本的には終値を使うのでPRICE_CLOSEとなっています。他にも始値、高値などいろいろな値で計算できます
PRICE_CLOSE 終値
PRICE_OPEN 始値
PRICE_HIGH 高値
PRICE_LOW 安値
PRICE_MEDIAN (高値+安値)÷2
PRICE_TYPICAL (高値+安値+終値)÷3
PRICE_WIGHTED(高値+安値+終値*2)÷4
⑦shift 現在のバーから何本目のバーの移動平均を算出するかを探します。現在のバーが0で、過去のバーは1、2、3と数字が増えていきます。つまり、変数iを入れればよいです。
コメント