William Blauの指数MQL5におけるトレーディングシステムパート 1:インディケータ

7 10月 2015, 12:21
Andrey F. Zelinsky
0
998

良いツールが手に入る場合のみ、技術的トレーディングを活用することが可能である。
そしてトレーダーのツールは、経験、判断、そして優秀なトレーディングコンピュータが提供する数学的階層である。
William Blau


はじめに

本稿の序盤『William Blau著 "Indicators and Trade Systems in MQL5" パート1:インディケータ』 はWilliam Blauが著書"Momentum, Direction, and Divergence"で述べいるインディケータとオシレータの記述です。

本稿で述べるインディケータとオシレータはMQL5 言語のソースコードとして紹介します。またそれは、アーカイブファイル "Blau_Indicators_MQL5_en.zip"に添付されています。

William Blauによる分析の重要な考え方

William Blauによる技術分析は4つのフェーズで構成されています。

  1. インディケータは価格系列データ(q bars)を使って、計算され、チャートにプロットされます。インディケータは価格変動の一般的傾向を反映しません。またそれによりトレンドの反転ポイントを判断することもできません。
  2. インディケータはEMA 手法を使用し複数回平滑化されます。最初(期間r)、二回目(期間s)三回目(期間u)。平滑指数がプロットされます。平滑指数はかなり正確で最小のログで価格変動を再生します。それにより値動きの傾向と反転ポイントを判断し、価格ノイズを除去することができるようになりました。
  3. 平滑指数は標準化され、標準化された平滑指数がプロットされます。この標準化により指数値がーケットの買いすぎ/売りすぎ状態を解釈できるのです。
  4. 標準化された平滑指数はEMA手法(期間ul)により一度平滑化され、オシレータが構築されます。 - インディケータヒストグラムとシグナルラインです。マーケットの買いすぎ/売りすぎレベルが追加されます。オシレータにより、マーケットの買いすぎ/売りすぎ、反転ポイント、トレンド終了を区別することができます。


Indicators

本稿では、以下のようなインディケータのグループについて述べます。

  1. モメンタムに基づく指数
  2. Indicators, based on Stochastic:
  3. ストキャスティックモメンタムに基づく指数
  4. マーケットトレンドの平均偏差に基づく指数
  5. 移動平均収束/拡散に基づく指数
  6. ろうそく足モメンタムに基づく指数
  7. ハイ-ロー合成モメンタムに基づく指数

指数の各グループいには以下が見られます。

  • 平滑化指標指数
  • 標準化された平滑化指数の指標
  • 標準化された平滑化指数の指数に基づくオシレータ

真強度指数セクションには

  • 価格チャートのテクニカル分析の見地におけるWilliam Blauの手法の詳細分析
  • モメンタムに基づく指数グループの各インディケータのアルゴリズムとコードの詳述

平滑化手法として William Blau usesは指数平滑 移動平均 (EMA)を用いています。指数移動平均は移動平均の前の値に加算することで算出されます。現在価格の特定のパーセンテージです。

EMAを使用するときは、最低価格が大きなウェイトを持っています。

EMAを計算する関数

EMA(k,n) = EMA(k-1,n) + 2/(n+1) * (price(k) - EMA(k-1,n))
         = price(k) * 2/(n+1) + EMA(k-1,n) * (1 - 2/(n+1))

ここで

  • EMA(k,n) - 現在期間 k に対する期間 n の指数平滑移動平均
  • price(k) - 現在期間 k における価格

移動平均の4つのタイプの記述とてくにかる分析におけるそれらの利用方法(iMAも確認)は『MetaTrader 5 ヘルプ』("Analytics/Technical Indicators/Trend Indicators/Moving Average")で参照ください。

関数ライブラリ

移動平均を計算する関数のライブラリは "MovingAverages.mqh"にあります。われわれが関心を寄せるのはExponentialMAOnBuffer()で、これはインプット配列 price[] のEMA 値を伴うアウトプット配列buffer[] を書きます。ただし、"MovingAverages.mqh"にある ExponentialMAOnBuffer()の実装は期間 n = 1のとき動作しないというデメリットがあります。

ソースコードで確認します。

if(period<=1 || rates_total-begin<period) return(0);

しかし、William Blauは著書で平滑化期間 n = 1 を平滑化不在としてその関数を使用しています。

よって、ExponentialMAOnBuffer()関数のコードに少し変更を加えました。

if(period<1 || rates_total-begin<period) return(0);

そして得たのがExponentialMAOnBufferWB()です。この関数のコードはファイル "WilliamBlau.mqh"にあります。

"WilliamBlau.mqh" もまた以下の関数を持ちます。

  • PriceName() 関数はストリングとしての価格タイプを返します。
string PriceName(
                 const int applied_price // price type
                )
  • CalculatePriceBuffer() 関数は価格タイプの価格配列を計算します。
int CalculatePriceBuffer(
                         const int applied_price,   // price type
                         const int rates_total,     // rates total
                         const int prev_calculated, // bars, processed at the last call
                         const double &Open[],      // Open[]
                         const double &High[],      // High[]
                         const double &Low[],       // Low[]
                         const double &Close[],     // Close[]
                         double &Price[]           // calculated prices array
                        )

適用された価格タイプと価格チャートの時間枠

William Blau は日時時間枠の終値を考察しています。本稿で作成されたインディケータにより価格タイプ(price constantsを参照)、インディケータの時間枠に応じた価格チャートの時間枠( chart timeframesを参照)を選択することができます。


1. 真強度指数

考察されるインディケータ(添付を参照ください)

  1. Blau_Mtm.mq5 - 割合の指数 (q-期間モメンタム; 平滑化されているq-期間モメンタム)
  2. Blau_TSI.mq5 - 強度指数(標準化平滑化されている q-期間モメンタム)
  3. Blau_Ergodic.mq5 - エルゴディックオシレータ(真強度指数に基づく)


1.1. モメンタム

内蔵テクニカル指数の記述Momentumと、テクニカル分析におけるその使用については"Analytics/Technical Indicators/Oscillators/Momentum""MetaTrader 5 Help" 項 にあります。(iMomentumも参照ください。)標準モメンタム(iMomentum)と反対にWilliam Blauによるモメンタムは 絶対価格変更としてモメンタムを計算します。

William Blauによる真強度指数(TSI)のMQL5実装例は 『MQL5: 自分自身のインディケータを作成する』稿でご覧いただけます。


1.1.1. モメンタム指数を使用するテクニカル分析

テクニカル分析のオブジェクトはファイナンシャルインスツルメントの価格チャートです。チャートの各エレメントは価格 バーです。価格バーには以下の特徴があります。開始時刻始値高値安値終値取引きボリュームその他。価格バーは作成され、特定の個別期間中(チャート 時間枠)の価格変動を反映します。

価格チャートのテクニカル分析タスクは値動きの現在都連祖を判断し、価格のピークと底を明らかにし、次の期間の値動き方向を予測します。 これの複雑なところは、価格、基本傾向の限度内で変動しているあいだは、いわゆる価格ノイズを作りながら複数方向に変動します。

William Blau が提案したこと最初の相違:モメンタム。 William Blau は毎(日)期間について価格変動(終値)に対してモメンタムを計算しました。そして、モメンタム指数を作り出しました。. 数学的観点からは モメンタム関数は価格の最初の微分係数です。

図1.1 モメンタム指数 (q-期間モメンタム)

図1.1 モメンタム指数 (q-期間モメンタム)

モメンタムは一日の期間で価格の変動を表します。この期間におけるスピード(大きさ)と価格変動の方向を示しますが、価格変動の一般的傾向は反映せず、反転ポイントの傾向も判断しません。

二番目の相違点は平滑化です。モメンタムの移動平均(日次価格変動合計集積)は価格曲線の主要なバリエーションとローカルバリエーションの両方をかなり正確に再生します。図1.2 (a) サブウィンドウIに平滑化されたモメンタムを表示しました。(それぞれ期間20と300の移動平均です。)

T高い方は移動平均の期間で、 より正確に平滑化されたモメンタムが価格曲線の変動に近づいて(再生して)います。<i4>数学的観点からは</i4> モメンタムの平滑化関数はモメンタムの背k分関数、または価格の復元関数です。

図1.2 (a) モメンタム指数(平滑化された q-期間モメンタム)

図1.2 (a) モメンタム指数(平滑化された q-期間モメンタム)

図1.2(b)モメンタム指数(平滑化された q-期間モメンタム)

図1.2(b)モメンタム指数(平滑化された q-期間モメンタム)

図1.2 (a)では、メインウィンドウで平滑化EMA(期間5、20、100)指数が表示されています。移動平均の期間がやや増していることでラグをまねき、移動平均は実際には価格曲線の変動を再生することができません。

三番目の相違点は再平滑化です。 モメンタムの最初の平滑化は反転ポイントと共に値動きの主なトレンドを決めますが、ノイズは除去しません。価格ノイズを除去するには短い移動平均は期間で再平滑化が必要です。

図1.2 (a) サブウィンドウIに平滑化されたモメンタム指標を表示しました。(移動平均期間20)サブウィンドウIIとサブウィンドウIII は二度、三度のモメンタムを平滑化を表示しています。(移動平均期間5、3)平滑化の繰り返しにより価格ノイズは除去されますが、曲線が若干k同します。(ラグ)

四番目の相違点は、トレンド動向のシグナルの違いです。短い移動平均の期間でのモメンタムの平滑化は価格曲線のトレンドについて平滑化されたモメンタムの多様性を招きます。

図1.2 (a)で、サブウィンドウIに不一致が見られます。 図1.2 (b)ではサブウィンドウI、II、IIIIに不一致が見られます。 (価格変動の方向が平滑化されたモメンタムの変化方向からそれています。)そのような違いは往々にしてトレンド変化を示します。<i4>数学的観点からは</i4> 逸脱は平滑化期間の関数です。

トレンド変化のシグナルとしてのこれら違いの解釈の信頼性は買いすぎまたは売りすぎ領域(1.2.1参照)のそれを考慮すると向上します。


1.1.2. モメンタムの定義

モメンタム相対的な価格変動です。

モメンタムのサインは 価格変動の方向を示します。:正のモメンタム - 期間中価格は上昇、負 - 期間中価格は下降モメンタムの大きさ - は価格変動の相対スピー(最初の価格の微分係数)

図1.3 モメンタムの定義

図1.3 モメンタムの定義

モメンタムの式

mtm(price) = price - price[1]

ここで

  • price - 現在期間の価格(終値)
  • price [1] -前期間の価格(終値)

William Blau はモメンタムを現在期間の(終値)価格と前期間の価格(終値)差という形で検証します。William Blauは単一期間のモメンタムの計算において、2つの期間(現在および前回期間)を使います。

われわれはモメンタムを計算する式に期間指数、q - は計算に使われる期間 (William Blauによると q = 2)を導入します。

q-期間モメンタムの式:

mtm(price,q) = price - price[q-1]

ここで

  • q - バー数、モメンタム計算に使われる
  • price - 現在期間の価格(終値)
  • price [q-1] - (q-1) 期間前の価格(終値)

結果得られる式は、われわれの2つの期間モメンタムは William Blauの 1期間 相対モメンタムに一致しています。

平滑化された q-期間モメンタムの式

Mtm(price,q,r,s,u) = EMA(EMA(EMA( mtm(price,q) ,r),s),u)

ここで

  • price - (終わり)の価格- 価格チャートの価格ベース
  • q - バー数、モメンタム計算に使われる
  • mtm(price,q)=price-price[q-1] - q-期間モメンタム
  • EMA (mtm (price, q), r) - 最初の平滑化 - EMA(r), q-期間モメンタムに適用される
  • EMA (EMA(..., r),s) - 二度目の平滑化 - EMA(s), 最初の平滑化結果に適用される
  • EMA (mtm (price, q), r) - 二番目の平滑化 - EMA(u), 二度目の平滑化結果に適用される


1.1.3. Mtm(price,q,r,s,u) - レート指数(モメンタム)仕様

  • ファイル名Blau_Mtm.mq5
  • 名前:モメンタム(q-期間モメンタム;平滑化 q-期間 モメンタム) William Blauによる。
  • 入力パラメータ
    • q - モメンタムが計算される期間(デフォルトq = 2);
    • r -最初のEMA期間、 モメンタムに適用される (デフォルト r = 20);
    • r -二番目のEMA期間、 最初の平滑化結果に適用される (デフォルト r = 5);
    • u -三度目のEMA期間、 二度目の平滑化結果に適用される (デフォルト u = 3);
    • AppliedPrice - price type (default AppliedPrice=PRICE_CLOSE).
  • 追加:
    • 別ウィンドウに表示されます。
    • グラフィカルプロットのレンダリングを変更します。 - 色、濃さ、線種(『色』タブ)。
  • 制約:
    • q>0;
    • r>0, s>0, u>0. r, s または u が 1に等しければ、EMA平滑化は行われません。たとえば、 Mtm (価格, 2,20,5,1)を設定すると、二度平滑化したモメンタムを取得します。が、Mtm (価格, 2,1,1,1)を設定すると平滑化されていないモメンタムを取得します。
    • 価格配列の最小サイズ = (q-1 + r + s + u-3 +1).


1.2. 真強度指数

1.2.1. 真強度指数を用いたテクニカル分析

1.1.1項より続く

五番目:標準化 平滑化されたモメンタムの値を単一のスケールに標準化する(インターバル [-1, +1]にマッピング)ことで、マーケットの買いすぎ/売りすぎ状況を判断することができます。標準化平滑化したモメンタムの値を何度かかけると、要因100が連続した数字をパーセンテージ域(インターバル [--100, 100]にマッピング)に変換します。

図1.4 標準化平滑化したモメンタム

図1.4 標準化平滑化したモメンタム

変化するトレンドのシグナルの不一致は標準化平滑化したモメンタムが買いすぎ/売りすぎの上阿智にあれば信頼性があると考えられます。


1.2.2. 真強度指数の定義

真強度指数 (真強度指数、 TSI) - は標準化されたモメンタムの指数です。(標準化 q-期間モメンタム)。. 平滑化されたモメンタムのモメンタムの値を単一スケール(インターバル[-1, +1]のマッピング)に持ってくることは平滑化されたモメンタムの各値の標準化により絶対値に取り込まれた平滑化されたモメンタムの値によって行われます。(平滑化されたq-期間の価格変動)

100の係数による乗算は表示のインターバルを [-100, +100] (パーセント)に変えます。標準化により TSI 値を買いすぎ(正)または売りすぎ(負)と解釈することができます。

真強度指数の計算式:

100 * EMA(EMA(EMA( mtm(price,q) ,r),s),u)         100 * Mtm(price,q,r,s,u)
TSI(price,q,r,s,u) = –––––––––––––––––––––––––------–––––––––– = ––––––––––––––––------–––––––––––––––
                       EMA(EMA(EMA( |mtm(price,q)| ,r),s),u)     EMA(EMA(EMA( |mtm(price,q)| ,r),s),u)
if EMA(EMA(EMA(|mtm(price,q)|,r),s),u)=0, then TSI(price,q,r,s,u)=0

ここで

  • price - (終わり)の価格- 価格チャートの価格ベース
  • q - モメンタム期間
  • mtm(price,q)=price-price[q-1] - q-期間モメンタム
  • | Mtm (price, q) | - q-期間モメンタムの絶対値
  • Mtm (price, q, r, s, u) - 三度平滑化されたq-期間モメンタム
  • EMA (mtm (price, q), r) - 最初の平滑化 - EMA(r), 期間rのEMA、以下に適用される1) q-期間モメンタム
    2) q-期間モメンタムの絶対値
  • EMA (EMA(..., r),s) - 二度目の平滑化 - EMA(s), 最初の平滑化結果に適用される
  • EMA (EMA (EMA (..., r), s), u)- 三度目の平滑化 - EMA(u), 二度目の平滑化結果に適用される


1.2.3. TSI(price,q,r,s,u) - 真強度指数仕様

  • ファイル名: Blau_TSI.mq5
  • 名前: 真強度指数 (標準化平滑化 q-期間相対モメンタム) William Blauによる
  • 入力パラメータ
    • q - モメンタムが計算される期間(デフォルトq = 2);
    • r -最初のEMA期間、 モメンタムに適用される (デフォルト r = 20);
    • r -二番目のEMA期間、 最初の平滑化結果に適用される (デフォルト r = 5);
    • u -三度目のEMA期間、 二度目の平滑化結果に適用される (デフォルト u = 3);
    • AppliedPrice - price type (default AppliedPrice=PRICE_CLOSE).
  • 追加:
    • 別ウィンドウに表示されます。
    • グラフィカルプロットのレンダリングを変更します。 - 色、濃さ、線種(『色』タブ)。
    • (オプション) 2レベル (デフォルトは -25 と +25) - レベルの追加/削除a;値変更、レベル記述、レベルのレンダリング種変更(『レベル』タブ)
    • 他につのインディケータウィンドウ(『スケール』タブ)の下限(デフォルトで-100)と上限(デフォルトでは100)を変更します。
  • 制約:
    • q>0;
    • r>0, s>0, u>0. r、s、u が1に等しければ、EMAの対応する期間で平滑化は行われません。
    • 価格配列の最小サイズ = (q-1 + r + s + u-3 +1).


1.3. エルゴディックオシレータ

1.3.1. エルゴディックオシレータを使用するテクニカル分析

セクション初めから続く1.1.1, 1.2.1.

6番目:マーケットの買いすぎ/売りすぎ領 ユニットインターバル [-1, +1] またはパーセンテージインターバル [-100.100]、その範囲内で標準化平滑化されたモメンタムの値変更が起こります。これによりマーケットの買いすぎ/売りすぎ領域を決めることができます。

テクニカル分析のインデックスクラス、それはマーケットの買いすぎ/売りすぎ領域状態を特徴づけるものですが、はオシレータと呼ばれます。 それぞれのオシレータには、レベルが決められておりそれに近づくとマーケットの買いすぎ/売りすぎのシグナルが受け取られます。オシレータはトレンディングなマーケットには効果がありません。というものそのようなマーケットは意の長い期間買いすぎ/売りすぎの状態に任あるからです。

7番目:シグナルライン。 トレンドの終わりや価格動向の反転トレンドに関するシグナルを取得するには、シグナルラインが使用されます。買いのシグナルはメインラインが底から上がってきたラインと交わるとき受け取られます。売りのシグナルはメインラインが一番上から下がってきたラインと交わるとき受け取られます。メインラインがある場合、 - これはエルディック(真強度指数の)で、それからエルゴディックの再平滑化で単一ラインを作成します。再平滑化は最後のエルゴディックの平滑化と同じ手順です。

8番目:価格変動傾向。メインライン(エルゴディック)がシグナルラインの上にあるとき、価格変動傾向が上方向(上向きトレンド) 。メインライン(エルゴディック)がシグナルラインの下にあるとき、価格変動傾向が下方向(下向きトレンド) 。

図1.5 エルゴディックオシレータ

図1.5 エルゴディックオシレータ

1.3.2. エルゴディックオシレータの定義

Ergodic(price,q,r,s,u) = TSI(price,q,r,s,u)
SignalLine(price,q,r,s,u,ul) = EMA( Ergodic(price,q,r,s,u) ,ul)

ここで

  • Ergodic() - エルゴディック - 真強度指数 TSI(price,q,r,s,u);
  • The SignalLine() -シグナルライン - the EMA(ul)、エルゴディックに適用される。
  • ul - シグナルラインのEMA 期間 - William Blauによると、ul 値はEMAエルゴディックの最後の有意 (>1) に等しい必要があります。たとえば、二度平滑化されたエルゴディックを使っているなら、 (価格, q, r, s, u) = エルゴディック (価格, 2,20,5,1)そうすると、 William Blau によれば、ul = s = 5.


