MQL5’i kullanarak özel bir Donchian Channel göstergesi nasıl oluşturulur?
Giriş
Bu makalede, alım-satımın çok önemli bir parçası olan trendin belirlenmesinden bahsedeceğiz ve bu konuda faydalı olabilecek teknik bir araç olan Donchian Channel hakkında bilgi edineceğiz. Bu, trend takip eden bir göstergedir.
Tüm bunlar aşağıdaki bölümlerde ele alınacaktır:
- Donchian Channel göstergesinin tanımı
- Özel Donchian Channel göstergesi
- Donchian Channel Uzman Danışmanı
- Sonuç
Donchian Channel göstergesinin tanımı
Bu bölümde, Donchian Channel göstergesini tanımlayacak ve etkili bir şekilde kullanmak için arkasındaki konsepti anlayacağız. Donchian Channel, yatırımcı Richard Donchian tarafından geliştirilmiştir. Ana amacı trend tespit etmektir. Trend yönlerini ve fiyat hareketlerini takip ettiği için trend takip eden, gecikmeli bir göstergedir. Fiyatın bulunduğu bir kanal oluşturan üç çizgiden oluşur. Kanalın üst çizgisi belirli bir süre boyunca kaydedilen en yüksek fiyatı, kanalın alt çizgisi belirli bir süre boyunca kaydedilen en düşük fiyatı ve orta çizgi de üst ve alt çizgiler arasındaki mesafenin yarısını temsil eder.
Donchian Channel göstergesini içeren örnek bir grafik:

Grafikte fiyatların üzerinde bir çizgi, fiyatların altında başka bir çizgi ve aralarında üçüncü bir çizgi görüyoruz. Gösterge, fiyatları üst ve alt çizgilerle çevreler veya içerir; buna ek olarak, yine faydalı olabilecek bir orta çizgi daha vardır. Göstergenin bu formuna dayanarak, trendleri, kırılma noktalarını ve destek/direnç seviyelerini belirlemek gibi farklı stratejilere göre kullanıldığında alım-satımda faydalı olabilir.
Göstergeyi kullanmanın temel prensibi, trendleri veya hakim yönü belirlemek için belirli bir süre boyunca fiyatların en yüksek ve en düşük seviyelerini gözlemlemektir. Fiyat belirli bir sürenin en yüksek seviyesinin üzerindeyse, bu bir alış sinyali olabilir. Fiyat belirli bir sürenin en düşük seviyesinin altındaysa, bu bir satış sinyali olabilir. Dolayısıyla, belirli bir süreyi belirledikten ve fiyatın en yüksek ve en düşük seviyelerini tanımladıktan sonra, fiyatlar belirli bir yönde yukarı veya aşağı hareket edene kadar izleriz ve buradaki sinyal, önceden belirlenmiş en yüksek veya en düşük seviyenin kırılmasıdır.
Gösterge, Zararı Durdur ve Kar Al seviyelerini belirlemek için kullanılabilir. Göstergenin seviyeleri çok net olduğu ve özellikle doğru parametreleri kullanırsak önemli seviyeleri temsil edebileceği için yanlış seviyelerin belirlenmesini azaltacağından alım-satımda çok önemli ve kullanışlıdır. Örneğin, kanalın düşük seviyesi bir alış pozisyonu için Zararı Durdur seviyesi olarak veya bir satış pozisyonu için Kar Al seviyesi olarak kullanılabilir. Kanalın yüksek seviyesi ise bir satış pozisyonu için Zararı Durdur veya bir alış pozisyonu için Kar Al olarak kullanılabilir.
Göstergenin nasıl hesaplandığını inceleyelim:
- Kanalın üst çizgisi = Son N periyottaki maksimum Yüksek değeri
- Kanalın alt çizgisi = Son N periyottaki minimum Düşük değeri
- Kanalın orta çizgisi = (Kanalın üst çizgisi + Kanalın alt çizgisi)/2
Dolayısıyla, trendi saptamak için ihtiyaç duyduğumuz periyodu belirlememiz, fiyatların en yüksek ve en düşük seviyelerini tespit etmemiz, gözlem için yanlarına çizgiler çizmemiz ve en yüksek ve en düşük seviyeler arasındaki mesafenin yarısını hesaplayarak orta çizgiyi elde etmemiz gerekiyor. Donchian Channel ile Bollinger Bands arasında bir fark olduğunu da belirtmekte fayda var. Çünkü, Donchian Channel belirli bir süre zarfındaki en yüksek ve en düşük fiyatı çizerken, Bollinger Bands iki standart sapma ekleyip çıkardıktan sonra belirli bir süre zarfındaki ortalamayı çizer. Bollinger Bands ve ona dayalı bir alım-satım sisteminin nasıl oluşturulacağı hakkında daha fazla bilgi edinmek için Bollinger Bands hakkındaki makalemi okuyabilirsiniz.
Trendleri net bir şekilde belirlemeye yardımcı olduğu için, alım-satım sistemimizde çok iyi bir araç olabileceğinden, bu göstergeye dayalı farklı stratejileri çalışmak ve test etmek faydalı olacaktır. Piyasanın tam bir resmini elde etmek ve daha iyi sonuçlar almak için bu göstergenin diğer teknik göstergelerle birlikte kullanılması önerilir.
Özel Donchian Channel göstergesi
Bu bölümde, MQL5’i kullanarak özel Donchian Channel göstergemizi oluşturmak için kullanılabilecek bir yöntemi ele alacağız. Üst, alt ve orta çizgileri olan bir gösterge oluşturacağız.
Aşağıdaki tanımlayıcı değerlerle ek parametreler oluşturalım:
- indicator_chart_window - Göstergeyi grafik penceresinde görüntülemek için.
- indicator_buffers - Gösterge hesaplamasının arabellek sayısı. (3) belirteceğiz.
- indicator_plots - Göstergedeki grafik serilerinin sayısı. (3) belirteceğiz.
#property indicator_chart_window #property indicator_buffers 3 #property indicator_plots 3
İki girdi parametresi oluşturalım: biri periyot için diğeri gösterge çizgilerinin rengi için, aşağıda gösterildiği gibi:
- indPeriod adında bir tamsayı değişken oluşturalım ve varsayılan değer olarak 20'yi ayarlayalım. Başka bir değer kullanabilirsiniz.
- indColor adında bir renk değişkeni oluşturalım ve varsayılan değer olarak maviyi ayarlayalım. Farklı bir değer de kullanabilirsiniz.
input int indPeriod=20; //Period input color indColor=clrBlue; //Color
Aşağıdaki gibi global değişkenler oluşturalım:
- double türünde diziler: upperBuff, lowerBuff ve middleBuff
- double türünde değişkenler: upperLine, lowerLine ve middleLine
- tamsayı türünde değişkenler: start ve bar
double upperBuff[]; double lowerBuff[]; double middleBuff[]; double upperLine,lowerLine,middleLine; int start, bar;
Hiçbir şey geri döndürmemek için void kullanarak “indInit” adında üç parametreli özel bir gösterge fonksiyonu oluşturalım (parametreleri: (index), dinamik bir dizi olarak (buffer) ve her gösterge çizgisi için bir dizge olarak (label)). Fonksiyonun gövdesinde aşağıdakileri yapacağız:
- Belirtilen göstergeyi tek boyutlu bir dinamik dizi ile ilişkilendiren “SetIndexBuffer” fonksiyonunu kullanacağız. Parametreleri şunlardır:
- index - Gösterge arabelleğinin numarası. (index) değişkenini kullanacağız.
- buffer[] - Oluşturulan dinamik dizi. (buffer) dizisini kullanacağız.
- data_type - Depolanacak veri türü. Varsayılan değer (INDICATOR_DATA) kullanacağız.
- Kodda göreceğimiz gibi “PlotIndexSetInteger” fonksiyonunu farklı prop-id ve prop_value parametreleriyle beş kez kullanacağız. Fonksiyon, ilgili gösterge çizgisinin değerini ayarlar. Gösterge özelliği tamsayı türünde olmalıdır. Parametreleri şunlardır:
- plot_index - Grafiksel çizim indeksi. (index) değişkenini kullanacağız.
- prop_id - ENUM_PLOT_PROPERT_INTEGER numaralandırması değerlerinden biri olan özellik tanımlayıcısı.
- prop_value - prop_id'de belirtilen özelliğin değeri.
- Göstergenin dizge türündeki özelliğinin değerini ayarlamak için “PlotIndexSetString” fonksiyonunu kullanacağız. Parametreleri “PlotIndexSetInteger” fonksiyonundakilerle aynıdır, ancak buradaki gösterge özelliği bir dizge olmalıdır.
- Göstergenin double türündeki özelliğinin değerini ayarlamak için “PlotIndexSetDouble” fonksiyonunu kullanacağız. Parametreler aynıdır, ancak gösterge özelliği double türünde olmalıdır.
void indInit(int index, double &buffer[],string label) { SetIndexBuffer(index,buffer,INDICATOR_DATA); PlotIndexSetInteger(index,PLOT_DRAW_TYPE,DRAW_LINE); PlotIndexSetInteger(index,PLOT_LINE_WIDTH,2); PlotIndexSetInteger(index,PLOT_DRAW_BEGIN,indPeriod-1); PlotIndexSetInteger(index,PLOT_SHIFT,1); PlotIndexSetInteger(index,PLOT_LINE_COLOR,indColor); PlotIndexSetString(index,PLOT_LABEL,label); PlotIndexSetDouble(index,PLOT_EMPTY_VALUE,EMPTY_VALUE); }
Sonrasında, OnInit() gövdesinde, göstergenin üç çizgisi için özel gösterge fonksiyonumuzu üç kez kullanalım.
indInit(0,upperBuff,"Donchian Channel"); indInit(1,lowerBuff,"Donchian Channel"); indInit(2,middleBuff,"Middle Donchian");
Göstergenin metin etiketini ayarlamak için “IndicatorSetString” fonksiyonunu kullanalım.
IndicatorSetString(INDICATOR_SHORTNAME,"Donchian ("+IntegerToString(indPeriod)+")");
OnCalculate kısmında, göstergeyi hesaplamak için aşağıdaki adımları gerçekleştireceğiz:
rates_total'ın “kullanıcı tarafından girilen periyot+1” periyottan daha az olup olmadığını kontrol edelim, eğer öyleyse, programın sıfır döndürmesini sağlayalım.
if(rates_total<indPeriod+1) { return 0; }
Üçlü operatör ?: kullanarak start değişkenine bir değer atayalım. start=prev_calculated==0 doğruysa, operatör indPeriod olarak ayarlanacaktır. Yanlışsa, operatör prev_calculated-1 olarak ayarlanacaktır.
start=prev_calculated==0? indPeriod: prev_calculated-1;
Göstergeyi hesaplamak üzere bir döngü oluşturmak için “for” fonksiyonunu kullanalım, birinci ifade (bar=start), ikinci ifade (bar<rates_total) ve üçüncü ifade çubuğu 1 artırmak için (bar ++) olacaktır. “for” döngüsü aşağıdaki gibi olacaktır:
- Dizideki en büyük değeri arayan “ArrayMaximum” fonksiyonunu kullanarak high dizisinin maksimum değerini belirleyerek upperLine’ı hesaplıyoruz.
- Dizideki en küçük değeri arayan “ArrayMinimum” fonksiyonunu kullanarak low dizisinin minimum değerini belirleyerek lowerLine'ı hesaplıyoruz.
- upperLine ve lowerLine toplamını 2'ye bölerek middleLine'ı hesaplıyoruz.
- upperBuff[bar], lowerBuff[bar] ve middleBuff[bar] değerlerini atıyoruz.
for(bar=start;bar<rates_total;bar++) { upperLine=high[ArrayMaximum(high,bar-indPeriod+1,indPeriod)]; lowerLine=low[ArrayMinimum(low,bar-indPeriod+1,indPeriod)]; middleLine=(upperLine+lowerLine)/2; upperBuff[bar]=upperLine-(upperLine-lowerLine); lowerBuff[bar]=lowerLine+(upperLine-lowerLine); middleBuff[bar]=middleLine; }
Kodun tamamı şu şekildedir:
#property indicator_chart_window #property indicator_buffers 3 #property indicator_plots 3 input int indPeriod=20; //Period input color indColor=clrBlue; //Color double upperBuff[]; double lowerBuff[]; double middleBuff[]; double upperLine,lowerLine,middleLine; int start, bar; void indInit(int index, double &buffer[],string label) { SetIndexBuffer(index,buffer,INDICATOR_DATA); PlotIndexSetInteger(index,PLOT_DRAW_TYPE,DRAW_LINE); PlotIndexSetInteger(index,PLOT_LINE_WIDTH,2); PlotIndexSetInteger(index,PLOT_DRAW_BEGIN,indPeriod-1); PlotIndexSetInteger(index,PLOT_SHIFT,1); PlotIndexSetInteger(index,PLOT_LINE_COLOR,indColor); PlotIndexSetString(index,PLOT_LABEL,label); PlotIndexSetDouble(index,PLOT_EMPTY_VALUE,EMPTY_VALUE); } int OnInit() { indInit(0,upperBuff,"Donchian Channel"); indInit(1,lowerBuff,"Donchian Channel"); indInit(2,middleBuff,"Middle Donchian"); IndicatorSetString(INDICATOR_SHORTNAME,"Donchian ("+IntegerToString(indPeriod)+")"); return(INIT_SUCCEEDED); } int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { if(rates_total<indPeriod+1) { return 0; } start=prev_calculated==0? indPeriod: prev_calculated-1; for(bar=start;bar<rates_total;bar++) { upperLine=high[ArrayMaximum(high,bar-indPeriod+1,indPeriod)]; lowerLine=low[ArrayMinimum(low,bar-indPeriod+1,indPeriod)]; middleLine=(upperLine+lowerLine)/2; upperBuff[bar]=upperLine-(upperLine-lowerLine); lowerBuff[bar]=lowerLine+(upperLine-lowerLine); middleBuff[bar]=middleLine; } return(rates_total); }
Kod hata ve uyarı olmadan derlenmelidir, daha sonra göstergeyi işlem terminalinin “Kılavuz” penceresinde “Göstergeler” klasöründe bulacağız ve çalıştırdıktan sonra aşağıdaki parametreler penceresi açılacaktır.

