2018年5月10日木曜日

HMAの計算方法

HULL Moving Average 略してHMAは非常に現在のプライスに近くなめらかと評判の平均です。
今は無きゴゴジャンの中井さんが退社直前に教えてくれたのですが、使ってみると評判通りでした。リペイントする物でもこれだけのものはなかなかありません。
インジケーターとしては何度か開発をしたことがあるのですが、
EAに組み込むために関数を作成してみます。

計算式はまずpHMA(期間)=LWMA(期間/2)*2-LWMA(期間)を作成します。

このpHMAのLWMA(期間の平方根)がHMAになります。

iMAに追加できればいいのですが今回はiHMAとして作成します。

iMAは下記のようになっています。
※公式サイトは違う記述になっていますがこちらが今のMetaEditorに会っているかと思います。


double  iMA(
   const string       symbol
   ,ENUM_TIMEFRAMES timeframe    
   ,int ma_period     
   ,int ma_shift       
   ,ENUM_MA_METHOD ma_method    
   ,ENUM_APPLIED_PRICE applied_price 
   ,int shift=0)
これに準じた形にします。


double iHMA(
   const string symbol=NULL
   ,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT
,int period=13
,int ma_shift=0
,ENUM_MA_METHOD ma_method=MODE_LWMA
,ENUM_APPLIED_PRICE applied_price=PRICE_MEDIAN
,int shift=0)

全てにデフォルトで値を入れていますのでiHMA()だけでも期間13のLWMA使用MEDIANのシフト0で値を出します。

pHMA[]を宣言しArrayResizeで要素数を決めます。
宣言時は[]もしくは数値しか指定できませんのでこのようにしています。

あとは先ほどの計算式に則りreturnで数値を戻します。

double iHMA(const string symbol=NULL
,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT
,int period=13
,int ma_shift=0
,ENUM_MA_METHOD ma_method=MODE_LWMA
,ENUM_APPLIED_PRICE applied_price=PRICE_MEDIAN
,int shift=0)
{
double pHMA[];
ArrayResize(pHMA,period+2);
for(i=period+1;i>=0;i--)
{
pHMA[i]=iMA(symbol,timeframe,(period/2),ma_shift,ma_method,applied_price,shift)*2 - iMA(symbol,timeframe,period ,ma_shift,ma_method,applied_price,shift);
}
return (iMAOnArray(pHMA,0,(int)MathSqrt(period),ma_shift,ma_method,shift));
}

この関数の特徴
■引数がiMAと同様
■初期値がすべて入っている為省略が可能
■HMAはLWMAを使用するがSMA,EMA、SMMAも使用する事が出来る。
■価格を選択できる

さて、これを使ってなにか開発しましょうかw




0 件のコメント:

コメントを投稿