1.3.3. Ergodic (price, q,r,s,u,ul) - ergodic oscillator. 仕様

  • ファイル名: Blau_Ergodic.mq5
  • 名前: エルゴディックオシレータ (真強度指数に基づき) William Blauによる
  • 入力パラメータ
    • graphic plot #0 - Ergodic (a true strength index):
      • q - モメンタムが計算される期間(デフォルトq = 2);
      • r -最初のEMA期間、 モメンタムに適用される (デフォルト r = 20);
      • r -二番目のEMA期間、 最初の平滑化結果に適用される (デフォルト r = 5);
      • u -三度目のEMA期間、 二度目の平滑化結果に適用される (デフォルト u = 3);
    • graphic plot #1 - シグナルライン:
      • ul - 期間EMAシグナルラインはエルゴディックに適用される。(デフォルトでは ul = 3);
    • AppliedPrice - price type (default AppliedPrice=PRICE_CLOSE).
  • 追加:
    • 別ウィンドウに表示されます。
    • グラフィックプロットのレンダリングを変更します。 - 色、濃さ、線種(『色』タブ)。
    • 2レベル (デフォルトは -25 と +25) - レベルの追加/削除;値変更、レベル記述、レベルのレンダリング種変更(『レベル』タブ)
    • 他につのインディケータウィンドウ(『スケール』タブ)の下境界(デフォルトで-100)と上境界(デフォルトでは100)を変更します。
  • 制約:
    • q>0;
    • r>0, s>0, u>0. r, s または u が 1に等しければ、EMA平滑化は行われません。
    • ul>0. ul = 1なら、シグナルラインとエルゴディックラインは等しくなります。
    • 価格配列の最小サイズ = (q-1 + r + s + u + ul-4 +1).


1.4. コード (詳細説明)

1.4.1. "Blau_Mtm.mq5" -インディケータMtm(price,q,r,s,u) - モメンタム

インディケータMtm (price,q,r,s,u)のコード

//+------------------------------------------------------------------+
//|                                                     Blau_Mtm.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // url
#property description "q-period Momentum (William Blau)"        // description
#include <WilliamBlau.mqh>              // include file (terminal_data_folder\MQL5\Include)
//--- indicator settings
#property indicator_separate_window     // indicator in a separate window
#property indicator_buffers 5           // number of buffers used
#property indicator_plots   1           // number of plots
//--- main graphic plot #0
#property indicator_label1  "Mtm"       // graphic plot label #0
#property indicator_type1   DRAW_LINE   // draw as a line
#property indicator_color1  Blue        // color
#property indicator_style1  STYLE_SOLID // line style - solid line
#property indicator_width1  1           // line width
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st EMA
input int    u=3;  // u - 3rd EMA, applied to the 2nd EMA
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type
//--- dynamic arrays
double MainBuffer[];     // u-period 3rd EMA (for graphic plot #0)
double PriceBuffer[];    // price array
double MtmBuffer[];      // q-period Momentum
double EMA_MtmBuffer[];  // r-period 1st EMA
double DEMA_MtmBuffer[]; // s-period 2nd EMA
//--- global variables
int    begin1, begin2, begin3, begin4; // data starting indexes
int    rates_total_min; // total rates min
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers
   // plot buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);             // u-period 3rd EMA
   // buffers for intermediate calculations
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);    // price buffer
   SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);      // q-period Momentum
   SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA
   SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA
/*
//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"Mtm");             // label
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);    // drawing type as a line
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Blue);        // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);           // line width
*/
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---
   begin1=q-1;        //                             - MtmBuffer[]
   begin2=begin1+r-1; // or =(q-1)+(r-1)             - EMA_MtmBuffer[]
   begin3=begin2+s-1; // or =(q-1)+(r-1)+(s-1)       - DEMA_MtmBuffer[]
   begin4=begin3+u-1; // or =(q-1)+(r-1)+(s-1)+(u-1) - MainBuffer[]
   //
   rates_total_min=begin4+1; // minimal size
//--- starting index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Mtm("+shortname+")");
//--- OnInit done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
   int i,pos;
//--- check rates
   if(rates_total<rates_total_min) return(0);
//--- calc PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // applied price
                        rates_total,         // rates total
                        prev_calculated,     // bars, calculated at previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[] arrays
                        PriceBuffer          // price buffer
                       );
//--- calculation of q-period Momentum
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos values
         MtmBuffer[i]=0.0;     // zero values
     }
   else pos=prev_calculated-1; // overwise recalc only last value
   // calculate MtmBuffer[]
   for(i=pos;i<rates_total;i++)
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   // u-period 3rd EMA (for plot #0)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,MainBuffer);
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

コードを詳しく考察していきます。

1.4.1.1. インディケータ設定Mtm (price,q,r,s,u)

文献

MQL5参照でインディケータ設定について何を読むべきでしょうか。

  1. セクション『カスタムインディケータ
  2. インディケータのプロパティと対応する関数の間の関係 ("Custom Indicators"参照)
  3. プログラムプロパティ (# property) (『Language Basics/ Preprocessor』参照).
  4. レンダリングスタイル(グラフィックプロットプロパティ) (セクション『標準定数、列挙、ストラクチャ、インディケータ定数』項参照).
  5. カスタムインディケータのプロパティ(グラフィックプロットプロパティ) (セクション『標準定数、列挙、ストラクチャ、インディケータ定数』項参照).

著作権インディケータの記述

#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // url
#property description "q-period Momentum (William Blau)"        // description

設定は#propertyプリプロセッサ指示文を使ってのみ著作権(パラメータcopyright およびlink)、バージョン(パラメータ version) 、mql5プログラムの記述(パラメータdescription) はインディケータウィンドウ 『プロパティ』タブのボックス『付録』)の『プロパティに』に表示しています。

インクルードファイル

#include <WilliamBlau.mqh>              // include file (terminal_data_folder\MQL5\Include)

プリプロセッサ―#Include <WilliamBlau.mqh>ラインを"WilliamBlau.mqh" ファイルの内容に置き換えます。山括弧 は、ファイル"WilliamBlau.mqh" がターミナルデータフォルダから取得されることを示します。さらなる情報は インクルードファイルを参照ください。

"WilliamBlau.mqh"の内容で序章を見ます。

インディケータ設定(標準的な)

カスタムインディケータ - は数個のグラフィックプロットです。インディケータのグラフィックプロットは価格チャートのメインウィンドウ、個別ウィンドウどちらにも表示可能です。それぞれのグラフィックプロットには特定の描画メソッド、色、スタイル、濃さがあります。

グラフィックプロットをレンダリングするデータはインディケータバッファから取得されます。(各グラフィックプロットは1~5のインディケータバッファです。)ここではインディケータバッファとしてインディケータ配列を使用します。

インディケータを設定するには以下が必要です。(図1.6参照)

  1. インディケータを表示するようウィンドウを指定する。
  2. グラフィックプロットの数を指定する。
  3. インディケータバッファを数を指定する。
  4. インディケータ配列の宣言。
  5. リンクを設定する。:インディケータ配列 -> インディケータバッファ -> グラフィックプロット
  6. 各グラフィックプロットのプロパティを記述する。
  7. インディケータ値の表示精度を指定する。
  8. 各グラフィカルコンストラクションにレンダリングなしの初期バー数を指定する。
  9. 水平レベルを設定し、各水平レベルのプロパティを記述する。(なし.)
  10. 個別インディケータウィンドウにスケール制限を設定する。(なし)
  11. インディケータの短縮名を指定する。

図1.6 モメンタム指数Mtm (price,q,r,s,u)

図1.6 モメンタム指数Mtm (price,q,r,s,u)

インディケータ設定が行われます。

詳細は『インディケータプロパティと対応関数』を参照ください。

インディケータ設定法の違いは #property 指令による設定はインディケータが価格チャートにアタッチされる前に使用可能です。一方、 特別な関数 による設定はインディケータが価格チャートにアタッチされた 使用可能です。設定のコンフィギュレーションはインディケータの『プロパティ』ウィンドウから行います。

設定:インディケータ (1)を表示するウィンドウ

#property indicator_separate_window     // indicator in a separate window

コンフィギュレーションは必ず行わなければなりません。またプリプロセッサ指示文 #propertyプリプロセッサ指示文を使っての場合は一度だけ可能です。インディケータ表示には2つ選択肢があります。

  1. 価格チャートのメインウィンドウ - indicator_chart_window;
  2. 別ウィンドウ - indicator_separate_window.

設定:バッファ (3) とグラフィックプロット (2)の数

#property indicator_buffers 5           // number of buffers used
#property indicator_plots   1           // number of plots

コンフィギュレーションは必ず行わなければなりません。#propertyプリプロセッサ指示文を使ってのみ可能です。インディケータバッファ数 (パラメータ indicator_buffers) とグラフィックプロット数 (パラメータ indicator_plots) には制限がありません。

設定:インディケータ配列(4)

//--- dynamic arrays
double MainBuffer[];     // u-period 3rd EMA (for graphic plot #0)
double PriceBuffer[];    // price array
double MtmBuffer[];      // q-period Momentum
double EMA_MtmBuffer[];  // r-period 1st EMA
double DEMA_MtmBuffer[]; // s-period 2nd EMA

インディケータ配列はグローバルレベルダブルタイプの一次元動的配列として宣言されます。

設定: インディケータ配列、インディケータバッファ、グラフィックプロット間にリンクを設定します。(5)

// graphic plot #0
SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);             // u-period 3rd EMA
// buffers for intermediate calculations
SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);    // price buffer
SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);      // q-period Momentum
SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA
SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA

コードはイベントハンドラInit()の関数OnInit()に書かれます。

インディケータバッファと対応する一次元配列間のリンクが関数SetIndexBuffer()で設定されます。

bool SetIndexBuffer(
   int                 index,    // index of the indicator buffer (starts from 0)
   double              buffer[], // dynamic array
   ENUM_INDEXBUFFER_TYPE data_type // type of data, stored in the indicator array
   );

インディケータバッファはダブル タイプの一次元動的配列で、そのサイズはクライアント端末から取得されます。そうして常にインディケータが計算されるバーの数と一致しています。インディケータのインデックスは 0から始まります。

An indicator buffer can store three types of data: INDICATOR_DATA, INDICATOR_COLOR_INDEX, INDICATOR_CALCULATIONS. 表示方法によりますが、各グラフィックプロットはひとつずつ5個のインディケータバッファに対応することができます。一つが4このインディケータバッファ値(データタイプ INDICATOR_DATA)、そして一つのカラーバッファ( データタイプ INDICATOR_COLOR_INDEX)です。

INDICATOR_CALCULATIONSデータタイプのインディケータバッファは中間計算用に設計されています。バインディング後、インディケータ配列は指数化を持ちます。ちょうど従来の配列と同じです。(下記1.4.1.2項参照).

設定: グラフィックプロットのプロパティ (6)

グラフィックプロット各セットのコンフィギュレーションを行うために以下が指定されます。

  1. ラベル
  2. 描画タイプ (ENUM_DRAW_TYPE 列挙で18タイプすべて参照できます。);
  3. Line Color;
  4. 線種(使用可能な選手は ENUM_LINE_STYLEで確認できます。);
  5. 線幅

コンフィギュア方法は2つあります。

1)設定は#propertyプリプロセッサ指示文を使って

//--- graphic plot #0 (Main)
#property indicator_label1  "Mtm"       // label of graphic plot #0
#property indicator_type1   DRAW_LINE   // Drawing type: DRAW_LINE - line
#property indicator_color1  Blue        // Line color - Blue
#property indicator_style1  STYLE_SOLID // Line style: STYLE_SOLID - solid line
#property indicator_width1  1           // Line width

2)グラフィックプロットのプロパティ設定の関数グループ PlotIndexSetDouble()PlotIndexSetInteger()PlotIndexSetString()によって。

//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"Mtm");            // label
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);    // drawing type as a line
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Blue);       // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);          // line width

コードはイベントハンドラInit()の関数OnInit()に書かれます。 PlotIndexSet *() 関数仕様

bool PlotIndexSetDouble|Integer|String(
   int                             plot_index, // index of the graphic plot
   int                             prop_id,    // identifier of the property of the graphic plot
   double|int,char,bool,color|string  prop_value  // new value of the property
   );

選択されたグラフィックプロットのの表示をするため、グラフィックプロットのプロパティIDを使います。以下にリスト化されています。ENUM_PLOT_PROPERTY列挙

インディケータのインデックスは 0から始まります。 #propertyプリプロセッサ指示文 を使ったコンフィギュレーションの参照性については、上記『インディケータ参照』項で確認してください。グラフィックプロットのいくつかのプロパティ(色、スタイル、線幅)はインディケータの『プロパティ』ウィンドウから変更が可能です。

設定:インディケータ値の表示精度(7)

//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);

コードはイベントハンドラInit()の関数OnInit()に書かれます。インディケータ設定コンフィギュレーションの仕様は IndicatorSet * ():

bool IndicatorSetDouble|Integer|String(
   int                    prop_id,   // ID of indicator property
   double|int,color|string  prop_value // new value of a property
   );

インディケータプロパティの識別子は以下にリスト化されています。ENUM_CUSTOMIND_PROPERTY列挙

インディケータ値の表示精度はIndicatorSetInteger()のみ取得できます。インディケータプロパティのID INDICATOR_DIGITS, ENUM_CUSTOMIND_PROPERTY_INTEGER 列挙

インディケータバッファ、それはレンダリングするのですが、の値がマウスポインタがインぢhケータファインの上にくるとき短縮名の隣にポップアップメッセージで表示されている例では、インディケータバッファはインスツルメントの価格の小数点以下を_Digitsに切り上げられます。 - インスツルメントにはインディケータがアタッチされています。

設定:レンダリングされない初期バーの数(8)

William Blau のq-期間モメンタムをレンダリングするためのデータは4つのステップで作成されます。

ステップ 1 PriceBuffer[] 価格配列からのデータに基づき、モメンタム(期間 q)が計算されます。q-期間モメンタムの値はMtmBuffer[] 配列に入れられますl価格配列の指数化は0から始まるので、他価格配列内の大量のデータもインデックス0から始まります。そうすると、MtmBuffer[] 配列内の大量のデータがインデックス (q-1)でスタートします。

ステップ2 MtmBuffer[] 配列内の大量のデータが平滑化されます。(平滑化期間 r)。平滑化されたq-期間モメンタムはEMA_MtmBuffer[] 配列に配置されます。MtmBuffer[] 配列の指数化が0から始まるの MtmBuffer[] 配列内の大量のデータはインデックス(q-1)から始まり、そうすると、EMA_MtmBuffer[] 配列内の大量のデータはインデックス (q-1) + (r-1)からスタートします。

ステップ3,4 同様に、DEMA_MtmBuffer[] 配列(平滑化期間 s)およびMainBuffer[](平滑化期間 u) 配列でどのバーが有意義なデータをスタートするのか判断することを考えます。図1.7参照

図1.7 Mtm (price,q,r,s,u) インディケータの有意義なデータ

図1.7 Mtm (price,q,r,s,u) インディケータの有意義なデータ

グローバルレベル で変数は宣言されます。

//--- global variables
int    begin1, begin2, begin3, begin4; // data starting indexes

変数の値 - はバーのインデックスでそこから変数インディケータ配列に対応して有意義なデータが始まります。変数値はイベントハンドラInitの関数OnInit()で計算され、 Calculateイベントハンドラの関数OnCalculate() で使われます。

//---
   begin1=q-1;        //                             - MtmBuffer[]
   begin2=begin1+r-1; // or =(q-1)+(r-1)             - EMA_MtmBuffer[]
   begin3=begin2+s-1; // or =(q-1)+(r-1)+(s-1)       - DEMA_MtmBuffer[]
   begin4=begin3+u-1; // or =(q-1)+(r-1)+(s-1)+(u-1) - MainBuffer[]
   //
   rates_total_min=begin4+1; // minimal size
//--- starting index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);

グラフィックプロットを表示しない初期バーの数はPlotIndexSetInteger()関数を使って指定されます。これはインディケータプロパティのの識別子 PLOT_DRAW_BEGIN (列挙ENUM_PLOT_PROPERTY_INTEGER)です。。

コンフィギュレーション:インディケータの短縮名 (11)

//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Mtm("+shortname+")");

コードはイベントハンドラInit()の関数OnInit()に書かれます。インディケータの短縮名はIndicatorSetString()関数を使って指定されます。これはインディケータプロパティの識別子INDICATOR_SHORTNAME (ENUM_CUSTOMIND_PROPERTY_STRING 列挙) <i1>INDICATOR_DIGITS</i1>, ENUM_CUSTOMIND_PROPERTY_INTEGER 列挙)です。PriceName ()関数がprice typeの名前を返します。これは AppliedPrice入力パラメータの値によります。PriceName ()関数のコードは ファイル "WilliamBlau.mqh" (イントロダクション参照)にあります。

入力パラメータ

//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st EMA
input int    u=3;  // u - 3rd EMA, applied to the 2nd EMA
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type

詳細はインプット変数参照入力パラメータはインディケータの『プロパティ』ウィンドウ("Inputs"タブ)から変更するのに利用可能です。

1.4.1.2. インディケータ Mtm (price,q,r,s,u)の計算

計算:アルゴリズム

Mtm(price,q,r,s,u)を計算するためのアルゴリズム

  1. インディケータを計算するためのデータが十分あるか確認します。
  2. 価格配列の計算は指定された 価格タイプ - PriceBuffer[] 配列の形式によります。
  3. インデックスバーの決定。そこでq-期間モメンタム計算をどこから始め、どこまで続けるか。
  4. q-期間モメンタムの計算 - MtmBuffer[] 配列への書き込み
  5. EMA メソッド (期間 r)による最初の平滑化 - EMA_MtmBuffer[]配列への書き込み
  6. EMA メソッド (期間 s)による二度目の平滑化 - DEMA_MtmBuffer[] 配列への書き込み
  7. EMA メソッド (期間 u)による三度目の平滑化 - MainBuffer[]配列への書き込み - グラフィックプロット#0をレンダリングするための値計算

計算:関数OnCalculate()

インチケータ値の計算ははイベントハンド Calculateの関数OnCalculate() で行われます。OnCalculate() 関数呼び出しの二番目の形式を使います。

int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at the previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
//---
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }

rates_total引数は価格チャートのバー数で、それはレンダリングされ、処理のためインディケータに使用可能です。prev_calculated - は現在の OnCalculate()関数呼び出しにおける 開始時刻でのインディケータによる処理が行われた価格チャートのバー数です。

OnCalculate()関数 は現在の呼び出しの 終了時刻でのインディケータによる処理が行われた価格チャートのバー数です。この関数はrates_total パラメータを返します。それは、最初の呼び出しで価格チャートの未処理のバーをすべて 処理する、というふうに構築する必要があります。

OnCalculate() 関数の最初の呼び出しで、パラメータprev_calculated が0に等しく、二度目の呼び出しでパラメータprev_calculatedrates_totalまたは rates_total +1のどちらかに等しく、二度目の呼び出しでスタートすると、OnCalculate() 関数が最後のバーだけを処理(数え)します。例についてこれ以上の計算はこちらを参照ください。

インディケータバッファとTime[]、Open[]、High[]、 Low[]、 Close[], TickVolume[]、 Volume[]、 Spread[] 配列はデフォルトの インデックス方向を持ち、それは左から右、配列の最初から終わり、古いデータから最近のデータへ となっています。最初のエレメントのインデックスは 0です。インディケータバッファのサイズはクライアント端末でコントロールされており、そのためそれは常にインディケータが計算されるバーの数に対応しています。

