English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
preview
CCI göstergesi: Yeni hesaplama yöntemleri

CCI göstergesi: Yeni hesaplama yöntemleri

MetaTrader 5Örnekler | 3 Nisan 2023, 10:54
645 1
Aleksej Poljakov
Aleksej Poljakov

Kısa tarihçe

Commodity Channel Index (CCI), her yatırımcının aşina olduğu bir göstergedir. Donald Lambert tarafından geliştirilmiştir ve ilk olarak 1980'de Commodities dergisinde (şimdiki adı - Modern Trader) yayınlanmıştır. O zamandan beri, bu gösterge hak ettiği ünü kazanmıştır ve yatırımcılar arasında çok popüler hale gelmiştir. CCI göstergesi, MetaTrader işlem platformunun araç setinde bulunmaktadır ve hem manuel ticarette hem de otomatik ticaret sistemlerinde kullanılmaktadır.


Hesaplama algoritması

Göstergenin hesaplanması oldukça basit ve nettir. Gösterge, fiyatın ortalama mutlak sapmaya göre ortalama değerden ne kadar saptığını gösterir. Hesaplama algoritması aşağıda gösterilmektedir. Göstergenin periyodu N olsun. Böylece:

  • Ortalamayı hesapla 

Ortalama

  • Ortalama mutlak sapmayı (Mean Absolute Deviation, MAD) hesapla

Ortalama mutlak sapma

  • Gösterge değerini hesapla

CCI

