![CCI göstergesi: Yeni hesaplama yöntemleri](https://c.mql5.com/2/49/cci_indicator_new_features_600x314.jpg)
CCI göstergesi: Yeni hesaplama yöntemleri
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 mutlak sapmayı (Mean Absolute Deviation, MAD) hesapla
- Gösterge değerini hesapla
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 karelerinin toplamını hesapla
- Gösterge değerini hesapla
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
TypeInd = Square
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
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
![KittyT KittyT](https://c.mql5.com/avatar/2023/4/642d5bee-f680.jpg)
![Veri Bilimi ve Makine Öğrenimi (Bölüm 06): Gradyan İniş](https://c.mql5.com/2/47/data_science_articles_series__1.png)
![Williams %R göstergesine dayalı bir ticaret sistemi nasıl geliştirilir?](https://c.mql5.com/2/47/why-and-how__4.png)
![Sıfırdan bir ticaret Uzman Danışmanı geliştirme (Bölüm 16): İnternetteki verilere erişme (II)](https://c.mql5.com/2/46/development__7.png)
![Ichimoku göstergesine dayalı bir ticaret sistemi nasıl geliştirilir?](https://c.mql5.com/2/47/why-and-how__3.png)
![MQL5 - MetaTrader 5 müşteri terminalinde yerleşik ticaret stratejileri dili](https://c.mql5.com/i/registerlandings/logo-2.png)
- Ücretsiz ticaret uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz