English Русский 中文 Español Deutsch Português 한국어 Français Italiano Türkçe
preview
CCI指標:アップグレードと新機能

CCI指標:アップグレードと新機能

MetaTrader 5 | 25 10月 2022, 08:50
223 0
Aleksej Poljakov
Aleksej Poljakov

簡単な歴史

コモディティチャネルインデックス(CCI)は、すべてのトレーダーになじみのあるものです。これはドナルド・ランバートによって開発され、1980年にCommodities誌(現在のModernTrader)に最初に掲載されました。 それ以来、この指標は受けるに値する名声を得て、トレーダーの間で非常に人気が高まっています.それは MetaTrader取引プラットフォームツールキットに存在し、手動取引と自動取引システムの両方で使用されます。


計算アルゴリズム

指標の計算は非常に単純明快です。この指標は、平均絶対偏差に関連して価格が平均値からどれだけ逸脱したかを示します。計算アルゴリズムは次のように表すことができます。指標期間をN価格読み取り値とします。この場合、次のようになります。

  • 2-TRを計算します 

平均

  • 平均絶対偏差を求めます

MAD

  • 指標値を計算します

CCI

元の指標では、補正係数k=0.015です。これは、1.5*MADの価格偏差が100指標単位に等しくなるように選択されます。この場合、3*MADによる偏差は200単位です(興味深いことに、除算を乗算に置き換えると、正規化係数kの値は66.6になります)。


可能なアルゴリズムの変更

この指標の注目すべき特徴は、平均絶対偏差の使用です。このアプローチは、コンピュータ技術の黎明期には完全に正当化されました。これは、絶対偏差の計算に必要な計算リソースが、より適切な標準偏差の計算に比べて少なくて済むためです。最新のコンピュータでは、妥当な時間内にsquaringとrootingを処理できます。したがって、アルゴリズムの計算アルゴリズムは次のようになります。

  • 数値の合計を求めます

sumS

  • 二乗和を求めます。

sumQ

  • 指標値を計算します。

CCI

このようなアルゴリズムはより正確ですが、完全ではありません。主な問題は、平均値と二乗平均平方根の値を見積もるには、十分な数の価格読み取り値(30以上)が必要になることです。ただし、短期間でも取引に使用できます。たとえば、CCIの従来のバージョンでは、14サンプルの期間が推奨されます。

このような状況では、堅牢な統計手法が必要です。それらは、非常に極端な状況でもかなり安定した信頼性の高いパラメーター推定値を取得することを可能にします。これは金融市場で非常に豊富です。

堅牢な方法がどのように機能するかを見て、従来の方法と比較してみましょう。例として、p[0]=1、p[1]=3、p[2]=8の3つの値の時系列を考えてみましょう。

古典的なアプローチは次の計算に縮小されます。

  • 平均:(1 + 3 + 8) / 3 = 4
  • 絶対偏差:(abs(1 – 4) + abs(3 – 4) + abs(8 – 4)) /3 = 2.67
  • チャネルの下限と上限:1.33 – 6.67 

次に、標準偏差を使用して計算してみましょう。

  • 平均:(1 + 3 + 8) / 3 = 4
  • 標準偏差:sqrt(((1 – 4)^2 + (3 – 4)^2 + (8 – 4)^2) / 3) = 2.94
  • チャネルの下限と上限:1.06 – 6.94

堅牢な見積もりの計算コストは高くなります。Theil-Sen法を使用して平均を推定してみましょう。これには、最初にペアで取得された時系列値のすべての半和を見つける必要があります。これらのペアの数は、数式「num=(N*(N-1)) / 2」を使用して取得できます。

この場合、安定した平均は、これらの半和の中央値に等しくなります。中央値を見つけるには、まず配列を昇順に並べ替えます。中央値は配列の中央の値に対応します。中央値を見つけるには、配列のサイズが奇数の場合は中央の要素のインデックスが必要です。配列のサイズが偶数の場合は中央の2つの要素のインデックスが必要で、その場合、中央値はこれら2つの要素の平均に等しくなります。

インデックスを計算する式(「size」は配列内の要素の数))は次の通りです。

  • 奇数サイズ

Index = size / 2

  • 偶数サイズ

Index1 = size / 2 – 1、Index2 = size / 2

この例の場合、これは次のようになります。

hs1 = (1 + 3) / 2 = 2

hs2 = (1 + 8) / 2 = 4.5

hs3 = (3 + 8) / 2 = 5.5

2、4.5、5.5を並び替えます。

  • Mean = 4.5

次に、偏差値に移りましょう。元の時系列の絶対値とその平均値の間の中央値を見つける必要があります。

d1 = abs(1 – 4,5) = 3.5

d2 = abs(3 – 4,5) = 1.5

d3 = abs(8 – 4,5) = 3.5

3.5、1.5、3.5を並び替えます。

  • Deviation = 3.5
  • チャンネルの下限と上限:1 – 8


クラシック指標とアップグレードされた指標のバージョンの比較