Orijinal göstergede düzeltme katsayısı k=0,015’tir. Bu değer, 1,5*MAD fiyat sapması 100 gösterge birimine eşit olacak şekilde seçilmiştir. Bu şekilde, 3*MAD fiyat sapması da 200 birim olur. (İlginç bir şekilde, bölme yerine çarpma yapılırsa, normalleştirme katsayısı k'nın değeri 66,6 olacaktır.)


Olası algoritma değişiklikleri

Göstergenin dikkate değer özelliği, ortalama mutlak sapmanın kullanılmasıdır. Mutlak sapmanın hesaplanması, daha uygun standart sapmanın hesaplanmasına kıyasla daha az hesaplama gücü gerektirdiğinden, bu yaklaşımın kullanılması bilgisayar teknolojisinin ilk dönemlerinde tamamen mantıklıydı. Ancak günümüzde modern bilgisayarlar kare ve karekök işlemlerini makul bir süre içerisinde gerçekleştirebilmektedir. Dolayısıyla, göstergenin hesaplama algoritması şu şekilde değiştirilebilir:

  • Fiyatların toplamını hesapla

Fiyatların toplamı

  • Fiyatların karelerinin toplamını hesapla

Fiyatların karelerinin toplamı

  • Gösterge değerini hesapla

CCI

Bu hesaplama algoritması daha hassas ve doğrudur, ancak yine de mükemmel değildir. Mesele, ortalama ve kareler ortalamasının karekökü (Root Mean Square, RMS) değerlerinin hesaplanmasının yeterince fazla sayıda (en az otuz) fiyat gerektirmesidir. Ancak ticaret için kısa periyotlar da kullanılabilmektedir. Örneğin, CCI'ın klasik versiyonunda 14 periyot tavsiye edilmektedir.

Bu tür durumlar sağlam istatistik yöntemleri gerektirir. Bu yöntemler, finansal piyasalarda yaygın olarak görülebilen ekstrem koşullarda bile oldukça istikrarlı ve güvenilir parametre hesaplamaları elde etmeye olanak sağlarlar.

Şimdi bu sağlam yöntemlerin nasıl çalıştığına bir göz atalım ve onları klasik yöntemlerle karşılaştıralım. Örneğin, şu üç değerden oluşan bir zaman serisini ele alalım: p[0]=1, p[1]=3, p[2]=8.

Klasik yaklaşım aşağıdaki hesaplamaları içerir:

  • Ortalama: (1+3+8)/3=4
  • Ortalama mutlak sapma: (mutlak(1-4) + mutlak(3-4) + mutlak(8-4))/3=2,67
  • Kanalın alt ve üst sınırları: 1,33 – 6,67 

Şimdi standart sapmayı kullanarak hesaplayalım:

  • Ortalama: (1+3+8)/3=4
  • Standart sapma: karekök(((1-4)^2 + (3-4)^2 + (8-4)^2)/3)=2,94
  • Kanalın alt ve üst sınırları: 1,06 – 6,94

Sağlam hesaplamalar daha fazla aşamaya sahiptir. Ortalamayı hesaplamak için Theil-Sen yöntemini kullanalım. Bunu yapmak için, öncelikle zaman serisi değerlerinin çiftler halinde toplam yarılarını bulmalıyız. Çift sayısı şu denklem kullanılarak elde edilebilir: (N*(N-1))/2.

Sağlam ortalama, bu toplam yarılarının medyanına eşittir. Medyanı bulmak için önce diziyi artan düzende sıralamamız gerekir. Medyan, bu dizinin ortasındaki değere karşılık gelecektir. Eğer dizinin büyüklüğü tek sayı ise merkezdeki elemanın indeksine, çift sayı ise merkezdeki iki elemanın indeksine ihtiyacımız vardır ve medyan bu iki elemanın ortalamasına eşit olacaktır.

Her iki durum için indeksleri hesaplama formülleri (dizinin büyüklüğü, dizideki eleman sayısıdır):

  • Dizinin büyüklüğü tek sayı ise

İndeks = dizinin büyüklüğü/2

  • Dizinin büyüklüğü çift sayı ise

İndeks 1 = (dizinin büyüklüğü/2)-1 ; İndeks 2 = dizinin büyüklüğü/2

Örneğimizde şu şekilde olacaktır:

1. toplam yarısı = (1+3)/2=2

2. toplam yarısı = (1+8)/2=4,5

3. toplam yarısı = (3+8)/2=5,5

Elde ettiğimiz toplam yarılarını sıralayalım: 2, 4,5, 5,5

  • Sağlam ortalama (yukarıdaki değerlerin medyanı) = 4,5

Şimdi sapmaya geçelim. Bunu yapmak için, orijinal zaman serisinin değerlerinin sağlam ortalamaya olan sapmalarının mutlak değerlerinin medyanını bulmamız gerekiyor.

1. sapma = mutlak(1-4.5)=3.5

2. sapma = mutlak(3-4.5)=1.5

3. sapma = mutlak(8-4,5)=3.5

Elde ettiğimiz mutlak sapmaları sıralayalım: 1,5, 3,5, 3,5

  • Sapma (yukarıdaki değerlerin medyanı) = 3,5
  • Kanalın alt ve üst sınırları: 1 – 8


Klasik ve iyileştirilmiş gösterge versiyonlarını karşılaştırma

Bu yaklaşımları karşılaştıralım. Normal hesaplamalarda, zaman serisinin minimum ve maksimum değerleri, ortalama mutlak sapma sınırlarının ötesine geçmiştir. Sağlam hesaplamalarda ise zaman serisinin tüm değerleri bu sınırlara uymaktadır. Üç yaklaşımdaki fark açıktır, ancak şu an için yalnızca bizim örneğimizde. Şimdi farklı hesaplama yöntemlerinin gerçek veriler üzerinde nasıl davrandığına bakalım. Üç algoritmayı da ayrı bir gösterge şeklinde uygulayalım. Bu aynı zamanda genel olarak hesaplamaların nasıl kodlandığının daha iyi anlaşılmasını sağlayacaktır.

Göstergenin görünümü büyük ölçüde iki değişkene bağlıdır - uygulanan fiyat sabiti ve periyot. MQL5'te, gösterge özellikleri tanımlanırken fiyat sabiti ayarlanabilir.

#property indicator_applied_price PRICE_TYPICAL

MQL4'te ayrı bir fonksiyon kullanacağım.

Gösterge periyodu, hesaplamalarda kullanılacak fiyat sayısını ifade eder.

input ushort iPeriod=14;//indicator period

Değişken değeri en az üç olmalıdır. Küçük periyotlarda yanlış (çok büyük) değerler alınabileceğini unutmayın.

CCI’ın klasik versiyonunun her i'ninci çubuk için hesaplanması aşağıdaki gibi yapılır. İlk olarak, fiyatların ortalamasını hesaplıyoruz.

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

Sonrasında, ortalama mutlak sapmayı hesaplıyoruz.

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
   }

Ortalama mutlak sapmanın değeri sıfırdan büyükse, gösterge şuna eşit olacaktır:

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

Standart sapmayı kullanan gösterge versiyonu aşağıdaki gibi hesaplanır. Öncelikle fiyatların toplamını ve karelerinin toplamını hesaplıyoruz.

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];
   }

Devamında, göstergeyi hesaplamak için gereken paydayı hesaplamamız gerekiyor.

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

Payda sıfırdan büyükse, sonuç aşağıdaki gibi olacaktır:

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

