Fan sayfamıza katılın
Öyleyse bir link gönderin -
başkalarının da faydalanmasını sağlayın
MACD Sample - MetaTrader 5 için Uzman Danışman
- Yayınlayan:
- MetaQuotes
- Görüntülemeler:
- 616
- Derecelendirme:
- 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:
Ş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
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:
- CSampleExpert(void) - yapıcı (sınıf örneği oluştururken otomatik olarak çağrılır);
- ~CSampleExpert(void) - yıkıcı (sınıf örneği silinirken otomatik olarak çağrılır);
- bool Init(void) - çalışma için gerekli tüm verilerin hazırlandığı başlatma metodu;
- void Deinit(void) - sonlandırma metodu;
- 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.
- double m_adjusted_point - 3/5 basamaklı fiyatlarla doğru çalışma için çarpan değişkeni;
- CTrade m_trade - СTrade sınıfı örneği;
- CSymbolInfo m_symbol - CSymbolInfo sınıfı örneği;
- CPositionInfo m_position - СPositionInfo sınıfı örneği;
- CAccountInfo m_account - CAccountInfo sınıfı örneği;
- int m_handle_macd - MACD göstergesinin tanıtıcı değerini saklamak için değişken;
- int m_handle_ema - EMA göstergesinin tanıtıcı değerini saklamak için değişken;
- double m_buff_MACD_main[] - MACD'nin ana çizgisinin değerlerini istemek için kullanılan double türünde dinamik dizi;
- double m_buff_MACD_signal[] - MACD'nin sinyal çizgisinin değerlerini istemek için kullanılan double türünde dinamik dizi;
- double m_buff_EMA[] - EMA'nın çizgisinin değerlerini istemek için kullanılan double türünde dinamik dizi;
- double m_macd_current - mevcut çubuğun MACD göstergesinin ana çizgisinin değerini saklamak için kullanılır;
- double m_macd_previous - önceki çubuğun MACD göstergesinin ana çizgisinin değerini saklamak için kullanılır;
- double m_signal_current - mevcut çubuğun MACD göstergesinin sinyal çizgisinin değerini saklamak için kullanılır;
- double m_signal_previous - önceki çubuğun MACD göstergesinin sinyal çizgisinin değerini saklamak için kullanılır;
- double m_ema_current - mevcut çubuğun EMA göstergesinin değerini saklamak için kullanılır;
- double m_ema_previous - önceki çubuğun EMA göstergesinin değerini saklamak için kullanılır;
- double m_macd_open_level;
- double m_macd_close_level;
- double m_traling_stop;
- 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ı:
- bool InitCheckParameters(const int digits_adjust) - girdi parametrelerinin doğruluğunu kontrol eder ve Uzman Danışman parametrelerini başlatır;
- bool InitIndicators(void) - MACD ve Moving Average göstergelerini başlatır (oluşturur);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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):
- m_macd_current>0 - mevcut çubuğun MACD göstergesinin ana çizgisinin değeri pozitif (MACD histogramı sıfır çizgisinin üzerinde);
- m_macd_current<m_signal_current && m_macd_previous>m_signal_previous - MACD göstergesinin ana çizgisi, sinyal çizgisini aşağı doğru çaprazladı;
- 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):
- m_macd_current<0 - mevcut çubuğun MACD göstergesinin ana çizgisinin değeri negatif (MACD histogramı sıfır çizgisinin altında);
- m_macd_current>m_signal_current && m_macd_previous<m_signal_previous - MACD göstergesinin ana çizgisi, sinyal çizgisini yukarı doğru çaprazladı;
- 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);
- m_macd_current<0 - mevcut çubuğun MACD göstergesinin ana çizgisinin değeri negatif (MACD histogramı sıfır çizgisinin altında);
- m_macd_current>m_signal_current && m_macd_previous<m_signal_previous - MACD göstergesinin ana çizgisi, sinyal çizgisini yukarı doğru çaprazladı;
- 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;
- 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):
- m_macd_current>0 - mevcut çubuğun MACD göstergesinin ana çizgisinin değeri pozitif (MACD histogramı sıfır çizgisinin üzerinde);
- m_macd_current<m_signal_current && m_macd_previous>m_signal_previous - MACD göstergesinin ana çizgisi, sinyal çizgisini aşağı doğru çaprazladı;
- m_macd_current>m_macd_open_level - mevcut çubuğun MACD göstergesinin ana çizgisinin değeri m_macd_open_level'dan yüksek;
- 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ı
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 Uzman Danışmanı, fiyatın MA'yı çaprazlamasıyla işlem gerçekleştirir.
ALGLIB - Sayısal Analiz KütüphanesiMQL5'e port edilen ALGLIB (sürüm 3.19) matematiksel fonksiyon kütüphanesi.
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.
QuotesDemoGoogle Finance'ten dünya endekslerinin fiyatlarını alma örneği.