English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
Heiken-Ashi Göstergesine Dayalı Bir Alım Satım Sistemi Örneği

Heiken-Ashi Göstergesine Dayalı Bir Alım Satım Sistemi Örneği

MetaTrader 5Örnekler | 15 Aralık 2021, 09:58
2 238 0
Dmitry Voronkov
Dmitry Voronkov

Giriş

ABD'de yirmi yıldan uzun bir süre önce mum grafiğin ortaya çıkmasıyla birlikte, Batı piyasalarında boğa ve ayı güçlerinin nasıl çalıştığının anlaşılması konusunda bir devrim yaşandı. Mum grafikler popüler bir alım satım enstrümanı haline geldi ve yatırımcılar grafiklerin okunmasını kolaylaştırmak için onlarla çalışmaya başladı. Ancak mum grafiklerin yorumlanması birbirinden farklılık gösterir.

Geleneksel mum grafiği değiştiren ve algılanmasını kolaylaştıran bu yöntemlerden biri de Heikin Ashi teknolojisi olarak adlandırılmaktadır.

1. «Nani Desu Ka?»*

Bu konuyla ilgili ilk yayın 2004 yılında, «Technical Analysis of STOCKS & COMMODITIES» dergisinin Şubat sayısında ortaya çıktı; burada Dan Valcu «Using The Heikin Ashi Technique» başlıklı bir makale yayınladı (orijinal makaleye bağlantı: )

adlı kendi Web sitesinde yazar, 2003 yazında Ichimoku teknolojisini incelediğine ve sıklıkla olduğu gibi, bir piyasanın açıkça görülebilen bir trendini gördüğü birkaç diyagramı tesadüfen keşfettiğine dikkat çekmektedir. Bunun bir Heikin-Ashi diyagramı olduğu veya daha açık olmak gerekirse, bazı değiştirilmiş mum grafikler olduğu ortaya çıktı.

Bu analiz yöntemi, çok başarılı olan ve bu yöntemi bugün dahi kullanan bir Japon yatırımcı tarafından geliştirilmiştir. Yazarı şaşkına çevirecek bir şekilde, kitaplarda veya internette ilgili başka bir bilgi bulamadı; bu nedenle bunu bir dergide yayınlayarak tüm yatırımcıların kullanımına sunmaya karar verdi.

