新年明けましておめでとうございます。

年末からEA開発をずっとしていてブログ更新をし忘れていた、たかはしです(;´∀`)

ドル円が年明け早々ガラッと落ちてしまいましたが、年明けって毎回ガラる噂は本当なのですね。

一方ポンドドルがもの凄い勢いで上にブレイクしてしまいました。

では、マルチタイムフレームの作り方について解説します。

ネットでマルチタイムフレームの作り方を調べているといろいろな作り方が出てきますね。

多重ループ処理やArrayCopySeriesを駆使してゴリゴリ書かれている方が結構多いです。

もちろん僕もそれらのサンプルを元に作っていたので、同じくゴリゴリ系になっていました。

でも、とある関数を見つけて組み替えてみると超絶シンプルになってしまいました。

下記がコード抜粋です。

たったこれだけの実装でマルチタイムフレームのインジケーターが作れてしまいます。

//+------------------------------------------------------------------+
//| 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 i,y,limit,counted_bars=IndicatorCounted();
  
  limit=Bars-counted_bars;
  for(i=0;i<limit;i++)
  {
    y=iBarShift(NULL,TimeFrame,Time[i],false);
    double rsi = iRSI(NULL,TimeFrame,period,applied_price,y);
    Buffer[i]=rsi;
  }
  return(rates_total);
}
//+------------------------------------------------------------------+

下記はコード全文です。

コピペしてお使いください

//+------------------------------------------------------------------+
//|                                                      mtf_rsi.mq4 |
//|                     Copyright 2017, Forex related to FX trading. |
//|                                      http://fxtrading.greeds.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Forex related to FX trading."
#property link      "http://fxtrading.greeds.net"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 SteelBlue

extern int TimeFrame=PERIOD_M60;
extern int period=14;
extern int applied_price=PRICE_TYPICAL;
double Buffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
  SetIndexBuffer(0,Buffer);
  SetIndexStyle(0,DRAW_LINE);
  SetIndexLabel(0,"MTF_RSI");
  SetLevelValue(0,80);
  SetLevelValue(1,20); 

  string TimeFrameStr;
  switch(TimeFrame)
  {
    case 1 : TimeFrameStr ="Period_M1"; break;
    case 5 : TimeFrameStr="Period_M5"; break;
    case 15 : TimeFrameStr="Period_M15"; break;
    case 30 : TimeFrameStr="Period_M30"; break;
    case 60 : TimeFrameStr="Period_H1"; break;
    case 240 : TimeFrameStr="Period_H4"; break;
    case 1440 : TimeFrameStr="Period_D1"; break;
    case 10080 : TimeFrameStr="Period_W1"; break;
    case 43200 : TimeFrameStr="Period_MN1"; break;
    default : TimeFrameStr="Current Timeframe";
  } 
  IndicatorShortName("MTF_RSI:"+TimeFrameStr);  

  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 i,y,limit,counted_bars=IndicatorCounted();
  
  limit=Bars-counted_bars;
  for(i=0;i<limit;i++)
  {
    y=iBarShift(NULL,TimeFrame,Time[i],false);
    double rsi = iRSI(NULL,TimeFrame,period,applied_price,y);
    Buffer[i]=rsi;
  }
  return(rates_total);
}
//+------------------------------------------------------------------+

この記事が気に入ったら
いいね ! しよう

Twitter で