English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
preview
MQL5’i kullanarak bir özel gösterge (Heiken Ashi) nasıl oluşturulur?

MQL5’i kullanarak bir özel gösterge (Heiken Ashi) nasıl oluşturulur?

MetaTrader 5Alım-satım | 6 Şubat 2025, 12:42
262 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

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:

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.

Sorumluluk reddi: Sağlanan tüm bilgiler ’olduğu gibi’ yalnızca bilgilendirme amaçlıdır, alım-satım tavsiyesi değildir. Bu bilgiler herhangi bir sonucu garanti etmemektedir. Bu materyalleri herhangi bir işlem hesabında kullanırsanız, ortaya çıkabilecek tüm riskler size ait olacaktır.

Ö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.

Indicators klasörü

Aşağıdaki şekilde gösterildiği gibi yeni bir program oluşturmak için “Yeni” düğmesine tıklayın.

Yeni düğmesi

Devamında, oluşturulacak programın türünü seçmeniz gereken bir pencere açılacaktır. Burada “Özel gösterge”yi seçiyoruz.

Program seçimi

“İ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.

Gösterge detayları

Sonraki pencerelerde, gösterge hakkında daha fazla detayı belirleterek devam ediyoruz.

Gösterge detayları 2

Gösterge detayları 3

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.

Heiken Ashi göstergesi

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

simpleHeikenAshi

Grafik üzerinde çalıştırırız. Standart ayarlar penceresi açılacaktır:

simpleHeikenAshi gösterge penceresi

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.

simpleHeikenAshi ayarları Renkler sekmesi

Tamam düğmesine bastıktan sonra, gösterge grafiğe eklenir ve aşağıdaki gibi görünür:

Grafiğe eklenmiş simpleHeikenAshi

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:

heikenAshiSystem

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:

heikenAsh-EMASystem - Alış sinyali

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:

heikenAsh-EMASystem - Satış sinyali

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

Popülasyon optimizasyon algoritmaları: Armoni arama (Harmony Search, HS) Popülasyon optimizasyon algoritmaları: Armoni arama (Harmony Search, HS)
Bu makalede, mükemmel ses uyumunu bulma sürecinden esinlenen en güçlü optimizasyon algoritması olan armoni aramayı (HS) inceleyecek ve test edeceğiz. Peki şu anda sıralamamızda lider olan algoritma hangisi?
MQL5'i kullanarak trendler ve grafik formasyonları nasıl tespit edilir? MQL5'i kullanarak trendler ve grafik formasyonları nasıl tespit edilir?
Bu makalede, MQL5’i kullanarak trendler (yükseliş trendi, düşüş trendi, yatay hareket), grafik formasyonları (Çift Tepe, Çift Dip) gibi fiyat hareketi formasyonlarını otomatik olarak tespit etmek için bir yöntem sunacağız.
Popülasyon optimizasyon algoritmaları: Maymun algoritması (Monkey Algorithm, MA) Popülasyon optimizasyon algoritmaları: Maymun algoritması (Monkey Algorithm, MA)
Bu makalede, maymun algoritması (MA) optimizasyon algoritmasını ele alacağız. Bu hayvanların zorlu engelleri aşma ve en ulaşılmaz ağaç tepelerine ulaşma yeteneği, MA algoritması fikrinin temelini oluşturmuştur.
MacOS’ta MetaTrader 5 MacOS’ta MetaTrader 5
MacOS'ta MetaTrader 5 işlem platformu için özel bir yükleyici sağlıyoruz. Uygulamayı yerel olarak yüklemenizi sağlayan tam teşekküllü bir sihirbazdır. Yükleyici gerekli tüm adımları gerçekleştirir: sisteminizi tanımlar, en son Wine sürümünü indirir ve yükler, yapılandırır ve ardından MetaTrader'ı içine yükler. Tüm adımlar otomatik olarak tamamlanır ve kurulumdan hemen sonra platformu kullanmaya başlayabilirsiniz.