Heikin-Ashi yöntemi (Japonca'da heikin "orta" veya "denge" ve ashi "ayak" veya "çubuk" anlamına gelir) trendleri, bunların yönlerini ve güçlerini değerlendirmek için kullanılan görsel bir araçtır. Bu, alım satımın "Kutsal Kasesi" değildir, ancak trendleri görselleştirmek için kesinlikle iyi ve kullanımı kolay bir enstrümandır.

OHLC mum grafik değerinin hesaplanmasının nasıl yapıldığını düşünelim:

Mevcut çubuğun kapanışı: haClose = (Açılış + Yüksek + Düşük + Kapanış) / 4
Mevcut çubuğun açılışı: haOpen = (haOpen [önce.] + HaClose [önce]) / 2
Mevcut çubuğun maksimum düzeyi: haHigh = Maks. (Yüksek, haOpen, haClose)
Mevcut çubuğun minimum düzeyi: haLow = Min. (Düşük, haOpen, haClose)

"Açılış", "Yüksek", "Düşük" ve "Kapanış" değerleri mevcut çubuğa atıfta bulunmaktadır. "ha" ön eki, heikin-ashi'nin karşılık gelen değiştirilmiş değerlerini göstermektedir.

Piyasa bilgilerinin algılanmasını kolaylaştırmak için, Heikin-Ashi teknolojisi, normal grafikteki düzensizliği ortadan kaldıran ve trendlerin ve konsolidasyonların daha iyi bir resmini sunan sentetik mum grafikler adlı grafikler oluşturarak geleneksel mum grafiğini değiştirir. Yalnızca bu yöntemle oluşturulan mum grafiğe bakarak, piyasaya ve onun tarzına ilişkin iyi bir genel bakış elde edebilirsiniz:

Şekil 1. Sol tarafta normal mum grafik(a), sağ tarafta Heikin-Ashi grafiği(b) gösterilmiştir.

Şekil 1'de, geleneksel Japon mum grafikleri ile Heiken Ashi mum grafikleri arasındaki fark gösterilmiştir. Bu grafiklerin ayırt edici özelliği, yukarı doğru bir trendde beyaz mumların çoğunun herhangi bir gölgeye sahip olmamasıdır. Düşen bir trendde, siyah mumların çoğunun üst gölgesi yoktur. Heiken Ashi grafiği kırılma göstermez; bu nedenle öncekinin orta seviyesinde yeni bir mum açılır.

Heiken-Ashi grafiğindeki mum grafikler, geleneksel mum grafiklere göre daha fazla trend göstergesi gösterir. Trend zayıfladığında, mum grafiklerin gövdeleri küçülür ve gölgeler büyür. Mum grafiklerin rengindeki değişiklik al / sat sinyalidir. Bu grafiklere dayanarak bir düzeltici hareketin sonunu belirlemek en uygunudur.

Bu gösterge MetaTrader 5'in bir parçasıdır ve onu «Indicators \\ Examples \\ Heiken_Ashi.mq5» klasöründe bulabilirsiniz. Göstergeyi grafiğe yüklemeden önce grafiği doğrusal yapmanızı tavsiye ederim. Ayrıca, grafik özelliklerinde, "Genel" sekmesinde, "üst grafikten" öğesinin işaretini kaldırın.

Heiken-Ashi yönteminin bir "Kutsal Kase" olmadığı gerçeğine bir kez daha dikkatinizi çekmek istiyorum. Bunu kanıtlamak için yalnızca bu tekniği kullanarak basit bir alım satım sistemi (TS) oluşturmaya çalışacağım.

Bunu yapmak için, MQL5 programlama dilini ve standart kitaplık sınıflarını kullanarak basit bir Expert Advisor oluşturmamız ve ardından MetaTrader 5 terminalinin strateji test cihazını kullanarak bunu geçmiş veriler üzerinde test etmemiz gerekiyor.

2. Alım Satım Sistemi Algoritması

İşleri çok karmaşık hale getirmeden, şu sitede Dan Valcu tarafından önerilen Heiken-Ashi prosedürünün altı temel kuralını kullanarak algoritmayı oluşturuyoruz: http://www.educofin.com/

  1. Artış trendi - mavi mum grafik haClose> haOpen
  2. Düşüş trendi - kırmızı mum grafik haClose <haOpen
  3. Güçlü bir artış trendi - içinde Düşük haOpen == haLow'un olmadığı mavi bir mum grafik
  4. Güçlü bir düşüş trendi - içinde Yüksek haOpen == haHigh'ın olmadığı kırmızı bir mum grafik
  5. Konsolidasyon - küçük gövdeli (herhangi bir renkte) ve uzun gölgeli bir dizi mum grafik
  6. Trend değişikliği - küçük gövdeli ve zıt renkte uzun gölgeli bir mum grafik. Bu her zaman güvenilir bir sinyal değildir ve bazen yalnızca konsolidasyonun bir parçası olabilir (5).

(1,2) eğiliminin anlaşılması kolaydır - bir işlemdeysek, pozisyonu bir önceki mum grafiğin 1-2 puan altında / üstünde hareket ettirerek tutmamız yeterlidir.

Güçlü bir eğilim (3,4) - durdurmayı yukarı çekerek aynı şekilde hareket ederiz.

Konsolidasyon (5) ve trend değişikliği (6), pozisyonu kapatır (durdurma tarafından kapatılmamışsa), ancak daha sonra zıt bir pozisyon açıp açmamaya karar vermemiz gerekir. Kararı vermek için, konsolidasyon mu yoksa tersine çevirme mi olduğunu bir şekilde belirlememiz gerekir. Göstergeler, mum grafik analizi veya grafik analizi üzerine kurulu bir filtreye ihtiyacımız olacak.

Makalemizin amaçları arasında karlı bir stratejinin oluşturulması değil, bunun sonucunda neleri başaracağımız yer almaktadır. Bu nedenle, zıt renkte bir mumun ortaya çıkması durumunda, pozisyonu kapatacağımızı ve zıt yönde yeni bir mum açacağımızı düşünelim.

Algoritmamız şu şekilde olur:

  1. Zıt renkte bir mum oluştuktan sonra, varsa bir önceki pozisyonu kapatırız ve yeni bir mumun açılışında bir pozisyon açarız, önceki mumun minimum/maksimum düzeyinin 2 puan altında/üstünde bir durdurma kurarız.
  2. Trend - durdurmayı önceki mumun minimum/ maksimum düzeyinin 2 puan altına /üstüne taşırız.
  3. Güçlü bir trendle, trendle aynı şekilde adımlar atıyoruz; yani durdurmayı hareket ettiriyoruz.

Genel olarak, her şey oldukça basit; bunun okuyucu için açık olacağını umuyorum. Şimdi bunu MQL5 diline uygulayacağız.

3. Expert Advisor'ı MQL5'te Programlama

Bir Expert Advisor oluşturmak için yalnızca bir giriş parametresine ihtiyacımız olacak - lotun boyutu, iki olay işleyicisinin OnInit (), OnTick () işlevleri ve kendi işlevimiz olan CheckForOpenClose ().

MQL5'te giriş parametrelerini ayarlamak için Giriş değişkenlerini kullanırız.

//--- input parameters
input double Lot=0.1;    // Port size

OnInit () işlevi, Init olay işleyicisidir. Başlatma olayları, Expert Advisor yüklendikten hemen sonra oluşturulur.

Bu işlevin kodunda göstergeyi Expert Advisor'a bağlayacağız. Yukarıda bahsettiğim gibi, standart MetaTrader 5 bir Heiken_Ashi.mq5 göstergesi içerir.

Göstergeyi hesaplamak için formüllerimiz varsa ve Expert Advisor kodundaki değerleri hesaplayabiliyorsak neden bu kadar karmaşıklık olduğunu merak ediyor olabilirsiniz. Evet, kabul ediyorum ki, bunu yapmak mümkün, ancak bunlardan birine dikkatlice bakarsanız:

haOpen=(haOpen[önceki]+haClose[önceki])/2

bağımsız hesaplamalar için belirli bir zorluk yaratan ve hayatımızı güçleştiren önceki değerleri kullandığını görürsünüz. Bu nedenle, bağımsız hesaplamalar yerine, özel göstergemizi, özellikle iCustom işlevini bağlamak için MQL5'in özelliklerinden yararlanacağız.

Bunu yapmak için OnInit() işlevinin gövdesine aşağıdaki satırı ekleriz:

   hHeiken_Ashi=iCustom(NULL,PERIOD_CURRENT,"Examples\\Heiken_Ashi");

bunun sonucunda, gelecekte ihtiyaç duyacağımız Heiken_Ashi.mq5 göstergesinin tanıtıcısı olan hHeiken_Ashi genel değişkenini elde ederiz.

OnTick () işlevi, yeni bir tick'in görünümüyle oluşturulan NewTick () olayının işleyicisidir.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- check the ability of trading and the calculated number of bars
   if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
      if(BarsCalculated(hHeiken_Ashi)>100)
        {
         CheckForOpenClose();
        }
//---
  }

