トレンドを色で把握する移動平均線を表示するインジケータを実際にプログラミングしていきます。
上昇トレンドを赤色 下降トレンドを青色で表示するMAのプログラムです。
プログラムコード
MT5です。※MT4では動きません。今後対応予定。
今回は通常の移動平均線を表示するところまでです。
//+------------------------------------------------------------------+
//| TrendMA.mq5 |
//| Copyright Rikei Trader Yoshiki |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright Rikei Trader Yoshiki"
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 10
#property indicator_plots 10
//--- ハンドル宣言
int hMA;
// ---バッファ宣言
double MA[];
// ---定数定義
int MA_Period = 50;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- インジケータ名
IndicatorSetString(INDICATOR_SHORTNAME,"TrendMA");
//--- バッファの設定
SetIndexBuffer(0,MA,INDICATOR_DATA);
//--- インジケータ設定
PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_COLOR_LINE);
PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);
PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrGold);
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,3);
PlotIndexSetString(0,PLOT_LABEL,"TrendMA");
//--- ハンドルの実行
hMA = iMA(NULL,PERIOD_CURRENT,MA_Period,0,MODE_EMA,PRICE_CLOSE);
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[])
{
// ---計算が全部終わっていなければ終了
if(BarsCalculated(hMA) < rates_total) return(0);
// ---バッファへのコピー数を計算
int to_copy;
to_copy=rates_total-prev_calculated;//最初はprev_calulated==0なので、すべてのデータがコピーされる
if(to_copy==0)//一度計算されるとrates_total==prev_calculatedになるので、最新のバーだけ計算するようにする
to_copy++;
// ---バッファに値をコピー
if(CopyBuffer(hMA,0,0,to_copy,MA)<=0) return(0);
Comment("");
//Comment("rates_total=",rates_total);
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 終了時関数の定義 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){
IndicatorRelease(hMA);
}
解説動画
準備中です。
コメント
Good to know.