
MQL5’i kullanarak bir özel gösterge (Heiken Ashi) nasıl oluşturulur?
Giriş
Hepimizin grafikleri yorumlamaya ihtiyacı var ve bu görevde yardımcı olabilecek herhangi bir aracı çok memnuniyetle karşılayacağız. Bu görevi basitleştirebilecek araçlar arasında fiyat, hacim, başka bir teknik gösterge veya bunların bir kombinasyonuna göre hesaplanan göstergeler bulunur. İşlem terminalimizde kullanıma hazır birçok gösterge mevcuttur, ancak alım-satım tarzımıza uygun bazı özellikler eklememiz gerekirse özel çözümlere başvurmamız gerekecektir.
Bu makalede, koşullarımıza ve tercihlerimize göre özel bir gösterge oluşturmamızı sağlayan “iCustom” fonksiyonunu kullanacağız. Heiken Ashi özel teknik göstergesini oluşturacağız ve bunu alım-satım sistemlerinde kullanacağız. Bu amaçla şu konular üzerinde ilerleyeceğiz:
- Özel gösterge ve Heiken Ashi tanımı
- Basit Heiken Ashi göstergesi
- Özel Heiken Ashi göstergesine dayalı Uzman Danışman
- Heiken Ashi - EMA sistemi
- Sonuç
Bu makaledeki materyal, kendi özel göstergelerinizi oluşturmak için bir örnek olarak kullanılabilir. Oluşturduğumuz göstergeler ve Uzman Danışmanlar için kod yazmak üzere MetaTrader 5 işlem platformunda yerleşik olan MQL5 (MetaQuotes Language 5) dilini kullanacağız. MetaTrader 5’in nasıl kurulacağı ve MetaEditor’ın nasıl kullanılacağı hakkında daha fazla bilgi edinmek istiyorsanız, önceki makalelerimden birinde yer alan "MetaEditor’da MQL5 kodu yazma" bölümünü okuyabilirsiniz.
Özel gösterge ve Heiken Ashi tanımı
Bir önceki bölümün girişinde bahsettiğim gibi, özel bir gösterge, bir kullanıcı tarafından MQL5 programlama dili kullanılarak oluşturulabilen bir teknik analiz aracıdır. MetaTrader 5'te piyasa hareketlerini analiz etmek ve anlamak ve bilinçli yatırım kararları vermenize yardımcı olmak için kullanılabilir. Birçok faydalı yerleşik teknik gösterge vardır, ancak bazen mevcut göstergelerin kapsamadığı bazı ek matematiksel, istatistiksel veya teknik fikirlere dayanarak piyasanın nasıl performans gösterdiğini analiz etmemiz ve anlamamız gerekir. Bu gibi durumlarda, böyle bir göstergeyi kendimiz oluşturmalıyız - ki bu, özel tercihlerimizi ve hedeflerimizi karşılayan kendi analiz veya alım-satım araçlarımızı oluşturmamıza yardımcı olan MetaTrader 5 platformunun özelliklerinden biridir.
Özel göstergenizi oluşturmaya başlamak için gerekli adımlara bakalım:
MetaEditor'ı açın ve Kılavuzdan “Indicators” klasörünü seçin.
Aşağıdaki şekilde gösterildiği gibi yeni bir program oluşturmak için “Yeni” düğmesine tıklayın.
Devamında, oluşturulacak programın türünü seçmeniz gereken bir pencere açılacaktır. Burada “Özel gösterge”yi seçiyoruz.
“İleri” düğmesine tıkladıktan sonra, gösterge ayrıntılarını içeren aşağıdaki pencere açılacaktır. Burada özel göstergenin adını belirtin ve “İleri”ye tıklayın.
Sonraki pencerelerde, gösterge hakkında daha fazla detayı belirleterek devam ediyoruz.
Tüm ayarlamayı tamamladıktan ve “Son” düğmesine tıkladıktan sonra, göstergenin kodunu yazacağımız düzenleyici penceresi açılacaktır.
Örnek olarak Heiken Ashi'yi kullanarak kendi göstergemizi nasıl geliştireceğimizi göreceğiz. Bu yüzden, Heiken Ashi teknik göstergesi hakkında daha fazla bilgi edinmemiz gerekiyor. Piyasa hareketini temsil etmek ve analiz etmek için kullanılabilen mum türünde bir grafik yöntemidir. Bilinçli alım-satım kararları alabileceğimiz ayrıntılı bilgiler elde etmek için diğer araçlarla birlikte kullanılabilir.
Heiken Ashi grafikleri normal mum grafiklerine benzer, ancak bu mumları çizmek için yapılan hesaplama farklıdır. Bildiğimiz gibi, normal bir mum grafiği fiyatları belirli bir zaman dilimi için mevcut Açılış, Yüksek, Düşük ve Kapanış fiyatlarına göre hesaplar, ancak Heiken Ashi, mumlarını hesaplarken önceki benzer fiyatları (Açılış, Yüksek, Düşük ve Kapanış fiyatları) dikkate alır.
Heiken Ashi değerlerinin nasıl hesaplandığı aşağıda açıklanmıştır:
- Açılış = (önceki mumun Açılışı + önceki mumun Kapanışı) / 2
- Kapanış = (mevcut mumun Açılışı + Kapanışı + Yükseği + Düşüğü) / 4
- Yüksek = mevcut zaman diliminin Yüksek, Açılış veya Kapanışından en yüksek değer
- Düşük = mevcut zaman diliminin Düşük, Açılış veya Kapanışından en düşük değer
Hesaplamaya dayanarak, gösterge yükseliş ve düşüş mumları oluşturur, bu mumların renkleri ilgili piyasa yönünü gösterir: yükseliş veya düşüş. Karşılaştırma için geleneksel Japon mumları ve Heiken Ashi aşağıda gösterilmiştir.
Üst kısım geleneksel mumları, alt kısım ise piyasa yönünü belirleyen mavi ve kırmızı mumlar şeklinde görüntülenen Heiken Ashi göstergesini göstermektedir. Göstergenin amacı, yanlış sinyallerden kaçınmak için verileri yumuşatarak piyasa hareketlerindeki gürültünün bir kısmını filtrelemek ve ortadan kaldırmaktır.
Basit Heiken Ashi göstergesi
MetaTrader 5'te kullanmak için basit bir Heiken Ashi göstergesi oluşturalım. Gösterge sürekli olarak fiyatları (Açılış, Yüksek, Düşük ve Kapanış) kontrol etmeli ve haOpen, haHigh, haLow ve haClose değerlerini oluşturmak için hesaplamalar yapmalıdır. Hesaplamalara dayanarak, gösterge değerleri grafikte farklı renklerde mumlar şeklinde göstermelidir: yükseliş hareketi için mavi ve düşüş hareketi için kırmızı. Mumlar, geleneksel grafiğin altında ayrı bir pencerede alt pencere olarak görüntülenmelidir.
Bu özel göstergeyi oluşturmak için izlememiz gereken tüm adımlara bakalım.
Gösterge ayarlarını #property ve tanımlayıcı değerler aracılığıyla ek parametreler belirleyerek tanımlayalım.
- (indicator_separate_window) - Göstergeyi ayrı bir pencerede göstermek için.
- (indicator_buffers) - Gösterge hesaplaması için arabellek sayısını belirlemek için.
- (indicator_plots) - Göstergedeki grafik serilerinin sayısını belirlemek için. Grafik serileri, özel bir gösterge oluştururken kullanılabilecek çizim stilleridir.
- (indicator_typeN) - (ENUM_DRAW_TYPE) değerlerinden grafik çizim türünü belirlemek için. N son parametrede belirlediğimiz grafik serilerinin sayısıdır ve 1'den başlar.
- (indicator_colorN) - N'nin rengini belirlemek için. N aynı zamanda daha önce belirlediğimiz grafik serilerinin sayısıdır ve 1'den başlar.
- (indicator_widthN) - N'nin veya grafik serilerinin kalınlığını belirlemek için.
- (indicator_labelN) - Belirlenen grafik serilerinden N tanesi için bir etiket ayarlamak için.
#property indicator_separate_window #property indicator_buffers 5 #property indicator_plots 1 #property indicator_type1 DRAW_COLOR_CANDLES #property indicator_color1 clrBlue, clrRed #property indicator_width1 2 #property indicator_label1 "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"
Göstergenin beş arabelleği (haOpen, haHigh, haLow, haClose ve haColor) için double türünde beş dizi oluşturalım.
double haOpen[]; double haHigh[]; double haLow[]; double haClose[]; double haColor[];
“OnInit()” fonksiyonu göstergeyi başlatmak için kullanılır.
int OnInit()
Gösterge arabelleklerini “SetIndexBuffer” fonksiyonunu kullanarak double türünde tek boyutlu bir dinamik dizi kullanarak sıralayalım. Parametreleri şunlardır:
- index - 0'dan başlayarak gösterge arabelleğinin numarası. Bu sayı indicator_buffers parametresinde bildirilen değerden küçük olmalıdır.
- buffer[] - Özel göstergemizde bildirilen dizi.
- data_type - Gösterge dizisinde saklamamız gereken veri türü.
SetIndexBuffer(0,haOpen,INDICATOR_DATA); SetIndexBuffer(1,haHigh,INDICATOR_DATA); SetIndexBuffer(2,haLow,INDICATOR_DATA); SetIndexBuffer(3,haClose,INDICATOR_DATA); SetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);
Özellik tanımlayıcısını belirttiğimiz çağrı varyantıyla “IndicatorSetInteger” fonksiyonunu kullanarak ilgili gösterge özelliğinin değerini ayarlayalım. Parametreleri şunlardır:
- prop_id - (ENUM_CUSTOMIND_PROPERTY_INTEGER) numaralandırmasından bir değer olabilen özellik tanımlayıcısı. (INDICATOR_DIGITS) belirteceğiz.
- prop_value - Özelliğin değeri. (_Digits) belirteceğiz.
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
İlgili dizge türündeki özelliğin değerini, özellik tanımlayıcısını belirttiğimiz çağrı varyantıyla “IndicatorSetString” fonksiyonunu kullanarak ayarlayalım. Parametreleri şunlardır:
- prop_id - (ENUM_CUSTOMIND_PROPERTY_STRING) numaralandırmasından bir değer olabilen özellik tanımlayıcısı. (INDICATOR_SHORTNAME) belirteceğiz.
- prop_value - Özelliğin değeri. "Simple Heiken Ashi" belirteceğiz.
IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");
“PlotIndexSetDouble” fonksiyonunu kullanarak ilgili göstergenin double türündeki ilgili özelliğinin değerini ayarlayalım. Parametreleri şunlardır:
- plot_index - Grafiksel çizimin indeksi. (0) belirteceğiz.
- prop_id - (ENUM_PLOT_PROPERTY_DOUBLE) değerlerinden biri. Çizim olmaması için (PLOT_EMPTY_VALUE) olacaktır.
- prop_value - Özelliğin değeri.
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
Ardından, “OnInit()” fonksiyonunun bir parçası olarak (INIT_SUCCEEDED) geri döndürerek başarılı bir başlatma ile fonksiyonu tamamlarız.
return(INIT_SUCCEEDED);
“OnCalculate()” fonksiyonu, mevcut zaman dilimi zaman serisine dayalı olarak hesaplama türüyle fiyat değişikliklerini işlemek için göstergede çağrılır.
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[])
start adında bir tamsayı değişken oluşturalım. Değerini daha sonra atayacağız.
int start;
prev_calculated 0 ise indeks değerlerini (Düşük, Yüksek, Açılış ve Kapanış) ve start=1 değerini geri döndürmek veya prev_calculated-1 atanan start değerini geri döndürmek için “if” deyimini kullanırız.
if(prev_calculated==0) { haLow[0]=low[0]; haHigh[0]=high[0]; haOpen[0]=open[0]; haClose[0]=close[0]; start=1; } else start=prev_calculated-1;
Hesaplamaların ana döngüsü için “for” fonksiyonu kullanılır. “for” operatörü üç ifadeden ve çalıştırılabilir operatörlerden oluşur.
Üç ifade:
- i=start: Başlangıç konumu.
- i<rates_total && !IsStopped(): Döngüyü bitirme koşulları. IsStopped(), göstergenin zorla kapatılmasını kontrol eder.
- i++: Yeni bir i elde etmek için i değerine 1 ekler.
Döngü sırasında her seferinde yürütmemiz gereken işlemler:
double türünde dört değişken için hesaplama:
- haOpenVal - Heiken Ashi açılış değeri.
- haCloseVal - Heiken Ashi kapanış değeri.
- haHighVal - Heiken Ashi yüksek değeri.
- haLowVal - Heiken Ashi düşük değeri.
Önceki adımda hesaplanan değerlerin atanması şu şekildedir:
- haLow[i]=haLowVal
- haHigh[i]=haHighVal
- haOpen[i]=haOpenVal
- haClose[i]=haCloseVal
Heiken Ashi'nin açılış değerinin kapanış değerinden düşük olup olmadığını kontrol edelim. Eğer öyleyse, gösterge mavi renkli bir mum çizmeli, değilse kırmızı renkli bir mum çizmelidir.
for(int i=start; i<rates_total && !IsStopped(); i++) { double haOpenVal =(haOpen[i-1]+haClose[i-1])/2; double haCloseVal=(open[i]+high[i]+low[i]+close[i])/4; double haHighVal =MathMax(high[i],MathMax(haOpenVal,haCloseVal)); double haLowVal =MathMin(low[i],MathMin(haOpenVal,haCloseVal)); haLow[i]=haLowVal; haHigh[i]=haHighVal; haOpen[i]=haOpenVal; haClose[i]=haCloseVal; //--- set candle color if(haOpenVal<haCloseVal) haColor[i]=0.0; else haColor[i]=1.0; }
Bir sonraki çağrı için (rates_total) değerini prev_calculated olarak geri döndürerek fonksiyonu sonlandıralım.
return(rates_total);
Hata olmadığından emin olarak kodu derleyelim. Kodun tamamı aşağıda tek bir blok halinde verilmiştir:
//+------------------------------------------------------------------+ //| simpleHeikenAshi.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property indicator_separate_window #property indicator_buffers 5 #property indicator_plots 1 #property indicator_type1 DRAW_COLOR_CANDLES #property indicator_color1 clrBlue, clrRed #property indicator_width1 2 #property indicator_label1 "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close" double haOpen[]; double haHigh[]; double haLow[]; double haClose[]; double haColor[]; int OnInit() { SetIndexBuffer(0,haOpen,INDICATOR_DATA); SetIndexBuffer(1,haHigh,INDICATOR_DATA); SetIndexBuffer(2,haLow,INDICATOR_DATA); SetIndexBuffer(3,haClose,INDICATOR_DATA); SetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX); IndicatorSetInteger(INDICATOR_DIGITS,_Digits); IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi"); PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0); 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[]) { int start; if(prev_calculated==0) { haLow[0]=low[0]; haHigh[0]=high[0]; haOpen[0]=open[0]; haClose[0]=close[0]; start=1; } else start=prev_calculated-1; for(int i=start; i<rates_total && !IsStopped(); i++) { double haOpenVal =(haOpen[i-1]+haClose[i-1])/2; double haCloseVal=(open[i]+high[i]+low[i]+close[i])/4; double haHighVal =MathMax(high[i],MathMax(haOpenVal,haCloseVal)); double haLowVal =MathMin(low[i],MathMin(haOpenVal,haCloseVal)); haLow[i]=haLowVal; haHigh[i]=haHighVal; haOpen[i]=haOpenVal; haClose[i]=haCloseVal; if(haOpenVal<haCloseVal) haColor[i]=0.0; else haColor[i]=1.0; } return(rates_total); }
Başarılı bir derlemeden sonra, gösterge aşağıda gösterildiği gibi Kılavuz penceresindeki “Göstergeler” klasöründe kullanılabilir hale gelir.
Grafik üzerinde çalıştırırız. Standart ayarlar penceresi açılacaktır:
Renkler sekmesi varsayılan ayarları gösterir: yukarı doğru hareket için mavi, aşağı doğru hareket için kırmızı. Gerekirse, tercih ettiğiniz renkleri ayarlamak için bu değerleri düzenleyebilirsiniz.
Tamam düğmesine bastıktan sonra, gösterge grafiğe eklenir ve aşağıdaki gibi görünür:
Gördüğümüz gibi, gösterge ayrı bir alt pencerede çalışır. Mavi ve kırmızı mumlar fiyat yönünü gösterir (yükseliş ve düşüş). Şimdi MetaTrader 5'te oluşturduğumuz kendi göstergemiz var. Bunu herhangi bir alım-satım sisteminde kullanabiliriz. Şimdi yapacağımız şey bu.
Özel Heiken Ashi göstergesine dayalı Uzman Danışman
Bu bölümde, bir Uzman Danışmanda bir özel göstergenin nasıl kullanılacağını öğreneceğiz. Gösterge hesaplamasına göre gerçek fiyatlardan farklı olduklarını bildiğimiz gösterge fiyatlarını (Açılış, Yüksek, Düşük ve Kapanış) bize gösterebilecek basit bir Heiken Ashi sistemi oluşturacağız.
Bir Uzman Danışman oluşturalım. Tam kodu:
//+------------------------------------------------------------------+ //| heikenAshiSystem.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" int heikenAshi; int OnInit() { heikenAshi=iCustom(_Symbol,_Period,"My Files\\Heiken Ashi\\simpleHeikenAshi"); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { Print("Heiken Ashi System Removed"); } void OnTick() { double heikenAshiOpen[], heikenAshiHigh[], heikenAshiLow[], heikenAshiClose[]; CopyBuffer(heikenAshi,0,0,1,heikenAshiOpen); CopyBuffer(heikenAshi,1,0,1,heikenAshiHigh); CopyBuffer(heikenAshi,2,0,1,heikenAshiLow); CopyBuffer(heikenAshi,3,0,1,heikenAshiClose); Comment("heikenAshiOpen ",DoubleToString(heikenAshiOpen[0],_Digits), "\n heikenAshiHigh ",DoubleToString(heikenAshiHigh[0],_Digits), "\n heikenAshiLow ",DoubleToString(heikenAshiLow[0],_Digits), "\n heikenAshiClose ",DoubleToString(heikenAshiClose[0],_Digits)); }
Bu koddaki farklılıklar şunlardır:
Programın türü Uzman Danışmandır. Dolayısıyla, bu programın yapısı üç bölümden oluştuğu için farklı olacaktır.
- int OnInit() - Uzman Danışmanın başlatılması için kullanılır; bir tamsayı değer geri döndürür.
- void OnDeinit - Uzman Danışmanın çalışmasının sonlandırılması için kullanılır; hiçbir değer geri döndürmez.
- void OnTick() - her tikte yeni fiyatın işlenmesi için kullanılır; hiçbir değer geri döndürmez.
Önceki fonksiyonların kapsamı dışında ve onlardan önce heikenAshi adında bir tamsayı değişken oluşturalım.
int heikenAshi;
“OnInit()” kapsamı içinde, “iCustom” fonksiyonunun değerini heikenAshi değişkenine atayalım. “iCustom” fonksiyonu, burada “simpleHeikenAshi” olacak olan özel göstergenin tanıtıcısını geri döndürür, ancak “Göstergeler” klasöründeki herhangi bir özel göstergeyi kullanabilirsiniz. Parametreleri şunlardır:
- symbol - Sembol adı. Mevcut sembol için (_Symbol) kullanacağız.
- period - Zaman dilimi. Mevcut zaman dilimi için (_Period) kullanacağız.
- name - MetaTrader 5'inizin Indicators klasöründeki yolu ile özel göstergenin adı. Burada "My Files\\Heiken Ashi\\simpleHeikenAshi" kullanacağız.
Daha sonra başarılı başlatma için (INIT_SUCCEEDED) geri döndürerek fonksiyonu sonlandıralım.
int OnInit() { heikenAshi=iCustom(_Symbol,_Period,"My Files\\Heiken Ashi\\simpleHeikenAshi"); return(INIT_SUCCEEDED); }
“OnDeinit()” fonksiyonu içinde, Uzman Danışmanın kaldırıldığını bildirmek için “print” fonksiyonunu kullanalım.
void OnDeinit(const int reason) { Print("Heiken Ashi System Removed"); }
“OnTick()” fonksiyonunun içinde, kodumuzu tamamlamak için aşağıdakileri yapalım:
Heiken Ashi fiyatları (Açılış, Yüksek, Düşük ve Kapanış) için double türünde dört değişken oluşturalım.
double heikenAshiOpen[], heikenAshiHigh[], heikenAshiLow[], heikenAshiClose[];
“CopyBuffer” fonksiyonunu kullanarak özel göstergenin arabellek verilerini alalım. Parametreleri şunlardır:
- indicator_handle - Gösterge tanıtıcısı. (heikenAshi) kullanacağız.
- buffer_num - Kullanacağımız gösterge arabellek numarası. Açılış için (0), Yüksek için (1), Düşük için (2) ve Kapanış için (3) kullanacağız.
- start_pos - Kopyalanacak ilk elemanın konumu. Mevcut eleman için (0) kullanacağız.
- count - Kopyalanacak veri miktarı. (1) kullanacağız ve burada bundan daha fazlasına ihtiyacımız yok.
- buffer[] - Verilerin kopyalanacağı dizi. Açılış için (heikenAshiOpen), Yüksek için (heikenAshiHigh), Düşük için (heikenAshiLow) ve Kapanış için (heikenAshiClose) kullanacağız.
“Comment” fonksiyonunu kullanarak mevcut Heiken Ashi fiyatları (Açılış, Yüksek, Düşük ve Kapanış) ile grafikte yorum görüntüleyelim:
Comment("heikenAshiOpen ",DoubleToString(heikenAshiOpen[0],_Digits), "\n heikenAshiHigh ",DoubleToString(heikenAshiHigh[0],_Digits), "\n heikenAshiLow ",DoubleToString(heikenAshiLow[0],_Digits), "\n heikenAshiClose ",DoubleToString(heikenAshiClose[0],_Digits));
Bu kodu herhangi bir hata olmadan derleyelim ve çalıştıralım. Böylece Uzman Danışman mevcut Heiken Ashi değerlerini gösterecektir:
Gördüğümüz gibi, gösterge fiyatları grafiğin sol üst köşesinde yorum olarak görüntülenmektedir.
Heiken Ashi - EMA sistemi
Bu bölümde, sonucun daha iyi olup olmayacağını görmek için başka bir teknik araç ekleyeceğiz. Buradaki fikir, üstel hareketli ortalamayı kullanarak özel göstergenin sinyallerini filtrelemektir. Bunu yapmanın birçok yolu vardır: EMA'ya daha fazla özellik eklemek istiyorsak, EMA için başka bir özel gösterge oluşturabiliriz. Ardından, istediğimiz sinyalleri almak için yaptığımız gibi Uzman Danışmanda “iCustom” olarak kullanabiliriz. Ayrıca, göstergenin değerlerini yumuşatarak yumușatılmıș bir gösterge olușturabilir ve ardından sinyallerimizi alabiliriz. Uzman Danışmanımızdaki dahili “iMA” fonksiyonunu ondan sinyal almak için kullanabiliriz. Basitlik için bu yöntemi burada kullanacağız.
Uzman Danışmanın, her bir değerin konumlarını belirlemek için mevcut iki EMA'nın (hızlı ve yavaş), önceki hızlı EMA'nın ve Heiken Ashi kapanış fiyatının değerlerini sürekli olarak kontrol etmesini sağlamamız gerekir. Önceki heikenAshiClose değeri önceki fastEMA değerinden daha yüksekse ve mevcut fastEMA değeri mevcut SlowEMA değerinden daha yüksekse, Uzman Danışman bir alış sinyali geri döndürmeli ve bu değerleri grafikte görüntülemelidir. Önceki heikenAshiClose değeri önceki fastEMA değerinden daha düşükse ve mevcut fastEMA değeri mevcut SlowEMA değerinden daha düşükse, bu sefer Uzman Danışman bir satış sinyali geri döndürmeli ve yine bu değerleri grafikte görüntülemelidir.
Aşağıda bu programı oluşturmak için gerekli kodun tamamı yer almaktadır:
//+------------------------------------------------------------------+ //| heikenAsh-EMASystem.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" input int fastEMASmoothing=9; // Fast EMA Period input int slowEMASmoothing=18; // Slow EMA Period int heikenAshi; double fastEMAarray[], slowEMAarray[]; int OnInit() { heikenAshi=iCustom(_Symbol,_Period,"My Files\\Heiken Ashi\\simpleHeikenAshi"); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { Print("Heiken Ashi-EMA System Removed"); } void OnTick() { double heikenAshiOpen[], heikenAshiHigh[], heikenAshiLow[], heikenAshiClose[]; CopyBuffer(heikenAshi,0,0,3,heikenAshiOpen); CopyBuffer(heikenAshi,1,0,3,heikenAshiHigh); CopyBuffer(heikenAshi,2,0,3,heikenAshiLow); CopyBuffer(heikenAshi,3,0,3,heikenAshiClose); int fastEMA = iMA(_Symbol,_Period,fastEMASmoothing,0,MODE_SMA,PRICE_CLOSE); int slowEMA = iMA(_Symbol,_Period,slowEMASmoothing,0,MODE_SMA,PRICE_CLOSE); ArraySetAsSeries(fastEMAarray,true); ArraySetAsSeries(slowEMAarray,true); CopyBuffer(fastEMA,0,0,3,fastEMAarray); CopyBuffer(slowEMA,0,0,3,slowEMAarray); if(heikenAshiClose[1]>fastEMAarray[1]) { if(fastEMAarray[0]>slowEMAarray[0]) { Comment("Buy Signal", "\nfastEMA ",DoubleToString(fastEMAarray[0],_Digits), "\nslowEMA ",DoubleToString(slowEMAarray[0],_Digits), "\nprevFastEMA ",DoubleToString(fastEMAarray[1],_Digits), "\nprevHeikenAshiClose ",DoubleToString(heikenAshiClose[0],_Digits)); } } if(heikenAshiClose[1]<fastEMAarray[1]) { if(fastEMAarray[0]<slowEMAarray[0]) { Comment("Sell Signal", "\nfastEMA ",DoubleToString(fastEMAarray[0],_Digits), "\nslowEMA ",DoubleToString(slowEMAarray[0],_Digits), "\nprevFastEMA ",DoubleToString(fastEMAarray[1],_Digits), "\nheikenAshiClose ",DoubleToString(heikenAshiClose[0],_Digits)); } } }
Bu koddaki farklılıklar şunlardır:
Kullanıcı tercihine göre hızlı EMA periyodunun ve yavaş EMA periyodunun ayarlanabilmesi için özel girdiler oluşturalım.
input int fastEMASmoothing=9; // Fast EMA Period input int slowEMASmoothing=18; // Slow EMA Period
fastEMA ve slowEMA için iki dizi oluşturalım.
double fastEMAarray[], slowEMAarray[];
Heiken Ashi göstergesinin önceki kapanış değerlerini almak için “CopyBuffer”da kopyalanacak veri miktarını 3'e ayarlayalım.
CopyBuffer(heikenAshi,0,0,3,heikenAshiOpen); CopyBuffer(heikenAshi,1,0,3,heikenAshiHigh); CopyBuffer(heikenAshi,2,0,3,heikenAshiLow); CopyBuffer(heikenAshi,3,0,3,heikenAshiClose);
Hareketli ortalama göstergesinin tanıtıcısını geri döndüren dahili “iMA” fonksiyonunu kullanarak hızlı ve yavaş EMA'yı tanımlayalım. Parametreleri şunlardır:
- symbol - Sembol adı. Mevcut sembol için (_Symbol) kullanacağız.
- period - Zaman dilimi. Mevcut zaman dilimi için (_Period) kullanacağız.
- ma_period - Hareketli ortalamayı yumuşatmak için periyot. (fastEMASmoothing) ve (slowEMASmoothing) girdilerini kullanacağız.
- ma_shift - Göstergenin kayma miktarı. (0) kullanacağız.
- ma_method - Hareketli ortalamanın türü. Basit hareketli ortalama için (MODE_SMA) kullanacağız.
- applied_price - Hesaplamada kullanılacak fiyat türü. (PRICE_CLOSE) kullanacağız.
int fastEMA = iMA(_Symbol,_Period,fastEMASmoothing,0,MODE_SMA,PRICE_CLOSE); int slowEMA = iMA(_Symbol,_Period,slowEMASmoothing,0,MODE_SMA,PRICE_CLOSE);
AS_SERIES bayrağını ayarlamak için “ArraySetAsSeries” fonksiyonunu kullanalım. Parametreleri şunlardır:
- array[] - Ayarlamanın yapılacağı dizi. (fastEMAarray) ve (slowEMAarray) belirteceğiz.
- flag - Dizi indeksleme yönü. (true) belirteceğiz.
ArraySetAsSeries(fastEMAarray,true); ArraySetAsSeries(slowEMAarray,true);
“CopyBuffer” fonksiyonunu kullanarak EMA göstergesinin arabellek verilerini alalım.
CopyBuffer(fastEMA,0,0,3,fastEMAarray); CopyBuffer(slowEMA,0,0,3,slowEMAarray);
“if” deyimini kullanarak sinyal geri döndürmek için koşullar:
Alış sinyali durumunda
Önceki heikenAshiClose > önceki fastEMA ve mevcut fastEMA > mevcut slowEMA ise, Uzman Danışman bir alış sinyali ve aşağıdaki değerleri geri döndürmelidir:
- fastEMA
- slowEMA
- prevFastEMA
- prevHeikenAshiClose
if(heikenAshiClose[1]>fastEMAarray[1]) { if(fastEMAarray[0]>slowEMAarray[0]) { Comment("Buy Signal", "\nfastEMA ",DoubleToString(fastEMAarray[0],_Digits), "\nslowEMA ",DoubleToString(slowEMAarray[0],_Digits), "\nprevFastEMA ",DoubleToString(fastEMAarray[1],_Digits), "\nprevHeikenAshiClose ",DoubleToString(heikenAshiClose[0],_Digits)); }
Satış sinyali durumunda
Önceki heikenAshiClose < önceki fastEMA ve mevcut fastEMA < mevcut slowEMA ise, bu kez Uzman Danışman bir satış sinyali ve aşağıdaki değerleri geri döndürmelidir:
- fastEMA
- slowEMA
- prevFastEMA
- prevHeikenAshiClose
if(heikenAshiClose[1]<fastEMAarray[1]) { if(fastEMAarray[0]<slowEMAarray[0]) { Comment("Sell Signal", "\nfastEMA ",DoubleToString(fastEMAarray[0],_Digits), "\nslowEMA ",DoubleToString(slowEMAarray[0],_Digits), "\nprevFastEMA ",DoubleToString(fastEMAarray[1],_Digits), "\nheikenAshiClose ",DoubleToString(heikenAshiClose[0],_Digits)); } }
Kodu derledikten ve çalıştırdıktan sonra, aşağıdaki test durumlarında gösterildiği gibi sinyallerimizi alabiliriz.
Alış sinyali durumunda:
Bir önceki grafikte gördüğümüz üzere, sol üst köşede yorum olarak aşağıdaki değerlere sahibiz:
- Alış sinyali
- fastEMA
- prevFastEMA
- prevHeikenAshiClose
Satış sinyali durumunda:
Grafikte aşağıdaki değerlere sahibiz:
- Satış sinyali
- fastEMA
- prevFastEMA
- prevHeikenAshiClose
Sonuç
Bu makalede tartıştığımız her şeyi anladıysanız, kendi Heiken Ashi göstergenizi oluşturabilir veya hatta tercihlerinize göre bazı ek özellikler ekleyebilirsiniz. Bu, grafikleri okumanızı ve etkili kararlar almanızı kolaylaştıracaktır. Ek olarak, oluşturulan göstergeyi alım-satım sistemlerinizde Uzman Danışmanlarınızın bir parçası olarak kullanabileceksiniz, bahsettiğimiz ve örnek olarak sunduğumuz iki alım-satım sisteminde kullandığımız gibi.
- Heiken Ashi sistemi
- Heiken Ashi - EMA sistemi
Umarım makale sizin için yararlı olmuştur ve alım-satım hedeflerinize ulaşmanıza yardımcı olacaktır. Ayrıca, bu makaleden öğrendiklerinizi uygulamaya çalıştığınızı umuyorum, çünkü pratik yapmak öğrenme sürecinde çok önemli bir faktördür ve programlama becerilerinizi geliştirmeniz için çok faydalı olacaktır. Lütfen bu makaleden veya diğer kaynaklardan öğrendiğiniz her şeyi gerçek hesabınızda kullanmadan önce test etmeniz gerektiğini unutmayın. Bu makalenin temel amacı tamamen eğitimdir, bu nedenle dikkatli olmalısınız.
Bu makaleyi faydalı bulduysanız ve daha fazla makale okumak istiyorsanız, yazdığım diğer makalelere bakabilirsiniz. Umarım size de katkı sağlarlar.
MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal makale: https://www.mql5.com/en/articles/12510





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