TerminalInfoInteger işlevi (TERMINAL_TRADE_ALLOWED) alım satım işlemine izin verilip verilmediğini kontrol eder. BarsCalculated (HHeiken_Ashi) işlevini kullanarak, bizim durumumuzda Heiken_Ashi.mq5 olan istenen gösterge için hesaplanan veri miktarını kontrol ederiz.

Ve her iki koşul da karşılanırsa, ana işin gerçekleştiği CheckForOpenClose () işlevimizin yerine getirildiğini görürüz. Bunu daha dikkatli bir şekilde gözden geçirelim.

TS'mizin şartlarında, talimatların kurulumunun yeni bir mum grafiğin açılışında gerçekleştiği belirtildiği için yeni bir mum grafiğin açılıp açılmadığını belirlememiz gerekir. Bunu yapmanın birçok yolu vardır ama en basiti ticklerin hacmini kontrol etmektir. Dolayısıyla, tick hacmi bire eşitse, bu, yeni bir çubuğun açıldığını gösterir; bu durumda TS şartlarını kontrol etmeli ve talimat vermelisiniz.

Bunu şu şekilde uyguluyoruz:

//--- process the orders only after receiving the first tick of the new candlestick 
   MqlRates rt[1];
   if(CopyRates(_Symbol,_Period,0,1,rt)!=1)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }
   if(rt[0].tick_volume>1) return;

Bir öğe boyutunda MqlRates türünde bir değişken dizisi oluşturun. CopyRates () işlevini kullanarak son çubuğun değerlerini elde edin. Ardından tick hacmini kontrol edin ve birden büyükse işlevi sonlandırın, değilse hesaplamalara devam edin.

Daha sonra, #define yönergesini kullanarak birkaç anımsatıcı sabit bildiririz:

//--- to check the conditions we need the last three bars
#define  BAR_COUNT   3
//--- the number of indicator buffer for storage Open
#define  HA_OPEN     0
//--- the number of the indicator buffer for storage High
#define  HA_HIGH     1
//--- the number of indicator buffer for storage Low
#define  HA_LOW      2
//--- the number of indicator buffer for storage Close
#define  HA_CLOSE    3

Ardından diziyi bildiririz:

double   haOpen[BAR_COUNT],haHigh[BAR_COUNT],haLow[BAR_COUNT],haClose[BAR_COUNT];

ve CopyBuffer () işlevini kullanarak uygun dizilerdeki gösterge değerlerini elde ederiz.

   if(CopyBuffer(hHeiken_Ashi,HA_OPEN,0,BAR_COUNT,haOpen)!=BAR_COUNT
      || CopyBuffer(hHeiken_Ashi,HA_HIGH,0,BAR_COUNT,haHigh)!=BAR_COUNT
      || CopyBuffer(hHeiken_Ashi,HA_LOW,0,BAR_COUNT,haLow)!=BAR_COUNT
      || CopyBuffer(hHeiken_Ashi,HA_CLOSE,0,BAR_COUNT,haClose)!=BAR_COUNT)
     {
      Print("CopyBuffer from Heiken_Ashi failed, no data");
      return;
     }

Verilerin dizinin değişkenlerinde nasıl depolandığına dikkatinizi çekmek istiyorum.

"En eski" (geçmişte) çubuk, dizinin ilk öğesinde (sıfır) depolanır.

Sonuncuda "en yeni" (mevcut) çubuk depolanır: BAR_COUNT-1 (Şek. 2).

Şekil 2. Mum grafiklerin sırası ve dizinin indeks değerleri

Şekil 2. Mum grafiklerin sırası ve dizinin indeks değerleri

Ve böylece OHLC Heiken-Ashi değerlerini elde ettik; geriye pozisyonların açılması veya sürdürülmesi için koşulları doğrulamak kalıyor.

Satış sinyalinin işlenmesini ayrıntılı olarak göz önünde bulundurun.

Daha önce de belirttiğim gibi, üç Heiken-Ashi mum grafiğin değerlerini aldık. Mevcut değer, [BAR_COUNT-1 = 2] numaralı hücrelerde yer alır ve bizim için gerekli değildir. Önceki değerler [BAR_COUNT-2 = 1] hücrelerindedir ve önceki çubuklar [BAR_COUNT-3 = 0] hücrelerindedir (bkz. Şek. 2) ve bu iki çubuğa dayanarak alım satım işlemi yapma hüküm ve koşullarını kontrol edeceğiz.

Daha sonra enstrümandaki açık pozisyonları kontrol etmemiz gerekir. Bunu yapmak için varsayılan kitaplığın alım satım sınıflarına ait CPositionInfo sınıfını kullanacağız. Bu sınıf, açık pozisyonlar ile ilgili bilgi edinmemizi sağlar. Select (_Symbol) yöntemini kullanarak enstrümanımızdaki açık pozisyonların varlığını belirleriz ve bunlar varsa, o zaman Type () yöntemini kullanarak açık pozisyonların türünü belirleriz.

Şu anda satın almak için açık bir pozisyonumuz varsa, onu kapatmamız gerekir.

Bunu yapmak için, alım satım işlemlerini gerçekleştirmek için tasarlanmış standart sınıf kitaplığının CTrade sınıfı yöntemlerini kullanırız.

PositionClose (const dize sembolü, ulong sapma) yöntemini kullanarak, sembolün enstrümanın adı olduğu ve ikinci parametre olan sapmanın kapanış fiyatının izin verilebilir sapması olduğu satın alma işlemini kapatacağız.

Ardından mum grafiklerin kombinasyonunu TS'mize göre kontrol ederiz. Yeni oluşturulan mum grafiklerin yönünü zaten kontrol ettiğimiz için ([BAR_COUNT-2] indeksi ile), yalnızca ondan önceki mum grafiği kontrol etmemiz ([BAR_COUNT-3] indeksi ile) ve pozisyonu açmak için gerekli adımları gerçekleştirmemiz gerekir.

     //--- check if there is an open position, and if there is, close it
      if(posinf.Select(_Symbol))
        {
         if(posinf.Type()==POSITION_TYPE_BUY)
           {
            //            lot=lot*2;
            trade.PositionClose(_Symbol,3);
           }
        }
      //--- check and set Stop Loss level
      double stop_loss=NormalizeDouble(haHigh[BAR_COUNT-2],_Digits)+_Point*2;
      double stop_level=SymbolInfoDouble(_Symbol,SYMBOL_ASK)+SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)*_Point;
      if(stop_loss<stop_level) stop_loss=stop_level;
      //--- check the combination: the candle with the opposite color has formed
      if(haOpen[BAR_COUNT-3]<haClose[BAR_COUNT-3])
        {
         if(!trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,lot,SymbolInfoDouble(_Symbol,SYMBOL_BID),stop_loss,0))
            Print(trade.ResultRetcodeDescription());
        }
      else
      if(posinf.Select(_Symbol))
        {
         if(!trade.PositionModify(_Symbol,stop_loss,0))
            Print(trade.ResultRetcodeDescription());
        }

Burada dikkatinizi CTrade sınıfının üç yönteminin kullanımına yöneltmeniz gerekiyor:

  • Yöntem PositionOpen (sembol, order_type, hacim, fiyat, sl, tp, açıklama) Sembolün enstrümanın adı olduğu bir pozisyon açmak için kullanılır, order_type - talimat türü, hacim - lot boyutu, fiyat - satın alma fiyatı, sl - Durdurma, tp - kar, comment - açıklama.
  • Yöntem PositionModify (sembol, sl, tp) Sembolün enstrümanın adı olduğu durdurma ve karın değerini değiştirmek için kullanılır, sl - Durdurma, tp - kar. Bu yöntemi kullanmadan önce açık bir pozisyon olup olmadığını kontrol etmeniz gerektiğine dikkat çekmek istiyorum.
  • ResultRetcodeDescription () yöntemi, kod hatasının açıklamasını satır şeklinde almak için kullanılır.

stop_loss değişkeninin hesaplanmasında, haHigh [BAR_COUNT-2] değeri, göstergeden alınan bir hesaplamadır ve doğru bir şekilde kullanılması için NormalizeDouble (haHigh [BAR_COUNT-2], _Digits) işlevi tarafından yapılan normalleştirmeyi gerektirir.

Bu, sat sinyalinin işlenmesini tamamlar.

Satın almak için aynı prensibi kullanırız.

Expert Advisor'ın tam kodu şu şekildedir:

//+------------------------------------------------------------------+
//|                                           Heiken_Ashi_Expert.mq5 |
//|                                               Copyright VDV Soft |
//|                                                 vdv_2001@mail.ru |
//+------------------------------------------------------------------+
#property copyright "VDV Soft"
#property link      "vdv_2001@mail.ru"
#property version   "1.00"

#include <Trade\AccountInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>

//--- the list of global variables
//--- input parameters
input double Lot=0.1;    // Lot size
//--- indicator handles
int      hHeiken_Ashi;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   hHeiken_Ashi=iCustom(NULL,PERIOD_CURRENT,"Examples\\Heiken_Ashi");
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- trading should be allowed and number of bars calculated>100
   if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
      if(BarsCalculated(hHeiken_Ashi)>100)
        {
         CheckForOpenClose();
        }
//---
  }
//+------------------------------------------------------------------+
//| Checking of the position opening conditions                      |
//+------------------------------------------------------------------+
void CheckForOpenClose()
  {
//--- process orders only when new bar is formed
   MqlRates rt[1];
   if(CopyRates(_Symbol,_Period,0,1,rt)!=1)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }
   if(rt[0].tick_volume>1) return;

//--- to check the conditions we need the last three bars
#define  BAR_COUNT   3
//--- number of the indicator buffer for storage Open
#define  HA_OPEN     0
//--- number of the indicator buffer for storage High
#define  HA_HIGH     1
//--- number of the indicator buffer for storage Low
#define  HA_LOW      2
//--- number of the indicator buffer for storage Close
#define  HA_CLOSE    3

   double   haOpen[BAR_COUNT],haHigh[BAR_COUNT],haLow[BAR_COUNT],haClose[BAR_COUNT];

   if(CopyBuffer(hHeiken_Ashi,HA_OPEN,0,BAR_COUNT,haOpen)!=BAR_COUNT
      || CopyBuffer(hHeiken_Ashi,HA_HIGH,0,BAR_COUNT,haHigh)!=BAR_COUNT
      || CopyBuffer(hHeiken_Ashi,HA_LOW,0,BAR_COUNT,haLow)!=BAR_COUNT
      || CopyBuffer(hHeiken_Ashi,HA_CLOSE,0,BAR_COUNT,haClose)!=BAR_COUNT)
     {
      Print("CopyBuffer from Heiken_Ashi failed, no data");
      return;
     }
//---- check sell signals
   if(haOpen[BAR_COUNT-2]>haClose[BAR_COUNT-2])// bear candlestick 
     {
      CPositionInfo posinf;
      CTrade trade;
      double lot=Lot;
     //--- check if there is an open position, and if there is, close it
      if(posinf.Select(_Symbol))
        {
         if(posinf.Type()==POSITION_TYPE_BUY)
           {
            //            lot=lot*2;
            trade.PositionClose(_Symbol,3);
           }
        }
      //--- check and set Stop Loss level
      double stop_loss=NormalizeDouble(haHigh[BAR_COUNT-2],_Digits)+_Point*2;
      double stop_level=SymbolInfoDouble(_Symbol,SYMBOL_ASK)+SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)*_Point;
      if(stop_loss<stop_level) stop_loss=stop_level;
      //--- check the combination: the candle with the opposite color has formed
      if(haOpen[BAR_COUNT-3]<haClose[BAR_COUNT-3])
        {
         if(!trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,lot,SymbolInfoDouble(_Symbol,SYMBOL_BID),stop_loss,0))
            Print(trade.ResultRetcodeDescription());
        }
      else
      if(posinf.Select(_Symbol))
        {
         if(!trade.PositionModify(_Symbol,stop_loss,0))
            Print(trade.ResultRetcodeDescription());
        }
     }
//---- check buy signals
   if(haOpen[BAR_COUNT-2]<haClose[BAR_COUNT-2]) // bull candle
     {
      CPositionInfo posinf;
      CTrade trade;
      double lot=Lot;
     //--- check if there is an open position, and if there is, close it
      if(posinf.Select(_Symbol))
        {
         if(posinf.Type()==POSITION_TYPE_SELL)
           {
            //            lot=lot*2;
            trade.PositionClose(_Symbol,3);
           }
        }
      //--- check and set Stop Loss level
      double stop_loss=NormalizeDouble(haLow[BAR_COUNT-2],_Digits)-_Point*2;
      double stop_level=SymbolInfoDouble(_Symbol,SYMBOL_BID)-SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)*_Point;
      if(stop_loss>stop_level) stop_loss=stop_level;
      //--- check the combination: the candle with the opposite color has formed
      if(haOpen[BAR_COUNT-3]>haClose[BAR_COUNT-3])
        {
         if(!trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,lot,SymbolInfoDouble(_Symbol,SYMBOL_ASK),stop_loss,0))
            Print(trade.ResultRetcodeDescription());
        }
      else
      if(posinf.Select(_Symbol))
        {
         if(!trade.PositionModify(_Symbol,stop_loss,0))
            Print(trade.ResultRetcodeDescription());
        }

     }
  }
//+------------------------------------------------------------------+

Expert Advisor'ın tam metni ekteki Heiken_Ashi_Expert.mq5 dosyasında bulunabilir. Kataloga kopyalayın .. \\ MQL5 \\ Experts, ardından "Araçlar -&gt; MetaQuotes Dil Düzenleyicisi" menüsünden MetaEditor'ı çalıştırın veya «F4» tuşunu kullanın. Daha sonra "Gezgin" penceresinde, «Experts» sekmesini açın ve üzerine çift tıklayarak Heiken_Ashi_Expert.mq5 dosyasını düzenleme penceresine indirin ve «F7» tuşuna basarak derleyin.

Tüm işlemler doğru bir şekilde gerçekleştirildiyse, "Gezgin" penceresinde, "Expert Advisors" sekmesinde Heiken_Ashi_Expert dosyası oluşturulacaktır. Heiken_Ashi.mq5 göstergesi \\ MQL5 \\ Indicators \\ Examples \\ katalogunda konumlandırıldığı şekilde derlenmelidir.

4. Alım satım sistemini geçmiş veriler üzerinde test etme

Alım satım sistemimizin uygulanabilirliğini kontrol etmek için alım satım platformunun bir parçası olan MetaTrader 5 strateji test cihazını kullanacağız. Test cihazı, "Görünüm -&gt; Strateji Test Cihazı" terminal menüsünden veya « Ctrl + R » tuş kombinasyonuna basılarak çalıştırılır. Başlatıldığında, "Ayarlar" sekmesini buluruz (Şekil 3). 

 Şekil 3. Strateji Test Cihazı ayarları

Şekil 3.  Strateji Test Cihazı ayarları

Expert Advisor'ı Yapılandırma - Expert Advisor'lar listesinden seçim yapın, test aralığını 2000'in başından 2009'un sonuna kadar belirtin, ilk para yatırma miktarı 10.000 USD'dir, optimizasyonu devre dışı bırakın (çünkü yalnızca bir giriş parametremiz var ve biz yalnızca TS'nin uygulanabilirliğini kontrol etmek istiyoruz).

Test, iki para birimi çifti kullanılarak yapılacaktır. Ben EURUSD ve GBPUSD para birimi çiftlerini seçmeye karar verdim.

Test için aşağıdaki zaman aralıklarını almaya karar verdim: H3, H6 ve H12. Bunun neden olduğunu soracaksınız. Çünkü TS'yi MetaTrader4 terminalinde bulunmayan zaman aralıklarında test etmek istedim.

İşte başlıyoruz. EURUSD test para birimini, H3 test dönemini seçerek "Başlat"a tıklıyoruz. Testin tamamlanmasının ardından test cihazı penceresinde iki yeni sekme görürüz: "Sonuçlar" (Şek. 4) ve "Grafik" (Şek. 5).

Şekil 4. Strateji test cihazı ile EURUSD H3'ün test sonucu

Şekil 4. Strateji test cihazı ile EURUSD H3'ün test sonucu

Test sonuçlarından (Şek. 4) 2000'in başından 2009'un sonlarına kadar olan dönem için verilen parametrelerle TS'nin $ -2560,60 USD zarar ettiğini görebilirsiniz.

Grafikte (Şek. 5), bize zaman içinde TS'nin performansını gözden geçirme ve sistem hatalarının analizini yapma fırsatı sunan kar ve zararların zaman içindeki dağılımı gösterilmiştir.

 Şekil 5. Strateji Test Cihazının "Grafik" sekmesi (EURUSD H3)

Şekil 5. Strateji Test Cihazının "Grafik" sekmesi (EURUSD H3)

"Sonuçlar" sekmesinin varsayılan olarak basit bir rapor oluşturduğunu söylemeyi neredeyse unutuyordum. Ayrıca, işlemleri, talimatları ve yazılı dosya raporlarını görüntüleme olanağına sahibiz.

Bunu yapmak için, imleci sekmenin üzerine getirerek farenin sağ tuşuna tıklayıp uygun menü öğesini seçeriz:

Şekil 6. Strateji Test Cihazının "Sonuçlar" sekmesinin bağlam menüsü

Şekil 6. Strateji Test Cihazının Sonuçlar sekmesinin bağlam menüsü

Altı saatlik bir süre boyunca yapılan testlerin sonuçları (H6) şu şekildedir:

 Şekil 7. Strateji Test Cihazının (EURUSD H6) "Sonuçlar" sekmesi

Şekil 7. Strateji Test Cihazının Sonuçlar sekmesi (EURUSD H6)

on iki saatlik bir süre boyunca (H12).

 Şekil 8. Strateji Test Cihazı Sonuçları sekmesi (EURUSD H12)

Şekil 8.  Strateji Test Cihazı Sonuçları sekmesi (EURUSD H12)

EURUSD gibi para birimi çiftlerinde stratejimiz etkili değil gibi görünüyor. Ancak çalışma dönemindeki değişikliğin sonucu önemli ölçüde etkilediğini görebiliriz.

TS'mizin verimliliği konusunda nihai sonuçlara varmak için testimizi GBPUSD para birimi çiftine genişletiyoruz.

 Şekil 9. Strateji Test Cihazı Sonuçları sekmesi (GBPUSD H3)

Şekil 9.  Strateji Test Cihazı Sonuçları sekmesi (GBPUSD H3)

 Şekil 10. Strateji Test Cihazı Sonuçları sekmesi (GBPUSD H6)

Şekil 10.  Strateji Test Cihazı Sonuçları sekmesi (GBPUSD H6)


 Şekil 11. Strateji Test Cihazı Sonuçları sekmesi (GBPUSD H12)

Şekil 11.  Strateji Test Cihazı Sonuçları sekmesi (GBPUSD H12)

 Şekil 12. Strateji Test Cihazı Grafiği sekmesi (GBPUSD H12)

Şekil 12.  Strateji Test Cihazı Grafiği sekmesi (GBPUSD H12)

Test sonuçlarını analiz ettikten sonra, GBPUSD gibi bir para birimi çifti kullanarak sistemimizin iki ayrı durumda olumlu sonuçlar verdiğini gördük. On iki saatlik bir süre zarfında, dokuz yılda alınmasına rağmen 8903,23 USD gibi önemli bir kar elde ettik.

İlgilenen kişiler diğer para birimi çiftlerini test edebilir. Benim varsayımım, parite ne kadar değişken olursa o kadar iyi sonuç alınması ve daha uzun süre kullanılması gerektiğidir.

Sonuç

Sonuç olarak, bu alım satım sisteminin "Kutsal Kase" olmadığını ve tek başına kullanılamayacağını vurguluyorum.

Ancak, ek sinyallerle (mum grafik analizi, dalga analizi, göstergeler, trendler) tersine dönüş sinyallerini konsolidasyon sinyallerinden ayırırsak, o zaman bazı değişken alım satım enstrümanlarında, "çılgın" bir kar getirme olasılığı pek mümkün olmasa da, oldukça uygulanabilir olabilir.

__________________________________ 
* "Nani Desu Ka?" - Bu nedir?  (Japonca)

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

Ekli dosyalar |
Delphi'de MQL5 için DLL yazma kılavuzu Delphi'de MQL5 için DLL yazma kılavuzu
Makalede, Delphi programlama ortamında popüler ObjectPascal programlama dili kullanılarak bir DLL modülü oluşturma mekanizması incelenmektedir. Bu makalede sağlanan materyallerin, öncelikli olarak, dış DLL modüllerini bağlayarak MQL5'in gömülü programlama dilinin sınırlarını aşan problemleri çözmeye çalışan yeni başlayan programcıları hedeflemesi amaçlanmıştır.
Pozisyon odaklı MetaTrader 5 ortamındaki talimatları takip etmek için Sanal Talimat Yöneticisi Pozisyon odaklı MetaTrader 5 ortamındaki talimatları takip etmek için Sanal Talimat Yöneticisi
Bu sınıf kitaplığı, MetaTrader 5'in pozisyon tabanlı yaklaşımına kıyasla, MetaTrader 4'e genel olarak benzer talimat odaklı bir yaklaşımla yazılmasını sağlamak için bir MetaTrader 5 Expert Advisor'ına eklenebilir. Bunu, MetaTrader 5 istemci terminalinde sanal talimatları takip ederken, olağanüstü durum koruması için her pozisyon için koruyucu bir aracı durdurması sağlayarak yapar.
Mum Grafik Formasyonlarını Analiz Etme Mum Grafik Formasyonlarını Analiz Etme
Japon mum grafiğinin oluşturulması ve mum grafik formasyonlarının analizi, teknik analizin muhteşem bir alanını teşkil eder. Mum grafiklerin avantajı, verileri, verilerin içindeki dinamikleri takip edebileceğiniz şekilde temsil etmeleridir. Bu makalede mum grafik türlerini, mum grafik formasyonlarının sınıflandırılmasını analiz edecek ve mum grafik formasyonlarını belirleyebilecek bir gösterge sunacağız.
Birkaç Ara Gösterge Arabelleği Kullanarak Çok Para Birimli Gösterge Oluşturma Birkaç Ara Gösterge Arabelleği Kullanarak Çok Para Birimli Gösterge Oluşturma
FOREX piyasasının küme analizlerine ilgi son zamanlarda arttı. MQL5, döviz çiftlerinin hareket trendlerini araştırmak için yeni olanaklar sunar. MQL5'i MQL4'ten ayıran en önemli özelliği, sınırsız miktarda gösterge arabelleği kullanma olasılığıdır. Bu makalede, çok para birimli göstergesi oluşturma örneği açıklanmaktadır.