計算:インディケータを計算するためのデータが十分あるか確認します。(1)

//--- check rates
   if(rates_total<rates_total_min) return(0);

グローバル 変数rates_total_minはインディケータの時系列インプットの最小サイズをしています。それは、 Initイベントハンドラの OnInit()関数で計算されます。

rates_total_min=begin4+1; // minimum size of the input timeseries of the indicator

計算:価格配列PriceBuffer[] (2)

//--- calculation of the prices array PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // price type
                        rates_total,         // size of the input timeseries
                        prev_calculated,     // bars, processed on the previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        PriceBuffer          // calculate the prices array
                       );

PriceBuffer[] 価格配列に書くため、CalculatePriceBuffer() 配列が使われます。 CalculatePriceBuffer()関数のコードはファイル "WilliamBlau.mqh" (イントロダクション参照)にあります。価格タイプは入力パラメータAppliedPriceに指定されます。

計算:インデックスバーの決定。q-期間モメンタムの計算をそれのどこから始め、どこまで続けるか。(3)

pos ローカル関数はバーのインデックスで、そこからインディケータはOnCalculate()関数の現在コールにおける計算をされます。pos変数の計算と MtmBuffer[]配列を準備する段階の計算を組み合わせます。(MtmBuffer[] 配列の重要エレメントをゼロ化する段階)

計算:q-期間モメンタム(4)

//--- calculation of q-period Momentum
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos values
         MtmBuffer[i]=0.0;     // zero values
     }
   else pos=prev_calculated-1; // overwise recalc only last value
   // calculate MtmBuffer[]
   for(i=pos;i<rates_total;i++)
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];

q-期間モメンタムは現在期間PriceBuffer[i]と前回期間PriceBuffer[i-(q-1)]の価格(q-1) の差で計算されます。

計算:EMA手法による平滑化 (5-7)

//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   // u-period 3rd EMA (for plot #0)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,MainBuffer);

ExponentialMAOnBuffer()関数はイントロダクションで述べられています。r-期間移動初回EMAの計算連では、:ExponentialMAOnBuffer()関数がEMA_MtmBuffer[]アウトプット配列にMtmBuffer[] インプット配列の値EMA (r)をi書き込みます。;インデックス (begin1-1) までの重要でないデータは、包括的にゼロ値で書かれます。

1.4.2. "Blau_TSI.mq5" - インディケータTSI(price,q,r,s,u) - 真強度指数

インディケータTSI (price,q,r,s,u)のコードは変更を基に構築されコード( "Blau_Mtm.mq5")に追加されます。

//+------------------------------------------------------------------+
//|                                                     Blau_TSI.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // URL
#property description "True Strength Index (William Blau)"      // description
#include <WilliamBlau.mqh>               // include file (terminal_data_folder\MQL5\Include)
//--- indicator settings
#property indicator_separate_window      // indicator in a separate window
#property indicator_buffers 10           // number of buffers used
#property indicator_plots   1            // graphic plots
//--- horizontal levels
#property indicator_level1 -25           // level #0 (vertical)
#property indicator_level2 25            // level #1 (vertical)
#property indicator_levelcolor Silver    // level color
#property indicator_levelstyle STYLE_DOT // level style
#property indicator_levelwidth 1         // level width
//--- indicator min/max
#property indicator_minimum -100         // minimum
#property indicator_maximum 100          // maximum
//--- graphic plot #0 (Main)
#property indicator_label1  "TSI"        // label for graphic plot #0
#property indicator_type1   DRAW_LINE    // draw as a line
#property indicator_color1  Blue         // line color
#property indicator_style1  STYLE_SOLID  // line style
#property indicator_width1  1            // line width
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to Momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st smoothing
input int    u=3;  // u - 3rd EMA, applied to the 2nd smoothing
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type
//--- dynamic arrays
double MainBuffer[];        // TSI (graphic plot #0)
double PriceBuffer[];       // price array
double MtmBuffer[];         // q-period Momentum
double EMA_MtmBuffer[];     // r-period 1st EMA
double DEMA_MtmBuffer[];    // s-period 2nd EMA
double TEMA_MtmBuffer[];    // u-period 3rd EMA
double AbsMtmBuffer[];      // q-period Momentum (absolute value)
double EMA_AbsMtmBuffer[];  // r-period 1st EMA (absolute value)
double DEMA_AbsMtmBuffer[]; // s-period 2nd EMA (absolute value)
double TEMA_AbsMtmBuffer[]; // u-period 3rd EMA (absolute value)
//--- global variables
int    begin1, begin2, begin3, begin4; // starting index
int    rates_total_min; // rates total min
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                // TSI
   // intermediate buffers; (not used for plot)
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);       // price array
   SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);         // q-period Momentum
   SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);     // r-period 1st EMA
   SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // s-period 2nd EMA
   SetIndexBuffer(5,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // u-period 3rd EMA
   SetIndexBuffer(6,AbsMtmBuffer,INDICATOR_CALCULATIONS);      // q-period моментум (absolute value)
   SetIndexBuffer(7,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA (absolute value)
   SetIndexBuffer(8,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute value)
   SetIndexBuffer(9,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute value)
/*
//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"TSI");             // label of graphic plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);    // draw as a line
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Blue);        // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);           // line width
*/
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,2);
/*
//--- horizontal levels
   IndicatorSetInteger(INDICATOR_LEVELS,2);                // number of levels
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-25);         // level #0
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,25);          // level #1
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,Silver);       // level color
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT);    // level style
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1);            // level width
   IndicatorSetString(INDICATOR_LEVELTEXT,0,"Oversold");   // level 0 description "Oversold"
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Overbought"); // level 1 description "Overbought"
//--- indicator scale
   IndicatorSetDouble(INDICATOR_MINIMUM,-100); // minimum
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);  // maximum
*/
//---
   begin1=q-1;        //                             - MtmBuffer[], AbsMtmBuffer[]
   begin2=begin1+r-1; // or =(q-1)+(r-1)             - EMA_...[]
   begin3=begin2+s-1; // or =(q-1)+(r-1)+(s-1)       - DEMA_...[]
   begin4=begin3+u-1; // or =(q-1)+(r-1)+(s-1)+(u-1) - TEMA_...[], MainBuffer[]
   //
   rates_total_min=begin4+1; // rates total min
//--- starting index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_TSI("+shortname+")");
//--- OnInit done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
   int i,pos;
   double value1,value2;
//--- check rates
   if(rates_total<rates_total_min) return(0);
//--- calc PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // price type
                        rates_total,         // rates total
                        prev_calculated,     // bars, calculated at previous tick
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        PriceBuffer          // price buffer
                       );
//--- calculation of  mtm and |mtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos
        {
         MtmBuffer[i]=0.0;     // zero values
         AbsMtmBuffer[i]=0.0;  //
        }
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculate MtmBuffer[] and AbsMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
      AbsMtmBuffer[i]=MathAbs(MtmBuffer[i]);
     }
//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,AbsMtmBuffer,EMA_AbsMtmBuffer);
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_AbsMtmBuffer,DEMA_AbsMtmBuffer);
   // u-period 3rd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,TEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_AbsMtmBuffer,TEMA_AbsMtmBuffer);
//--- TSI calculation (graphic plot #0)
   if(prev_calculated==0)      // at first call
     {
      pos=begin4;              // calc all values starting from begin4
      for(i=0;i<pos;i++)       // 
         MainBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculation of MainBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      value1=100*TEMA_MtmBuffer[i];
      value2=TEMA_AbsMtmBuffer[i];
      MainBuffer[i]=(value2>0)?value1/value2:0;
     }
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

コード "Blau_Mtm.mq5"に対する変更と追加部分のみこまかく見ていきます。

1.4.2.1. インディケータTSI (price,q,r,s,u)のコンフィギュレーション "Blau_Mtm.mq5"への変更と追加。

インディケータ設定(標準的な)

インディケータTSI (price,q,r,s,u)のコンフィギュレーション はインディケータMtm(price,q,r,s,u)のコンフィギュレーション (図1.8参照)とは異なります。

  1. インディケータを表示するウィンドウを指定します。(変更なし)
  2. グラフィックストラクチャの数を指定します。(変更なし)
  3. インディケータバッファ数を指定します。(バッファ数は増加しています。)
  4. インディケータ配列の宣言。(配列に追加)
  5. 配列/バッファ/プロットの割当て:インディケータ配列 -> インディケータバッファ -> グラフィックプロット (制限)
  6. 各グラフィックプロットの記述をします。 (ラベルは変更済みです。)
  7. インディケータ値表示の精度を指定します。​​(変更した精度)
  8. 各グラフィックプロットについて、グラフィックプロットを表示しない初期バー数を指定します。 (変更なし)
  9. 水平レベルを設定し、各水平レベルのプロパティを記述します。(新規)
  10. 個別のインディケータウィンドウのスケール限界を設定します。 (新規)
  11. インディケータの短縮名を指定します。(名前変更済み)

図1.8 真強度指数 TSI (price,q,r,s,u) インディケータ

図1.8 真強度指数 TSI (price,q,r,s,u) インディケータ

コンフィギュレーション(変更)

コード "Blau_Mtm.mq5"において、以下の 小さな変更をします。

1. mql5-programの短い記述を変更します。

#property description "True Strength Index (William Blau)"      // description

2. (コンフィギュレーション 6で) グラフィックプロット数は増やしませんでした。描画方法 (DRAW_LINE - 線)、線の色 (青)、線種 (STYLE_SOLID - 実線)、線幅 (1) は変更せずそのまま残しますが、グラフィックプロット #0 のラベルは変更しています。

#property indicator_label1  "TSI"        // label for graphic plot #0

3. (コンフィギュレーション 7で) インディケータ値の表示精度を変更します。

IndicatorSetInteger(INDICATOR_DIGITS,2);

4. (コンフィギュレーション 11で) インディケータの短縮名を変更します。

IndicatorSetString(INDICATOR_SHORTNAME,"Blau_TSI("+shortname+")");

コンフィギュレーション:水平レベル(9)

水平レベルを構成するために、各レベルについて以下を指定する必要があります。

  1. 縦軸の値
  2. レベルの記述(オプション)水平層はレンダリングのスタイルを一つだけ持っています。
    1. ライン表示のための色
    2. 線種 ( ENUM_LINE_STYLEに列挙のある使用可能なスタイルを確認);
    3. 線幅

コンフィギュア方法は2つあります。

1)設定は#propertyプリプロセッサ指示文を使って

//--- horizontal levels
#property indicator_level1 -25           // level #0 (vertical)
#property indicator_level2 25            // level #1 (vertical)
#property indicator_levelcolor Silver    // level color
#property indicator_levelstyle STYLE_DOT // level style
#property indicator_levelwidth 1         // level width

2)IndicatorSet *()関数のグループを使って

//--- horizontal levels
   IndicatorSetInteger(INDICATOR_LEVELS,2);                // number of levels
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-25);         // level #0
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,25);          // level #1
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,Silver);       // level color
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT);    // level style
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1);            // level width
   IndicatorSetString(INDICATOR_LEVELTEXT,0,"Oversold");   // level 0 description "Oversold"
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Overbought"); // level 1 description "Overbought"

コードはイベントハンドラInit()の関数OnInit()に書かれます。水平レベルのインデックスは 0からスタートします。水平レベルの表示を改良するため、INDICATOR_LEVEL * インデックスのプロパティの識別子を使用します。それは ENUM_CUSTOMIND_PROPERTY 列挙リストにあります。

各レベルの記述は IndicatorSetString() 関数でのみ設定されます。これはインディケータプロパティ INDICATOR_LEVELTEXTの識別子です。 (ENUM_CUSTOMIND_PROPERTY_STRING 列挙)レベル記述は左側、直接レベルの上に配置します。

インディケータの『プロパティ』ウィンドウ(『レベル』タブ)から水平レベルを追加/削除;値変更、各レベル記述、レベルのレンダリング種変更が可能です。

コンフィギュレーション:個別のインディケータウィンドウのスケール限界を設定します。(10)

コンフィギュア方法は2つあります。

1)設定は#propertyプリプロセッサ指示文を使って

//--- indicator min/max
#property indicator_minimum -100         // minimum
#property indicator_maximum 100          // maximum

2)IndicatorSetDouble() 関数を使って。それはインディケータのプロパティ INDICATOR_MINIMUMINDICATOR_MAXIMUM の識別子です。(ENUM_CUSTOMIND_PROPERTY_DOUBLE 列挙)

//--- indicator scale
   IndicatorSetDouble(INDICATOR_MINIMUM,-100); // minimum
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);  // maximum

コードはイベントハンドラInit()の関数OnInit()に書かれます。個別インディケータウィンドウの上下スケール限界はインディケータの『プロパティ』ウィンドウ(『スケール』タブ)から変更できます。

コンフィギュレーション(変更):インディケータバッファ(3-5)

コンフィギュレーションの変更:インディケータ配列 -> インディケータバッファ -> グラフィックプロット

1. (コンフィギュレーション 3で) バッファ数を増やします。

#property indicator_buffers 10           // the number of buffers for the calculation of the indicator

2. (コンフィギュレーション4で) q-期間モメンタムの絶対値計算に必要なインディケータ配列を追加します。

double AbsMtmBuffer[];      // q-period Momentum (absolute value)
double EMA_AbsMtmBuffer[];  // r-period 1st EMA (absolute value)
double DEMA_AbsMtmBuffer[]; // s-period 2nd EMA (absolute value)
double TEMA_AbsMtmBuffer[]; // u-period 3rd EMA (absolute value)

MainBuffer[] 配列の目的が変わります。

double MainBuffer[];        // TSI (graphic plot #0)
double TEMA_MtmBuffer[];    // u-period 3rd EMA

3. (in configuration 5) 「インディケータ配列 -> インディケータバッファ -> グラフィックプロット」の連携が変更します。

// graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                // TSI
   // intermediate buffers; (not used for plot)
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);       // price array
   SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);         // q-period Momentum
   SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);     // r-period 1st EMA
   SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // s-period 2nd EMA
   SetIndexBuffer(5,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // u-period 3rd EMA
   SetIndexBuffer(6,AbsMtmBuffer,INDICATOR_CALCULATIONS);      // q-period моментум (absolute value)
   SetIndexBuffer(7,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA (absolute value)
   SetIndexBuffer(8,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute value)
   SetIndexBuffer(9,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute value)

1.4.2.2. インディケータTSI (price,q,r,s,u)の計算 (コード"Blau_Mtm.mq5"への変更と追加)

計算:アルゴリズム

TSI (price,q,r,s,u) インディケータを計算するためのアルゴリズム

  1. インディケータを計算するためのデータが十分あるか確認します。
  2. 価格配列の計算は指定された 価格タイプ - PriceBuffer[] 配列の形式によります。
  3. インデックスバーの決定。そこでq-期間モメンタム計算をどこから始め、どこまで続けるか。
  4. q-期間モメンタムとその絶対値の計算 - MtmBuffer[] 配列と AbsMtmBuffer[] 配列への書き込み
  5. EMA メソッド (期間 r)による最初の平滑化 - MtmBuffer[] 配列と AbsMtmBuffer[] 配列への書き込み
  6. EMA メソッド (期間 s)による二度目の平滑化 - MtmBuffer[] 配列と AbsMtmBuffer[] 配列への書き込み
  7. EMA メソッド (期間 u)による三度目の平滑化 - TEMA_MtmBuffer[]配列とTEMA_AbsMtmBuffer[] 配列への書き込み
  8. インデックスバーの決定。そこで真強度指数計算をどこから始め、どこまで続けるか。
  9. 真強度指数の計算 - グラフィックプロット#0についてMainBuffer[] array配列への書き込み

アルゴリズム変更の基礎 (簡単に):

  • a) (段落4-7参照) q-期間モメンタム(配列グループ * MtmtBuffer[]) 計算と並行して q-期間モメンタムの絶対値計算(*AbsMtmBuffer[] 配列グループ) が行われます。
  • b) (8-9項参照) TSI計算が追加されます。

計算: q-期間モメンタムの絶対値 (3-7)

//--- calculation of  mtm and |mtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos
        {
         MtmBuffer[i]=0.0;     // zero values
         AbsMtmBuffer[i]=0.0;  //
        }
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculate MtmBuffer[] and AbsMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
      AbsMtmBuffer[i]=MathAbs(MtmBuffer[i]);
     }
//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,AbsMtmBuffer,EMA_AbsMtmBuffer);
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_AbsMtmBuffer,DEMA_AbsMtmBuffer);
   // u-period 3rd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,TEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_AbsMtmBuffer,TEMA_AbsMtmBuffer);

計算:真強度指数 (8-9)

//--- TSI calculation (graphic plot #0)
   if(prev_calculated==0)      // at first call
     {
      pos=begin4;              // calc all values starting from begin4
      for(i=0;i<pos;i++)       // 
         MainBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculation of MainBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      value1=100*TEMA_MtmBuffer[i];
      value2=TEMA_AbsMtmBuffer[i];
      MainBuffer[i]=(value2>0)?value1/value2:0;
     }


1.4.3. "Blau_Ergodic.mq5" - エルゴディック(price,q,r,s,u,ul) - エルゴディックオシレータ

Ergodic (price,q,r,s,u,ul) インディケータのコードは"Blau_TSI.mq5"の変更に基づきまず。

