MQL4で移動平均線を呼び出せるiMA()関数とは?プログラミングの仕方やサンプルコードをご紹介!

 

MQL4で移動平均線を呼び出せる

「iMA()関数」

について記事を書きました。

 

移動平均線を使ったインジケーターやEAを作りたい!けどどうやって使えばいいかわからない・・

そんな方はこの記事を読んでください。

 

iMA関数の基本や移動平均線を活用したインジケーター・EAのサンプルコードも用意しましたので最後までご覧ください。

 

MQL4プログラミングで移動平均線を呼び出せるiMA()関数とは?

double iMA(
string symbol,// 通貨ペア
int timeframe,// 時間軸
int ma_period,// MAの期間
int ma_shift,// MAシフト
int ma_method,// MAの平均メソッド
int applied_price,// 適用価格
int shift// シフト
);

移動平均線を呼びだす際はiMA()関数」を使います。

呼び出し方は決まっており、引数は下記の通りです。

string symbol

通貨ペア名。

NULLは現在の通貨ぺアを意味します。

int timeframe

呼び出したいMAの時間軸。

PERIOD_CURRENT 0 現在チャートの時間軸
PERIOD_M1 1 1分
PERIOD_M5 5 5分
PERIOD_M15 15 15分
PERIOD_M30 30 30分
PERIOD_H1 60 1時間
PERIOD_H4 240 4時間
PERIOD_D1 1440 1日
PERIOD_W1 10080 1週間
PERIOD_MN1 43200 1ヶ月

 

int ma_period

移動平均線を計算する期間

5MAなら5と、25MAなら25と入力する

int ma_shift

移動平均線の表示を右方向にシフトするバーの数

int ma_method

移動平均線の種類を指定する。

MODE_SMA 0 単純移動平均線
MODE_EMA 1 指数移動平均線
MODE_SMMA 2 平滑移動平均線
MODE_LWMA 3 加重移動平均線

int applied_price

適応価格。

PRICE_CLOSE 0 終値
PRICE_OPEN 1 始値
PRICE_HIGH 2 高値
PRICE_LOW 3 安値
PRICE_MEDIAN 4 中間値
(高値 + 安値)/2
PRICE_TYPICAL 5 平均値1
(高値 + 安値 + 終値)/3
PRICE_WEIGHTED 6 平均値2
(高値 + 安値 + 終値 + 終値)/4

int shift

移動平均線の値を取得したいバーの位置を指定します。(最新足が0)

iMA()関数を使った移動平均線サンプルコード【MQL4プログラミング】

iMA()関数を使った移動平均線サンプルコードを紹介していきます。

細かい解説は省きますが、MQLの基本を理解してからサンプルコードを見ると理解度がぐんと上がります。

 

MQLの基本を学びたい方は下記の記事とYOUTUBEをご覧ください。

⇩⇩

 

YOUTUBE【チャンネル登録よろしくお願いします!】

⇩⇩

インジケータープログラミング講座

EAプログラミング講座

 

現在足と1本前足の100SMAの値を取得したい場合のサンプルプログラム

double MA0 = iMA(NULL,0,100,0,MODE_SMA,PRICE_CLOSE,0);//現在足
double MA1 = iMA(NULL,0,100,0,MODE_SMA,PRICE_CLOSE,1);//1本前

MAを呼び出す際はiMA関数を使いdouble型の変数に保存しましょう。

ma_periodに「100」

ma_methodに「MODE_SMA」

applied_priceに「PRICE_CLOSE」

シフトに0(最新足)と1(1本前足)

入力するだけです。

 

チャートに2本の移動平均線を表示するインジケーター

//+------------------------------------------------------------------+
//|                                                          2MA.mq4 |
//|                                        Copyright 2021, キャンドルマツ |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, キャンドルマツ"
#property strict
#property indicator_chart_window//メインウインドウに表示

