移動平均(Moving Average)のインジケータを作成してみます。インジケータ自体はMT4にありますが、mq4ファイルはないようなので
移動平均
移動平均はシンプルでよく使われますが、MQL4ではiMA()関数を使います。
1 2 3 4 5 6 7 8 9 |
double iMA( string symbol, // symbol int timeframe, // timeframe int ma_period, // MA averaging period int ma_shift, // MA shift int ma_method, // averaging method int applied_price, // applied price int shift // shift ); |
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
//+------------------------------------------------------------------+ // MovingAverage_01.mq4 //+------------------------------------------------------------------+ // インジケーターをチャートウィンドウに表示させる #property indicator_chart_window // インジケーター描画用のバッファー数 #property indicator_buffers 1 // 表示するインジケータのプロット数 #property indicator_plots 1 // N番目のインジケータの描画スタイル #property indicator_type1 DRAW_LINE // N番目のインジケータの描画色 #property indicator_color1 Magenta // N番目のインジケータのラインの太さ #property indicator_width1 2 // 移動平均の平均期間 extern int MovingPeriod = 14; // 移動平均のシフト extern int MovingShift = 0; // インジケータのバッファ double Buffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit(){ // Buffer配列を表示用として設定 SetIndexBuffer(0, Buffer, INDICATOR_DATA); 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 - prev_calculated; for(int i = limit - 1; i >= 0; i--){ Buffer[i] = iMA( NULL, // 通貨ペア名, NULLは現在の通貨ペア 0, // ENUM_TIMEFRAMES の時間足, 0は現在の時間足 MovingPeriod, // 平均する期間 MovingShift, // 平均する期間のシフト MODE_SMA, // 平均するメソッド, ENUM_MA_METHOD PRICE_CLOSE, // サンプリングする価格, ENUM_APPLIED_PRICE i // 0が現在値で過去へのシフト ); } return rates_total; } |
このサンプルは単純平均のSMAですが4種類の平均化手法があります。
平均化手法
- MODE_SMA :単純移動平均
- MODE_EMA :指数移動平均
- MODE_SMMA:平滑移動平均
- MODE_LWMA:加重移動平均
平均化手法によってそれなりに異なるカーブとなり、それぞれの特徴を知っておいたほうがいいでしょう・
References:
Program Properties (#property) – MQL4 Documentation
iMA – MQL4 Documentation
ENUM_TIMEFRAMES – MQL4 Documentation
Smoothing Methods – Indicator Constants – MQL4 Reference
Price Constants – MQL4 Reference