CCI指標:3つの変換ステップ
前回は、従来のコモディティチャネルインデックスの指標の変化の可能性について考えてみました。これらは計算方法に関するもので、この指標の本質に影響を与えるものではありません。今回は、その計算ロジックを修正することで、少し違った観点で指標の変更を考えてみます。これらの変更が指標の結果にどのような影響を与えるか見てみましょう。もちろん、実装した変更の妥当性については評価するようにします。
ステップ1
CCIはシンプルで直感的な計算に基づいています。まず、現在値と平均値の差を算出します。この差を標準偏差で割ります。つまり、サンプル標準偏差と比較して、サンプル平均値との差が何倍かを評価します。
すべてシンプルでわかりやすくなっていますが、誤った判断をしてしまう原因となる欠点もあります。「2, 1, 1」と「21, 11, 1」の2つの順序を例にとって考えてみましょう。この順序を取引の言葉に置き換えると、1つ目は横ばい、2つ目は明確で強いトレンドということになります。
この2つの順序のうち、どちらの方がCCI値が高くなるでしょうか。直感で答えて答えを正当化するようにしましょう。とりあえず、必要な計算をしてみます。
最初の順序
2番目の順序
見ての通り、どちらの順序でも同じ結果が得られました。主な理由は、標準偏差を使用しているということです。最初の順序では、現在値と平均値の差は小さくなりますが、標準偏差も小さくなります。2番目の順序では、差が大きくなっているが、標準偏差も大きくなっています。そのため、2つの異種順序が同じ結果になったのです。
トレーダーにテクニカル指標に求める条件を尋ねると、「ユニークな状況がユニークな指標値を生み出すこと」こと」」と答える人がほとんどでしょう。CCIに関しては、そんな願いを叶えることができるのでしょうか。答えはここにあります。しかし、そのためには、割り算を捨て、掛け算に置き換える必要があります。そうすると、指標の計算式は次のようになります。
このような変更により、差と標準偏差の両方が大きければ、トレンドのある値動きを十分に強調することができるようになりました。ただし、この方法には一長一短があります。指標値の範囲やそのレベルを(おおよそでも)推定できないことです。ただし、この欠点は簡単に克服することができます。どのような値をどのくらいの頻度で取得するかは、指標自身が計算するようにします。そのようなデータを集めた上で、指標レベルを設定します。ゼロからわずかにずれた指標値がより頻繁に発生するようになります。数値が大きいほど発生頻度が低くなります。指標値を発生頻度で区切ることで、指標レベルを設定することができるようになります。指標の正の値と負の値では、統計値が異なる場合があることを考慮しましょう。そこで、正のレベルと負のレベルのデータを別々に集めましょう。
レベルの値そのものは、パーセンテージで設定するのが最も便利です。例えば、レベルが70に等しい場合、これはまさにレベルとゼロ線の間に位置する指標値の割合となります。レベルを超えるのは、3割の値だけです。
レベルの算出は、以下のように進めていきます。指標の値を格納するための配列を2つ作ってみましょう(正負を分離)。
int array_dn[], // array for storing positive values array_up[], // array for storing negative values size_dn=0,size_up=0;// array sizes
配列のサイズを設定しましょう。
ArrayResize(array_up,size_up,rates_total); ArrayResize(array_dn,size_dn,rates_total);
過去のデータが入手可能になった時点で、得られた結果を設定します。なお、負の値に対しては、配列に正の数を設定します。これは、その後の取り扱いの便宜を図るためです。
if(cci>0) { ArrayResize(array_up,size_up+1); array_up[size_up]=(int)MathRound(cci/_Point); size_up++; } if(cci<0) { ArrayResize(array_dn,size_dn+1); array_dn[size_dn]=(int)MathRound(-cci/_Point); size_dn++; }
ゼロバーを開く前に、まずこれらの配列を並び替える必要があります。そして,配列の要素のインデックスを求めます。 これらのセルにはレベル値が入ります。負の値の場合は、マイナス記号を返すことを忘れてはいけません。
ArraySort(array_up); IndicatorSetDouble(INDICATOR_LEVELVALUE,0,array_up[size_up*level/100]*_Point); ArraySort(array_dn); IndicatorSetDouble(INDICATOR_LEVELVALUE,1,-array_dn[size_dn*level/100]*_Point);
では、新しい指標を見てみましょう。
このように、どの計算方法でも同じような結果が得られています。主な違いは、レベルの数値です。興味深いことに、すべての選択肢の正と負の値のレベルが互いに異なっています。つまり、物価の上昇と下降は指標的には対称ではなく、統計の別集計という想定は正しかったことが判明したのです。
しかし、この新しい指標を従来のCCIと比較すると、さらに興味深いことがわかります。ここでは、指標がかなり似通っている部分に出会うことができます。
また、指標が異なる挙動を示す部分もあります。この違いは、指標となる線の交差とそのレベルに注目すると特に顕著になります。
では、新しい指標を実際にテストしてみましょう。EAを開発し、そのシグナルで取引します。指標レベルは変化する可能性があるため、ポジションを建てる際のルールを以下のように設定します。買いポジションは、指標の現在値が負のレベルを下回り、かつ指標の前回値が現在値を下回ると建てられます。売りポジションは、指標の現在値が正を上回り、かつ前回値が今回値を上回った場合に建てられます。あるタイプのポジションを建てると、反対側のポジションがすべて決済されます。
テストパラメータはEURUSD H1、2021.01.01~2021.12.31です。
各テストの主な結果は、表のとおりです。
TypeInd | 総純利益 | 粗利益 | 総損失 | 取引総額 |
---|---|---|---|---|
クラシカル | 248.21 | 1 361.74 | -1 113.53 | 823 |
正方形 | -304.83 | 2 993.08 | -3 297.91 | 3581 |
モダン | -567.15 | 2 540.88 | -3 108.03 | 3251 |
興味深いことに、標準偏差を計算する古典的な方法では、すぐに肯定的な結果が得られました。直近の2つのオプションでは、取引件数が大幅に増加しました。これは、指標のトリガーレベルを上げる必要があることを示しているのかもしれません。そうすれば、取引回数が減り、もしかしたら効率も上がるかもしれません。クラシック版のバランス曲線の例を以下に示します。
ステップ2
これまでは、標準偏差を使って指標を算出していました。標準偏差を使用して値を正規化することは、値の分布が正規の法則に従う場合にのみ正当化されます。CCIの場合、初期データは価格と平均の差です。実際にどのように配布されているのか見てみましょう。
得られた結果の特徴を強調するために、サンプルサイズを小さくし、そこからゼロ値を取り除きました。ご覧のように、グラフはかなり特殊なものになり、およそ正規分布のグラフには見えません。
差が何らかの経験則に従って分布しているのであれば、標準偏差を放棄することも可能です。そうすると、この指標はCCIの半分になります。
その結果どのようなことが起こるのかを考えてみましょう。明らかに、平滑化しなければ、指標値の広がりはかなり大きくなり、どこか異常な印象を与えるでしょう。また、大きな値動きがあると、指標の視覚的な印象に影響を与えることがあります。ただし、これらの欠点は、ある大きな利点を凌駕することはできません。
CCI指標の値を算出する際には、単純平均を使用します。これはよく知られた式ですが、それでもここで示しておきます。
この処方の背景には何があるのでしょうか。これは、算術平均、確率変数の数学的期待値、長方形のウィンドウとすることができます。最後の選択肢に注目しましょう。なぜ長方形のウィンドウなのでしょう。結局のところ、他にも応用できるウィンドウ関数があるのです。
私は、独自の名前を持つウィンドウ関数を50個ほど知っています。正式名称のないウィンドウ関数はもっと多くなります。
実験では、長方形のウィンドウ、三角形のウィンドウ、フラットトップのウィンドウを取り上げます。最後のウィンドウ関数は、重みのいくつかが負の値になっている珍しいものです。また、線形、累乗、指数関数的の3つの非対称なウィンドウを用意しましょう。線形および指数関数的な重みによる平均は、MetaTraderの「移動平均」メニューで利用できます。
すべてのオプションの概観を図に示します(最下段の指標は古典的なCCIです)。
すべてのオプションは非常によく似ていますが、そのレベルはかなり異なります。使用するウィンドウ関数にもよりますが、遅れているものもあり、比較的大きな指標値が頻繁に発生する場合もあります。他のウィンドウ関数は価格に追従し、結果として小さな偏差が多くなります。
また、念のため、指標に2つの平滑化オプションを追加します。これらは計算の本質を変えるものではありませんが、視覚的に指標をより魅力的にすることができます。
このhCCI指標をテストするために、別のEAを開発してみましょう。ポジションを建てる/決済するシグナルは、前のEAと全く同じになります。テストパラメータとその間隔も前の場合と同じです。
主なテスト結果は表のとおりです。
ウィンドウ | 総純利益 | 粗利益 | 総損失 | 取引総額 |
---|---|---|---|---|
長方形 | 224.57 | 1 745.03 | -1 520.46 | 726 |
三角形 | 94.17 | 1 532.10 | -1 437.93 | 696 |
フラットトップ | 236.54 | 1 354.67 | -1 118.13 | 643 |
LWMA | 243.62 | 1 444.48 | -1 200.86 | 639 |
累乗 | 44.57 | 1 175.79 | -1 131.22 | 561 |
指数 | -317.41 | 725.11 | -1 042.52 | 359 |
すべてのウィンドウ関数の中で、指数ウィンドウだけが負の結果をもたらしました。これは、それが取引に適さないということではありません。つまり、そのパラメータを細かく調整する必要があるのです。また、ポジションを決済する際のルールも改善されるべきです(すべてのEAバージョンに適用されます)。図は、LWMAウィンドウ関数によるEAのバランス曲線を示しています。
ステップ3
これまで、CCI指標をオシレーターとして考えてきましたが、メインチャートに移動して、その上でどのように表示されるかを見てみるのも面白いかもしれません。どうすれば実現できるのかを見ていきましょう。
ほとんどのオシレーターは、メインシグナルを抑制し、微妙な値動きを強調するという単純な原理に基づいています。したがって、この指標をメインチャートに移すには、その値に参照シグナルを追加する必要があります。CCIの場合、現在の価格または平均値をシグナルとして使用することができます。そうすると、指標値の計算式は以下のようになります。
どちらの選択肢も不安定です。値が価格線から大きく乖離することがあります。ただし、この欠点は、両指標がトレンドの値動きをうまく強調できるという事実によって補われます。
結論
今回紹介した指標は、古典的なCCI指標に定められた原則を発展させたものです。新しい指標の確かなメリットは、トレーダーの選択でそれらをカスタマイズすることができることです。
指標パラメータは次の通りです。
pCCI指標
- TypeInd – 指標値の計算方法を設定
- iPeriod - 指標期間,最小値 2
- iLevel - 指標レベルの値,有効値1〜99
hCCI指標
- Window – 使用するウィンドウ関数の種類
- Smoothing – 適用する平滑化
- iPeriod - 指標期間,最小値 2
- iLevel - 指標レベルの値,有効値1〜99
lCCI指標
- Window – 使用するウィンドウ関数の種類
- Direct – 参照シグナルの種類
- iPeriod – 指標期間,最小値 2
差分配信スクリプト
- Length – 移動平均期間
- Level – サンプルの最大値
- ViewDuration – 表示期間
- ScreenShot – 有効な場合、チャートをFilesフォルダに保存
EA pCCI
パラメータはすべてpCCI指標と同じです。 新しいバーが開かれたときに、ポジションの建てる/決済するシグナルが発生します。
EA hCCI
主な設定項目は、hCCI指標と同じです。
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/8860
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索