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【チャンネル登録よろしくお願いします!】
⇩⇩
現在足と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登録でプログラミング講座を無料受講!
3.水平線にタッチした時に自動で知らせてくれるインジケーター
4.RSI、ストキャスティクス、CCIをミックスした逆張りサインインジケーター(勝率表示機能付き)
5.ローソク足が短期EMAに対して浮遊した時サインが出るインジケーター(勝率表示・背景色変更機能付き)