2016年6月2日木曜日

【EAを作ろう】第十三回 関数を作ろう1 RSI

FX-ONの社長から手書きの手紙を頂戴いたしました。
うれしいものですね♪

関数を作ります。
MT4にはiRSIやiMA,iBands,iMACDなどなど本当に多くのインディケーターが用意されています。
とくにEMAの計算を作らなくていいことは非常に助かるのですが、設定項目の多さに戸惑うことがあります。
RSIはシンプルなオシレーターの中では精度が高いので気に入っています。
まずはこのRSI算出のiRSIを見ていきたいと思います。

iRSI(通貨ペア , 時間軸 , 期間 , 適応価格 , シフト)

通貨ペア
USDJPYやEURUSD等です。
チャートに合わせるときにはSymbol()を使うことになっていますが、
Symbol()を呼び出すのに数ミリ秒かかります。
非公式ですがNULLで代用できます。さらに""(ダブルコーテーション2個)でもOKです。
この非公式なやり方のほうが早くなります。
時間軸
チャートに合わせるときは PERIOD_CURRENT  もしくは0
一分足は              PERIOD_M1            もしくは1
日足は                PERIOD_D1             もしくは1440

設定項目に入れるときは extern ENUM_TIMEFRAMES 定数; 

期間
RSIの期間です。
14か20の使用頻度が多いと思いますが、時間軸によってまちまちです。

適応価格
終値を使うことが多いのですが、下は安値 上は高値などいろいろあるようです
終値      PRICE_CLOSE         もしくは 0
中央値  PRICE_MEDIAN もしくは 4

設定項目に入れるときはextern ENUM_APPLIED_PRICE 定数;

シフト
取得したいバーの位置
0は現在、1は一本前・・・

私の場合通貨ペア:""、時間軸:0、期間:14、適応価格:0、シフト:1がほとんどです。
毎回同じ項目を入れるのは面倒なので

double RSI(){return(iRSI("",0,14,0,1));}

このような関数を使うことが多くあります。
毎回打たなくてもRSI()で呼び出せるからです。
見にくいのでインデントを付けてみます。

double RSI()
  {
  return( iRSI("",0,14,0,1) );
  }

iRSIでもとめた値をreturnに入れて返すだけのシンプルな奴です。

RSI=iRSI("",0,14,0,1);

これじゃダメなのかと声が聞こえてきそうです。
単純にRSIが70を超えた処理、30を下回った処理を行う場合このほうが早いですね。

しかし関数の場合は応用がききます。
RSIの期間を14と20と両方確認したい場合


double RSI(int Period)
  {
  return( iRSI("",0,Period,0,1) );
  }

こうすることで

RSI(14)は期間14のRSIの値、RSI(20)は期間20のRSIの値になります。

さらに、時間軸も変更したいときには

double RSI(int TimeFrame,int Period)
  {
  return( iRSI("",TimeFrame,Period,0,1) );
  }

こうすることでRSI(1,20)は一分足の期間20のRSI
RSI(5,14)は五分足の期間14のRSIなどという使い方もできます。


伝統的な書き方はこちら
double Fast_RSI14 = iRSI(Symbol(),PERIOD_M1,14,PRICE_CLOSE,1);
double Fast_RSI20 = iRSI(Symbol(),PERIOD_M1,20,PRICE_CLOSE,1);
double Slow_RSI14 = iRSI(Symbol(),PERIOD_M5,14,PRICE_CLOSE,1);
double Slow_RSI20 = iRSI(Symbol(),PERIOD_M5,20,PRICE_CLOSE,1);


わたし的にはこうですね
double RSI(int TimeFrame,int Period){return(iRSI("",TimeFrame,Period,0,1));}















0 件のコメント:

コメントを投稿