Ticaret robotlarını ücretsiz olarak nasıl indirebileceğinizi izleyin
Bizi Facebook üzerinde bulun!
Fan sayfamıza katılın
Komut dosyasını ilginç mi buldunuz?
Öyleyse bir link gönderin -
başkalarının da faydalanmasını sağlayın
Komut dosyasını beğendiniz mi? MetaTrader 5 terminalinde deneyin
Uzman Danışmanlar

MACD Sample - MetaTrader 5 için Uzman Danışman

Yayınlayan:
MetaQuotes
Görüntülemeler:
570
Derecelendirme:
(51)
Yayınlandı:
2022.03.21 09:25
Bu koda dayalı bir robota veya göstergeye mi ihtiyacınız var? Freelance üzerinden sipariş edin Freelance'e git

MACD Sample Uzman Danışmanı, MetaTrader 5 müşteri terminalinin standart paketine dahildir ve MACD göstergesini kullanarak işlem yapan bir Uzman Danışman örneğidir.

MACD Sample.mq5 Uzman Danışmanı dosyası terminal_veri_klasörü\MQL5\Experts\Examples\MACD\ klasöründe bulunur. Bu Uzman Danışman, Uzman Danışman geliştirmede nesne yönelimli yaklaşımın bir örneğidir.

Uzman Danışmanın yapısına ve nasıl çalıştığına daha yakından bakalım.


1. Uzman Danışmanın özellikleri

1.1. Uzman Danışmanın özellikleri

//+------------------------------------------------------------------+
//|                                                  MACD Sample.mq5 |
//|                   Copyright 2009-2013, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2009-2013, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version     "5.20"
#property description "Uzmanın normal bir grafik ile çalıştığından ve kullanıcının girdi değişkenlerini"
#property description "(Lots, TakeProfit, TrailingStop) ayarlarken herhangi bir hata yapmadığından"
#property description "emin olmak önemlidir, bizim durumumuzda TakeProfit'i 2*trend_period çubuktan"
#property description "daha fazla olacak şekilde grafik üzerinde kontrol ediyoruz."

İlk 5 satır yorum içerir, sonraki 7 satırsa #property önişlemci yönergesini kullanarak MQL5 programının özelliklerini (telif hakkı, link, sürüm, açıklama) ayarlar.

Uzman Danışman başlatıldığında, bunlar "Genel" sekmesinde görüntülenir:

MACD Sample Uzman Danışmanı

Şekil 1. MACD Sample Uzman Danışmanının genel parametreleri

1.2. Dosyaları dahil et

Ardından, #include yönergesini kullanarak derleyiciye Standart Kütüphanenin ticaret sınıflarını içeren dosyalarını eklemesi talimatı verilir.

  • Trade.mqh (CTrade - ticaret işlemleri için sınıf);
  • SymbolInfo.mqh (CSymbolInfo - işlem enstrümanının özellikleriyle çalışmak için sınıf);
  • PositionInfo.mqh (CPositionInfo - açık pozisyonun özellikleriyle çalışmak için sınıf);
  • AccountInfo.mqh (CAccountInfo - işlem hesabının özellikleriyle çalışmak için sınıf).
//--- dosyaları dahil et
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\AccountInfo.mqh>

İlgili sınıfların örnekleri daha sonra CExpert sınıfının üye değişkenleri olarak kullanılır (Bölüm 3).

1.3. Girdiler

Sonrasında türler, adlar, varsayılan değerler ve yorumlar belirtilir. Rolleri şekil 2'de gösterilmiştir.

//--- Uzman Danışmanın girdi parametreleri
input double InpLots          =0.1; // lot
input int    InpTakeProfit    =50;  // Kârı al (pip cinsinden)
input int    InpTrailingStop  =30;  // takip eden durdurucu seviyesi (pip cinsinden)
input int    InpMACDOpenLevel =3;   // MACD açılış seviyesi (pip cinsinden)
input int    InpMACDCloseLevel=2;   // MACD kapanış seviyesi (pip cinsinden)
input int    InpMATrendPeriod =26;  // MA trend periyodu

Girdi parametrelerinin adlarının "Inp" ön ekine sahip olduğuna dikkat edin. Global değişkenlerin önüne de "Ext" eklendiğine dikkat edin. Değişkenleri adlandırmaya yönelik bu yaklaşım, çok sayıda farklı değişkenle çalışmayı kolaylaştırır.

InpLots, işlem hacmini, InpTakeProfit ve InpTrailingStop ise Kârı Al ve Takip Eden Durdurucu seviyelerini belirler.

Girdi parametresi satırındaki yorumdaki metin, varsayılan değerlerle birlikte, girdi parametresinin adı yerine "Girdiler" sekmesinde görüntülenir:

Şekil 2. MACD Sample Uzman Danışmanının girdi parametreleri

Şekil 2. MACD Sample Uzman Danışmanının girdi parametreleri


1.4. Global değişkenler

Ardından ExtTimeOut global değişkeni bildirilir. Ticaret işlemlerinin gerçekleşme zamanını kontrol etmek için kullanılacaktır.

int ExtTimeOut=10; // ticaret işlemleri arasındaki süre (saniye cinsinden)

CSampleExpert sınıfının bildirilmesinden sonra, 76. satırda başka bir global değişken daha bildirilir: ExtExpert - CSampleExpert sınıfının bir örneği:

//--- ExtExpert global değişkeni
CSampleExpert ExtExpert;

ExtExpert nesnesi (CSampleExpert sınıfının bir örneği), ticaret stratejisinin temel mantığını içerir (Bölüm 3).


2. Olay yönetimi fonksiyonları

Olay yönetimi fonksiyonları

2.1. OnInit() başlatma fonksiyonu

OnInit() fonksiyonu, Uzman Danışmanın ilk başlatılması sırasında bir kez çağrılır. Genellikle OnInit() olay yöneticisinde Uzman Danışman çalışma için hazırlanır: girdi parametreleri kontrol edilir, göstergeler ve parametreler başlatılır, vb. Daha fazla çalışmanın anlamsız olduğu kritik hata olması durumunda, INIT_FAILED geri dönüş koduyla fonksiyondan çıkılır.

//+------------------------------------------------------------------+
//| Uzman Danışman başlatma fonksiyonu                               |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- gerekli tüm nesneleri başlat ve oluştur
   if(!ExtExpert.Init())
      return(INIT_FAILED);
//--- başarılı başlatma
   return(INIT_SUCCEEDED);
  }

Bu durumda, ExtExpert nesnesinin Init() metodu çağrılır, bu yöntem, çalışma için gerekli tüm nesnelerin başarılı bir şekilde hazırlanmasına bağlı olarak true veya false değerini geri döndürür (bkz. Bölüm 3.4). Bir hata durumunda, OnInit()'ten INIT_FAILED geri dönüş koduyla çıkılır - bu, başarısız başlatma durumunda Uzman Danışmanın / göstergenin çalışmasını sonlandırmanın doğru yoludur.


2.2. OnTick() fonksiyonu

OnTick() fonksiyonu, Uzman Danışmanın üzerinde çalıştığı grafiğin sembolü için her yeni teklif alındığında çağrılır.

//+------------------------------------------------------------------+
//| Uzman Danışman yeni tik yönetme fonksiyonu                       |
//+------------------------------------------------------------------+
void OnTick(void)
  {
   static datetime limit_time=0; // "son çağrı zamanı + timeout"u kaydeder
//--- gerekli süre geçmediyse çalışma
   if(TimeCurrent()>=limit_time)
     {
      //--- verileri kontrol et
      if(Bars(Symbol(),Period())>2*InpMATrendPeriod)
        {
         //--- Processing() metodunun çağrılmasından sonra, limit_time değerini ExtTimeOut kadar artır
         if(ExtExpert.Processing())
            limit_time=TimeCurrent()+ExtTimeOut;
        }
     }
  }

OnTick() olay yöneticisi, piyasayı analiz etmek ve ticaret koşulları karşılandığında ticaret işlemlerini gerçekleştirmek için kullanılan ExtExpert.Processing() metodunu periyodik olarak çağırmak için bir mekanizma uygular.

Çağrılar arasındaki süre, ExtTimeOut girdi parametresinin değeri ile belirlenir.


2.3. OnDeinit() Uzman Danışman sonlandırma fonksiyonu

OnDeInit(), Uzman Danışman grafikten kaldırıldığında çağrılır. Program çalışma sırasında grafik nesneleri yerleştirirse, bunlar tablodan kaldırılabilir.

Bu örnekte, sonlandırma fonksiyonu kullanılmamıştır, hiçbir eylem gerçekleştirilmemiştir.


3. CSampleExpert sınıfı

3.1. CSampleExpert sınıfı

//+------------------------------------------------------------------+
//| MACD Sample Uzman Danışmanı sınıfı örneği                        |
//+------------------------------------------------------------------+
class CSampleExpert
  {
protected: 
   //--- protected değişkenler - sınıf üyelerine yalnızca sınıf metotlarında erişilebilir 
   double            m_adjusted_point;             // 3/5 basamaklı fiyatlar için çarpan
   CTrade            m_trade;                      // CTrade sınıfı örneği
   CSymbolInfo       m_symbol;                     // CSymbolInfo sınıfı örneği
   CPositionInfo     m_position;                   // CPositionInfo sınıfı örneği
   CAccountInfo      m_account;                    // CAccountInfo sınıfı örneği
   //--- gösterge tanıtıcı değerleri
   int               m_handle_macd;                // MACD göstergesinin tanıtıcı değeri
   int               m_handle_ema;                 // Moving Average göstergesinin tanıtıcı değeri
   //--- gösterge arabellekleri
   double            m_buff_MACD_main[];           // MACD göstergesinin ana çizgisinin arabelleği
   double            m_buff_MACD_signal[];         // MACD göstergesinin sinyal çizgisinin arabelleği
   double            m_buff_EMA[];                 // EMA göstergesinin arabellekleri
   //--- mevcut gösterge değerleri
   double            m_macd_current;
   double            m_macd_previous;
   double            m_signal_current;
   double            m_signal_previous;
   double            m_ema_current;
   double            m_ema_previous;
   //--- seviyeler (standart puan cinsinden)
   double            m_macd_open_level;
   double            m_macd_close_level;
   double            m_traling_stop;
   double            m_take_profit;

public: 
   //--- yapıcı
                     CSampleExpert(void);
   //--- yıkıcı
                     ~CSampleExpert(void);
   //--- public metotlar - metotlara dışarıdan erişilebilir, sınıfın dışından çağrılabilirler 
   //--- başlatma metodu
   bool              Init(void);
   //--- sonlandırma metodu
   void              Deinit(void);
   //--- işleme metodu
   bool              Processing(void);
protected: 
   //--- protected metotlar - metotlar yalnızca sınıf metotlarında kullanılabilir 
   bool              InitCheckParameters(const int digits_adjust);
   bool              InitIndicators(void);
   bool              LongClosed(void);
   bool              ShortClosed(void);
   bool              LongModified(void);
   bool              ShortModified(void);
   bool              LongOpened(void);
   bool              ShortOpened(void);
  };

Uzman Danışman sınıfı, değişkenlerin (sınıf üyeleri) ve fonksiyonların (sınıf metotları) bildirimlerini içerir.

Değişkenlerle daha rahat çalışma için sınıfın üyesi olan tüm değişkenler, değişkenin sınıfın üyesi olduğunu gösteren "m_" (member) ön ekine sahiptir. Değişkenin veya metodun bildirilmesinden önce, türü (veya fonksiyonlar için geri dönüş değeri) belirtilir.

Sınıf üyesi değişkenlerin ve metotların görünürlüğü, erişim değiştiricileri kullanılarak ayarlanır. CSampleExpert sınıfında, protected ve public değiştiricileri kullanılır. public bölümünde tanımlanan tüm değişkenler ve metotlar herkese açıktır ve dışarıdan erişilebilir. CSampleExpert sınıfının bu türde beş metodu vardır:

  1. CSampleExpert(void) - yapıcı (sınıf örneği oluştururken otomatik olarak çağrılır);
  2. ~CSampleExpert(void) - yıkıcı (sınıf örneği silinirken otomatik olarak çağrılır);
  3. bool Init(void) - çalışma için gerekli tüm verilerin hazırlandığı başlatma metodu;
  4. void Deinit(void) - sonlandırma metodu;
  5. bool Processing(void) - işleme metodu.