これらのアプローチを比較してみましょう。通常の計算では、時系列の最小値と最大値が平均+/-偏差を超えていました。堅牢な推定の場合、元の系列のすべての値がこれらの境界に収まります。3つのアプローチの違いは明らかですが、この例だけです。次に、さまざまな計算方法が実際のデータでどのように動作するかを見てみましょう。3つのアルゴリズムすべてを個別の指標として実装しましょう。これにより、各オプションを計算する機能についても知ることができます。

指標の外観は、適用される価格定数とその期間という2つの変数に大きく依存します。MQL5では、指標プロパティを定義するときに価格定数を設定できます。

#property indicator_applied_price PRICE_TYPICAL

MQL4では、別の関数を使用します。

指標期間は、計算で使用される価格の読み取り回数を示します。

input ushort iPeriod=14;//indicator period

変数値は少なくとも3である必要があります。期間が短いと、誤った(大きすぎる)値が取得される可能性があります。

i番目ごとのバーのクラシックCCIバージョンの計算は、次のように実行されます。まず、標本平均の値を見つけます。

double mean=0;                //sample mean
for(int j=0; j<iPeriod; j++)
   {
    mean=mean+price[i+j];     //sum up price values
   }
mean=mean/iPeriod;            //sample mean for the period

次に平均絶対偏差を計算します。

double mad=0;                          //mean absolute deviation
for(int j=0; j<iPeriod; j++)
   {
    mad=mad+MathAbs(price[i+j]-mean);  //sum up absolute difference values
   }

平均絶対偏差の値が0より大きい場合、指標は次のようになります。

res=(price[i]-mean)*iPeriod/mad;

標準偏差を使用した指標バージョンは次のように計算されます。まず、価格の合計とその2乗を求めます。

double sumS=0,//sum of prices
       sumQ=0;//sum of price squares
for(int j=0; j<iPeriod; j++)
   {
    sumS=sumS+price[i+j];
    sumQ=sumQ+price[i+j]*price[i+j];
   }

次に、指標の計算に必要な分母を見つけます。

double denom=MathSqrt(iPeriod*sumQ-sumS*sumS);

分母が0より大きい場合、結果は次のようになります。

res=(iPeriod*price[i]-sumS)/denom;

最後に、堅牢な方法を使用した計算について考えてみましょう。まず、中間結果を格納するための2つの配列を準備します。1つの配列は半和の値を格納するためのもので、もう1つの配列は絶対差を格納するためのものです。

double halfsums[],diff[];

まず、さらに使用するためのhalfsums配列を準備します。これには、そのサイズを定義しましょう。

int size=iPeriod*(iPeriod-1)/2; //halfsums array size
ArrayResize(halfsums,size);     //set the array size

次に、配列の中心要素のインデックスを見つけてみましょう。汎用性のために、2つのインデックスを使用します。これらのインデックスは、サイズが奇数の場合は同じですが、偶数の場合は異なります。

indx10=size/2;
indx11=indx10;
if(MathMod(size,2)==0)
   indx11=indx10-1;

その後、diff配列を準備します。そのサイズは指標期間と一致します。要素のインデックスは、前の場合と同じです。

ArrayResize(diff,iPeriod);
indx20=iPeriod/2;
indx21=indx20;
if(MathMod(iPeriod,2)==0)
   indx21=indx20-1;

ここで、指標値の計算を開始します。配列を半和で埋めるには、追加のカウンタが必要です。

int cnt=0; //counter of array elements
for(int j=iPeriod-2; j>=0; j--)
   {
    for(int k=iPeriod-1; k>j; k--)
       {
        halfsums[cnt]=(price[i+j]+price[i+k])/2; //half sum value
        cnt++;                                   //increase the counter
       }
   }

配列を埋めた後、並び替える必要があります。配列の中心からの値を平均の推定値として使用します。

ArraySort(halfsums);                               //sort the array
double mean=(halfsums[indx10]+halfsums[indx11])/2; //robust mean

次の段階で、標準偏差の堅牢な推定値を見つけます。

for(int j=0; j<iPeriod; j++)
   {
    diff[j]=MathAbs(price[i+j]-mean);
   }
    
ArraySort(diff);
double sd=(diff[indx20]+diff[indx21])/2; //robust standard deviation

標準偏差が0より大きい場合、指標値は次のようになります。

res=(price[i]-mean)/sd;

これで、指標の異なるバージョンの動作を比較できます。場合によっては、指標は非常に似たものになります。


ただし、違いが顕著に表れる部分もあります。



指標を比較するための小さなエキスパートアドバイザー(EA)

視覚的な比較は主観的なものであり、誤った結論につながる可能性があります。結論を出すには、より信頼できる根拠が必要です。すべての指標バージョンを評価するために、簡単なEAを書きましょう。ポジションのオープンとクローズに同じルールを割り当てて、結果を比較します。特定のレベルを超えると、一方向ではポジションが開き、反対方向ではポジションが閉じる(存在する場合)というルールを使用します。

