パーフェクトオーダーとMACDを組み合わせたインジケーター
パーフェクトオーダーとMACDを組み合わせたインジケーターを作成したいと思います。
- 上昇パーフェクトオーダーでMACDがゴールデンクロスしている時に上矢印
- 下降パーフェクトオーダーでMACDがデッドクロスしている時に下矢印
メタエディタ(MetaEditor)を立ち上げる
メタエディタ(MetaEditor)を立ち上げましょう。操作は以下に記載しています。
今回は名前を「PerfectOrder-MACD」で作成します。
プロパティを記述する
プロパティを記述しましょう。今回は、
- 上矢印
- 下矢印
の2つになります。
#property indicator_buffers 2//バッファ2つ
これでプロパティの記述は完了です。
#property indicator_buffers 2//バッファ2つ
バッファを定義する
バッファを定義しましょう。上矢印と下矢印用を作ります。
double UP_Arrow[],DOWN_Arrow[];//上矢印と下矢印
これで、バッファを定義は完了です。
double UP_Arrow[],DOWN_Arrow[];//上矢印と下矢印
パラメーターを記述する
パラメーターを記述しましょう。
移動平均線の短期、中期、長期をそれぞれの期間を指定します。
input int MA_Short_Period = 25;//短期移動平均線の期間 input int MA_Middle_Period = 50;//中期移動平均線の期間 input int MA_Long_Period = 200;//長期移動平均線の期間
MACDの期間を指定します。
input int fast_ema_period = 12;//MACDのfast_emaの期間 input int slow_ema_period = 26;//MACDのslow_emaの期間 input int signal_period = 9;//MACDのSignalの期間
これでパラメーターの記述は完了です。
input int MA_Short_Period = 25;//短期移動平均線の期間 input int MA_Middle_Period = 50;//中期移動平均線の期間 input int MA_Long_Period = 200;//長期移動平均線の期間 input int fast_ema_period = 12;//MACDのfast_emaの期間 input int slow_ema_period = 26;//MACDのslow_emaの期間 input int signal_period = 9;//MACDのSignalの期間
OnInit()関数を記述する
OnInit()関数を記述しましょう。
インデックスに紐付けします。
SetIndexBuffer(0, UP_Arrow);//インデックス0にUP_Arrowを格納 SetIndexBuffer(1, DOWN_Arrow);//インデックス1にDOWN_Arrowを格納
矢印の設定をします。
SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,2,Red);//インデックス0を上矢印設定 SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,2,Yellow);//インデックス1を下矢印設定
矢印の種類を設定します。
SetIndexArrow(0,233);//矢印の種類 SetIndexArrow(1,234);//矢印の種類
これでOnInit()関数を記述は完了です。
SetIndexBuffer(0, UP_Arrow);//インデックス5にUP_Arrowを格納 SetIndexBuffer(1, DOWN_Arrow);//インデックス6にDOWN_Arrowを格納 SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,2,Red);//インデックス5を上矢印設定 SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,2,Yellow);//インデックス6を下矢印設定 SetIndexArrow(0,233);//矢印の表示設定 SetIndexArrow(1,234);//矢印の表示
OnCalculate()関数を記述する
OnCalculate()関数を記述しましょう。
変数を記述しましょう。
double MA_Short,MA_Middle,MA_Long;//MA変数 double MACDMain,MACDSignal;//MACD変数 double MACDMainPre,MACDSignalPre;//MACD過去変数
未だ計算されていないバー数(チャート上のバー数 – 計算済みバー数)を取得します。
int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)
それぞれの値を格納します。
MA_Short = iMA(_Symbol,_Period,MA_Short_Period,0,MODE_SMA,PRICE_CLOSE,i);//MA_Short MA_Middle = iMA(_Symbol,_Period,MA_Middle_Period,0,MODE_SMA,PRICE_CLOSE,i);//MA_Middle MA_Long = iMA(_Symbol,_Period,MA_Long_Period,0,MODE_SMA,PRICE_CLOSE,i);//MA_Long MACDMain = iMACD(NULL, 0, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_MAIN, i);//MACDMain MACDSignal = iMACD(NULL, 0, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_SIGNAL, i);//MACDSignal MACDMainPre = iMACD(_Symbol, _Period, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_MAIN, i+1);//MACDMain過去 MACDSignalPre = iMACD(_Symbol, _Period, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_SIGNAL, i+1);//MACDSignal過去
配列を空にしましょう。
UP_Arrow[i] = EMPTY_VALUE;//配列を空にする DOWN_Arrow[i] = EMPTY_VALUE;//配列を空にする
次に上昇トレンド時のトレード条件を記述しましょう。
上昇パーフェクトオーダー時にMACDがゴールデンクロス時に
if((MA_Short > MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MACDMain > MACDSignal && MACDMainPre < MACDSignalPre)//上昇パーフェクトオーダー時にMACDがゴールデンクロス
上矢印を表示します。
UP_Arrow[i] = Low[i] - 20 * Point;//上矢印表示
下降パーフェクトオーダー時にMACDがデッドクロス時に
if((MA_Short > MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MACDMain > MACDSignal && MACDMainPre < MACDSignalPre) //下降パーフェクトオーダー時にMACDがデッドクロス
下矢印を表示します。
DOWN_Arrow[i] = High[i] + 20 * Point;//下矢印表示
これでOnCalculate()関数を記述は完了です。
double MA_Short,MA_Middle,MA_Long;//MA変数
double MACDMain,MACDSignal;//MACD変数
double MACDMainPre,MACDSignalPre;//MACD過去変数
int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)
for(int i = limit-1; i >= 0; i--)
{
MA_Short = iMA(_Symbol,_Period,MA_Short_Period,0,MODE_SMA,PRICE_CLOSE,i);//MA_Short
MA_Middle = iMA(_Symbol,_Period,MA_Middle_Period,0,MODE_SMA,PRICE_CLOSE,i);//MA_Middle
MA_Long = iMA(_Symbol,_Period,MA_Long_Period,0,MODE_SMA,PRICE_CLOSE,i);//MA_Long
MACDMain = iMACD(NULL, 0, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_MAIN, i);//MACDMain
MACDSignal = iMACD(NULL, 0, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_SIGNAL, i);//MACDSignal
MACDMainPre = iMACD(_Symbol, _Period, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_MAIN, i+1);//MACDMain過去
MACDSignalPre = iMACD(_Symbol, _Period, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_SIGNAL, i+1);//MACDSignal過去
UP_Arrow[i] = EMPTY_VALUE;//配列を空にする
DOWN_Arrow[i] = EMPTY_VALUE;//配列を空にする
if((MA_Short > MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MACDMain > MACDSignal && MACDMainPre < MACDSignalPre)//上昇パーフェクトオーダー時にMACDがゴールデンクロス
{
UP_Arrow[i] = Low[i] - 20 * Point;//上矢印表示
}
if((MA_Short > MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MACDMain > MACDSignal && MACDMainPre < MACDSignalPre) //下降パーフェクトオーダー時にMACDがデッドクロス
{
DOWN_Arrow[i] = High[i] + 20 * Point;//下矢印表示
}
}
コンパイルする
コンパイルしてシグナルが表示されていたら完了です。
ただ移動平均線の角度などは決めていないので角度などを組み合わせるとまたさらに精度が良くなります。
ソースコード全体
PerfectOrder-MACDのソースコード全体は以下に記載しています。
//+------------------------------------------------------------------+
//| PerfectOrder-MACD.mq4 |
//| Copyright 2020, FX-EA System Project Creator |
//| https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, FX-EA System Project Creator"
#property link "https://creator.fx-ea-system-project.com/"
#property version "1.00"
#property strict
/*プロパティ*/
#property indicator_chart_window
#property indicator_buffers 2//バッファ2つ
/*バッファ*/
double UP_Arrow[],DOWN_Arrow[];//上矢印と下矢印
/*パラメーター*/
input int MA_Short_Period = 25;//短期移動平均線の期間
input int MA_Middle_Period = 50;//中期移動平均線の期間
input int MA_Long_Period = 200;//長期移動平均線の期間
input int fast_ema_period = 12;//MACDのfast_emaの期間
input int slow_ema_period = 26;//MACDのslow_emaの期間
input int signal_period = 9;//MACDのSignalの期間
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0, UP_Arrow);//インデックス0にUP_Arrowを格納
SetIndexBuffer(1, DOWN_Arrow);//インデックス1にDOWN_Arrowを格納
SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,2,Red);//インデックス0を上矢印設定
SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,2,Yellow);//インデックス1を下矢印設定
SetIndexArrow(0,233);//矢印の表示設定
SetIndexArrow(1,234);//矢印の表示設定
//---
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[])
{
//---
double MA_Short,MA_Middle,MA_Long;//MA変数
double MACDMain,MACDSignal;//MACD変数
double MACDMainPre,MACDSignalPre;//MACD過去変数
int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)
for(int i = limit-1; i >= 0; i--)
{
MA_Short = iMA(_Symbol,_Period,MA_Short_Period,0,MODE_SMA,PRICE_CLOSE,i);//MA_Short
MA_Middle = iMA(_Symbol,_Period,MA_Middle_Period,0,MODE_SMA,PRICE_CLOSE,i);//MA_Middle
MA_Long = iMA(_Symbol,_Period,MA_Long_Period,0,MODE_SMA,PRICE_CLOSE,i);//MA_Long
MACDMain = iMACD(NULL, 0, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_MAIN, i);//MACDMain
MACDSignal = iMACD(NULL, 0, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_SIGNAL, i);//MACDSignal
MACDMainPre = iMACD(_Symbol, _Period, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_MAIN, i+1);//MACDMain過去
MACDSignalPre = iMACD(_Symbol, _Period, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_SIGNAL, i+1);//MACDSignal過去
UP_Arrow[i] = EMPTY_VALUE;//配列を空にする
DOWN_Arrow[i] = EMPTY_VALUE;//配列を空にする
if((MA_Short > MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MACDMain > MACDSignal && MACDMainPre < MACDSignalPre)//上昇パーフェクトオーダー時にMACDがゴールデンクロス
{
UP_Arrow[i] = Low[i] - 20 * Point;//上矢印表示
}
if((MA_Short > MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MACDMain > MACDSignal && MACDMainPre < MACDSignalPre) //下降パーフェクトオーダー時にMACDがデッドクロス
{
DOWN_Arrow[i] = High[i] + 20 * Point;//下矢印表示
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
まとめ
知識を応用するだけでパーフェクトオーダーとMACDを組み合わせたインジケーターを作ることができましたね。
これぐらいできると基本的なインジケーターはできてしまいます。
コメント