Gördüğümüz gibi, iki girdimiz var:
- Period - Göstergenin hesaplanması için kullanılacak periyot. Varsayılan değer olarak 20 görünür ancak kullanıcı tarafından güncellenebilir.
- Color - Gösterge çizgilerinin rengi. Varsayılan değeri mavidir ancak güncellenebilir.
Bu iki girdiyi tercihlerimize göre ayarladıktan ve Tamama tıkladıktan sonra, gösterge aşağıdaki gibi grafiğe eklenir:

Yukarıdaki grafikte görebileceğimiz gibi, göstergenin üç çizgisine sahibiz, fiyatı yukarıdan ve aşağıdan çevreleyen iki çizgi bir kanal oluşturuyor ve orta çizgi kanalın yarı mesafesini temsil ediyor.
Donchian Channel Uzman Danışmanı
Bu bölümde, göstergenin hareketine veya davranışına dayalı sinyaller üretmek için bir Uzman Danışman oluşturarak özel Donchian Channel göstergemizi bir alım-satım sisteminde kullanacağız. Bunu iki farklı yöntem kullanarak yapabiliriz: birincisi gösterge kodunu Uzman Danışmana yazmak, ikincisi ise oluşturulan göstergeyi Uzman Danışmana eklemek için iCustom fonksiyonunu kullanmaktır. Burada fikri anlamak için çok basit sistemler geliştireceğiz. Gösterge kodunun nasıl yazılacağını zaten öğrendiğimiz için ikinci yöntemi kullanacağız.
Geliştireceğimiz Uzman Danışmanlar:
Donchian Channel Simple Uzman Danışmanı:
Grafik üzerinde gösterge değerlerini (üst, orta ve alt kanallar) gösteren ilk sistemi oluşturalım. Program bu değerleri sürekli olarak izleyecek ve grafik üzerinde yorum olarak gösterecektir.
Aşağıda bu tür bir Uzman Danışman oluşturmak için gerekli adımlar yer almaktadır:
Varsayılan değeri (20) olan bir gösterge periyodu girdi değişkeni oluşturalım. Kullanıcı, Uzman Danışmanın girdi parametrelerinden bu değeri güncelleyebilir.
input int indPeriod=20; //Period
donchianChannel şeklinde bir tamsayı global değişken oluşturalım.
int donchianChannel; OnInit() kısmında, oluşturulan özel Donchian Channel göstergesinin tanımlayıcısını geri döndüren “iCustom” fonksiyonuna atayarak donchianChannel'ı güncelleyelim. Parametreleri şunlardır:
- symbol - Sembol adı. Mevcut sembole uygulanmak üzere (_Symbol) kullanacağız.
- period - Zaman dilimi. Mevcut zaman dilimine uygulanmak üzere (PERIOD_CURRENT) kullanacağız.
- name - Göstergenin dizge adı ve yolu.
- Ardından, göstergenin girdi parametrelerini belirleriz. Bizim durumumuzda, göstergenin periyodu.
donchianChannel=iCustom(_Symbol,PERIOD_CURRENT,"My Files\\Donchian_Channel\\Donchian_Channel",indPeriod);
OnDeinit() kısmında, Uzman Danışman kaldırıldığında “Donchian Channel EA Removed” mesajını geri döndürmek için Print fonksiyonunu kullanalım.
Print("Donchian Channel EA Removed");
OnTick() kısmında ChannelBuff, ChannelBuff1 ve MiddleBuff olmak üzere üç dizi oluşturalım.
double channelBuff[],channelBuff1[], middleBuff[]; Özel Donchian Channel göstergesinin her bir arabelleğinin verilerini almak için “CopyBuffer” fonksiyonunu kullanalım. Parametreleri şunlardır:
- indicator_handle - Gösterge tanıtıcısı. Her üç arabellek için de oluşturulan (donchianChannel) tanıtıcısını kullanacağız.
- buffer_num - Arabellek numarası. channelBuff için (0), channelBuff1 için (1) ve middleBuff için (2) ayarlayacağız.
- start_pos - Kopyalanacak ilk elemanın konumu. Her üç arabellek için de (0) kullanacağız.
- count - Kopyalanacak veri miktarı. Her üç arabellek için de (3) kullanacağız.
- buffer[] - Kopyalanacak hedef dizi. Üç arabelleği (channelBuff, channelBuff1 ve middleBuff) belirteceğiz.
CopyBuffer(donchianChannel,0,0,3,channelBuff); CopyBuffer(donchianChannel,1,0,3,channelBuff1); CopyBuffer(donchianChannel,2,0,3,middleBuff);
Hepsi için birer double türü değişken oluşturduktan sonra her çizginin mevcut değerlerini belirleyelim.
double channelHigh=channelBuff1[0]; double channelMiddle=middleBuff[0]; double channelLow=channelBuff[0];
Grafik üzerinde her biri ayrı bir satırda olmak üzere üç değer içeren bir yorum geri döndürmek için “Comment” fonksiyonunu kullanalım.
Comment("Channel High: ",channelHigh,"\nChannel Middle: ",channelMiddle,"\nChannel Low: ",channelLow);
Kodun tamamı şu şekildedir:
input int indPeriod=20; //Period int donchianChannel; int OnInit() { donchianChannel=iCustom(_Symbol,PERIOD_CURRENT,"My Files\\Donchian_Channel\\Donchian_Channel",indPeriod); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { Print("Donchian Channel EA Removed"); } void OnTick() { double channelBuff[],channelBuff1[], middleBuff[]; CopyBuffer(donchianChannel,0,0,3,channelBuff); CopyBuffer(donchianChannel,1,0,3,channelBuff1); CopyBuffer(donchianChannel,2,0,3,middleBuff); double channelHigh=channelBuff1[0]; double channelMiddle=middleBuff[0]; double channelLow=channelBuff[0]; Comment("Channel High: ",channelHigh,"\nChannel Middle: ",channelMiddle,"\nChannel Low: ",channelLow); }
Bu kodu hata veya uyarı olmadan derledikten sonra, Kılavuz penceresinde Uzman Danışman klasörü altında bulabiliriz. Uzman Danışmanı bir grafiğe eklediğimizde, aşağıdaki parametreler penceresi açılacaktır:

Uzman Danışmanı grafik üzerinde çalıştırdıktan sonra mevcut Donchian Channel değerlerini yorum olarak görebiliriz:

Grafikte, üç gösterge değeri (Channel High, Channel Middle ve Channel Low) içeren bir yorum şeklinde istediğimiz sinyal bulunmaktadır. Her değer ayrı bir satırda yer almaktadır.
Doğrulama amacıyla, Uzman Danışman sinyal değerlerini ve gösterge değerlerini karşılaştırırsak, veri penceresindeki değerlerin Uzman Danışman sinyal değerleriyle aynı olduğunu görürüz:

Uzman Danışmanın göstergenin hareketlerine ve seviyelerine göre sinyaller bulmasını istiyorsak, alış ve satış sinyallerini almak için gerekli koşulları tanımlayarak onu iyileştirebiliriz.
Donchian Channel Breakout Uzman Danışmanı:
Uzman Danışmanın bu sürümünde, programın her üç gösterge değerini de sürekli olarak kontrol etmesine ihtiyacımız var ve fiyat (Ask) kanalın yüksek seviyesini kırarsa, grafikte bir yorum olarak bir alış sinyali almamız gerekiyor. Buna karşılık, fiyat (Bid) kanalın düşük seviyesini kırarsa, bir satış sinyali almamız gerekiyor. Diğer tüm durumlarda, herhangi bir şey almamıza gerek yok.
Bu stratejiye dayalı Uzman Danışmanın tam kodu aşağıda gösterilmektedir:
input int indPeriod=20; //Period int donchianChannel; int OnInit() { donchianChannel=iCustom(_Symbol,PERIOD_CURRENT,"My Files\\Donchian_Channel\\Donchian_Channel",indPeriod); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { Print("Donchian Channel EA Removed"); } void OnTick() { double channelBuff[],channelBuff1[], middleBuff[]; CopyBuffer(donchianChannel,0,0,3,channelBuff); CopyBuffer(donchianChannel,1,0,3,channelBuff1); CopyBuffer(donchianChannel,2,0,3,middleBuff); double channelHigh=channelBuff1[0]; double channelMiddle=middleBuff[0]; double channelLow=channelBuff[0]; double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK); double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID); if(ask>channelHigh) { Comment("Buy Signal"); } else if(bid<channelLow) { Comment("Sell Signal"); } else Comment(" "); }
Bu koddaki farklılıklar şunlardır:
double türünde ask ve bid değişkenlerini oluşturuyoruz ve mevcut Ask ve Bid fiyatlarını geri döndürmek için “SymbolInfoDouble” fonksiyonunu kullanarak ask ve bid değişkenlerini tanımlıyoruz.
double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK); double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
Stratejinin koşulları:
Alış koşulu
Birbirlerine göre konumlarını belirlemek için programın Ask fiyatını ve kanalın yüksek seviyesini kontrol etmesine ihtiyacımız var. Ask fiyatı kanalın yüksek seviyesini aşarsa, bu bir alış koşulu demektir ve Uzman Danışmanın bu koşul karşılanır karşılanmaz grafikte bir yorum olarak bir alış sinyali geri döndürmesine ihtiyacımız var.
if(ask>channelHigh) { Comment("Buy Signal"); }
Satış koşulu
Birbirlerine göre konumlarını belirlemek için programın Bid fiyatını ve kanalın düşük seviyesini kontrol etmesine ihtiyacımız var. Bid fiyatı kanalın düşük seviyesinin altına inerse, bu bir satış koşulu demektir ve Uzman Danışmanın bu koşul karşılanır karşılanmaz grafikte bir yorum olarak bir satış sinyali geri döndürmesine ihtiyacımız var.
else if(bid<channelLow) { Comment("Sell Signal"); }
Diğer durumlar
Alış veya satış koşulu dışında bir şey varsa Uzman Danışmanın hiçbir şey geri döndürmemesine ihtiyacımız var.
else Comment(" ");
Bu kodu herhangi bir hata veya uyarı olmadan derledikten sonra, bir grafik üzerine sürükleyip bırakarak çalıştırabilir ve aşağıdaki örneklerde gösterildiği gibi stratejiye dayalı sinyaller alabiliriz:
Alış sinyali durumunda