EAパラメータ

  • TypeInd - 指標の種類(Classical、Square、Modern)
  • iPeriod - 指標の期間
  • iPrice - 指標の価格
  • Level - 交差を追跡するレベル(値150は、従来のCCIのレベル100に相当)

テストを高速化するために、指標計算アルゴリズムがEA内に移動されました。指標値は、新しいバーの開始時に計算されます。指標値が負のレベル値を上に超えると、買いポジションが開かれます。同時に、売りポジションは決済されます。指標値が正のレベル値を下向きに横切る場合、売りポジションが開かれます(買いポジションは決済されます)。

テストパラメータ

EURUSDペア

H1時間枠

時間間隔–2021年

iPeriod = 14

iPrice = PRICE_TYPICAL

Level = 150

3つのケースすべてのバランスカーブオプションを以下に示します。

TypeInd = Classical

1テスター1

TypeInd = Square

2テスター2

ご覧のとおり、標準偏差を適用すると、取引数が減少し、その後、大きな損失が減少しました。

TypeInd = Modern

テスター3

堅牢な見積もりを使用することで取引数が増加し、大きな損失の数はさらに減少しました。これは、このような指標バージョンにとって大きな利点です。

いずれにせよ、ポジションのオープンとクローズのルールには、すべての場合において大幅な改善が必要です。


    トレンドを推定するための指標の修正

    CCI指標(どのバージョンでも)を注意深く観察しているときに、驚くべき発見をしました。正の値と負の値の両方を取ることができるということです。これがノーベル賞に値するかどうかはわかりませんが、MetaQuotes社は独自の賞を設けるべきだと思います。私は間違いなく受賞できます。冗談はこれで充分です。

    正の指標値は上昇トレンドに関連し、負の指標値は下降トレンドに関連しています。これについてもっと詳しく説明しましょう。新しい指標の一般的な考え方は、トレンドが始まった瞬間から終わりまでのCCI指標の値を合計するということです。もちろん、この動きを平均値と比較します。このようにして、トレンドの動きの持続時間とその強さを評価することができます。

    堅牢な推定を伴うバージョンの計算が基礎として使用されます。唯一の違いは、0レベルを超えた後にCCI指標値の合計を累積することです。この累積量の値が出力として使用されます。上昇トレンドと下降トレンドの平均は、比較のために別々に計算されます。この指標の全体像は次のようになります。


    この指標を使用すると、トレンドの始まり、終わり、強さを評価できます。この指標の最も単純な戦略は、トレンドが完了したときに、トレンドが平均を上回っていた場合(指標が対応するレベルを超えた場合)、価格が反対方向に動くと予想することです。

    結論

    おわかりのように、テクニカル指標を再確認することは非常に有用です。最終バージョンの指標は1つもありません。特定の戦略の改良と変更の可能性は常にあります。添付ファイル

    • mCCI - 3つのCCIバージョンを持つ指標
    • EACCI - 異なるCCIバージョンを比較するためのEAの取引
    • tCCI - 累積トレンド額を計算する指標。

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

    添付されたファイル |
    mCCI.mq5 (3.84 KB)
    EA_CCI.mq5 (7.46 KB)
    tCCI.mq5 (4.55 KB)
    mCCI.mq4 (5.25 KB)
    EA_CCI.mq4 (6.26 KB)
    tCCI.mq4 (4.54 KB)
    ウィリアムズPRによる取引システムの設計方法を学ぶ ウィリアムズPRによる取引システムの設計方法を学ぶ
    MetaTrader 5で使用される最も人気のあるテクニカル指標によってMQL5で取引システムを設計する方法を学ぶ連載の新しい記事です。今回は、ウィリアムズの%R指標による取引システムの設計方法について学びます。
    ニューラルネットワークが簡単に(第19部):MQL5を使用したアソシエーションルール ニューラルネットワークが簡単に(第19部):MQL5を使用したアソシエーションルール
    アソシエーションルールの検討を続けます。前回の記事では、このタイプの問題の理論的側面について説明しました。この記事では、MQL5を使用したFPGrowthメソッドの実装を紹介します。また、実装したソリューションを実際のデータを使用してテストします。
    一からの取引エキスパートアドバイザーの開発(第22部):新規受注システム(V) 一からの取引エキスパートアドバイザーの開発(第22部):新規受注システム(V)
    今日は、新しい受注システムの開発を進めていきます。新しいシステムを導入するのはそう簡単なことではありません。プロセスが非常に複雑になるような問題がしばしば発生します。このような問題が発生したときは、一度立ち止まって、自分たちの進むべき方向を再分析しなければなりません。
    DoEasy-コントロール(第9部):WinFormsオブジェクトメソッド、RadioButtonおよびButtonコントロールの再配置 DoEasy-コントロール(第9部):WinFormsオブジェクトメソッド、RadioButtonおよびButtonコントロールの再配置
    この記事では、WinFormsオブジェクトクラスメソッドの名前を修正し、ButtonおよびRadioButton WinFormsオブジェクトを作成します。