//+------------------------------------------------------------------+
//|                                                 Blau_Ergodic.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // URL
#property description "Ergodic Oscillator (William Blau)"       // description
#include <WilliamBlau.mqh>                 // include file (terminal_data_folder\MQL5\Include)
//--- indicator settings
#property indicator_separate_window        // indicator in a separate window
#property indicator_buffers 11             // number of buffers
#property indicator_plots   2              // indicator plots
//--- horizontal levels
#property indicator_level1 -25             // level #0
#property indicator_level2 25              // level #1
#property indicator_levelcolor Silver      // level color
#property indicator_levelstyle STYLE_DOT   // level style
#property indicator_levelwidth 1           // level width
//--- min/max
#property indicator_minimum -100           // minimum
#property indicator_maximum 100            // maximum
//--- graphic plot #0 (Main)
#property indicator_label1  "Ergodic"      // graphic plot #0
#property indicator_type1   DRAW_HISTOGRAM // draw as a histogram
#property indicator_color1  Silver         // histogram color
#property indicator_style1  STYLE_SOLID    // line style
#property indicator_width1  2              // line width
//--- graphic plot #1 (Signal Line)
#property indicator_label2  "Signal"       // graphic plot #1
#property indicator_type2   DRAW_LINE      // draw as a line
#property indicator_color2  Red            // line color
#property indicator_style2  STYLE_SOLID    // line style
#property indicator_width2  1              // line width
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to Momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st smoothing
input int    u=3;  // u - 3rd EMA, applied to the 2nd smoothing
input int    ul=3; // ul- period of a Signal Line
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type
//--- dynamic arrays
double MainBuffer[];        // Ergodic (graphic plot #0)
double SignalBuffer[];      // Signal line: ul-period EMA of Ergodic (graphic plot #1)
double PriceBuffer[];       // price array
double MtmBuffer[];         // q-period Momentum
double EMA_MtmBuffer[];     // r-period of the 1st EMA
double DEMA_MtmBuffer[];    // s-period of the 2nd EMA
double TEMA_MtmBuffer[];    // u-period of the 3rd EMA
double AbsMtmBuffer[];      // q-period Momentum (absolute value)
double EMA_AbsMtmBuffer[];  // r-period of the 1st EMA (absolute value)
double DEMA_AbsMtmBuffer[]; // s-period of the 2nd EMA (absolute value)
double TEMA_AbsMtmBuffer[]; // u-period of the 3rd EMA (absolute value)
//--- global variables
int    begin1, begin2, begin3, begin4, begin5; // starting indexes
int    rates_total_min; // rates total min
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                 // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);               // signal line: ul-period EMA of Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);        // price array
   SetIndexBuffer(3,MtmBuffer,INDICATOR_CALCULATIONS);          // q-period моментум
   SetIndexBuffer(4,EMA_MtmBuffer,INDICATOR_CALCULATIONS);      // r-period of the 1st EMA
   SetIndexBuffer(5,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // s-period of the 2nd EMA
   SetIndexBuffer(6,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // u-period of the 3rd EMA
   SetIndexBuffer(7,AbsMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Momentum (absolute value)
   SetIndexBuffer(8,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);   // r-period of the 1st EMA (absolute value)
   SetIndexBuffer(9,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // s-period of the 2nd EMA (absolute value)
   SetIndexBuffer(10,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (absolute value)
/*
//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"Ergodic");           // label of graphic plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); // draw as a histogram
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Silver);        // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);   // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);             // line width
//--- graphic plot #1 (Signal Line)
   PlotIndexSetString(1,PLOT_LABEL,"Signal");            // label of graphic plot #1
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE);      // draw as a line
   PlotIndexSetInteger(1,PLOT_LINE_COLOR,Red);           // line color
   PlotIndexSetInteger(1,PLOT_LINE_STYLE,STYLE_SOLID);   // line style
   PlotIndexSetInteger(1,PLOT_LINE_WIDTH,1);             // line width
*/
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,2);
/*
//--- horizontal levels
   IndicatorSetInteger(INDICATOR_LEVELS,2);                // number of indicator levels
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-25);         // level #0
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,25);          // level #1
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,Silver);       // level color
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT);    // level style
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1);            // level width
   IndicatorSetString(INDICATOR_LEVELTEXT,0,"Oversold");   // level #0 "Oversold"
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Overbought"); // level #1 "Overbought"
//--- min/max values
   IndicatorSetDouble(INDICATOR_MINIMUM,-100); // min
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);  // max
*/
//---
   begin1=q-1;         //                                    - MtmBuffer[], AbsMtmBuffer[]
   begin2=begin1+r-1;  // or =(q-1)+(r-1)                    - EMA_...[]
   begin3=begin2+s-1;  // or =(q-1)+(r-1)+(s-1)              - DEMA_...[]
   begin4=begin3+u-1;  // or =(q-1)+(r-1)+(s-1)+(u-1)        - TEMA_...[], MainBuffer[]
   begin5=begin4+ul-1; // or =(q-1)+(r-1)+(s-1)+(u-1)+(ul-1) - SignalBuffer[]
   //
   rates_total_min=begin5+1; // rates total min
//--- starting bar index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- starting bar index for plot #1
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,begin5);
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u)+","+string(ul);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Ergodic("+shortname+")");
//--- OnInit done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
   int i,pos;
   double value1,value2;
//--- rates total
   if(rates_total<rates_total_min) return(0);
//--- calculation of PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // price type
                        rates_total,         // rates total
                        prev_calculated,     // bars, calculated at the previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        PriceBuffer          // price array
                       );
//--- calculation of mtm and |mtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // starting from begin1
      for(i=0;i<pos;i++)       // pos
        {
         MtmBuffer[i]=0.0;     // zero values
         AbsMtmBuffer[i]=0.0;  //
        }
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculate MtmBuffer[] and AbsMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
      AbsMtmBuffer[i]=MathAbs(MtmBuffer[i]);
     }
//--- EMA smoothing
   // r-period of the 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,AbsMtmBuffer,EMA_AbsMtmBuffer);
   // s-period of 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_AbsMtmBuffer,DEMA_AbsMtmBuffer);
   // u-period 3rd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,TEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_AbsMtmBuffer,TEMA_AbsMtmBuffer);
//--- calculation of Ergodic (graphic plot #0)
   if(prev_calculated==0)      // at first call
     {
      pos=begin4;              // starting from begin4
      for(i=0;i<pos;i++)       // pos
         MainBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calculate only last bar
   // calculation of MainBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      value1=100*TEMA_MtmBuffer[i];
      value2=TEMA_AbsMtmBuffer[i];
      MainBuffer[i]=(value2>0)?value1/value2:0;
     }
//--- calculation of Signal Line (graphic plot #1)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin4,ul,MainBuffer,SignalBuffer);
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

コード "Blau_TSI.mq5"に対する変更と追加部分のみこまかく見ていきます。

1.4.3.1. インディケータErgodic (price,q,r,s,u,ul)のコンフィギュレーション "Blau_TSI.mq5"への変更と追加。

インディケータ設定(標準的な)

インディケータErgodic (price,q,r,s,u,ul)のコンフィギュレーション はインディケータTSI (price,q,r,s,u)のコンフィギュレーション (図1.9参照)とは異なります。

  1. インディケータを表示するウィンドウを指定します。(変更なし)
  2. グラフィックプロットの数を指定する。(グラフィックプロットが追加されます。)
  3. インディケータバッファ数を指定します。(バッファ数は増加しています。)
  4. インディケータ配列の宣言。(配列に追加)
  5. 連携を設定する。:インディケータ配列 -> インディケータバッファ -> グラフィックプロット
  6. 各グラフィックプロットを記述する。(i0>プロパティが変更され、グラフィックプロットが追加されます。)
  7. インディケータ値の表示精度を指定します。​(変更なし)
  8. 各グラフィッカルストラクチャについて、グラフィックプロットを表示しない初期バー数を指定します。 (ラフィックプロット)
  9. 水平レベルを設定し、各水平レベルのプロパティを記述します。(変更なし)
  10. 個別のインディケータウィンドウのスケール限界を設定します。 (変更なし)
  11. インディケータの短縮名を指定します。(名前変更済み)

図1.9 エルゴディック (price,q,r,s,u,ul) インディケータ

図1.9 エルゴディック (price,q,r,s,u,ul) インディケータ

コンフィギュレーション(変更)

コード "Blau_TSI.mq5"を以下の方法で変更します。

1. mql5-programの短い記述を変更します。

#property description "Ergodic Oscillator (William Blau)"       // description

2. 入力パラメータを追加します。

input int    ul=3; // ul- period of a Signal Line

3. (コンフィギュレーション 11で) インディケータの短縮名を変更します。

//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u)+","+string(ul);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Ergodic("+shortname+")");

コンフィギュレーション (変更):グラフィックプロット (2, 6)

1. (コンフィギュレーション2で) ラフィックプロットをもう一つ追加します。 (シグナルライン):

#property indicator_plots   2              // indicator plots

2. (コンフィギュレーション6で) a) 最初のグラフィックプロット#0 『エルゴディック』。

前にライン表示する方法として、(拡張子 DRAW_LINE)を使いました。今回は、ゼロラインからのヒストグラムを使います。 (ENUM_DRAW_TYPE列挙のDRAW_HISTOGRAM です。)

ライン表示のための色と線幅を変更します。

//--- graphic plot #0 (Main)
#property indicator_label1  "Ergodic"      // graphic plot #0
#property indicator_type1   DRAW_HISTOGRAM // draw as a histogram
#property indicator_color1  Silver         // histogram color
#property indicator_style1  STYLE_SOLID    // line style
#property indicator_width1  2              // line width

b) グラフィックプロット#1『シグナル』(シグナルライン):

//--- graphic plot #1 (Signal Line)
#property indicator_label2  "Signal"       // graphic plot #1
#property indicator_type2   DRAW_LINE      // draw as a line
#property indicator_color2  Red            // line color
#property indicator_style2  STYLE_SOLID    // line style
#property indicator_width2  1              // line width

コンフィギュレーション(変更):インディケータバッファ(3-5)

コンフィギュレーションの変更:インディケータ配列 -> インディケータバッファ -> グラフィックストラクチャ

1. (コンフィギュレーション 3で) バッファ数を増やします。

#property indicator_buffers 11             // number of buffers

2. (コンフィギュレーション4で) シグナルライン値の計算とレンダリングに必要なインディケータ配列を追加します。

double SignalBuffer[];      // Signal line: ul-period EMA of Ergodic (graphic plot #1)

3. (コンフィギュレーション5で) 関係インディケータ配列 -> インディケータバッファ -> グラフィックプロットを変更します。

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                 // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);               // signal line: ul-period EMA of Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);        // price array
   SetIndexBuffer(3,MtmBuffer,INDICATOR_CALCULATIONS);          // q-period моментум
   SetIndexBuffer(4,EMA_MtmBuffer,INDICATOR_CALCULATIONS);      // r-period of the 1st EMA
   SetIndexBuffer(5,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // s-period of the 2nd EMA
   SetIndexBuffer(6,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // u-period of the 3rd EMA
   SetIndexBuffer(7,AbsMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Momentum (absolute value)
   SetIndexBuffer(8,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);   // r-period of the 1st EMA (absolute value)
   SetIndexBuffer(9,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // s-period of the 2nd EMA (absolute value)
   SetIndexBuffer(10,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (absolute value)

設定:レンダリングされない初期バーの数(8)

  • グラフィックプロット #0『エルゴディック』をレンダリングしない初期バー数 計算メソッドは 1.4.1.1.項にて説明します。
  • グラフィックプロット #1『シグナル』をレンダリングしない初期バー数を計算する方法 SignalBuffer[] 配列はMainBuffer[]の大量のデータを平滑化した結果です。(平滑化期間 ul)。

MainBuffer[] 配列の指数化が0から始まるので MainBuffer[] 配列内の大量のデータはインデックス(q-1)+(r-1)+(s-1)+(u-1)から始まり、そうするとSignalBuffer[] 配列内の大量のデータは(q-1)+(r-1)+(s-1)+(u-1)+(ul-1)

グローバル変数begin5が宣言されます。

int    begin1, begin2, begin3, begin4, begin5; // starting indexes

計算(完了、追加情報は1.4.1.1項参照ください。):

//---
   begin1=q-1;         //                                    - MtmBuffer[], AbsMtmBuffer[]
   begin2=begin1+r-1;  // or =(q-1)+(r-1)                    - EMA_...[]
   begin3=begin2+s-1;  // or =(q-1)+(r-1)+(s-1)              - DEMA_...[]
   begin4=begin3+u-1;  // or =(q-1)+(r-1)+(s-1)+(u-1)        - TEMA_...[], MainBuffer[]
   begin5=begin4+ul-1; // or =(q-1)+(r-1)+(s-1)+(u-1)+(ul-1) - SignalBuffer[]
   //
   rates_total_min=begin5+1; // rates total min
//--- starting bar index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- starting bar index for plot #1
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,begin5);

1.4.3.2. Ergodic (price,q,r,s,u,ul)インディケータの計算( "Blau_TSI.mq5"への変更と追加。)

計算:アルゴリズム

Ergodic (price,q,r,s,ul)を計算するためのアルゴリズム

  1. インディケータを計算するためのデータが十分あるか確認します。
  2. 価格配列の計算は指定された 価格タイプ - PriceBuffer[] 配列に書き込みます。
  3. インデックスバーの決定。そこでq-期間モメンタム計算をどこから始め、どこまで続けるか。
  4. q-期間モメンタムとその絶対値の計算 - MtmBuffer[] 配列と AbsMtmBuffer[] 配列への書き込み
  5. EMA メソッド (期間 r)による最初の平滑化 - EMA_MtmBuffer[]配列と EMA_AbsMtmBuffer[] 配列への書き込み
  6. EMA メソッド (期間 s)による二度目の平滑化 - MtmBuffer[] 配列と AbsMtmBuffer[] 配列への書き込み
  7. EMA メソッド (期間 u)による三度目の平滑化 - TEMA_MtmBuffer[]配列とTEMA_AbsMtmBuffer[] 配列への書き込み
  8. インデックスバーの決定。そこで真強度指数計算をどこから始め、どこまで続けるか。
  9. Ergodic(真強度指数)の計算 - MainBuffer[] array配列への書き込 - 、グラフィックプロット#0をレンダリングするための値の計算
  10. シグナルラインの計算 - EMAメソッドによるエルゴディックの平滑化(period ul) - SignalBuffer[] 配列への書き込み- グラフィックプロット#1をレンダリングするための値の計算

アルゴリズム変更の基本 (簡単に) a) (1項参照) 時系列インディケータ入力の最小サイズへの要求を変更; b) (段落10参照) シグナルラインの計算変更

計算(変更):インディケータを計算するためのデータが十分あるか確認します。 (1)

アルゴリズムに変更はありません。

//--- rates total
   if(rates_total<rates_total_min) return(0);

グローバル 変数rates_total_minはインディケータの時系列インプットの最小サイズを変更しています。それは、 Initializationイベントハンドラの OnInit()関数で計算されます。

rates_total_min=begin5+1; // the minimum size of the input timeseries of the indicator

計算:シグナルライン (10)

//--- calculation of Signal Line (graphic plot #1)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin4,ul,MainBuffer,SignalBuffer);


2. ストキャスティック モメンタム

考察されるインディケータ(添付を参照ください)は2つのグループに分かれます。

I. ストキャスティックに基づくインディケータ

  1. Blau_TStoch.mq5 - Stochastic (q-period Stochastic; smoothed q-period Stochastic);
  2. Blau_TStochI.mq5 - Stochastic Index (normalized smoothed q-period Stochastic);
  3. Blau_TS_Stochastic.mq5 - Stochastic TS-oscillator (based on the index of the Stochastic).

II. ストキャスティックモメンタムに基づく指数

  1. Blau_SM.mq5 - Stochastic Momentum (q-period Stochastic Momentum; smoothed q-period Stochastic Momentum);
  2. Blau_SMI.mq5 - Stochastic Momentum Index (normalized smoothed q-period Momentum);
  3. Blau_SM_Stochastic.mq5 - Stochastic SM-Oscillator (based on the Stochastic Momentum Index).


2.1. Indicators based on the Stochastic

『MetaTraderクライアント端末使用ガイド』の『分析/テクニカルインディケータ/オシレータ/ストキャスティックオシレータ』項で、MetaTrader 5内蔵クライアント端末ストキャスティックオシレータのテクニカルインディケータとテクニカル分析における活用について述べられています。(iStochasticも参照ください。)


2.1.1. George Laneのストキャスティックオシレータ

ストキャスティックストキャスティックオシレータ (ストキャスティック、ストキャスティックオシレータ) - は以前のq期間について価格変動に関連した価格を表示する指数です。人指数を普及させたた著者はGeorge Lane氏です。

識別:

  • ファーストストキャスティク%Kとも呼ばれます。
  • スローストキャスティク (シグナルライン)、%Dとも呼ばれます。

George Laneによるトキャスティクの式 :

price - LL(q)
%K = 100 * -------------
           HH(q) - LL(q)
%D = SMA(%k, ul)

ここで

  • % K - ファーストストキャスティク;
  • % D - スローストキャスティク(シグナルライン);
  • price - 現在期間の価格(終値)
  • q - ストキャスティクの計算に使われるチャート価格の期間数t;
  • HH (q) - 期間q対する最高の前のq 期間の最大値;
  • HH (q) - 期間q対する最低の前のq 期間の最小値;
  • SMA (% K, ul) - オーダー ulの単純移動平均。 ファーストストキャスティク (% K)に適用されます。

George Laneの解釈によると、基本の考え方は、価格情報トレンドの間(上昇傾向)、価格トレンドはストップし、前回の最大値で閉じる。価格下降で(下降傾向)価格トレンドはストップし、前回の最小で閉じる。


2.1.2. William Blauのストキャスティクオシレータ

図2.1 ストキャスティクに基づくWilliam Blauの指数

図2.1 ストキャスティクに基づくWilliam Blauの指数


2.1.2.1. ストキャスティク

ストキャスティク - は距離です現在期間の価格(終値)から前回q期間についてもっとも低い価格動向範囲のポイントへの距離です。q-期間のストキャスティク値が示すのは価格変更のq-期間範囲の最低ポイントに関して価格がどのくらい動いたか、ということです。q-期間ストキャスティクの値はゼロに対して正、または等しいです。

図2.2 ストキャスティクの定義

図2.2 ストキャスティクの定義

q-期間ストキャスティクの式:

stoch(price,q) = price - LL(q)

ここで

  • price - 現在期間の価格(終値)
  • q - 価格グラフの期間の数値。ストキャスティクの計算に使われます。;
  • LL (q) - 最低値。前回のq-期間に対して、q-期間の最低価格。

平滑化q-期間ストキャスティクの式:

TStoch(price,q,r,s,u) = EMA(EMA(EMA( stoch(price,q) ,r),s),u)

ここで

  • price - (終わり)の価格- 価格チャートの価格ベース
  • q - バー数。ストキャスティクの計算に使われます。
  • stoch(price,q)=price-LL(q) - q-period Stochastic;
  • EMA (stoch (price, q), r) - 最初の平滑化 - EMA(r), q-期間ストキャスティクに適用されます。
  • EMA (EMA (..., r),s) - 二番目の平滑化 - EMA(期間s), 最初の平滑化結果に適用される
  • EMA (mEMA (EMA (..., r), s), u) - 三度目の平滑化 - EMA(期間u), 二度目の平滑化結果に適用される

TStoch(price,q,r,s,u) - ストキャスティク仕様

  • ファイル名: Blau_TStoch.mq5
  • 名前: ストキャスティク指数(q-期間 ストキャスティク; 平滑化 q-期間ストキャスティク)William Blauによる
  • 入力パラメータ
    • q - ストキャスティクが計算される期間(デフォルトq = 5);
    • r -最初のEMA期間、 ストキャスティクに適用される (デフォルト r = 20);
    • r -二番目のEMA期間、 最初の平滑化結果に適用される (デフォルト r = 5);
    • u -三度目のEMA期間、 二度目の平滑化結果に適用される (デフォルト u = 3);
    • AppliedPrice - price type (default AppliedPrice=PRICE_CLOSE).
  • 追加:
    • 別ウィンドウに表示されます。
    • グラフィカルプロットのレンダリングを変更します。 - 色、濃さ、線種(『色』タブ)。
  • 制約:
    • q>0;
    • r>0, s>0, u>0. r, s または u が 1に等しければ、EMA平滑化は行われません。
    • 価格配列の最小サイズ = (q-1 + r + s + u-3 +1).


2.1.2.2. ストキャスティク指数

ストキャスティク指数インディケータは標準化平滑化q-期間 ストキャスティクです。

平滑化されたq-期間ストキャスティクはパーセンテージでマッピングされます。(インターバル[0, 100])平滑化されたq-期間ストキャスティクは、q-期間期間価格レンジの値でひゅう純化されます。 標準化により可能になること は標準化平滑化q-期間 ストキャスティクがマーケットの買いすぎ/売りすぎの程度として解釈できることです。

ストキャスティク指数の式:

100 * EMA(EMA(EMA( price-LL(q) ,r),s),u)       100 * TStoch(price,q,r,s,u)
TStochI(price,q,r,s,u) = ---------------------------------------- = ----------------------------------
                            EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)      EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)
if EMA(EMA(EMA(HH(q)-LL(q),r),s),u)=0, then TStochI(price,q,r,s,u)=0