#property indicator_buffers 2//表示したいバッファーの数
#property indicator_width1 1//太さ
#property indicator_color1 clrGold//色
#property indicator_width2 1
#property indicator_color2 clrAqua

double Buffer_0[];
double Buffer_1[];
//パラメーター
extern int MA1_Period= 6;//短期MA期間
extern int MA2_Period= 14;//長期MA期間

//+------------------------------------------------------------------+
//| インジケーターを入れたときに一度だけ通る(OnInit)             |
//+------------------------------------------------------------------+
int OnInit()
  {
   IndicatorBuffers(2);
   SetIndexBuffer(0,Buffer_0);
   SetIndexStyle(0,DRAW_LINE);//Buffer_0にラインを設定

   SetIndexBuffer(1,Buffer_1);
   SetIndexStyle(1,DRAW_LINE);//Buffer_1にラインを設定
   return(INIT_SUCCEEDED);//Init終了
  }


//+------------------------------------------------------------------+
//| ここからティックごと                                             |
//+------------------------------------------------------------------+
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 limit = Bars - IndicatorCounted()-1;
   if(limit < 0)
      limit = 0;

   for(int i = limit; i >= 0; i--)
     {
//MAの値を取得
      double ma1=iMA(NULL,0,MA1_Period,0,MODE_SMA,PRICE_CLOSE,i);//短期MA
      double ma2=iMA(NULL,0,MA2_Period,0,MODE_SMA,PRICE_CLOSE,i);//長期MA
//取得したMAをバッファーに入れる
      Buffer_0[i]=ma1;
      Buffer_1[i]=ma2;

     }//--- for

   return(rates_total);
  }

//+------------------------------------------------------------------+

 

移動平均線をチャートに入れるとき1本ずつ入れていくのめんどくさくないですか?

iMA関数を活用すれば2本のMAを1つのインジケーターで表示させることが可能です。(何本でも可能)

 

移動平均線のゴールデンクロスで上矢印、デッドクロスで下矢印を出すサインツール

//+------------------------------------------------------------------+
//|                                                          2MA.mq4 |
//|                                        Copyright 2021, キャンドルマツ |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, キャンドルマツ"
#property strict
#property indicator_chart_window

#property indicator_buffers 2

#property indicator_width1 5
#property indicator_color1 clrGold
#property indicator_width2 5
#property indicator_color2 clrAqua

double Buffer_0[];
double Buffer_1[];

extern int MA1_Period= 6;//短期MA期間
extern int MA2_Period= 14;//長期MA期間

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   IndicatorBuffers(2);
   SetIndexBuffer(0,Buffer_0);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,241);

   SetIndexBuffer(1,Buffer_1);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,242);
   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 limit = Bars - IndicatorCounted()-1;
   if(limit < 0)
      limit = 0;

   for(int i = limit; i >= 0; i--)
     {

      double ma1=iMA(NULL,0,MA1_Period,0,MODE_SMA,PRICE_CLOSE,i);//短期MA
      double ma2=iMA(NULL,0,MA2_Period,0,MODE_SMA,PRICE_CLOSE,i);//長期MA
      double ma10=iMA(NULL,0,MA1_Period,0,MODE_SMA,PRICE_CLOSE,i+1);//1本前短期MA
      double ma20=iMA(NULL,0,MA2_Period,0,MODE_SMA,PRICE_CLOSE,i+1);//1本前長期MA

      Buffer_0[i]=EMPTY_VALUE;
      Buffer_1[i]=EMPTY_VALUE;
//ゴールデンクロスで安値の下に上矢印
      if(ma10<ma20 && ma1>=ma2)
        {
         Buffer_0[i] = Low[i]-10*Point;
        }
//デッドクロスで高値の上に下矢印
      if(ma10>ma20 && ma1<=ma2)
        {
         Buffer_1[i] = High[i]+10*Point;
        }
     }//--- for

   return(rates_total);
  }

//+------------------------------------------------------------------+

 

移動平均線のゴールデンクロスで上矢印、デッドクロスで下矢印のサインツールは上のように書きます。

・矢印をバッファーに割り当てる

・現在足・1本前足の移動平均線の値(短期、長期)を取得

・1本前と現在足を比べてゴールデンクロスで上矢印、デッドクロスで下矢印を出す

この順序で書くことでサインツールが作れます。

 

移動平均線のゴールデンクロスで買い、デッドクロスで売りの自動売買EA

//+------------------------------------------------------------------+
//|                                                        2MAEA.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "キャンドルマツが語るトレード部屋"
#property link      "https://tradedekasegu.info/"
#property version   "1.00"
#property strict

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {

   return(INIT_SUCCEEDED);
  }

extern string Note0="";//----------基本設定----------
extern int  magicnum = 5555;//マジックナンバー
extern double Lots = 0.01;  // ロット数
extern int Slippage = 20;  // 許容スリッページ

extern int MA1_Period= 6;//短期MA期間
extern int MA2_Period= 14;//長期MA期間

extern int rikaku = 100;  //利確ポイント(10→1pips)
extern int son = 200;  //損切ポイント(10→1pips)

int NowBars=0;
bool Ticket=false;


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

   double ma1=iMA(NULL,0,MA1_Period,0,MODE_SMA,PRICE_CLOSE,1);//短期MA
   double ma2=iMA(NULL,0,MA2_Period,0,MODE_SMA,PRICE_CLOSE,1);//長期MA
   double ma10=iMA(NULL,0,MA1_Period,0,MODE_SMA,PRICE_CLOSE,2);//1本前短期MA
   double ma20=iMA(NULL,0,MA2_Period,0,MODE_SMA,PRICE_CLOSE,2);//1本前長期MA

//足確定でエントリー
   if(NowBars < Bars)
     {
      NowBars = Bars;

      if(OrdersTotal() == 0)
        {
//デッドクロスで売り
         if(ma10>ma20 && ma1<=ma2)
           {
            Ticket=OrderSend(NULL,OP_SELL,Lots,Bid,Slippage,Bid+son*Point,Bid-rikaku*Point,NULL,magicnum,0,Aqua);
           }
//ゴールデンクロスで買い
         if(ma10<ma20 && ma1>=ma2)
           {
            Ticket=OrderSend(NULL,OP_BUY,Lots,Ask,Slippage,Ask-son*Point,Ask-rikaku*Point,NULL,magicnum,0,White);
           }
        }

     }//---NowBars

  }//---OnTick

//+------------------------------------------------------------------+

 

移動平均線のゴールデンクロスで買い、デッドクロスで売りの自動売買EAを作る場合もサインツールとほぼ同じです。

サインを出していた箇所を「OrderSend」関数でエントリーするように書き換えるだけです。

 

LINE登録でプログラミング講座を無料受講!

当サイトでは無料でプログラミングを学ぶことができるメール講座を配信しています。
登録するだけで7日間にわたる講義によりインジケーター・EAを作るまでの流れ、コードを学ぶことができます。
MQL4初心者の方でも、マスターできるようにサンプルコードを用いて基礎から実践的な内容までお教えしていきます。
無料でMQL4を学んで一人でインジケーター・EA開発ができるようになりませんか?
さらに今だけ有料級インジケーター5つをコード付きで無料プレゼント中!
1.RSIの買われすぎ売られすぎでサインが出るサインインジケーター
2.ストキャスティクスが買われすぎ売られすぎで売買するEA(自動売買)
3.水平線にタッチした時に自動で知らせてくれるインジケーター
4.RSI、ストキャスティクス、CCIをミックスした逆張りサインインジケーター(勝率表示機能付き)
5.ローソク足が短期EMAに対して浮遊した時サインが出るインジケーター(勝率表示・背景色変更機能付き)

Twitterでフォローしよう!!

おすすめの関連記事