移動平均線のパーフェクトオーダーのサインインジケーター
移動平均線のパーフェクトオーダーのサインインジケーターを作成していきたいと思います。
- 上昇パーフェクトオーダー時にロングエントリーシグナルを表示させる
- 下降パーフェクトオーダー時にショートエントリーシグナルを表示させる
メタエディタ(MetaEditor)を立ち上げる
メタエディタ(MetaEditor)を立ち上げましょう。操作は以下に記載しています。
今回は名前を「Perfect-order」で作成します。
プロパティを記述する
プロパティの記述していきます。
必要なのは
- 上矢印
- 下矢印
なのでバッファを2個用意しましょう。
#property indicator_buffers 2//バッファ2つ
次に色を選択しましょう。
#property indicator_color0 Blue//青色 #property indicator_color1 Red//赤色
次に線を実線に設定しましょう。
#property indicator_style0 STYLE_SOLID//実線 #property indicator_style1 STYLE_SOLID//実線
最後に幅を1に設定しましょう。
#property indicator_width4 1//幅1 #property indicator_width5 1//幅1
これでプロパティの記述は完了です。
#property indicator_buffers 2//バッファ2つ #property indicator_color0 Blue//青色 #property indicator_color1 Red//赤色 #property indicator_style0 STYLE_SOLID//実線 #property indicator_style1 STYLE_SOLID//実線 #property indicator_width4 1//幅1 #property indicator_width5 1//幅1
バッファを定義する
バッファを定義しましょう。バッファも2つ用意しましょう。
double BufUP_Arrow[];//上矢印 double BufDOWN_Arrow[];//下矢印
これでバッファの定義は完了です。
double BufUP_Arrow[];//上矢印 double BufDOWN_Arrow[];//下矢印
パラメーターを記述する
パラメーターを記述しましょう。
パラメーターを記述することでインジケーターを使うユーザーが自由に期間を設定することが可能になります。
移動平均線を3つ使うのでそれぞれの期間を設定できるようにしましょう。
input int MA_Short_Period = 25;//短期移動平均線の期間 input int MA_Middle_Period = 50;//中期移動平均線の期間 input int MA_Long_Period = 200;//長期移動平均線の期間
これでパラメーターの記述は完了です。
input int MA_Short_Period = 25;//短期移動平均線の期間 input int MA_Middle_Period = 50;//中期移動平均線の期間 input int MA_Long_Period = 200;//長期移動平均線の期間
OnInit()関数に記述する
OnInit()関数に記述していきましょう。
まずはそれぞれをインデックスに紐付けします。
SetIndexBuffer(0,BufUP_Arrow);//インデックス0にBufUP_Arrowを紐付け SetIndexBuffer(1,BufDOWN_Arrow);//インデックス1にBufDOWN_Arrowを紐付け
次にインデックスを矢印表示に設定しましょう。
SetIndexStyle(0,DRAW_ARROW);//インデックス0を矢印表示 SetIndexStyle(1,DRAW_ARROW);//インデックス1を矢印表示
最後にインデックスの矢印の種類を設定しましょう。
SetIndexArrow(0,233);//インデックス0を矢印の種類 SetIndexArrow(1,234);//インデックス1を矢印の種類
これでOnInit()関数の記述は完了です。
SetIndexBuffer(0,BufUP_Arrow);//インデックス0にBufUP_Arrowを紐付け SetIndexBuffer(1,BufDOWN_Arrow);//インデックス1にBufDOWN_Arrowを紐付け SetIndexStyle(0,DRAW_ARROW);//インデックス0を矢印表示 SetIndexStyle(1,DRAW_ARROW);//インデックス1を矢印表示 SetIndexArrow(0,233);//インデックス0を矢印の種類 SetIndexArrow(1,234);//インデックス1を矢印の種類
OnCalculate()関数に記述する
OnCalculate()関数に記述していきましょう。
未だ計算されていないバー数(チャート上のバー数 – 計算済みバー数)を取得します。
int limit = Bars-IndicatorCounted();
3つの移動平均線をそれぞれの値を格納します。
MA_Short =iMA(_Symbol,_Period,MA_Short_Bars, 0,MODE_SMA,PRICE_CLOSE,i);//現在の短期MA MA_Middle=iMA(_Symbol,_Period,MA_Middle_Bars,0,MODE_SMA,PRICE_CLOSE,i);//現在の中期MA MA_Long =iMA(_Symbol,_Period,MA_Long_Bars, 0,MODE_SMA,PRICE_CLOSE,i);//現在の長期MA MA_Short_Pre =iMA(_Symbol,_Period,MA_Short_Bars, 0,MODE_SMA,PRICE_CLOSE,i+1);//過去の短期MA MA_Middle_Pre =iMA(_Symbol,_Period,MA_Middle_Bars,0,MODE_SMA,PRICE_CLOSE,i+1);//過去の中期MA MA_Long_Pre =iMA(_Symbol,_Period,MA_Long_Bars, 0,MODE_SMA,PRICE_CLOSE,i+1);//過去
それぞれの配列を空にします。
BufUP_Arrow[i] = EMPTY_VALUE;//バッファ空にする BufDOWN_Arrow[i] = EMPTY_VALUE;//バッファ空にする
「短期 > 中期 & 中期 > 長期 & 終値 > 短期」という上昇パーフェクトオーダー時に
if(MA_Short> MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MA_Short_Pre> MA_Middle_Pre && MA_Middle_Pre > MA_Long_Pre && Close[i] > MA_Short_Pre)
上矢印を安値から-30*pointずらした場所に表示させます。
BufUP_Arrow[i] = Low[i]-30*Point;
「短期 < 中期 & 中期 < 長期 & 終値 < 短期」という下降パーフェクトオーダー時に
if(MA_Short> MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MA_Short_Pre> MA_Middle_Pre && MA_Middle_Pre > MA_Long_Pre && Close[i] > MA_Short_Pre)
下矢印を高江値から+30*pointずらした場所に表示させます。
BufDOWN_Arrow[i] = High[i]-30*Point;
OnCalculate()関数は完了です。
int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)
for(int i=limit-1; i>=0; i--)
{
MA_Short =iMA(_Symbol,_Period,MA_Short_Bars, 0,MODE_SMA,PRICE_CLOSE,i);//現在の短期MA
MA_Middle=iMA(_Symbol,_Period,MA_Middle_Bars,0,MODE_SMA,PRICE_CLOSE,i);//現在の中期MA
MA_Long =iMA(_Symbol,_Period,MA_Long_Bars, 0,MODE_SMA,PRICE_CLOSE,i);//現在の長期MA
MA_Short_Pre =iMA(_Symbol,_Period,MA_Short_Bars, 0,MODE_SMA,PRICE_CLOSE,i+1);//過去の短期MA
MA_Middle_Pre =iMA(_Symbol,_Period,MA_Middle_Bars,0,MODE_SMA,PRICE_CLOSE,i+1);//過去の中期MA
MA_Long_Pre =iMA(_Symbol,_Period,MA_Long_Bars, 0,MODE_SMA,PRICE_CLOSE,i+1);//過去の長期MA
BufUP_Arrow[i] = EMPTY_VALUE;//バッファ空にする
BufDOWN_Arrow[i] = EMPTY_VALUE;//バッファ空にする
// 短期 > 中期 & 中期 > 長期 & 終値 > 短期の場合(上昇パーフェクトオーダー)
if(MA_Short> MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MA_Short_Pre> MA_Middle_Pre && MA_Middle_Pre > MA_Long_Pre && Close[i] > MA_Short_Pre)
{
BufUP_Arrow[i] = Low[i]-30*Point;//上矢印の表示
}
// 短期 < 中期 & 中期 < 長期 & 終値 < 短期の場合(下降パーフェクトオーダー)
if(MA_Short> MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MA_Short_Pre> MA_Middle_Pre && MA_Middle_Pre > MA_Long_Pre && Close[i] > MA_Short_Pre)
{
BufDOWN_Arrow[i] = High[i]+30*Point;//下矢印の表示
}
}
コンパイルする
コンパイルして移動平均線とシグナルが表示されていたら完了です。
実はまだこれは実用的ではなく、単純に移動平均線の並びに対してシグナルを表示させているだけです。
ソースコード全体
Perfect-orderのソースコード全体は以下に記載しています。
//+------------------------------------------------------------------+
//| Perfect-order.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つ
#property indicator_color0 Blue//青色
#property indicator_color1 Red//赤色
#property indicator_style0 STYLE_SOLID//実線
#property indicator_style1 STYLE_SOLID//実線
#property indicator_width4 1//幅1
#property indicator_width5 1//幅1
/*バッファ*/
double BufUP_Arrow[];//上矢印
double BufDOWN_Arrow[];//下矢印
/*パラメーター*/
input int MA_Short_Period = 25;//短期移動平均線の期間
input int MA_Middle_Period = 50;//中期移動平均線の期間
input int MA_Long_Period = 200;//長期移動平均線の期間
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,BufUP_Arrow);//インデックス0にBufUP_Arrowを紐付け
SetIndexBuffer(1,BufDOWN_Arrow);//インデックス1にBufDOWN_Arrowを紐付け
SetIndexStyle(0,DRAW_ARROW);//インデックス0を矢印表示
SetIndexStyle(1,DRAW_ARROW);//インデックス1を矢印表示
SetIndexArrow(0,233);//インデックス0を矢印の種類
SetIndexArrow(1,234);//インデックス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 limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)
for(int i=limit-1; i>=0; i--)
{
MA_Short =iMA(_Symbol,_Period,MA_Short_Bars, 0,MODE_SMA,PRICE_CLOSE,i);//現在の短期MA
MA_Middle=iMA(_Symbol,_Period,MA_Middle_Bars,0,MODE_SMA,PRICE_CLOSE,i);//現在の中期MA
MA_Long =iMA(_Symbol,_Period,MA_Long_Bars, 0,MODE_SMA,PRICE_CLOSE,i);//現在の長期MA
MA_Short_Pre =iMA(_Symbol,_Period,MA_Short_Bars, 0,MODE_SMA,PRICE_CLOSE,i+1);//過去の短期MA
MA_Middle_Pre =iMA(_Symbol,_Period,MA_Middle_Bars,0,MODE_SMA,PRICE_CLOSE,i+1);//過去の中期MA
MA_Long_Pre =iMA(_Symbol,_Period,MA_Long_Bars, 0,MODE_SMA,PRICE_CLOSE,i+1);//過去の長期MA
BufUP_Arrow[i] = EMPTY_VALUE;//バッファ空にする
BufDOWN_Arrow[i] = EMPTY_VALUE;//バッファ空にする
// 短期 > 中期 & 中期 > 長期 & 終値 > 短期の場合(上昇パーフェクトオーダー)
if(MA_Short> MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MA_Short_Pre> MA_Middle_Pre && MA_Middle_Pre > MA_Long_Pre && Close[i] > MA_Short_Pre)
{
BufUP_Arrow[i] = Low[i]-30*Point;//上矢印の表示
}
// 短期 < 中期 & 中期 < 長期 & 終値 < 短期の場合(下降パーフェクトオーダー)
if(MA_Short> MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MA_Short_Pre> MA_Middle_Pre && MA_Middle_Pre > MA_Long_Pre && Close[i] > MA_Short_Pre)
{
BufDOWN_Arrow[i] = High[i]+30*Point;//下矢印の表示
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
まとめ
今回は移動平均線のパーフェクトオーダーのサインインジケーターを作成してみました。
少しずつプログラミングにもなれてきたと思います。徐々に高度なことに挑戦していきましょう。
コメント