ここで

  • price - (終わり)の価格- 価格チャートの価格ベース
  • q - バー数。ストキャスティクの計算に使われます。
  • LL (q) - 期間 qの安値の最低値;
  • HH (q) - 期間 qの高値の最大値;
  • stoch(q)=price-LL(q) - q-期間 ストキャスティク;
  • TStoch(price,q,r,s,u) - 三度平滑化したq-期間 ストキャスティク;
  • HH(q)-LL(q) - q-期間価格レンジ;
  • EMA (..., r) - 最初の平滑化 - EMA(r)、次に適用されます。:
    1. q-期間 ストキャスティク;
    2. q-期間価格レンジ;
  • EMA (EMA(..., r),s) - 二度目の平滑化 - EMA(s), 最初の平滑化結果に適用される
  • EMA (EMA (EMA (..., r), s), u)- 三度目の平滑化 - EMA(u), 二度目の平滑化結果に適用される

TStochI(price,q,r,s,u) - ストキャスティク指数. 仕様

  • File name: Blau_TStochI.mq5
  • Name: Stochastic Index (normalized smoothed q-period Stochastic), according to William Blau.
  • 入力パラメータ
    • q - ストキャスティクが計算される期間(デフォルトq = 5);
    • r -最初のEMA期間、 ストキャスティクに適用される (デフォルト r = 20);
    • r -二番目のEMA期間、 最初の平滑化結果に適用される (デフォルト r = 5);
    • u -三度目のEMA期間、 二度目の平滑化結果に適用される (デフォルト u = 3);
    • AppliedPrice - price type (default AppliedPrice=PRICE_CLOSE).
  • 追加:
    • 別ウィンドウに表示されます。
    • グラフィックプロットのレンダリングを変更します。 - 色、濃さ、線種(『色』タブ)。
    • (オプション) 2レベル (デフォルトは 40 と 60) - レベルの追加/削除a;値変更、レベル記述、レベルのレンダリング種変更(『レベル』タブ)
    • 個別のインディケータウィンドウ(『スケール』タブ)の下限(デフォルトで0)と上限(デフォルトでは100)を変更します。
  • 制約:
    • q>0;
    • r>0, s>0, u>0. r、s、u が1に等しければ、EMAの対応する期間で平滑化は行われません。
    • 価格配列の最小サイズ = (q-1 + r + s + u-3 +1).


2.1.2.3. ストキャスティクオシレータ

ストキャスティクオシレータの定義

TS_Stochastic(price,q,r,s,u) = TStochI(price,q,r,s,u)
SignalLine(price,q,r,s,u,ul) = EMA( TS_Stochastic(price,q,r,s,u) ,ul)

ここで

  • TS_Stochastic() - ファーストストキャスティク、 %k - ストキャスティク指数 TStochI(price,q,r,s,u);
  • SignalLine() - スローストキャスティク (すぐなるライン)、% d - 期間 ulのEMA、ファーストストキャスティクに適用されます。 (% k);
  • ul - 期間 EMA シグナルライン - William Blauによると ul 値は最後の有意の期間と等しくなければならない。 (> 1) EMA ファーストストキャスティク.

TS_Stochastic(price,q,r,s,u,ul) - ストキャスティクオシレータ仕様

  • ファイル名: Blau_TS_Stochastic.mq5
  • 名前: Stochastic Oscillator (ストキャスティク指数に基づく), William Blauによる。.
  • 入力パラメータ
    • graphic plot #0 - ファーストストキャスティク(ストキャスティク指数),% k:
      • q - ストキャスティクが計算される期間(デフォルトq = 5);
      • r -最初のEMA期間、 ストキャスティクに適用される (デフォルト r = 20);
      • r -二番目のEMA期間、 最初の平滑化結果に適用される (デフォルト r = 5);
      • u -三度目のEMA期間、 二度目の平滑化結果に適用される (デフォルト u = 3);
    • graphic plot #1 - スローストキャスティク (シグナルライン),% d:
      • ul - 期間EMAシグナルライン、ファーストストキャスティクに適用される。(デフォルトでは ul = 3);
    • AppliedPrice - price type (default AppliedPrice=PRICE_CLOSE).
  • 追加:
    • 別ウィンドウに表示されます。
    • グラフィカルプロットのレンダリングを変更します。 - 色、濃さ、線種(『色』タブ)。
    • 2レベル (デフォルトは 40 と 60) - レベルの追加/削除a;値変更、レベル記述、レベルのレンダリング種変更(『レベル』タブ)
    • 個別のインディケータウィンドウ(『スケール』タブ)の下限(デフォルトで0)と上限(デフォルトでは100)を変更します。
  • 制約:
    • q>0;
    • r>0, s>0, u>0. r, s または u が 1に等しければ、EMA平滑化は行われません。
    • ul>0. If ul = 1、そうするとスローストキャスティク(シグナルライン)とファーストストキャスティクラインは同じ;
    • 価格配列の最小サイズ = (q-1 + r + s + u + ul-4 +1).


2.1.2.4. 連続性

William BlauのストキャスティクオシレータはGeorge Laneのストキャスティクオシレータも含みます。TS_Stochastic (William Blau)を標準の ストキャスティクオシレータ(George Lane)に対応するため、MetaTrader 5に実装するには以下の指定が必要です。:

TS_Stochastic( price=Close, q=KPeriod, r=1, s=1, u=1, ul=DPeriod )
Stochastic( KPeriod=q, DPeriod=ul, Slowing=1, price="Low/High", method="Exponential" )

図2.3 William BlauのストキャスティクオシレータはGeorge Laneのストキャスティクオシレータも含みます。

図2.3 William BlauのストキャスティクオシレータはGeorge Laneのストキャスティクオシレータも含みます。


2.1.2.5. ストキャスティクオシレータのコード

インディケータTS_Stochastic (price,q,r,s,u,ul)の例:

1)インディケータ配列、インディケータバッファ、グラフィックプロットの関係:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);              // fast Stochastic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);            // slow Stochastic: ul-period EMA of the fast Stochastic
   // buffers, used for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);      // price array
   SetIndexBuffer(3,LLBuffer,INDICATOR_CALCULATIONS);         // min value (q bars)
   SetIndexBuffer(4,HHBuffer,INDICATOR_CALCULATIONS);         // max value (q bars)
   SetIndexBuffer(5,StochBuffer,INDICATOR_CALCULATIONS);      // q-period Stochastic
   SetIndexBuffer(6,EMA_StochBuffer,INDICATOR_CALCULATIONS);  // r-period of the 1st EMA
   SetIndexBuffer(7,DEMA_StochBuffer,INDICATOR_CALCULATIONS); // s-period of the 2nd EMA
   SetIndexBuffer(8,TEMA_StochBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA
   SetIndexBuffer(9,HHLLBuffer,INDICATOR_CALCULATIONS);       // q-period price range
   SetIndexBuffer(10,EMA_HHLLBuffer,INDICATOR_CALCULATIONS);  // r-period of the 1st EMA (price range)
   SetIndexBuffer(11,DEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // s-period of the 2nd EMA (price range)
   SetIndexBuffer(12,TEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (price range)

2)q-期間ストキャスティクとq-期間価格レンジの計算アルゴリズム:

// calculation of StochBuffer[], HHLLBuffer[], LLBuffer[], HHBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      // LLBuffer[] - search for the minimal price (q bars)
      // HHBuffer[] - search for the maximal price (q bars)
      min=1000000.0;
      max=-1000000.0;
      for(k=i-(q-1);k<=i;k++)
        {
         if(min>Low[k])  min=Low[k];
         if(max<High[k]) max=High[k];
        }
      LLBuffer[i]=min;
      HHBuffer[i]=max;
      // StochBuffer[] - q-period Stochastic
      StochBuffer[i]=PriceBuffer[i]-LLBuffer[i];
      // HHLLBuffer[] - q-period price range
      HHLLBuffer[i]=HHBuffer[i]-LLBuffer[i];
     }


2.2. ストキャスティックモメンタムに基づく指数

図2.4 ストキャスティクモメンタムに基づくWilliam Blauの指数

図2.4 ストキャスティクモメンタムに基づくWilliam Blauの指数


2.2.1. ストキャスティック モメンタム

ストキャスティクモメンタム (Stochastic Momentum, SM) - は現在期間の価格から前回q期間での価格レンジの中ほどまでの距離です。q期間ストキャスティクモメンタムの値は、価格レンジでの価格のポジションを示します。

q期間ストキャスティクモメンタムのサインが示すのは q期間価格レンジの半ばに関する価格ポジション、 正- 価格は中間点を上回っている、負- 価格は中間点を下回っている。

図2.5 ストキャスティクモメンタムの定義

図2.5 ストキャスティクモメンタムの定義

q-期間ストキャスティクモメンタムの式:

sm(price,q) = price - 1/2 * [LL(q) + HH(q)]

ここで

  • price - 現在期間の価格(終値)
  • q - バー数、ストキャスティク計算に使われる
  • LL (q) - 期間 qの安値の最低値;
  • HH (q) - 期間 qの高値の最大値;
  • 1/2* [LL(q)+HH (q)] - q-期間価格レンジの真ん中

平滑化q-期間ストキャスティクモメンタムの式:

SM(price,q,r,s,u) = EMA(EMA(EMA( sm(price,q) ,r),s),u)

ここで

  • price - (終わり)の価格- 価格チャートの価格ベース
  • q - バー数、ストキャスティクモメンタム計算に使われる
  • sm(price,q)=price-1/2*[LL(q)+HH(q)] - -期間ストキャスティクモメンタム;
  • EMA (sm(price,q),r) - 最初の平滑化 - EMA(r), q-期間ストキャスティクモメンタムに適用される
  • EMA (EMA(..., r),s) - 二度目の平滑化 - EMA(s), 最初の平滑化結果に適用される
  • EMA (MA(sm(q),r),s),u) - 三度目の平滑化 - EMA(u), 二度目の平滑化結果に適用される


2.2.1.2. SM(price,q,r,s,u) - ストキャスティクモメンタム仕様

  • ファイル名: Blau_SM.mq5
  • 名前: ストキャスティクモメンタムインディケータ (-q-期間ストキャスティクモメンタム, 平滑化 q-期間ストキャスティクモメンタム), William Blauによる
  • 入力パラメータ
    • q - ストキャスティクモメンタムが計算される期間(デフォルトq = 5);
    • r -最初のEMA期間、 ストキャスティクモメンタムに適用される (デフォルト r = 20);
    • r -二番目のEMA期間、 最初の平滑化結果に適用される (デフォルト r = 5);
    • u -三度目のEMA期間、 二度目の平滑化結果に適用される (デフォルト u = 3);
    • AppliedPrice - price type (default AppliedPrice=PRICE_CLOSE).
  • 追加:
    • 別ウィンドウに表示されます。
    • グラフィカルプロットのレンダリングを変更します。 - 色、濃さ、線種(『色』タブ)。
  • 制約:
    • q>0;
    • r>0, s>0, u>0. r, s または u が 1に等しければ、EMA平滑化は行われません。
    • 価格配列の最小サイズ = (q-1 + r + s + u-3 +1).


2.2.2. ストキャスティクモメンタム指数

ストキャスティクモメンタム指数 (SMI) - 標準化されたストキャスティクレートの指数です。(標準化平滑化q-期間 ストキャスティクモメンタム)平滑化されたq-期間ストキャスティクモメンタムモメンタムはパーセンテージ形式で与えられます。(表示インターバル[-100, 100])

平滑化されたq-期間のストキャスティクモメンタムの値は価格動向のq-期間レンジ半分の値で標準化されます。この標準化によりSMIの値を指数値がーケットの買いすぎ(正の値)/売りすぎ(負の値)の程度と解釈できるのです。

ストキャスティクモメンタム指数の式:

100 * EMA(EMA(EMA( price-1/2*[LL(q)+HH(q)] ,r),s),u)           100 * SM(price,q,r,s,u)
SMI(price,q,r,s,u) = ---------------------------------------------------- = ----------------------------------------
                           EMA(EMA(EMA( 1/2*[HH(q)-LL(q)] ,r),s),u)         EMA(EMA(EMA( 1/2*[HH(q)-LL(q)] ,r),s),u)
if EMA(EMA(EMA(1/2*[HH(q)-LL(q)],r),s),u)=0, then SMI(price,q,r,s,u)=0

ここで

  • price - (終わり)の価格- 価格チャートの価格ベース
  • LL (q) - 期間 qの安値の最低値;
  • HH (q) - 期間 qの高値の最大値;
  • sm(price,q)=price-1/2*[LL(q)+HH(q)] - -期間ストキャスティクモメンタム;
  • SM(price,q,r,s,u) - 三度平滑化したq-期間 ストキャスティクモメンタム;
  • HH(q)-LL(q) - q-期間価格レンジ;
  • 1/2* [LL(q)+HH (q)] - q-期間価格レンジの真ん中
  • 1/2*[HH(q)-LL(q)] - 価格レンジのq-期間の半分;
  • EMA (..., r) - 最初の平滑化 - EMA(r)、次に適用されます。:1) q-期間ストキャスティクモメンタム
    2) q-期間半分の価格レンジ;
  • EMA (EMA(..., r),s) - 二度目の平滑化 - EMA(s), 最初の平滑化結果に適用される
  • EMA (EMA (EMA (..., r), s), u)- 三度目の平滑化 - EMA(u), 二度目の平滑化結果に適用される


2.2.2.2. SMI(price,q,r,s,u) - ストキャスティクモメンタム指数仕様

  • ファイル名: Blau_SMI.mq5
  • 名前: ストキャスティクモメンタム指数 (準化平滑化 q-期間相対モメンタム ) William Blauによる
  • 入力パラメータ
    • q - ストキャスティクモメンタムが計算される期間(デフォルトq = 5);
    • r - 最初のEMA期間、 ストキャスティクモメンタムに適用される (デフォルト r = 20);
    • s -二番目のEMA期間、 最初の平滑化結果に適用される (デフォルト s = 5);
    • u -三度目のEMA期間、 二度目の平滑化結果に適用される (デフォルト u = 3);
    • AppliedPrice - price type (default AppliedPrice=PRICE_CLOSE).
  • 追加:
    • 別ウィンドウに表示されます。
    • グラフィカルプロットのレンダリングを変更します。 - 色、濃さ、線種(『色』タブ)。
    • (オプション) 2レベル (デフォルトは-40 と +40) - レベルの追加/削除a;値変更、レベル記述、レベルのレンダリング種変更(『レベル』タブ)
    • 他につのインディケータウィンドウ(『スケール』タブ)の下限(デフォルトで-100)と上限(デフォルトでは100)を変更します。
  • 制約:
    • q>0;
    • r>0, s>0, u>0. r、s、u が1に等しければ、EMAの対応する期間で平滑化は行われません。
    • 価格配列の最小サイズ = (q-1 + r + s + u-3 +1).


2.2.3. ストキャスティクオシレータ

ストキャスティクオシレータの定義

SM_Stochastic(price,q,r,s,u) = SMI(price,q,r,s,u)
SignalLine(price,q,r,s,u,ul) = EMA( SM_Stochastic(price,q,r,s,u) ,ul)

ここで

  • SM_Stochastic() - ストキャスティクモメンタム指数 SMI(price,q,r,s,u);
  • SignalLine() - シグナルライン - 期間 ulのEMA、ストキャスティクモメンタムに適用されます。 (% k);
  • ul - 期間 EMA シグナルライン - William Blauによると ul 値は最後の有意の期間と等しくなければならない。 (> 1) EMA ストキャスティクレートの指数


2.2.3.1. SM_Stochastic(price,q,r,s,u,ul) - ストキャスティクオシレータ仕様

  • ファイル名: Blau_SM_Stochastic.mq5
  • 名前: ストキャスティクオシレータ (ストキャスティクモメンタムに基づく), William Blauによる
  • 入力パラメータ
    • graphic plot #0 - ストキャスティクモメンタム指数
      • q - ストキャスティクモメンタムが計算される期間(デフォルトq = 5);
      • r -最初のEMA期間、 ストキャスティクモメンタムに適用される (デフォルト r = 20);
      • s -二番目のEMA期間、 最初の平滑化結果に適用される (デフォルト r = 5);
      • u -三度目のEMA期間、 二度目の平滑化結果に適用される (デフォルト u = 3);
    • graphic plot #1 - シグナルライン:
      • ul - 期間EMAシグナルライン、キャスティクレートの指数に関し(デフォルトでは ul = 3);
    • AppliedPrice - price type (default AppliedPrice=PRICE_CLOSE).
  • 追加:
    • 別ウィンドウに表示されます。
    • グラフィカルプロットのレンダリングを変更します。 - 色、濃さ、線種(『色』タブ)。
    • 2レベル (デフォルトは -40 と +40) - レベルの追加/削除;値変更、レベル記述、レベルのレンダリング種変更(『レベル』タブ)
    • 他につのインディケータウィンドウ(『スケール』タブ)の下限(デフォルトで-100)と上限(デフォルトでは100)を変更します。
  • 制約:
    • q>0;
    • r>0, s>0, u>0. r、s、u が1に等しければ、EMAの対応する期間で平滑化は行われません。
    • ul>0. If ul = 1, シグナルラインはストキャスティクレートと一致します。;
    • 価格配列の最小サイズ = (q-1 + r + s + u + ul-4 +1).


2.2.4. ストキャスティクオシレータのコード

The SM_Stochastic (price, q, r, s, u, ul):

1)インディケータ配列、インディケータバッファ、グラフィックプロットの関係:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                   // Stochastic Momentum Index
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);                 // Signal Line: ul-period EMA of Stochastic Momentum Index
   // buffers for intermediate calculations (not used for plotting)
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);          // price array
   SetIndexBuffer(3,LLBuffer,INDICATOR_CALCULATIONS);             // minimal price value (q bars)
   SetIndexBuffer(4,HHBuffer,INDICATOR_CALCULATIONS);             // maximal price value (q bars)
   SetIndexBuffer(5,SMBuffer,INDICATOR_CALCULATIONS);             // q-period Stochastic Momentum
   SetIndexBuffer(6,EMA_SMBuffer,INDICATOR_CALCULATIONS);         // r-period of the 1st EMA
   SetIndexBuffer(7,DEMA_SMBuffer,INDICATOR_CALCULATIONS);        // s-period of the 2nd EMA
   SetIndexBuffer(8,TEMA_SMBuffer,INDICATOR_CALCULATIONS);        // u-period of the 3rd EMA
   SetIndexBuffer(9,HalfHHLLBuffer,INDICATOR_CALCULATIONS);       // half of price range (q bars)
   SetIndexBuffer(10,EMA_HalfHHLLBuffer,INDICATOR_CALCULATIONS);  // r-period of the 1st EMA (half of price range)
   SetIndexBuffer(11,DEMA_HalfHHLLBuffer,INDICATOR_CALCULATIONS); // s-period of the 2nd EMA (half of price range)
   SetIndexBuffer(12,TEMA_HalfHHLLBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (half of price range)

2) The algorithm of calculation of the q-period Stochastic Momentum and half of the q-period price range:

//--- calculation of q-period Stochastic Momentum and half of price range (q bars)
   if(prev_calculated==0)       // at first call
     {
      pos=begin1;               // starting from 0
      for(i=0;i<pos;i++)        // pos values
        {
         SMBuffer[i]=0.0;       // zero values
         HalfHHLLBuffer[i]=0.0; //
         LLBuffer[i]=0.0;       //
         HHBuffer[i]=0.0;       //
        }
     }
   else pos=prev_calculated-1;  // overwise calculate only last value
   // calculation of SMBuffer[], HalfHHLLBuffer[], LLBuffer[], HHBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      // calculation of LLBuffer[] - search for the minimal price (q bars)
      // calculation of HHBuffer[] - search for the maximal price (q bars)
      min=1000000.0;
      max=-1000000.0;
      for(k=i-(q-1);k<=i;k++)
        {
         if(min>Low[k])  min=Low[k];
         if(max<High[k]) max=High[k];
        }
      LLBuffer[i]=min;
      HHBuffer[i]=max;
      // calculation of SMBuffer[] - q-period Stochastic Momentum
      SMBuffer[i]=PriceBuffer[i]-0.5*(LLBuffer[i]+HHBuffer[i]);
      // calculation of HalfHHLLBuffer[] - half of price range (q bars)
      HalfHHLLBuffer[i]=0.5*(HHBuffer[i]-LLBuffer[i]);
     }


3. トレンドからの偏差指数

考察されるインディケータ(添付を参照ください)は2つのグループに分かれます。

I. マーケットトレンドの偏差に基づく指数

  1. Blau_MDI.mq5- トレンドの平均偏差に基づく指数 (平均偏差、移動平均偏差);
  2. Blau_Ergodic_MDI.mq5- エルゴディック MDI オシレータ (均偏差に基づく)

II. 移動平均収束/拡散に基づく指数

  1. Blau_MACD.mq5- 移動平均収束/拡散(MACD; 平滑化 MACD);
  2. Blau_Ergodic_MACD.mq5- ルゴディック MDI オシレータ ( MACD 指数に基づく).


3.1. マーケットトレンドの偏差に基づく指数

図3.1 William Blauの指数はマーケットトレンドの偏差に基づいています。

図3.1 William Blauの指数はマーケットトレンドの偏差に基づいています。


3.1.1. 平均偏差指標指数

トレンドからの平均偏差は価格とEMA(指数平滑移動平均)、または期間rの距離で、価格に適用されます。

マーケット成長のトレンド: EMA(r)、価格に適用される、は上昇トレンド(急激な増加)、または下降(急激な減少)を判断するのに使われます。

移動平均は価格曲線をスムーズにしますが、移動平均期間がやysフエルト、ラグにつながります。これは価格反転のポイントで明確です。(1.1.1項 図1.2参照ください)トレンドからの平均偏差値が示すもの は価格に適用されるMA(r)への距離です。

トレンドからの平均偏のサインが示すもの は価格に適用されるEMA(r) と相対的な価格のポジショです。:トレンドからの正の偏差が - 価格は指数よりも高い。負 - 価格は指数よりも低い

トレンドからの平均偏差の式

md(price,r) = price - EMA(price,r)

ここで

  • price - 現在期間の価格;
  • EMA (price,r) - マーケットトレンド- 期間のEMA 、 価格に適用されます。

『クライアントターミナルMetaTraderユーザーガイド』の『分析/テクニカルインディケータ/トレンドインディケータ』を参照ください。:

  1. 二重指数移動平均、DEMA;
  2. 三重指数移動平均、DEMA;

Alexander Elderによって、著書"Bears Power and Bulls Power indicators"で似た指数が使われています。『クライアントターミナルMetaTraderユーザーガイド』の『分析/テクニカルインディケータ/トレンドインディケータ』を参照ください。:

  1. ベアーパワー;
  2. ブルパワー

トレンドの平均偏差に基づく指数 (平均偏差指数、MDI) - はマーケットトレンドからの平滑化された平均偏差です。;

トレンドからの平均偏差インディケータの式

MDI(price,r,s,u) = EMA(EMA( md(price,r) ,s),u) = EMA(EMA( price-EMA(price,r) ,s),u)

ここで

  • price - (終わり)の価格- 価格チャートの価格ベース
  • EMA (price,r) - マーケットトレンド- 期間のEMA 、 価格に適用されます。
  • md (price,r) = price--EMA (price,r) - レンドからの平均偏差 - EMA(r)からの価格指数、価格に適用されます。 ;
  • EMA (md (price, r), s) - 二度目の平滑化 - EMA(s), 最初の平滑化結果に適用される
  • EMA (EMA (md(price,r),s),u) - 三度目の平滑化 - EMA(u), 二度目の平滑化結果に適用される


3.1.1.3. MDI(price,r,s,u) - 平均偏差指数. 仕様

  • ファイル名: Blau_MDI.mq5
  • 名前: マーケットからの平均偏差指数 (平均偏差、平滑化された平均偏差), William Blauによる
  • 入力パラメータ
    • r -最初のEMA期間、 ストキャスティクに適用される (デフォルト r = 20);
    • s - period of the 2nd EMA, applied to mean deviation (by default, s = 5);
    • u -三度目のEMA期間、 二度目の平滑化結果に適用される (デフォルト u = 3);
    • AppliedPrice - price type (default AppliedPrice=PRICE_CLOSE).
  • 追加:
    • 別ウィンドウに表示されます。
    • グラフィカルプロットのレンダリングを変更します。 - 色、濃さ、線種(『色』タブ)。
  • 制約:
    • r>1;
    • s>0, u>0. r, s または u が 1に等しければ、EMA平滑化は行われません。
    • 価格配列の最小サイズ = (r+s+u-3+1)


3.1.2. エルゴディック MDIオシレータ

エルゴディックMDIオシレータの定義

Ergodic_MDI(price,r,s,u) = MDI(price,r,s,u)
SignalLine(price,r,s,u,ul) = EMA( Ergodic_MDI(price,r,s,u) ,ul)

ここで

  • Ergodic_MDI() - Ergodic - 平均偏差指数 MDI(price,r,s,u);
  • The SignalLine() -シグナルライン - EMA期間ul、エルゴディックに適用される。
  • ul - シグナルラインのEMA 期間 - William Blauによると、ul 値はEMAエルゴディックの最後のsignificant (>1) に等しい必要がある。


3.1.2.2. Ergodic_MDI(price,r,s,u,ul) - エルゴディック MDIオシレータ仕様

  • ファイル名: Blau_Ergodic_MDI.mq5
  • 名前: エルゴディック MDIオシレータ (平均偏差指数に基づく)、William Blauによる。
  • 入力パラメータ
    • graphic plot #0 - Ergodic (トレンドからの平均偏差指数):
      • r -最初のEMA期間、 ストキャスティクに適用される (デフォルト r = 20);
      • s -二番目のEMA期間、 最初の平滑化結果に適用される (デフォルト s = 5);
      • u -三度目のEMA期間、 二度目の平滑化結果に適用される (デフォルト u = 3);
    • graphic plot #1 - シグナルライン:
      • ul - 期間EMAシグナルラインはエルゴディックに適用される。(デフォルトでは ul = 3);
    • AppliedPrice - price type (default AppliedPrice=PRICE_CLOSE).
  • 追加:
    • 別ウィンドウに表示されます。
    • グラフィカルストラクチャのレンダリングスタイルを変更します。 - 色、線幅、線種(『色』タブ)。
  • 制約:
    • r>1;
    • s>0, u>0. r, s または u が 1に等しければ、EMA平滑化は行われません。
    • ul>0. ul = 1なら、シグナルラインとエルゴディックラインは等しくなります。
    • 価格配列の最小サイズ = (r+s+u+ul-4+1)


3.1.3. エルゴディックオシレータのコード

例としてErgodic_MDI (price,r,s,u,ul) インディケータを考察していきます。:

1)インディケータ配列、インディケータバッファ、グラフィックプロットの関係:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);              // ergodic: u-period 3rd EMA
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);            // signal line: ul-period EMA of Ergodic
   // buffers for intermediate calculations; not used for plotting
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);     // price array
   SetIndexBuffer(3,EMA_PriceBuffer,INDICATOR_CALCULATIONS); // r-period 1st EMA (price)
   SetIndexBuffer(4,MDBuffer,INDICATOR_CALCULATIONS);        // среднее отклонение
   SetIndexBuffer(5,DEMA_MDBuffer,INDICATOR_CALCULATIONS);   // s-period 2nd EMA

2) The algorithm for calculating the mean deviation:

//--- calculation of the mean deviation
   if(prev_calculated==0)      // at first call
     {
      pos=begin2;              // starting from 0
      for(i=0;i<pos;i++)       // pos data
         MDBuffer[i]=0.0;      // zero values
     }
   else pos=prev_calculated-1; // overwise calculate only last bar
   // r-period 1st EMA: calculation of EMA_PriceBuffer[]
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,PriceBuffer,EMA_PriceBuffer);
   // calculation of MDBuffer[]
   for(i=pos;i<rates_total;i++)
      MDBuffer[i]=PriceBuffer[i]-EMA_PriceBuffer[i];


3.2. 移動平均収束/拡散に基づくインディケータ

図3.2 William Blauによる指数は移動平均収束/拡散に基づいています。

図3.2 William Blauによる指数は移動平均収束/拡散に基づいています。


3.2.1. 移動平均収束/拡散に基づく指数

移動平均収束/拡散 (移動平均収束/拡散、 MACD) - は指数関数的に平滑化された2つの移動平均の間の差を言います。:ファーストEMA(s)、スローEMA(r)、価格に適用されます。

サイン MACD が示すのは ファスト EMA(s)のrelative to the スローEMA(r)に対する相対的ポジションです。: 正の MACD - EMA(s) がEMA(r)を上回る、 負の MACD - EMA(s) がEMA(r)を下回る。絶対値によるMACD の変更:増加する|MACD| は 移動平均間の不一致を示します。減少する|MACD| は移動平均の収束を示します。

移動平均収束/拡散の式

macd(price,r,s) = EMA(price,s) - EMA(price,r)
s < r

ここで

  • price - 現在期間の価格(終値)
  • EMA(price,r) - スロー EMA(r), 価格に適用されます。;
  • EMA(price,s) - スロー EMA(s), 価格に適用されます。.

MACDインディケータがファーストとスローの指数平均間の関係を表します。(平滑化された移動平均の収束/拡散 )

MACD 指数の式:

MACD(price,r,s,u) = EMA( macd(price,r,s) ,u) = EMA( EMA(price,s)-EMA(price,r) ,u)
s < r

ここで

  • price - (終わり)の価格- 価格チャートの価格
  • EMA(price,r) - 最初の平滑化 - EMA(r)のゆっくりな指数、価格に適用されます。
  • EMA(price,s) - 二度目の平滑化 - ファーストEMA(s)、s、価格に適用されます。
  • macd(r,s)=EMA(price,s)-EMA (price,r) - the MACD;
  • EMA(macd (r,s),u) - the third smoothing - the EMA(u), applied to the MACD: a fast EMA (price,s) and a slow EMA (price,r).


3.2.1.1. MACD(price,r,s,u) - 移動平均の収束/拡散指数仕様

  • ファイル名: Blau_MACD.mq5
  • 名前: MACD指数 (MACD;杯活化MACD)William Blauによる
  • 入力パラメータ
    • r -最初のEMA期間、 EMA (スロー)、価格に適用される (デフォルト r = 20);
    • s -二度目のEMA期間、 EMA (ファースト)、価格に適用される(デフォルト r = 5);
    • u -三度目のEMA期間、 移動平均の収束/拡散指数に適用される (デフォルト u = 3);
    • AppliedPrice - price type (default AppliedPrice=PRICE_CLOSE).
  • 追加:
    • 別ウィンドウに表示されます。
    • グラフィカルプロットのレンダリングを変更します。 - 色、濃さ、線種(『色』タブ)。
  • 制約:
    • r>1, s>1;
    • s <r (セオリー要求による限界、プログラムレベルでは確認されません);
    • u>0. If u = 1, 平滑化は行われません。;
    • 価格配列の最小サイズ = ([max(r,s)]+u-2+1).


3.2.2. エルゴディックMACDオシレータ

エルゴディックMDIオシレータの定義

Ergodic_MACD(price,r,s,u) = MACD(price,r,s,u)
SignalLine(price,r,s,u,ul) = EMA( Ergodic_MACD(price,r,s,u) ,ul)

ここで

  • Ergodic_MACD () - エルゴディック - 移動平均収束/拡散 MACD(price,r,s,u)の指数;
  • The SignalLine() -シグナルライン - an EMA(ul), エルゴディックに適用されます。;
  • ul - シグナルラインのEMA 期間 - William Blauによると、ul 値はEMAエルゴディックの最後の有意 (>1) に等しい必要があります。

『MetaTraderクライアント端末使用ガイド』の『分析/テクニカルインディケータ/オシレータ/ストキャスティックオシレータ/MACD』 項テクニカルインディケータ/ 移動平均の収束と拡散 (MACD)、内蔵MetaTrader 5クライアント端末どそれをテクニカル分析で使用する方法が述べられています。(iMACDも合わせてご覧ください。)

標準的な MACDとは反対に、 William Blauは指数関数的に平滑化された移動平均 (標準MACDでは、シンプルな 移動平均が使われています。)を使っています。


3.2.2.1. Ergodic_MACD(price,r,s,u,ul) - エルゴディックMDIオシレータ仕様

  • ファイル名: Blau_Ergodic_MACD.mq5
  • 名前: エルゴディックMDIオシレータ( 移動平均収束/拡散指数に基づく)、William Blauによる。
  • 入力パラメータ
    • エルゴディックgraphic plot #0 - エルゴディック (t移動平均収束/拡散):
      • r -最初のEMA期間、 EMA (スロー)、価格に適用される (デフォルト r = 20);
      • s -二度目のEMA期間、 EMA (ファースト)、価格に適用される(デフォルト s = 5);
      • u -三度目のEMA期間、 移動平均の収束/拡散指数に適用される (デフォルト u = 3);
    • graphic plot #1 - シグナルライン:
      • ul - 期間EMAシグナルラインはエルゴディックに適用される。(デフォルトでは ul = 3);
    • AppliedPrice - price type (default AppliedPrice=PRICE_CLOSE).
  • 追加:
    • 別ウィンドウに表示されます。
    • グラフィカルストラクチャのレンダリングスタイルを変更します。 - 色、線幅、線種(『色』タブ)。
  • 制約:
    • r>1, s>1;
    • s <r (セオリー要求による限界、プログラムレベルでは確認されません);
    • u>0. If u = 1, 平滑化は行われません。;
    • ul>0. ul = 1なら、シグナルラインとエルゴディックは等しくなります。
    • 価格配列の最小サイズ = ([max(r,s)]+u+ul-3+1).


3.2.3. エルゴディックMACDオシレータのコード

例としてErgodic_MACD (price,r,s,u,ul) インディケータを考察していきます。:

1)インディケータ配列、インディケータバッファ、グラフィックプロットの関係:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);               // Ergodic: u-period 3rd EMA
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);             // Signal Line: ul-period EMA, applied to Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);      // price array
   SetIndexBuffer(3,EMA1_PriceBuffer,INDICATOR_CALCULATIONS); // r-period 1st EMA (slow), applied to price
   SetIndexBuffer(4,EMA2_PriceBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (fast), applied to price
   SetIndexBuffer(5,MACDBuffer,INDICATOR_CALCULATIONS);       // moving averages convergence/divergence

2)移動平均収束/拡散のアルゴリズム:

//--- calculation of moving average convergence/divergence
   if(prev_calculated==0)      // at first call
     {
      pos=begin2;              // 
      for(i=0;i<pos;i++)       // pos
         MACDBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // r-period 1st EMA: calculation of EMA1_PriceBuffer[]
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,PriceBuffer,EMA1_PriceBuffer);
   // s-period 2nd EMA: calculation of EMA2_PriceBuffer[]
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,s,PriceBuffer,EMA2_PriceBuffer);
   // calculation of MACDBuffer[]
   for(i=pos;i<rates_total;i++)
      MACDBuffer[i]=EMA2_PriceBuffer[i]-EMA1_PriceBuffer[i];


3.3. 追加

エルゴディック MDIオシレータとMACD-オシレータの計算において、William Blauによると、標準化は行われていません(pp参照)。1.2.1, 1.3.1). Therefore, the エルゴディック MDIオシレータとMACD-オシレータはマーケットの買いすぎ/売りすぎの程度を解釈するのに使うことはできません。

たとえば、『クライアントターミナルMetaTraderユーザーガイド』の『分析/テクニカルインディケータ/トレンドインディケータ/オシレータ/MACD』からはMACD指数の使用は推奨されています。:

MACDは買いすぎ/売りすぎの指数としても有用です。ショートの移動平均がロングの移動平均から大きく引き離すと、(MACDがライズすると)、安全価格が拡張しすぎ、するにより現実的なレベルに戻るということが起こりそうです。

この場合、テクニカル分析の観点から。


4. ろうそく足モメンタム

考察されるインディケータ(添付を参照ください)は2つのグループに分かれます。

  1. Blau_CMtm.mq5- ろうそく足モメンタム指数 (q-期間ろうそく足のモメンタム、平滑化q-期間ろうそく足のモメンタム);
  2. インデックス(標準化平滑化されている q-期間ろうそく足モメンタム)
    • Blau_CMI.mq5-ろうそく足モメンタム指数 (q-期間ろうそく足モメンタムの絶対値により標準化);
    • Blau_CSI.mq5- ろうそく足指数 (長さ q-期間ろうそく足で標準化);
  3. ろうそく足のエルゴディック オシレータ
    • Blau_Ergodic_CMI.mq5- エルゴディックCMI-オシレータ (ろうそく足モメンタム指数に基づく);
    • Blau_Ergodic_CSI.mq5- エルゴディックCMI-オシレータ (ろうそく足指数に基づく).

図4.1 ろうそく足モメンタムに基づくWilliam Blauによる指数 (q-期間ろうそく足モメンタムの絶対値により標準化)

図4.1 ろうそく足モメンタムに基づくWilliam Blauによる指数 (q-期間ろうそく足モメンタムの絶対値により標準化)

図4.2 ろうそく足モメンタムに基づくWilliam Blauによる指数 (q-期間ろうそく足モメンタムの長さにより標準化)

図4.2 ろうそく足モメンタムに基づくWilliam Blauによる指数 (q-期間ろうそく足モメンタムの長さにより標準化)


4.1. そく足モメンタム

4.1.1. ろうそく足モメンタムの定義

モメンタム (p.1.1参照) - は現在価格(通常本日の終値)と前回価格(通常昨日の終値)の差を言います。モメンタムは価格グラフのいかなる期間の価格変化も反映することができます。

ろうそく足モメンタム (William Blauによると) - は同じ期間内(ひとつのろうそく足内)の終値と始値の差です。ろうそく足モメンタムのサインは価格変動の方向を示します。:正のろうそく足モメンタム - 期間中価格は上昇、負 - 期間中価格は下降

ろうそく足モメンタムの式

cmtm = クローズ - オープン

ここで

  • price - 期間(現在)の終値;
  • open - 期間(現在)の始値

汎用性の観点から ろうそく足モメンタムの定義を拡げます。:

  1. ろうそく足モメンタムは価格グラフのいかなる期間の価格変化も反映することができます。
  2. 価格ベース (終値、初めね) は任意にできます。

図4.3 q-期間ろうそく足の定義

図4.3 q-期間ろうそく足の定義

ろうそく足モメンタムの式:

cmtm(price1,price2,q) = price1 - price2[q-1]

ここで

  • q - 価格チャートバー数、ろうそく足モメンタムの計算に使われます。
  • price - 期間qの終わりの価格(終値)
  • price - 期間qの始まりの価格(始値)

平滑化q-期間ろうそく足モメンタムの式:

CMtm(price1,price2,q,r,s,u) = EMA(EMA(EMA( cmtm(price1,price2,q) ,r),s),u)