protected erişim değiştiricisi ile bildirilen CSampleExpert sınıfı üyesi değişkenler, yalnızca CSampleExpert sınıfı metotlarında (ve alt sınıflar) kullanılabilir olacaktır.

    1. double           m_adjusted_point - 3/5 basamaklı fiyatlarla doğru çalışma için çarpan değişkeni;
    2. CTrade          m_trade - СTrade sınıfı örneği;
    3. CSymbolInfo  m_symbol - CSymbolInfo sınıfı örneği;
    4. CPositionInfo  m_position - СPositionInfo sınıfı örneği;
    5. CAccountInfo  m_account - CAccountInfo sınıfı örneği;
    6. int                 m_handle_macd - MACD göstergesinin tanıtıcı değerini saklamak için değişken;
    7. int                 m_handle_ema - EMA göstergesinin tanıtıcı değerini saklamak için değişken;
    8. double           m_buff_MACD_main[] - MACD'nin ana çizgisinin değerlerini istemek için kullanılan double türünde dinamik dizi;
    9. double           m_buff_MACD_signal[] - MACD'nin sinyal çizgisinin değerlerini istemek için kullanılan double türünde dinamik dizi;
    10. double           m_buff_EMA[] - EMA'nın çizgisinin değerlerini istemek için kullanılan double türünde dinamik dizi;
    11. double           m_macd_current - mevcut çubuğun MACD göstergesinin ana çizgisinin değerini saklamak için kullanılır;
    12. double           m_macd_previous - önceki çubuğun MACD göstergesinin ana çizgisinin değerini saklamak için kullanılır;
    13. double           m_signal_current - mevcut çubuğun MACD göstergesinin sinyal çizgisinin değerini saklamak için kullanılır;
    14. double           m_signal_previous - önceki çubuğun MACD göstergesinin sinyal çizgisinin değerini saklamak için kullanılır;
    15. double           m_ema_current - mevcut çubuğun EMA göstergesinin değerini saklamak için kullanılır;
    16. double           m_ema_previous - önceki çubuğun EMA göstergesinin değerini saklamak için kullanılır;
    17. double           m_macd_open_level;
    18. double           m_macd_close_level;
    19. double           m_traling_stop;
    20. double           m_take_profit - m_adjusted_point çarpanını dikkate alarak fiyat seviyelerinin (girdi parametrelerinde ayarlanan) değerlerini saklamak için kullanılır.

      protected erişim değiştiricisiyle bildirilen CSampleExpert sınıfı metotları:

      1. bool  InitCheckParameters(const int digits_adjust) - girdi parametrelerinin doğruluğunu kontrol eder ve Uzman Danışman parametrelerini başlatır;
      2. bool  InitIndicators(void) - MACD ve Moving Average göstergelerini başlatır (oluşturur);
      3. bool  LongClosed(void) - alış pozisyonunu kapatma için koşullar karşılanırsa true değerini geri döndürür (ve açık alış pozisyonunu kapatır);
      4. bool  ShortClosed(void) - satış pozisyonunu kapatma için koşullar karşılanırsa true değerini geri döndürür (ve açık satış pozisyonunu kapatır);
      5. bool  LongModified(void) - açık alış pozisyonunun Zararı Durdur seviyesini değiştirme için koşullar karşılanırsa true değerini geri döndürür (ve Zararı Durdur seviyesini değiştir);
      6. bool  ShortModified(void) - açık satış pozisyonunun Zararı Durdur seviyesini değiştirme için koşullar karşılanırsa true değerini geri döndürür (ve Zararı Durdur seviyesini değiştir);
      7. bool  LongOpened(void) - alış pozisyonu açma için koşullar karşılanırsa true değerini geri döndürür (ve alış pozisyonu açar);
      8. bool  ShortOpened(void) - satış pozisyonu açma için koşullar karşılanırsa true değerini geri döndürür (ve satış pozisyonunu açar).


      3.2. CSampleExpert sınıfı yapıcısı

      //+------------------------------------------------------------------+
      //| CSampleExpert sınıfı yapıcısı                                    |
      //+------------------------------------------------------------------+
      CSampleExpert::CSampleExpert(void) : m_adjusted_point(0),
                                           m_handle_macd(INVALID_HANDLE),
                                           m_handle_ema(INVALID_HANDLE),
                                           m_macd_current(0),
                                           m_macd_previous(0),
                                           m_signal_current(0),
                                           m_signal_previous(0),
                                           m_ema_current(0),
                                           m_ema_previous(0),
                                           m_macd_open_level(0),
                                           m_macd_close_level(0),
                                           m_traling_stop(0),
                                           m_take_profit(0)
        {
         ArraySetAsSeries(m_buff_MACD_main,true);
         ArraySetAsSeries(m_buff_MACD_signal,true);
         ArraySetAsSeries(m_buff_EMA,true);
        }

      Sınıf örneği nesnesi oluşturulduğunda, sınıf yapıcısı otomatik olarak çağrılır. Çağrıldığında, sınıf üyesi değişkenler için varsayılan değerler (parantez içinde) ayarlanır ve indeksleme yönü m_buff_MACD_main[], m_buff_MACD_signal[], m_buff_EMA[] dizileri için zaman serilerinde olduğu gibi ayarlanır.


      3.3. CSampleExpert sınıfı yıkıcısı

      //+------------------------------------------------------------------+
      //| CSampleExpert sınıfı yıkıcısı                                    |
      //+------------------------------------------------------------------+
      CSampleExpert::~CSampleExpert(void)
        {
        }

      CSampleExpert sınıfı yıkıcısı herhangi bir kod içermez.


      3.4. CSampleExpert sınıfının Init metodu

      //+------------------------------------------------------------------+
      //| başlat ve girdi parametrelerini doğrula                          |
      //+------------------------------------------------------------------+
      bool CSampleExpert::Init(void)
        {
      //--- genel özellikleri ayarla
         m_symbol.Name(Symbol());              // symbol
         m_trade.SetExpertMagicNumber(12345);  // magic
      //--- 3/5 basamaklı fiyatları dikkate al
         int digits_adjust=1;
         if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
            digits_adjust=10;
         m_adjusted_point=m_symbol.Point()*digits_adjust;
      //--- m_adjusted_point değiştiricisini dikkate alarak seviyelerin değerlerini ayarla
         m_macd_open_level =InpMACDOpenLevel*m_adjusted_point;
         m_macd_close_level=InpMACDCloseLevel*m_adjusted_point;
         m_traling_stop    =InpTrailingStop*m_adjusted_point;
         m_take_profit     =InpTakeProfit*m_adjusted_point;
      //--- 3 puan kayma ayarla
         m_trade.SetDeviationInPoints(3*digits_adjust);
      //---
         if(!InitCheckParameters(digits_adjust))
            return(false);
         if(!InitIndicators())
            return(false);
      //--- başarılı tamamlama
         return(true);
        }

      Init() metodunda, sınıf üyesi değişkenler başlatılır ve girdi parametreleri doğrulanır.

      m_symbol nesnesinin (CSymbolInfo sınıfı örneği) Name() metodunun çağrılması, Uzman Danışmanın üzerinde çalıştığı sembolün adını ayarlar, devamında m_trade nesnesinin (ticaret işlemleri için kullanılır) SetExpertMagicNumber() metodu çağrılır, bu metot da Uzman Danışmanın kimliğini (magic number) ayarlar. Sonrasında, sembollerin ondalık virgülünden sonraki basamak sayısını istemek için Digits() metodu kullanılır ve gerekirse seviyeler de düzeltilir.

      Ardından da, m_trade nesnesinin ticaret işlemlerinde izin verilen kayma değerini ayarlayan SetDeviationInPoints() metodu çağrılır.


      3.5. CSampleExpert sınıfının InitCheckParameters metodu

      //+------------------------------------------------------------------+
      //| girdi parametrelerini kontrol et                                 |
      //+------------------------------------------------------------------+
      bool CSampleExpert::InitCheckParameters(const int digits_adjust)
        {
      //--- Kârı Al seviyesinin doğruluğunu kontrol et
         if(InpTakeProfit*digits_adjust<m_symbol.StopsLevel())
           {
            printf("Kâr Al seviyesi %d seviyesinden yüksek olmalıdır",m_symbol.StopsLevel());
            return(false);
           }
      //--- Takip Eden Durdurucu seviyesinin doğruluğunu kontrol et
         if(InpTrailingStop*digits_adjust<m_symbol.StopsLevel())
           {
            printf("Takip Eden Durdurucu seviyesi %d seviyesinden yüksek olmalıdır",m_symbol.StopsLevel());
            return(false);
           }
      //--- işlem hacminin doğruluğunu kontrol et
         if(InpLots<m_symbol.LotsMin() || InpLots>m_symbol.LotsMax())
           {
            printf("Lot büyüklüğü %f ile %f aralığında olmalıdır",m_symbol.LotsMin(),m_symbol.LotsMax());
            return(false);
           }
         if(MathAbs(InpLots/m_symbol.LotsStep()-MathRound(InpLots/m_symbol.LotsStep()))>1.0E-10)
           {
            printf("Lot büyüklüğü, %f lot adımına karşılık gelmiyor",m_symbol.LotsStep());
            return(false);
           }
      //--- Kârı Al <= Takip Eden Durdurucu durumunda uyarı göster
         if(InpTakeProfit<=InpTrailingStop)
            printf("Uyarı: Takip Eden Durdurucu, Kârı Al'dan daha düşük olmalıdır");
      //--- başarılı tamamlama
         return(true);
        }

      Uzman Danışmanın girdi parametrelerinin doğruluğu InitCheckParameters() metodunda kontrol edilir. Parametrelerden herhangi biri geçersizse ilgili mesaj görüntülenir ve fonksiyon false geri döndürür.


      3.6. CSampleExpert sınıfının InitIndicators() metodu

      //+------------------------------------------------------------------+
      //| Gösterge başlatma metodu                                         |
      //+------------------------------------------------------------------+
      bool CSampleExpert::InitIndicators(void)
        {
      //--- MACD göstergesini oluştur
         if(m_handle_macd==INVALID_HANDLE)
            if((m_handle_macd=iMACD(NULL,0,12,26,9,PRICE_CLOSE))==INVALID_HANDLE)
              {
               printf("MACD göstergesi oluşturulurken hata oluştu");
               return(false);
              }
      //--- EMA göstergesini oluştur
         if(m_handle_ema==INVALID_HANDLE)
            if((m_handle_ema=iMA(NULL,0,InpMATrendPeriod,0,MODE_EMA,PRICE_CLOSE))==INVALID_HANDLE)
              {
               printf("EMA göstergesi oluşturulurken hata oluştu");
               return(false);
              }
      //--- başarılı tamamlama
         return(true);
        }

      InitIndicators() metodu, m_handle_macd ve m_handle_ema değişkenlerinin başlangıç değerlerinin doğruluğunu kontrol eder (yapıcıda başlatıldıkları için INVALID_HANDLE'a eşit olmalıdırlar) ve MACD ve Moving Average teknik göstergeleri oluşturur (iMACD ve iMA fonksiyonlarını kullanarak). Başarılı olursa, fonksiyon true değerini döndürür ve göstergelerin tanıtıcı değerleri m_handle_macd ve m_handle_ema sınıf üyelerine kaydedilir.

      Oluşturulan göstergelerin tanıtıcı değerleri daha sonra, hesaplanan veri miktarını kontrol etmek (BarsCalculated) ve Processing() metodundaki göstergelerin sayısal değerlerini almak (CopyBuffer) için kullanılır.


      3.7. CSampleExpert sınıfının LongClosed() metodu

      //+------------------------------------------------------------------+
      //| alış pozisyonunu kapatma koşullarını kontrol et                  |
      //+------------------------------------------------------------------+
      bool CSampleExpert::LongClosed(void)
        {
         bool res=false;
      //--- pozisyon kapatılmalı mı?
         if(m_macd_current>0)
            if(m_macd_current<m_signal_current && m_macd_previous>m_signal_previous)
               if(m_macd_current>m_macd_close_level)
                 {
                  //--- pozisyonu kapat
                  if(m_trade.PositionClose(Symbol()))
                     printf("%s alış pozisyonu kapatılacak",Symbol());
                  else
                     printf("%s pozisyonu kapatılırken hata oluştu: '%s'",Symbol(),m_trade.ResultComment());
                  res=true;
                 }
      //--- sonucu geri döndür
         return(res);
        }

      LongClosed() metodu, alış pozisyonunu kapatma için koşullar karşılanırsa true değerini geri döndürür (ve açık alış pozisyonunu kapatır):

      1. m_macd_current>0 - mevcut çubuğun MACD göstergesinin ana çizgisinin değeri pozitif (MACD histogramı sıfır çizgisinin üzerinde);
      2. m_macd_current<m_signal_current && m_macd_previous>m_signal_previous - MACD göstergesinin ana çizgisi, sinyal çizgisini aşağı doğru çaprazladı;
      3. m_macd_current>m_macd_close_level - mevcut çubuğun MACD göstergesinin ana çizgisinin değeri m_macd_close_level'dan yüksek.


      3.8. CSampleExpert sınıfının ShortClosed() metodu

      //+------------------------------------------------------------------+
      //| satış pozisyonunu kapatma koşullarını kontrol et                 |
      //+------------------------------------------------------------------+
      bool CSampleExpert::ShortClosed(void)
        {
         bool res=false;
      //--- pozisyon kapatılmalı mı?
         if(m_macd_current<0)
            if(m_macd_current>m_signal_current && m_macd_previous<m_signal_previous)
               if(MathAbs(m_macd_current)>m_macd_close_level)
                 {
                  //--- pozisyonu kapat
                  if(m_trade.PositionClose(Symbol()))
                     printf("%s satış pozisyonu kapatılacak",Symbol());
                  else
                     printf("%s pozisyonu kapatılırken hata oluştu: '%s'",Symbol(),m_trade.ResultComment());
                  res=true;
                 }
      //--- sonucu geri döndür
         return(res);
        }

      ShortClosed() metodu, satış pozisyonunu kapatma için koşullar karşılanırsa true değerini geri döndürür (ve açık satış pozisyonunu kapatır):

      1. m_macd_current<0 - mevcut çubuğun MACD göstergesinin ana çizgisinin değeri negatif (MACD histogramı sıfır çizgisinin altında);
      2. m_macd_current>m_signal_current && m_macd_previous<m_signal_previous - MACD göstergesinin ana çizgisi, sinyal çizgisini yukarı doğru çaprazladı;
      3. MathAbs(m_macd_current)>m_macd_close_level - mevcut çubuğun MACD göstergesinin ana çizgisinin değeri m_macd_close_level'dan yüksek.


      3.9. CSampleExpert sınıfının LongModified() metodu

      //+------------------------------------------------------------------+
      //| alış pozisyonunu değiştirme koşullarını kontrol et               |
      //+------------------------------------------------------------------+
      bool CSampleExpert::LongModified(void)
        {
         bool res=false;
      //--- Takip Eden Durdurucunun gerekli olup olmadığını kontrol et
         if(InpTrailingStop>0)
           {
            if(m_symbol.Bid()-m_position.PriceOpen()>m_adjusted_point*InpTrailingStop)
              {
               double sl=NormalizeDouble(m_symbol.Bid()-m_traling_stop,m_symbol.Digits());
               double tp=m_position.TakeProfit();
               if(m_position.StopLoss()<sl || m_position.StopLoss()==0.0)
                 {
                  //--- pozisyonun Zararı Durdur ve Kârı Al seviyelerini değiştir
                  if(m_trade.PositionModify(Symbol(),sl,tp))
                     printf("%s alış pozisyonu değiştirilecek",Symbol());
                  else
                    {
                     printf("%s pozisyonu değiştirilirken hata oluştu: '%s'",Symbol(),m_trade.ResultComment());
                     printf("Parametreleri değiştir: SL=%f,TP=%f",sl,tp);
                    }
                  res=true;
                 }
              }
           }
      //--- sonucu geri döndür
         return(res);
        }

      LongModified() metodu, alış pozisyonunu değiştirme koşulları karşılanırsa true değerini geri döndürür (ve pozisyonun Zararı Durdur değerini değiştirir). InpTrailingStop girdi parametresinin değeri sıfırdan büyükse ise, fiyatın InpTrailingStop'ı pozisyonun açılış yönüne doğru çaprazlayıp çaprazlamadığı kontrol edilir. Ardından, Zararı Durdur seviyesinin yeni değeri hesaplanır ve açık pozisyonun Zararı Durdur parametresi değiştirilir.


      3.10. CSampleExpert sınıfının ShortModified metodu

      //+------------------------------------------------------------------+
      //| satış pozisyonunu değiştirme koşullarını kontrol et              |
      //+------------------------------------------------------------------+
      bool CSampleExpert::ShortModified(void)
        {
         bool   res=false;
      //--- Takip Eden Durdurucunun gerekli olup olmadığını kontrol et
         if(InpTrailingStop>0)
           {
            if((m_position.PriceOpen()-m_symbol.Ask())>(m_adjusted_point*InpTrailingStop))
              {
               double sl=NormalizeDouble(m_symbol.Ask()+m_traling_stop,m_symbol.Digits());
               double tp=m_position.TakeProfit();
               if(m_position.StopLoss()>sl || m_position.StopLoss()==0.0)
                 {
                  //--- pozisyonun Zararı Durdur ve Kârı Al seviyelerini değiştir
                  if(m_trade.PositionModify(Symbol(),sl,tp))
                     printf("%s satış pozisyonu değiştirilecek",Symbol());
                  else
                    {
                     printf("%s pozisyonu değiştirilirken hata oluştu: '%s'",Symbol(),m_trade.ResultComment());
                     printf("Parametreleri değiştir: SL=%f,TP=%f",sl,tp);
                    }
                  res=true;
                 }
              }
           }
      //--- sonucu geri döndür
         return(res);
        }

      ShortModified() metodu, satış pozisyonunu değiştirme koşulları karşılanırsa true değerini geri döndürür (ve pozisyonun Zararı Durdur değerini değiştirir). InpTrailingStop girdi parametresinin değeri sıfırdan büyükse ise, fiyatın InpTrailingStop'ı pozisyonun açılış yönüne doğru çaprazlayıp çaprazlamadığı kontrol edilir. Ardından, Zararı Durdur seviyesinin yeni değeri hesaplanır ve açık pozisyonun Zararı Durdur parametresi değiştirilir.


      3.11. CSampleExpert sınıfının LongOpened() metodu

      //+------------------------------------------------------------------+
      //| alış pozisyonu açma koşullarını kontrol et                       |
      //+------------------------------------------------------------------+
      bool CSampleExpert::LongOpened(void)
        {
         bool res=false;
      //--- alış pozisyonu açma koşullarını kontrol et
         if(m_macd_current<0)
            if(m_macd_current>m_signal_current && m_macd_previous<m_signal_previous)
               if(MathAbs(m_macd_current)>(m_macd_open_level) && m_ema_current>m_ema_previous)
                 {
                  double price=m_symbol.Ask();
                  double tp   =m_symbol.Bid()+m_take_profit;
                  //--- serbest marjini kontrol et
                  if(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_BUY,InpLots,price)<0.0)
                     printf("Yeterli para yok. Serbest marjin = %f",m_account.FreeMargin());
                  else
                    {
                     //--- alış pozisyonu aç
                     if(m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,InpLots,price,0.0,tp))
                        printf("%s alış pozisyonu açılacak",Symbol());
                     else
                       {
                        printf("%s alış pozisyonu açılırken hata oluştu: '%s'",Symbol(),m_trade.ResultComment());
                        printf("Parametreler: price=%f,TP=%f",price,tp);
                       }
                    }
                  res=true;
                 }
      //--- sonucu geri döndür
         return(res);
        }

      LongOpened() metodu, alış pozisyonu açma için koşullar karşılanırsa true değerini geri döndürür (ve alış pozisyonu açar);

      1. m_macd_current<0 - mevcut çubuğun MACD göstergesinin ana çizgisinin değeri negatif (MACD histogramı sıfır çizgisinin altında);
      2. m_macd_current>m_signal_current && m_macd_previous<m_signal_previous - MACD göstergesinin ana çizgisi, sinyal çizgisini yukarı doğru çaprazladı;
      3. MathAbs(m_macd_current)>m_macd_open_level - mevcut çubuğun MACD göstergesinin ana çizgisinin değeri m_macd_open_level'dan yüksek;
      4. m_ema_current>m_ema_previous - EMA yükseliyor.

      Tüm koşullar karşılandığında, yeterli miktarda serbest marjın bulunup bulunmadığı kontrol edilir (Standart Kütüphanenin CAccountInfo sınıfının FreeMarginCheck() metodu kullanılır) ve CTrade sınıfının PositionOpen() metodu kullanılarak alış pozisyonu açılır.


      3.12. CSampleExpert sınıfının ShortOpened metodu

      //+------------------------------------------------------------------+
      //| satış pozisyonu açma koşullarını kontrol et                      |
      //+------------------------------------------------------------------+
      bool CSampleExpert::ShortOpened(void)
        {
         bool res=false;
      //--- satış pozisyonu açma koşullarını kontrol et
         if(m_macd_current>0)
            if(m_macd_current<m_signal_current && m_macd_previous>m_signal_previous)
               if(m_macd_current>(m_macd_open_level) && m_ema_current<m_ema_previous)
                 {
                  double price=m_symbol.Bid();
                  double tp   =m_symbol.Ask()-m_take_profit;
                  //--- serbest marjini kontrol et
                  if(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_SELL,InpLots,price)<0.0)
                     printf("Yeterli para yok. Serbest marjin = %f",m_account.FreeMargin());
                  else
                    {
                     //--- satış pozisyonu aç
                     if(m_trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,InpLots,price,0.0,tp))
                        printf("%s satış pozisyonu açılacak",Symbol());
                     else
                       {
                        printf("%s satış pozisyonu açılırken hata oluştu: '%s'",Symbol(),m_trade.ResultComment());
                        printf("Parametreler: price=%f,TP=%f",price,tp);
                       }
                    }
                  res=true;
                 }
      //--- sonucu geri döndür
         return(res);
        }

      ShortOpened() metodu, satış pozisyonu açma için koşullar karşılanırsa true değerini geri döndürür (ve satış pozisyonunu açar):

      1. m_macd_current>0 - mevcut çubuğun MACD göstergesinin ana çizgisinin değeri pozitif (MACD histogramı sıfır çizgisinin üzerinde);
      2. m_macd_current<m_signal_current && m_macd_previous>m_signal_previous - MACD göstergesinin ana çizgisi, sinyal çizgisini aşağı doğru çaprazladı;
      3. m_macd_current>m_macd_open_level - mevcut çubuğun MACD göstergesinin ana çizgisinin değeri m_macd_open_level'dan yüksek;
      4. m_ema_current<m_ema_previous - EMA düşüyor.

      Tüm koşullar karşılandığında, yeterli miktarda serbest marjın bulunup bulunmadığı kontrol edilir (Standart Kütüphanenin CAccountInfo sınıfının FreeMarginCheck() metodu kullanılır) ve CTrade sınıfının PositionOpen() metodu kullanılarak satış pozisyonu açılır.


      3.13 CSampleExpert sınıfının Processing() metodu

      //+----------------------------------------------------------------------------+
      //| ana fonksiyon, herhangi bir pozisyon işlenirse true değerini geri döndürür |
      //+----------------------------------------------------------------------------+
      bool CSampleExpert::Processing(void)
        {
      //--- fiyatları günceller
         if(!m_symbol.RefreshRates())
            return(false);
      //--- gösterge değerlerini güncelle
         if(BarsCalculated(m_handle_macd)<2 || BarsCalculated(m_handle_ema)<2)
            return(false);
         if(CopyBuffer(m_handle_macd,0,0,2,m_buff_MACD_main)  !=2 ||
            CopyBuffer(m_handle_macd,1,0,2,m_buff_MACD_signal)!=2 ||
            CopyBuffer(m_handle_ema,0,0,2,m_buff_EMA)         !=2)
            return(false);
      //--- göstergelerle çalışmayı basitleştirmek ve daha hızlı erişim için
      //--- göstergelerin mevcut değerleri dahili değişkenlere (sınıf üyelerine) kaydedilir
         m_macd_current   =m_buff_MACD_main[0];
         m_macd_previous  =m_buff_MACD_main[1];
         m_signal_current =m_buff_MACD_signal[0];
         m_signal_previous=m_buff_MACD_signal[1];
         m_ema_current    =m_buff_EMA[0];
         m_ema_previous   =m_buff_EMA[1];
      //--- piyasaya doğru giriş önemlidir, ancak piyasadan doğru çıkış daha da önemlidir
      //--- ilk olarak açık pozisyon var olup olmadığını kontrol et
         if(m_position.Select(Symbol()))
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               //--- gerekirse, alış pozisyonunu kapat veya değiştir
               if(LongClosed())
                  return(true);
               if(LongModified())
                  return(true);
              }
            else
              {
               //--- gerekirse, satış pozisyonunu kapat veya değiştir
               if(ShortClosed())
                  return(true);
               if(ShortModified())
                  return(true);
              }
           }
      //--- açık pozisyon yok
         else
           {
            //--- koşulları kontrol et ve gerekirse alış pozisyonu aç
            if(LongOpened())
               return(true);
            //--- koşulları kontrol et ve gerekirse satış pozisyonu aç
            if(ShortOpened())
               return(true);
           }
      //--- pozisyon işleme olmadan çık
          return(false);
        }

      CSampleExpert sınıfının Processing() metodu, Uzman Danışmanın metodudur. Processing() metodu, OnTick() olay yöneticisinde çağrılır ve bu metodun ardışık çağrıları arasındaki süre izlenir (en az ExtTimeOut saniye) (Bölüm 2.2).

      CSymbolInfo sınıfının RefreshRates() metodu çağrılarak fiyatlar güncellenir. BarsCalculated() fonksiyonu, MACD ve Moving Average göstergelerinin hesaplandığı çubuk sayısını istemek için kullanılır (Bölüm 3.6.); çubuk sayısı 2'den azsa, fonksiyon false geri döndürerek çıkar.

      Ardından, CopyBuffer fonksiyonu çağrısı, teknik göstergelerin (MACD'nin ana ve sinyal çizgileri ve Moving Average değerleri) son iki değerini ister; ve kopyalanan veri miktarı ikiden az ise, fonksiyondan çıkılır. Bundan sonra m_buff_MACD_main[], m_buff_MACD_signal[] ve m_buff_EMA[] dizilerinden göstergelerin değerleri m_macd_current, m_macd_previous, m_signal_current, m_signal_previous, m_ema_current ve m_ema_previous değişkenlerine kopyalanır.

      Sonraki adım pozisyonla çalışmaktır, bu, Standart Kütüphanenin CPositionInfo sınıfı kullanılarak yapılır. Select() metodu çağrısı true geri döndürdüyse, bu, şu anda bir açık pozisyon olduğu anlamına gelir, pozisyonun türü PositionType() metodu kullanılarak belirlenir. Açık pozisyonun türüne göre daha fazla çalışma yapılır.


      4. Geriye dönük test

      En iyi girdi parametreleri kümesi, MetaTrader 5 müşteri terminalinin Strateji Sınayıcısı kullanılarak bulunabilir.

      Şekil 3, Uzman Danışmanın 2013 için varsayılan ayarlarla testinin sonuçlarını gösterir.

      Şekil 3. MACD Sample Uzman Danışmanının geriye dönük test sonuçları

      Şekil 3. MACD Sample Uzman Danışmanının geriye dönük test sonuçları

      Sonuçlar

      MetaTrader 5 terminalinin standart paketinde bulunan MACD Sample Uzman Danışmanı, Uzman Danışman geliştirmede nesne yönelimli yaklaşımın bir örneğidir.


      MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
      Orijinal kod: https://www.mql5.com/ru/code/2154

      Moving Average Moving Average

      Moving Average Uzman Danışmanı, fiyatın MA'yı çaprazlamasıyla işlem gerçekleştirir.

      ALGLIB - Sayısal Analiz Kütüphanesi ALGLIB - Sayısal Analiz Kütüphanesi

      MQL5'e port edilen ALGLIB (sürüm 3.19) matematiksel fonksiyon kütüphanesi.

      SignalsDemo SignalsDemo

      Bu Uzman Danışman, sinyallerin özelliklerini görüntüler, sinyal kopyalama ayarlarının yönetilmesine ve seçilen ticaret sinyaline abone olunmasına veya aboneliğin iptal edilmesine olanak sağlar.

      QuotesDemo QuotesDemo

      Google Finance'ten dünya endekslerinin fiyatlarını alma örneği.