Son olarak, sağlam yöntemleri kullanarak hesaplamaları inceleyelim. İlk olarak, ara sonuçları depolamak için iki dizi hazırlamamız gerekiyor. Biri toplam yarılarını depolamak, diğeri de mutlak farkları depolamak içindir.

double halfsums[],diff[];

Öncelikle toplam yarıları (halfsums) dizisini hazırlayalım. Dizinin büyüklüğünü tanımlayalım.

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

Dizinin merkezindeki elemanların indekslerini bulalım. Genellik açısından iki indeks kullanacağız. Dizinin büyüklüğü (size) tek ise bu indeksler birbirleriyle aynı, aksi takdirde farklı olacaktır.

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

Şimdi mutlak farklar (diff) dizisini hazırlayalım. Büyüklüğü gösterge periyoduyla örtüşür. Eleman indekslerinin bulunması önceki durumdakiyle aynıdır.

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

Şimdi sağlam hesaplamaları yapalım. halfsums dizisini toplam yarılarıyla doldurmak için ek bir sayaca ihtiyacımız vardır.

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
       }
   }

Diziyi doldurduktan sonra sıralayacağız. Dizinin merkezindeki değer sağlam ortalama olacaktır.

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

Sağlam standart sapmayı hesaplayalım.

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

Standart sapma sıfırdan büyükse, gösterge değeri şu şekilde olacaktır:

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

Artık göstergenin farklı versiyonlarının davranışını karşılaştırabiliriz. Bazı durumlarda, göstergeler çok benzer görünmektedir.


Ancak göstergeler arasındaki farkın oldukça belirgin olduğu alanlar da vardır.



Göstergeleri karşılaştırmak için küçük bir Uzman Danışman

Görsel karşılaştırmalar özneldir ve yanlış sonuçlara yol açabilir. Sonuçlarımız için daha güvenilir bir dayanak noktasına ihtiyacımız vardır. Tüm gösterge versiyonlarını değerlendirmek için basit bir Uzman Danışman yazalım. Pozisyon açma ve kapatma için aynı kuralları belirleyelim ve sonuçları karşılaştıralım. Şu kuralları kullanacağız - belirli bir seviyenin geçilmesi bir yönde bir pozisyon açacaktır ve (varsa) ters yöndeki pozisyonları kapatacaktır.

Uzman Danışman parametreleri:

  • TypeInd - gösterge türü (Classical, Square, Modern)
  • iPeriod - gösterge periyodu
  • iPrice - gösterge fiyatı
  • Level - çaprazlanması izlenecek seviye. 150 değeri, klasik CCI'da 100 seviyesine denk gelmektedir.

Testi hızlandırmak için gösterge hesaplama algoritmaları Uzman Danışmana taşındı. Gösterge değerleri her yeni çubuğun açılışında hesaplanır. Gösterge değeri negatif Level parametresi değerini aşağıdan yukarıya doğru çaprazladığında bir alış pozisyonu açılacaktır ve aynı zamanda satış pozisyonları kapatılacaktır. Gösterge değeri pozitif Level parametresi değerini yukarıdan aşağıya doğru çaprazladığında bir satış pozisyonu açılacaktır ve aynı zamanda alış pozisyonları kapatılacaktır.

Test parametreleri:

EURUSD çifti

H1 zaman dilimi

Zaman aralığı – 2021 yılı

iPeriod = 14

iPrice = PRICE_TYPICAL

Level = 150

Her üç durum için bakiye eğrileri aşağıda gösterilmektedir.

TypeInd = Classical

Classical için bakiye eğrisi

TypeInd = Square

Square için bakiye eğrisi

Gördüğümüz gibi, standart sapmanın uygulanması işlem sayısında ve bununla birlikte büyük zararlarda azalmaya yol açmıştır.

TypeInd = Modern

Modern için bakiye eğrisi

Sağlam hesaplamaların kullanılması ise işlem sayısını artırırken büyük zararların sayısını daha da azaltmıştır. Bu, göstergenin bu versiyonu için ciddi bir avantajdır.