ここで

  • q - 価格チャートのバー数、q-期間ろうそく足モメンタムの計算に使われます。
  • price - 期間qの終わりの価格(終値)
  • price2 - 期間qの始まりの価格(始値);
  • cmtm(price1,price2,q)=price1-price2[q-1] - q-期間ろうそく足モメンタム;
  • EMA (cmtm (price1, price2, q), r) - 最初の平滑化 - EMA(r), q-期間ろうそく足モメンタムに適用されます。;
  • EMA (EMA(..., r),s) - 二度目の平滑化 - EMA(s), 最初の平滑化結果に適用される
  • EMA (EMA (EMA (..., r), s), u)- 三度目の平滑化 - EMA(u), 二度目の平滑化結果に適用される


4.1.2. CMtm(price1,price2,q,r,s,u) - ろうそく足モメンタム指数仕様

  • ファイル名: Blau_CMtm.mq5
  • 名前: ろうそく足モメンタム指数 (q-期間平滑化 ろうそく足モメンタム)William Blauによる
  • 入力パラメータ
    • q - ろうそく足モメンタム期間(デフォルトq = 1);
    • r -最初のEMA期間、 q-期間ろうそく足モメンタムに適用されます。 (デフォルト r = 20);
    • r -二番目のEMA期間、 最初の平滑化結果に適用される (デフォルト r = 5);
    • u -三度目のEMA期間、 二度目の平滑化結果に適用される (デフォルト u = 3);
    • AppliedPrice1 - price type [closing] (by default AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - price type [opening] (by default AppliedPrice=PRICE_OPEN).
  • 追加:
    • 別ウィンドウに表示されます。
    • グラフィカルプロットのレンダリングを変更します。 - 色、濃さ、線種(『色』タブ)。
  • 制約:
    • q>0;
    • r>0, s>0, u>0. r, s または u が 1に等しければ、EMA平滑化は行われません。
    • 価格配列の最小サイズ = (q-1 + r + s + u-3 +1).


4.2. 標準化ろうそく足モメンタム

4.2.1. ろうそく足モメンタム指数

ろうそく足モメンタム指数 (CMI) - q-期間ろうそく足モメンタムにより標準化);

平滑化されたろうそく足のモメンタムの値はパーセンテージで表されます。(マッピングインターバル[-100, 100])平滑化されたq-期間ろうそく足のモメンタムの各値は、平滑化されたq-期間ろうそく足モメンタムによって標準化されます。;この標準化によりCMIの値がマーケットの買いすぎ(正の値)/売りすぎ(負の値)の程度と解釈できるのです。

ろうそく足モメンタム指数の式:

100 * EMA(EMA(EMA( cmtm(price1,pric2,q) ,r),s),u)          100 * CMtm(price1,pric2,q,r,s,u)
CMI(price1,price2,q,r,s,u) = –––––––––––-------------––––––––-–––––––––––––––– = –––––––––––––––-------------–––-–––––––––––––
                               EMA(EMA(EMA( |cmtm(price1,pric2,q)| ,r),s),u)     EMA(EMA(EMA( |cmtm(price1,pric2,q)| ,r),s),u)
if EMA(EMA(EMA(|cmtm(price1,pric2,q)|,r),s),u)=0, then CMI(price1,price2,q,r,s,u)=0

ここで

  • q - 価格グラフの期間の数値。ストキャスティクの計算に使われます。;
  • price - 期間qの終わりの価格(終値)
  • price2 - 期間qの始まりの価格(始値);
  • cmtm(price1,pric2,q)=price1-pric2[q-1], - q-期間ろうそく足モメンタム;
  • |cmtm(price1,pric2,q)| - q-期間ろうそく足モメンタムの絶対値
  • SM(price,q,r,s,u) - 三度平滑化したq-期間 ろうそく足モメンタム;
  • EMA (..., r) - 最初の平滑化 - EMA(r)、次に適用されます。:1) q-期間ろうそく足モメンタム
    2) q-期間ろうそく足モメンタムの絶対値
  • EMA (EMA(..., r),s) - 二度目の平滑化 - EMA(s), 最初の平滑化結果に適用される
  • EMA (EMA (EMA (..., r), s), u)- 三度目の平滑化 - EMA(u), 二度目の平滑化結果に適用される。


4.2.1.1. CMI(price1,price2,q,r,s,u) - ろうそく足モメンタム指数仕様

  • ファイル名: Blau_CMI.mq5
  • 名前: q-期間ろうそく足モメンタム指数 (標準化 平滑化 q-期間ろうそく足モメンタム; q-期間ろうそく足モメンタムの絶対値により標準化William Blauによる
  • 入力パラメータ
    • q - ろうそく足モメンタム期間(デフォルトq = 1);
    • r -最初のEMA期間、 ストキャスティクモメンタムに適用される (デフォルト r = 20);
    • r -二番目のEMA期間、 最初の平滑化結果に適用される (デフォルト r = 5);
    • u -三度目のEMA期間、 二度目の平滑化結果に適用される (デフォルト u = 3);
    • AppliedPrice1 - price type [closing] (by default AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - price type [opening] (by default AppliedPrice=PRICE_OPEN).
  • 追加:
    • 別ウィンドウに表示されます。
    • グラフィカルプロットのレンダリングを変更します。 - 色、濃さ、線種(『色』タブ)。
    • (オプション) 2レベル (デフォルトは -25 と +25) - レベルの追加/削除a;値変更、レベル記述、レベルのレンダリング種変更(『レベル』タブ)
    • 他につのインディケータウィンドウ(『スケール』タブ)の下限(デフォルトで-100)と上限(デフォルトでは100)を変更します。
  • 制約:
    • q>0;
    • r>0, s>0, u>0. r、s、u が1に等しければ、EMAの対応する期間で平滑化は行われません。
    • 価格配列の最小サイズ = (q-1 + r + s + u-3 +1).


4.2.2. ろうそく足指数

ろうそく足指数 (CSI) - は標準化されたq-期間ろうそく足モメンタムです。(標準化平滑化q-期間ろうそく足のモメンタム);平滑化されたろうそく足のモメンタムの値はパーセンテージで表されます。(マッピングインターバル[-100, 100])

平滑化されたq-期間ろうそく足モメンタムの各値は、q-期間価格レンジ(またはq-期間ろうそく足の長さ)の値によって標準化されます。;この標準化によりCSIの値がマーケットの買いすぎ(正の値)/売りすぎ(負の値)の程度と解釈できるのです。

ストキャスティク指数の式:

100 * EMA(EMA(EMA( cmtm(price1,pric2,q) ,r),s),u)    100 * CMtm(price1,pric2,q,r,s,u)
CSI(price1,price2,q,r,s,u) = –––––––––––––––––––-–––-------------––––––––––––– = ––––––––––––––––--––-–––––––––––––
                                    EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)           EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)
if EMA(EMA(EMA(HH(q)-LL(q),r),s),u)=0, then CSI(price1,price2,q,r,s,u)=0

ここで

  • q - 価格チャートのバー数、q-期間ろうそく足モメンタムの計算に使われます。
  • price - 期間qの終わりの価格(終値)
  • price2 - 期間qの始まりの価格(始値);
  • cmtm(price1,pric2,q)=price1-price2[q-1] - q-期間ろうそく足モメンタム;
  • LL (q) - 期間 qの安値の最低値;
  • HH (q) - 期間 qの高値の最大値;
  • HH(q)-LL(q) - q-期間価格レンジ;
  • SM(price,q,r,s,u) - 三度平滑化したq-期間 ろうそく足モメンタム;
  • EMA (..., r) - 最初の平滑化 - EMA(r)、次に適用されます。:1) q-期間ろうそく足モメンタム
    q-期間価格レンジ(またはq-期間ろうそく足の長さ);
  • EMA (EMA(..., r),s) - 二度目の平滑化 - EMA(s), 最初の平滑化結果に適用される
  • EMA (mtm (price, q), r) - 二番目の平滑化 - EMA(u), 二度目の平滑化結果に適用される


4.2.2.1. CSI(price1,price2,q,r,s,u) - ろうそく足指数仕様

  • ファイル名: Blau_CSI.mq5
  • 名前: q-期間ろうそく足モメンタム指数 (標準化 平滑化 q-期間ろうそく足モメンタム; q-期間ろうそく足の長さにより標準化William Blauによる
  • 入力パラメータ
    • q - q-期間ろうそく足モメンタムが計算される期間(デフォルトq = 1);
    • r -最初のEMA期間、 q-期間ろうそく足モメンタムに適用されます。 (デフォルト r = 20);
    • r -二番目のEMA期間、 最初の平滑化結果に適用される (デフォルト r = 5);
    • u -三度目のEMA期間、 二度目の平滑化結果に適用される (デフォルト u = 3);
    • AppliedPrice1 - price type [closing] (by default AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - price type [opening] (by default AppliedPrice=PRICE_OPEN).
  • 追加:
    • 別ウィンドウに表示されます。
    • グラフィカルプロットのレンダリングを変更します。 - 色、濃さ、線種(『色』タブ)。
    • (オプション) 2レベル (デフォルトは -25 と +25) - レベルの追加/削除a;値変更、レベル記述、レベルのレンダリング種変更(『レベル』タブ)
    • 他につのインディケータウィンドウ(『スケール』タブ)の下限(デフォルトで-100)と上限(デフォルトでは100)を変更します。
  • 制約:
    • q>0;
    • r>0, s>0, u>0. r, s または u が 1に等しければ、EMA平滑化は行われません。
    • 価格配列の最小サイズ = (q-1 + r + s + u-3 +1).


4.3. ろうそく足のエルゴディック オシレータ

4.3.1. エルゴディックCMIオシレータ

エルゴディックCMIオシレータの定義

Ergodic_CMI(price1,pric2,q,r,s,u) = CMI(price1,pric2,q,r,s,u)
SignalLine(price1,pric2,q,r,s,u,ul) = EMA( Ergodic_CMI(price1,pric2,q,r,s,u) ,ul)

ここで

  • Ergodic_CMI() - Ergodic - ろうそく足モメンタム指数CMI(price1,price2,q,r,s,u);
  • The SignalLine() -a Signal Line - EMA(ul), エルゴディックに適用されます。;
  • ul - シグナルラインのEMA 期間 - William Blauによると、ul 値はEMAエルゴディックの最後の有意 (>1) に等しい必要があります。

Ergodic_CMI(price1,pric2,q,r,s,u,ul) - エルゴディックCMIオシレータ仕様

  • ファイル名: Blau_Ergodic_CMI.mq5
  • 名前: エルゴディックCMIオシレータ (ろうそく足モメンタム指数に基づく)William Blauによる。
  • 入力パラメータ
    • graphic plot #0 - エルゴディック (ろうそく足モメンタム指数):
      • q - ろうそく足モメンタム期間(デフォルトq = 1);
      • r -最初のEMA期間、 ストキャスティクモメンタムに適用される (デフォルト r = 20);
      • s -二番目のEMA期間、 最初の平滑化結果に適用される (デフォルト r = 5);
      • u -三度目のEMA期間、 二度目の平滑化結果に適用される (デフォルト u = 3);
    • graphic plot #1 - シグナルライン:
      • ul - シグナルライン期間、シグナルラインはエルゴディックに適用される。(デフォルトでは ul = 3);
    • AppliedPrice1 - price type [closing] (by default AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - price type [opening] (by default AppliedPrice=PRICE_OPEN).
  • 追加:
    • 別ウィンドウに表示されます。
    • グラフィカルプロットのレンダリングを変更します。 - 色、濃さ、線種(『色』タブ)。
    • 2レベル (デフォルトは -25 と +25) - レベルの追加/削除;値変更、レベル記述、レベルのレンダリング種変更(『レベル』タブ)
    • 他につのインディケータウィンドウ(『スケール』タブ)の下限(デフォルトで-100)と上限(デフォルトでは100)を変更します。
  • 制約:
    • q>0;
    • r>0, s>0, u>0. r、s、u が1に等しければ、EMAの対応する期間で平滑化は行われません。
    • ul>0. ul = 1なら、シグナルラインとエルゴディックは等しくなります。
    • 価格配列の最小サイズ = (q-1 + r + s + u + ul-4 +1).

エルゴディックCMIオシレータのコード

例としてErgodic_CMI (price1,price2,r,s,u,ul)インディケータを考察していきます。:

1)インディケータ配列、インディケータバッファ、グラフィックプロットの関係:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                  // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);                // Signal Line: EMA(ul), applied to Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,Price1Buffer,INDICATOR_CALCULATIONS);        // price array [close]
   SetIndexBuffer(3,Price2Buffer,INDICATOR_CALCULATIONS);        // price array [open]
   SetIndexBuffer(4,CMtmBuffer,INDICATOR_CALCULATIONS);          // q-period Candlestick Momentum
   SetIndexBuffer(5,EMA_CMtmBuffer,INDICATOR_CALCULATIONS);      // r-period 1st EMA
   SetIndexBuffer(6,DEMA_CMtmBuffer,INDICATOR_CALCULATIONS);     // s-period 2nd EMA
   SetIndexBuffer(7,TEMA_CMtmBuffer,INDICATOR_CALCULATIONS);     // u-period 3rd EMA
   SetIndexBuffer(8,AbsCMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Candlestick Momentum (absolute value)
   SetIndexBuffer(9,EMA_AbsCMtmBuffer,INDICATOR_CALCULATIONS);   // r-period 1st EMA (absolute value)
   SetIndexBuffer(10,DEMA_AbsCMtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute value)
   SetIndexBuffer(11,TEMA_AbsCMtmBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute value)

2)cmtm と |cmtm|計算のアルゴリズム:

//--- calculation of Price1Buffer[] and Price2Buffer[]
   CalculatePriceBuffer(
                        AppliedPrice1,       // applied price [close]
                        rates_total,         // rates total
                        prev_calculated,     // number of bars, calculated at previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        Price1Buffer         // target array
                       );
   CalculatePriceBuffer(AppliedPrice2,rates_total,prev_calculated,Open,High,Low,Close,Price2Buffer);
//--- calculation of cmtm and |cmtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // 
      for(i=0;i<pos;i++)       // 
        {
         CMtmBuffer[i]=0.0;    // zero values
         AbsCMtmBuffer[i]=0.0; //
        }
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // calculation of CMtmBuffer[] and AbsCMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      CMtmBuffer[i]=Price1Buffer[i]-Price2Buffer[i-(q-1)];
      AbsCMtmBuffer[i]=MathAbs(CMtmBuffer[i]);
     }


4.3.2. <a0>エルゴディックCSIオシレータ</a0> (Blau_Ergodic_CSI.mq5)

エルゴディックCSIオシレータは以下のように定義されます。:

Ergodic_CSI(price1,pric2,q,r,s,u) = CSI(price1,pric2,q,r,s,u)
SignalLine(price1,pric2,q,r,s,u,ul) = EMA( Ergodic_CSI(price1,pric2,q,r,s,u) ,ul)

ここで

  • Ergodic_CMI() - Ergodic - ろうそく足モメンタム指数CSI(price1,price2,q,r,s,u;
  • The SignalLine() -シグナルライン - the EMA(ul)、エルゴディックに適用される。
  • ul - シグナルラインのEMA 期間 - William Blauによると、ul 値はEMAエルゴディックの最後のsignificant (>1) に等しい必要がある。


4.3.2.1. Ergodic_CMI(price1,pric2,q,r,s,u,ul) - エルゴディックCMIオシレータ仕様

  • ファイル名: Blau_Ergodic_CSI.mq5
  • 名前: エルゴディックCMIオシレータ (ろうそく足モメンタム指数に基づく)William Blauによる。
  • 入力パラメータ
    • graphic plot #0 - エルゴディック (ろうそく足指数):
      • q - q-期間ろうそく足モメンタムが計算される期間(デフォルトq = 1);
      • r -最初のEMA期間、 q-期間ろうそく足モメンタムに適用されます。 (デフォルト r = 20);
      • r -二番目のEMA期間、 最初の平滑化結果に適用される (デフォルト r = 5);
      • u -三度目のEMA期間、 二度目の平滑化結果に適用される (デフォルト u = 3);
    • graphic plot #1 - シグナルライン:
      • ul - 期間EMAシグナルラインはエルゴディックに適用される。(デフォルトでは ul = 3);
    • AppliedPrice1 - price type [closing] (by default AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - price type [opening] (by default AppliedPrice=PRICE_OPEN).
  • 追加:
    • 別ウィンドウに表示されます。
    • グラフィカルプロットのレンダリングを変更します。 - 色、濃さ、線種(『色』タブ)。
    • 2レベル (デフォルトは -25 と +25) - レベルの追加/削除;値変更、レベル記述、レベルのレンダリング種変更(『レベル』タブ)
    • 他につのインディケータウィンドウ(『スケール』タブ)の下境界(デフォルトで-100)と上境界(デフォルトでは100)を変更します。
  • 制約:
    • q>0;
    • r>0, s>0, u>0. r、s、u が1に等しければ、EMAの対応する期間で平滑化は行われません。
    • ul>0. ul = 1なら、シグナルラインとエルゴディックは等しくなります。
    • 価格配列の最小サイズ = (q-1 + r + s + u + ul-4 +1).


4.3.2.2. エルゴディックCMIオシレータのコード

インディケータT Ergodic_CSI (price1, price2,r,s,u,ul)の例:

1)インディケータ配列、インディケータバッファ、グラフィックプロットの関係:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);               // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);             // Signal Line: EMA(ul), applied to Ergodic
   // buffers, used for intermediate calculations
   SetIndexBuffer(2,Price1Buffer,INDICATOR_CALCULATIONS);     // price array [close]
   SetIndexBuffer(3,Price2Buffer,INDICATOR_CALCULATIONS);     // price arrya [open]
   SetIndexBuffer(4,LLBuffer,INDICATOR_CALCULATIONS);         // lowest prices (q bars)
   SetIndexBuffer(5,HHBuffer,INDICATOR_CALCULATIONS);         // highest prices (q bars)
   SetIndexBuffer(6,CMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Candlestick Momentum
   SetIndexBuffer(7,EMA_CMtmBuffer,INDICATOR_CALCULATIONS);   // r-period 1st EMA
   SetIndexBuffer(8,DEMA_CMtmBuffer,INDICATOR_CALCULATIONS);  // s-period 2nd EMA
   SetIndexBuffer(9,TEMA_CMtmBuffer,INDICATOR_CALCULATIONS);  // u-period 3rd EMA
   SetIndexBuffer(10,HHLLBuffer,INDICATOR_CALCULATIONS);      // price range (q bars)
   SetIndexBuffer(11,EMA_HHLLBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA (price range)
   SetIndexBuffer(12,DEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (price range)
   SetIndexBuffer(13,TEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (price range)

2) cmtm とq-期間価格レンジの計算アルゴリズム:

//--- calculation of Price1Buffer[] and Price2Buffer[]
   CalculatePriceBuffer(
                        AppliedPrice1,       // price type [close]
                        rates_total,         // rates total
                        prev_calculated,     // number of bars, calculated at previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        Price1Buffer         // target array
                       );
   CalculatePriceBuffer(AppliedPrice2,rates_total,prev_calculated,Open,High,Low,Close,Price2Buffer);
//--- calculation of cmtm and price range (q bars)
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // 
      for(i=0;i<pos;i++)       // 
        {
         CMtmBuffer[i]=0.0;    // zero values
         HHLLBuffer[i]=0.0;    //
         LLBuffer[i]=0.0;      //
         HHBuffer[i]=0.0;      //
        }
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // calculation of CMtmBuffer[], HHLLBuffer[], LLBuffer[], HHBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      // CMtmBuffer[] - q-period Candlestick Momentum
      CMtmBuffer[i]=Price1Buffer[i]-Price2Buffer[i-(q-1)];
      // LLBuffer[] - search for the lowest price (q bars)
      // HHBuffer[] - search for the highest price (q bars)
      min=1000000.0;
      max=-1000000.0;
      for(k=i-(q-1);k<=i;k++)
        {
         if(min>Low[k])  min=Low[k];
         if(max<High[k]) max=High[k];
        }
      LLBuffer[i]=min;
      HHBuffer[i]=max;
      // HHLLBuffer[] - Price Range (q bars)
      HHLLBuffer[i]=HHBuffer[i]-LLBuffer[i];
     }


5. 方向性トレンド

考察されるインディケータ(添付を参照ください)

  1. Blau_HLM.mq5- はバーチャルクローズインディケータです。(q-期間がハイ-ローモメンタムを構成するモメンタム、標準化平滑化構成ハイ-ローモメンタム)
  2. Blau_DTI.mq5- 方向性トレンド指数 (標準化平滑化されたq-期間構成ハイ-ローモメンタム));
  3. Blau_Ergodic_DTI.mq5- エルゴディックDTI-オシレータ (方向性トレンド指数に基づく).

図5.1 方向性トレンド指数インディケータ

図5.1 方向性トレンド指数インディケータ


5.1. コンポジットハイ-ローモメンタム

5.1.1. 上昇トレンドと下降トレントのモメンタムの確定

トレンドと判断する際. 高値の値が増えれば、上昇傾向にあります。安値の値が減れば、下降傾向にあります。

モメンタム指数のグループは(1項で述べましたが)高値のモメンタムを計算するのに使用することができます。:

Mtm( price=High, q, r, s, u )
TSI( price=High, q, r, s, u )
Ergodic( price=High, q, r, s, u )

and for the minimum prices:

Mtm( price=Low, q, r, s, u )
TSI( price=Low, q, r, s, u )
Ergodic( price=Low, q, r, s, u )

上昇トレンドのモメンタムまたはハイモメンタム上昇 (HMU) は 現在期間の高値とq-期間の価格レンジの最初の方の高値との差がポジティブな 差を言います。上昇傾向のq-期間モメンタムの値が示すのは、現在期間への高値の成長を価格変動のq-期間レンジの最初の高値と比べた相対的速度です。

上昇トレンドのq-期間ストキャスティクモメンタムの式:

HMU(q) = High - High[q-1], if High - High[q-1] > 0
HMU(q) = 0, if High - High[q-1] <= 0

ここで

  • q - 価格グラフの期間の数値。上昇トレンドモメンタムの計算に使われます。;
  • high - 現在期間で最高値の配列です。
  • High[q–1] - (q-1) 期間前の高値.

下降トレンドモメンタム または ローモメンタム下降 (LMD) - これは現在期間の安値と価格変動のq-期間レンジの初めの安値の の差です。. 下降傾向のq-期間モメンタムの値が示すのは、現在期間への安値の減少を価格変動のq-期間レンジの最初の安値と比べた相対的速度です。

下降トレンドのq-期間ストキャスティクモメンタムの式:

LMD(q) = -(Low - Low[q-1]), if Low - Low[q-1] < 0
LMD(q) = 0, if Low - Low[q-1] >= 0

ここで

  • q - 価格価格チャートの期間の数値。下降トレンドモメンタムの計算に使われます。;
  • high - 現在期間で最小値の配列です。
  • High[q–1] - (q-1) 期間前の安値.

コンポジットハイ―ローモメンタム (ハイ―ロー モメンタム, HLM) - は上昇傾向のq-期間モメンタムと下降傾向のq-期間モメンタムの差です。コンポジット High-Low モメンタムのサインは、価格変動傾向を示します。:正のHLMは価格増加(上昇トレンド)を、負のHLMは価格の減少(下降トレンド)です。

:

HLM(q) = HMU(q) - LMD(q)

ここで

  • q - 価格グラフの期間の数値。上昇ト、下降レンドモメンタムの計算に使われます。;
  • HMU(q) - 期間qにたいして上昇トレンドのモメンタム;
  • HMU(q) - 期間qにたいして下降トレンドのモメンタム;

The 平滑化されたq-期間コンポジッドHigh-Lowモメンタムの式(バーチャルクローズ):

HLM(q,r,s,u) = EMA(EMA(EMA( HLM(q) ,r),s),u) = EMA(EMA(EMA( HMU(q)-HMD(q) ,r),s),u)

ここで

  • q - 価格グラフの期間の数値。上昇ト、下降レンドモメンタムの計算に使われます。;
  • HMU(q) - 期間qにたいして上昇トレンドのモメンタム;
  • HMU(q) - 期間qにたいして下降トレンドのモメンタム;
  • HLM(q) = HMU(q)-LMD(q) - q-期間コンポジッドHigh-Lowモメンタム;
  • EMA (HLM (q), r)- 最初の平滑化 - EMA(r), q-期間コンポジッドHigh-Lowモメンタムに適用される
  • EMA (EMA(..., r),s) - 二度目の平滑化 - EMA(s), 最初の平滑化結果に適用される
  • EMA (EMA (EMA (..., r), s), u)- 三度目の平滑化 - EMA(u), 二度目の平滑化結果に適用される。

最大、最高モメンタムの複合体が集積されたグラフの曲線は バーチャルクローズと呼ばれます。


5.1.2. HLM(q,r,s,u) - バーチャルクローズインディケータ仕様

  • ファイル名: Blau_HLM.mq5
  • 名前: バーチャルクローズインディケータ (q-期間コンポジッドHigh-Lowモメンタム) William Blauによる.
  • 入力パラメータ
    • q - モHLMが計算される期間(デフォルトq = 2);
    • r -最初のEMA期間、 HLMに適用される (デフォルト r = 20);
    • r -二番目のEMA期間、 最初の平滑化結果に適用される (デフォルト r = 5);
    • u -三度目のEMA期間、 二度目の平滑化結果に適用される (デフォルト u = 3);
  • 追加:
    • 別ウィンドウに表示されます。
    • グラフィカルプロットのレンダリングを変更します。 - 色、濃さ、線種(『色』タブ)。
  • 制約:
    • q>0;
    • r>0, s>0, u>0. r、s、u が1に等しければ、EMAの対応する期間で平滑化は行われません。
    • 価格配列の最小サイズ = (q-1 + r + s + u-3 +1).


5.2. 方向性トレンド指数

5.2.1. 方向性トレンド指数の定義

方向性トレンド指数 (方向性トレンド指数、DTI)- は標準化されたq-期間コンポジッドHigh-Lowモメンタム標準化平滑化されたHLM))です。(;平滑化されたHLMの値はパーセンテージで表されます。(マッピングインターバル[-100, 100])

平滑化されたHLM各値は、絶対数として取得される平滑化されたHLMによって標準化されます。;この標準化により DTIの値がマーケットの買いすぎ(正の値)または売りすぎ(負の値)の程度と解釈できるのです。

方向性トレンド指数の式

100 * EMA(EMA(EMA( HLM(q) ,r),s),u)          100 * HLM(q,r,s,u)
DTI(q,r,s,u) = –––––––––––––––––––––––––---––––––– = ––––––––––––––--–––––––––––––––
                 EMA(EMA(EMA( |HLM(q)| ,r),s),u)     EMA(EMA(EMA( |HLM(q)| ,r),s),u)
if EMA(EMA(EMA(|HLM(q)|,r),s),u)=0, then DTI(price,q,r,s,u)=0

ここで

  • q - 価格グラフの期間の数値。上昇ト、下降レンドモメンタムの計算に使われます。;
  • HLM(q) = HMU(q)-LMD(q) - 最大および最小について合成のq-期間モメンタム ;
  • | Mtm (price, q) | - HLM(q)の絶対値
  • TStoch(price,q,r,s,u) - 三度平滑化したHLM(q);
  • EMA (..., r) - 最初の平滑化 - EMA(r)、次に適用されます。
    :1) HLM (q)
    HLM(q)の絶対値
  • EMA (EMA(..., r),s) - 二度目の平滑化 - EMA(s), 最初の平滑化結果に適用される
  • EMA (mtm (price, q), r) - 二番目の平滑化 - EMA(u), 二度目の平滑化結果に適用される