Grafiğin sol üst köşesinde, kanalın yüksek seviyesinin yukarı doğru kırılmasının ardından bir alış sinyali görüyoruz.
Satış sinyali durumunda

Grafiğin sol üst köşesinde, kanalın düşük seviyesinin aşağı doğru kırılmasının ardından bir satış sinyali görüyoruz.
Diğer durumlar

Gördüğümüz gibi, fiyat kanalın içinde (kanalın yüksek seviyesinin altında ve düşük seviyesinin üstünde) hareket ettiği için sinyal yok.
Donchian Channel ve MA:
Şimdi, strateji koşullarına hareketli ortalama ekleyip sinyalleri filtreleyerek Uzman Danışmanı biraz daha geliştirmemiz gerekiyor. Dolayısıyla, 200 periyotluk EMA'nın (Exponential Moving Average) Ask fiyatının altında olması durumunda, Ask fiyatı kanalın yüksek seviyesinin üzerine çıktığında bir alış sinyali almamız gerekiyor. Satış sinyali durumunda, 200 periyotluk EMA'nın Bid fiyatının üzerinde olduğundan ve aynı zamanda Bid fiyatının kanalın düşük seviyesinin altına indiğinden emin olmamız gerekiyor. Diğer tüm durumlarda hiçbir sinyal almamalıyız.
Bu stratejiye dayalı Uzman Danışmanın tam kodu aşağıda gösterilmektedir:
input int indPeriod=20; //Period input int maPeriod=200; //Moving Average Period int donchianChannel; int EMA; double emaArray[]; int OnInit() { donchianChannel=iCustom(_Symbol,PERIOD_CURRENT,"My Files\\Donchian_Channel\\Donchian_Channel",indPeriod); EMA = iMA(_Symbol,_Period,maPeriod,0,MODE_EMA,PRICE_CLOSE); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { Print("Donchian Channel EA Removed"); } void OnTick() { double channelBuff[],channelBuff1[], middleBuff[]; CopyBuffer(donchianChannel,0,0,3,channelBuff); CopyBuffer(donchianChannel,1,0,3,channelBuff1); CopyBuffer(donchianChannel,2,0,3,middleBuff); ArraySetAsSeries(emaArray,true); CopyBuffer(EMA,0,0,3,emaArray); double channelHigh=channelBuff1[0]; double channelMiddle=middleBuff[0]; double channelLow=channelBuff[0]; double EMAValue=NormalizeDouble(emaArray[0],_Digits); double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK); double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID); if(ask>channelHigh&&ask>EMAValue) { Comment("Buy Signal","\nAsk above Channel High","\nAsk above (",maPeriod,") EMA"); } else if(bid<channelLow&&bid<EMAValue) { Comment("Sell Signal","\nBid below Channel Low","\nBid Below (",maPeriod,") EMA"); } else Comment(" "); }
Bu koddaki farklılıklar şunlardır:
Varsayılan değeri (200) olan maPeriod adında tamsayı türünde başka bir girdi parametresi oluşturuyoruz.
input int maPeriod=200; //Moving Average Period
EMA adında global bir tamsayı değişkeni oluşturuyoruz.
int EMA; Bir emaArray[] dizisi oluşturuyoruz.
double emaArray[]; Hareketli ortalama göstergesinin tanıtıcısını geri döndüren “iMA” fonksiyonunu kullanarak EMA değişkenini güncelliyoruz. Parametreleri şunlardır:
- symbol - Sembol adı. Mevcut sembole uygulanmak üzere (_Symbol) kullanacağız.
- period - Zaman dilimi. Mevcut zaman dilimine uygulanmak üzere (_period) kullanacağız.
- ma_period - Hareketli ortalama periyodu. Girdi değişkenini (maPeriod) kullanacağız.
- ma_shift - Göstergenin kayma miktarı. Gerek olmadığı için (0) kullanacağız.
- ma_method - Hareketli ortalama türü. Exponential Moving Average’a ihtiyacımız olduğu için (MODE_EMA) kullanacağız.
- applied_price - Hesaplamada kullanılacak fiyat türü. (PRICE_CLOSE) kullanacağız.
EMA = iMA(_Symbol,_Period,maPeriod,0,MODE_EMA,PRICE_CLOSE);
“ArraySetAsSeries” fonksiyonunu kullanarak AS_SERIES bayrağını ayarlıyoruz. Parametreleri şunlardır:
- array[] - Dizi. (emaArray) kullanacağız.
- flag - Dizi indeksleme yönü. (true) kullanacağız.
ArraySetAsSeries(emaArray,true);
“CopyBuffer” fonksiyonunu kullanarak hareketli ortalama arabelleğinden verileri alıyoruz.
CopyBuffer(EMA,0,0,3,emaArray);
Normalize ederek EMA değerini belirliyoruz.
double EMAValue=NormalizeDouble(emaArray[0],_Digits);
Stratejinin koşulları:
Alış koşulu
Fiyat > kanalın yüksek seviyesi ise, grafikte aşağıdaki yoruma ihtiyacımız var:
- Alış sinyali
- Ask fiyatı kanalın yüksek seviyesinin üzerinde
- Ask fiyatı (periyot) EMA’nın üzerinde
if(ask>channelHigh&&ask>EMAValue) { Comment("Buy Signal","\nAsk above Channel High","\nAsk above (",maPeriod,") EMA"); }
Satış koşulu
Fiyat < kanalın düşük seviyesi ise, grafikte aşağıdaki yoruma ihtiyacımız var:
- Satış sinyali
- Bid fiyatı kanalın düşük seviyesinin altında
- Bid fiyatı (periyot) EMA’nın altında
else if(bid<channelLow&&bid<EMAValue) { Comment("Sell Signal","\nBid below Channel Low","\nBid Below (",maPeriod,") EMA"); }
Diğer durumlar
else Comment(" ");
Kodu hata veya uyarı olmadan derledikten sonra, bu alım-satım sisteminin sinyallerini aşağıdaki gibi bulabiliriz.
Alış sinyali durumunda