Ancak görüldüğü üzere her durum için pozisyon açma ve kapatma kurallarında ciddi iyileştirmelere ihtiyaç vardır.


    Trendi değerlendirmek için göstergede değişiklik

    CCI göstergesini dikkatlice gözlemlerken (tüm versiyonlarını), harika bir keşif yaptım - hem pozitif hem de negatif değerler alabilmektedir. Bunun Nobel Ödülüne layık olup olmadığını bilmiyorum ama bence MetaQuotes Ltd kendi ödülünü oluşturmalı ve bana vermelidir. Kesinlikle hak ediyorum :) Bu kadar şaka yeterli, devam edelim.

    Pozitif gösterge değerleri yükseliş trendiyle ilişkiliyken, negatif gösterge değerleri düşüş trendiyle ilişkilidir. Bunun üzerinde daha ayrıntılı olarak duralım. Yeni göstergenin genel fikri şu şekildedir: CCI göstergesinin değerlerini trendin başlangıcından sonunda kadar topluyoruz. Elbette bu hareketi ortalamayla karşılaştıracağız. Bu şekilde, trend hareketlerinin süresini ve gücünü değerlendirebileceğiz.

    Sağlam hesaplamalara sahip versiyonu esas alacağız. Tek fark, sıfır seviyesini aştıktan sonra CCI göstergesinin değerlerinin toplamını biriktireceğiz. Bu birikmiş miktarın değeri çıktı olarak kullanılacaktır. Yükseliş ve düşüş trendleri için ortalamalar ayrı ayrı hesaplanacaktır. Bu göstergenin genel resmi aşağıdaki gibidir.


    Bu göstergeyle bir trendin başlangıcını, sonunu ve gücünü değerlendirebiliriz. Bu gösterge için en basit strateji şu şekilde olabilir - trendin sonunda, trend ortalamanın üzerindeyse (gösterge ilgili seviyeyi geçtiyse), fiyatın ters yönde hareket etmesini bekleyebiliriz.

    Sonuç

    Bu makalede, teknik göstergelere yeni bir bakışın çok faydalı olabileceğini gördük. Hiç bir gösterge son sürümünde değildir - her zaman belirli stratejiler için değiştirme ve iyileştirme olasılığı vardır. Ekli dosyalar:

    • mCCI — üç CCI versiyonuna sahip gösterge
    • EA CCI — farklı CCI versiyonlarını karşılaştırmak için ticaret Uzman Danışmanı
    • tCCI — birikmiş trend miktarlarını hesaplayan gösterge.

    MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
    Orijinal makale: https://www.mql5.com/ru/articles/11126

    Ekli dosyalar |
    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)
    Son yorumlar | Tartışmaya git (1)
    KittyT
    KittyT | 5 Nis 2023 şu zamanda: 11:42
    Merhaba, formasyonlarda "Mum göstergesini" göremedim. Onu ekleme şansınız bulunuyor mu ? 
    Veri Bilimi ve Makine Öğrenimi (Bölüm 06): Gradyan İniş Veri Bilimi ve Makine Öğrenimi (Bölüm 06): Gradyan İniş
    Gradyan iniş, sinir ağlarının ve çeşitli makine öğrenimi algoritmalarının eğitiminde önemli bir rol oynamaktadır - hızlı ve akıllı bir algoritmadır. Etkileyici bir şekilde çalışmasına rağmen, birçok veri bilimci tarafından hala yanlış anlaşılmaktadır. Bu makalemizde onu detaylıca inceleyerek daha iyi anlayacağız.
    Williams %R göstergesine dayalı bir ticaret sistemi nasıl geliştirilir? Williams %R göstergesine dayalı bir ticaret sistemi nasıl geliştirilir?
    MetaTrader 5’te kullanılmak üzere MQL5 dili aracılığıyla en popüler teknik göstergelere dayalı ticaret sistemleri geliştirdiğimiz serimizin yeni makalesindeyiz. Bu makalemizde, Williams %R göstergesiyle basit bir ticaret sisteminin nasıl geliştirileceğini öğreneceğiz.
    Sıfırdan bir ticaret Uzman Danışmanı geliştirme (Bölüm 16): İnternetteki verilere erişme (II) Sıfırdan bir ticaret Uzman Danışmanı geliştirme (Bölüm 16): İnternetteki verilere erişme (II)
    İnternetten Uzman Danışmana verilerin nasıl alınacağı o kadar net değildir. MetaTrader 5'in sunduğu tüm olanakları anlamadan bunu yapabilmek zordur.
    Ichimoku göstergesine dayalı bir ticaret sistemi nasıl geliştirilir? Ichimoku göstergesine dayalı bir ticaret sistemi nasıl geliştirilir?
    Bu makalede de en popüler teknik göstergelere dayalı ticaret sistemlerini nasıl oluşturacağımızı öğrendiğimiz serimize devam ediyoruz. Bu sefer Ichimoku göstergesi hakkında konuşacağız ve ona dayalı bir ticaret sistemi geliştireceğiz.