5.2.2. DTI(q,r,s,u) - 方向性トレンド指数. 仕様

  • ファイル名: Blau_DTI.mq5
  • 名前 方向性トレンド指数(標準化平滑化 q-期間コンポジッドHigh-Lowモメンタム)William Blauによる
  • 入力パラメータ
    • q - モHLMが計算される期間(デフォルトq = 2);
    • r -最初のEMA期間、 HLMに適用される (デフォルト r = 20);
    • r -二番目のEMA期間、 最初の平滑化結果に適用される (デフォルト r = 5);
    • u -三度目のEMA期間、 二度目の平滑化結果に適用される (デフォルト u = 3);
  • 追加:
    • 別ウィンドウに表示されます。
    • グラフィカルプロットのレンダリングを変更します。 - 色、濃さ、線種(『色』タブ)。
    • (オプション) 2レベル (デフォルトは -25 と +25) - レベルの追加/削除a;値変更、レベル記述、レベルのレンダリング種変更(『レベル』タブ)
    • 他につのインディケータウィンドウ(『スケール』タブ)の下限(デフォルトで-100)と上限(デフォルトでは100)を変更します。
  • 制約:
    • q>0;
    • r>0, s>0, u>0. r、s、u が1に等しければ、EMAの対応する期間で平滑化は行われません。
    • 価格配列の最小サイズ = (q-1 + r + s + u-3 +1).


5.3. エルゴディックDTI オシレータ

5.3.1. エルゴディックDTIオシレータの定義

Ergodic_DTI(q,r,s,u) = DTI(q,r,s,u)
SignalLine(q,r,s,u,ul) = EMA( Ergodic_DTI(q,r,s,u) ,ul)

ここで

  • Ergodic_DTI() - Ergodic - 方向性トレンド指数 DTI(q,r,s,u);
  • The SignalLine() - シグナルライン - 期間 ulの指数移動平均, エルゴディックに適用されます。
  • ul - シグナルラインのEMA 期間 - William Blauによると、ul 値はEMAエルゴディックの最後のsignificant (>1) に等しい必要がある。

5.3.2. Ergodic_DTI(q,r,s,u,ul) - Ergodic DTI-oscillator. 仕様

  • ファイル名: Blau_Ergodic_DTI.mq5
  • エルゴディックDTI-オシレータ (方向性トレンド指数に基づく)William Blauによる
  • 入力パラメータ
    • graphic plot #0 - ergodic (方向性トレンドのインデックス):
      • q - モHLMが計算される期間(デフォルトq = 2);
      • r -最初のEMA期間、 HLMに適用される (デフォルト r = 20);
      • s -二番目のEMA期間、 最初の平滑化結果に適用される (デフォルト s = 5);
      • u -三度目のEMA期間、 二度目の平滑化結果に適用される (デフォルト u = 3);
    • graphic construction #1 - シグナルライン:
      • ul - 期間EMAシグナルラインはエルゴディックに適用される。(デフォルトでは ul = 3);
  • 追加:
    • 別ウィンドウに表示されます。
    • グラフィカルプロットのレンダリングを変更します。 - 色、濃さ、線種(『色』タブ)。
    • 2レベル (デフォルトは -25 と +25) - レベルの追加/削除;値変更、レベル記述、レベルのレンダリング種変更(『レベル』タブ)
    • 他につのインディケータウィンドウ(『スケール』タブ)の下限(デフォルトで-100)と上限(デフォルトでは100)を変更します。
  • 制約:
    • q>0;
    • r>0, s>0, u>0. r, s または u が 1に等しければ、EMA平滑化は行われません。
    • ul>0. ul = 1なら、シグナルラインとエルゴディックは等しくなります。
    • 価格配列の最小サイズ = (q-1 + r + s + u + ul-4 +1).


5.4. エルゴディックDTIオシレータ

Ergodic_DTI (q,r,s,u,ul) インディケータ

1)インディケータ配列、インディケータバッファ、グラフィックプロットの関係:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                 // Ergodic Line
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);               // Signal Line: EMA(ul), applied to Ergodic
   // buffers, used for intermediate calculations
   SetIndexBuffer(2,HMUBuffer,INDICATOR_CALCULATIONS);          // q-period Up Trend Momentum
   SetIndexBuffer(3,LMDBuffer,INDICATOR_CALCULATIONS);          // q-period Down Trend Momentum
   SetIndexBuffer(4,HLMBuffer,INDICATOR_CALCULATIONS);          // Composite q-period High/Low Momentum
   SetIndexBuffer(5,EMA_HLMBuffer,INDICATOR_CALCULATIONS);      // r-period 1st EMA
   SetIndexBuffer(6,DEMA_HLMBuffer,INDICATOR_CALCULATIONS);     // s-period 2nd EMA
   SetIndexBuffer(7,TEMA_HLMBuffer,INDICATOR_CALCULATIONS);     // u-period 3rd EMA
   SetIndexBuffer(8,AbsHLMBuffer,INDICATOR_CALCULATIONS);       // Composite q-period High/Low Momentum (absolute values)
   SetIndexBuffer(9,EMA_AbsHLMBuffer,INDICATOR_CALCULATIONS);   // r-period 1st EMA (absolute values)
   SetIndexBuffer(10,DEMA_AbsHLMBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute values)
   SetIndexBuffer(11,TEMA_AbsHLMBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute values)

2)HLM と |HML|計算のアルゴリズム:

//--- calculation of HLM and |HLM|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // 
      for(i=0;i<pos;i++)       // 
        {
         HLMBuffer[i]=0.0;     // zero values
         AbsHLMBuffer[i]=0.0;  //
         HMUBuffer[i]=0.0;     //
         LMDBuffer[i]=0.0;     //
        }
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // calculation of HLMBuffer[], AbsHLMBuffer[], HMUBuffer[], LMDBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      HMUBuffer[i]=High[i]-High[i-(q-1)];    HMUBuffer[i]=(HMUBuffer[i]>0)?HMUBuffer[i]:0;
      LMDBuffer[i]=-1*(Low[i]-Low[i-(q-1)]); LMDBuffer[i]=(LMDBuffer[i]>0)?LMDBuffer[i]:0;
      HLMBuffer[i]=HMUBuffer[i]-LMDBuffer[i];
      AbsHLMBuffer[i]=MathAbs(HLMBuffer[i]);
     }


おわりに

本稿の最初のパートはWilliam BlauのインディケータとMQL5のトレーディングシステム パート1: インディケータWilliam Blau著 "Momentum, Direction, and Divergence" からMQL5で作成されたインディケータとオシレータについて述べました。

"William Blau's Indicators and Trading Systems in MQL5.の2番目の項目でトレーディング決断が必要なときの これらインディケータとオシレータの使用について述べられます。パート2: トレーディングシステム".

単プ資料の内容です。 ("Blau_Indicators_MQL5_en.zip"):

ファイル 内容
インクルードされているファイルロケーション: "terminal_data_folder\MQL5\Include"
WilliamBlau.mqh
インディケータ. Location: "terminal_data_folder\MQL5\Indicators"

モメンタムに基づくインディケータ
Blau_Mtm.mq5 The Momentum Indicator (q-period momentum, smoothed q-period momentum)
Blau_TSI.mq5 The True Strength Index (Normalized smoothed q-period momentum)
Blau_Ergodic.mq5 Ergodic Oscillator (based on the true strength index)

Indicators, based on the Stochastic
Blau_TStoch.mq5 Stochastic (q-period stochastic, smoothed q-period Stochastic)
Blau_TStochI.mq5 Stochastic index (normalized smoothed q-period Stochastic)
Blau_TS_Stochastic.mq5 Stochastic TS-oscillator (based on the Stochastic Index)

ストキャスティックモメンタムに基づく指数
Blau_SM.mq5 Stochastic Momentum (q-period Stochastic Momentum, smoothed q-period Stochastic Momentum)
Blau_SMI.mq5 Stochastic Momentum Index (Smoothed normalized q-stochastic momentum RSI)
Blau_SM_Stochastic.mq5 Stochastic SM-Oscillator (based on the Stochastic Momentum Index)

Indicators, based on a deviation from the market trend
Blau_MDI.mq5 Mean Deviation Indicator (Mean Deviation, smoothed mean deviation)
Blau_Ergodic_MDI.mq5 Ergodic MDI-oscillator (based on the Mean Deviation indicator)

移動平均収束/拡散に基づくインディケータ
Blau_MACD.mq5 Indicator of the convergence/divergence of the moving averages (MACD; smoothed MACD)
Blau_Ergodic_MACD.mq5 Ergodic MACD-oscillator (based on the MACD indicator)

ろうそく足モメンタムに基づくインディケータ
Blau_CMtm.mq5 Candlestick Momentum Indicator (q-period Candlestick Momentum, smoothed q-period Candlestick Momentum)
Blau_CMI.mq5 Candlestick Momentum Index (normalized smoothed q-period Candlestick Momentum; normalized by the absolute value of the q-period Candlestick Momentum)
Blau_CSI.mq5 The Candlestick Index (normalized smoothed q-period Candlestick Momentum; normalization by the length of the q-period candlestick)
Blau_Ergodic_CMI.mq5 Ergodic CMI-oscillator (based on the Candlestick Momentum Index)
Blau_Ergodic_CSI.mq5 Ergodic CSI-oscillator (based on the Candlestick Index)

コンポジットモメンタムに基づくインディケータ
Blau_HLM.mq5 Indicator of Virtual Close (q-period Composite High-Low Momentum; the smoothed q-period Composite High-Low Momentum)
Blau_DTI.mq5 Index of a directional trend (normalized smoothed q-period Composite High-Low Momentum)
Blau_Ergodic_DTI.mq5 Ergodic DTI-oscillator (based on the Directional Trend Index)

MetaQuotes Software Corp.によってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/190

添付されたファイル |
Meta Trader5がもたらす新たな機会 Meta Trader5がもたらす新たな機会
Meta Trader4は世界中のトレーダーから好評を博し、これ以上に望むものはないように思われていました。高い処理速度、安定性、インディケータ記述の広大な可能性、エキスパートアドバイザー、情報提供型トレーディングシステム、そして100以上の異なるブローカーから選択できることにより-このターミナルは他に類を見ないほどに優れたものでした。しかし時は流れ、今や、Meta Trader4かMeta Trader5かの選択を迫られる時代となりました。本稿では、時代が求めるこの第5世代ターミナルの主な違いについて述べます。
スペクトラム分析の構築 スペクトラム分析の構築
本稿は、MQL5言語のグラフィカルオブジェクト使用が可能なバリアントを知っていただくのが目的です。それはグラフィカルオブジェクトを使用し、シンプルなスペクトラム分析を管理するパネルの実装を行うインディケータを分析します。読者のみなさんには本稿をとおしてMQL5の基本を知っていただきたいと思います。
MQL5でトレンドを見つけるいくつかの方法 MQL5でトレンドを見つけるいくつかの方法
あらゆるトレーダーが、所定の時点におけるトレンドを正確に見つけるための多くの機会を提供することができます。これはおそらく、誰もが探している聖杯です。本稿では、トレンドを見つけるいくつかの方法を検討していきます。それはより正確に言えば-MQL5を用いてトレンドを見つけるいくつかの伝統的な方法をプログラムする方法、です。
追加バッファなしの中間計算用物価系列の平均化 追加バッファなしの中間計算用物価系列の平均化
本稿は、もっともシンプルでシングルタイプのクラスに搭載された、従来のまた独自の平均化アルゴリズムを数々取り上げます。それらはほとんどすべてといってよいほどインディケータの開発に汎用的に使用されます。提案するクラスが、カスタムインディケータおよびテクニカルインディケータの「大量」呼び出しに対する有効な代替手段になればよいと思っています。