Gördüğümüz gibi, bir alış sinyalimiz var (fiyat kanalın yüksek seviyesinin ve 200 periyotluk EMA'nın üzerinde).
Satış sinyali durumunda

Gördüğümüz gibi, bir satış sinyalimiz var (fiyat kanalın düşük seviyesinin ve 200 periyotluk EMA'nın altında).
Diğer durumlar

Sinyal yok. Fiyat 200 EMA'nın altında, ancak kanalın düşük seviyesinin üzerinde ve yüksek seviyesinin altında.
Sonuç
Bu makalede, Donchian Channel göstergesinin bilhassa özel olarak oluşturulmuş versiyonlarında ve alım-satım sistemlerinin bir parçası olarak yararlı ve değerli bir araç olabileceğini gördük. Tercihlerinize ve alım-satım tarzınıza nelerin hizmet ettiğine göre kendi özel Donchian Channel göstergenizi oluşturabilirsiniz. Ayrıca, göstergeye dayalı olarak işlem yapmak veya sinyal almak için iCustom fonksiyonunu kullanarak bir alım-satım sistemi oluşturabilirsiniz. Belirli koşullar ekleyerek ve diğer teknik araçları kullanarak alım-satım sistemini (Uzman Danışman) iyileştirebilirsiniz.
Umarım bu makaleyi faydalı bulur ve alım-satım sonuçlarınızı iyileştirmenize yardımcı olur. Herkes için uygun tek bir araç olmadığından, sizin için karlı olup olmayacağını öğrenmek için gerçek hesabınızda kullanmadan önce bu makalenin içeriğini test ettiğinizden emin olun.
Aşağıdaki linklerden diğer makalelerimi okuyabilirsiniz. Özellikle, en popüler teknik göstergelere dayalı alım-satım sistemleri oluşturma hakkında birçok makale bulabilirsiniz. Umarım faydalı bulursunuz. Bir sonraki makalede görüşmek üzere.
MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal makale: https://www.mql5.com/en/articles/12711
Uyarı: Bu materyallerin tüm hakları MetaQuotes Ltd.'a aittir. Bu materyallerin tamamen veya kısmen kopyalanması veya yeniden yazdırılması yasaktır.
Bu makale sitenin bir kullanıcısı tarafından yazılmıştır ve kendi kişisel görüşlerini yansıtmaktadır. MetaQuotes Ltd, sunulan bilgilerin doğruluğundan veya açıklanan çözümlerin, stratejilerin veya tavsiyelerin kullanımından kaynaklanan herhangi bir sonuçtan sorumlu değildir.
MQL5 Algo Forge'a Geçiş (Bölüm 3): Kendi Projelerinizde Harici Depoları Kullanma
MQL5 Algo Forge'a Geçiş (Bölüm 2): Birden Fazla Depo ile Çalışma
MQL5 Algo Forge'a Geçiş (Bölüm 1): Ana Deponun Oluşturulması
- Ücretsiz alım-satım 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
Yeni makale MQL5 kullanarak özelleştirilmiş bir Donchian Kanalı nasıl oluşturulur yayınlandı:
Yazar: Mohamed Abdelmaaboud
görüyorsunuz https://www.mql5.com/en/market/product/31082?source=Unknown