English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
Otomatik Alım Satım Şampiyonası 2010 için Bir Expert Advisor Nasıl Hızlı Bir Şekilde Oluşturulur?

Otomatik Alım Satım Şampiyonası 2010 için Bir Expert Advisor Nasıl Hızlı Bir Şekilde Oluşturulur?

MetaTrader 5Örnekler | 15 Aralık 2021, 10:45
56 0
Andrey Kornishkin
Andrey Kornishkin

Giriş

Otomatik Alım Satım Şampiyonası 2010'a katılacak bir expert geliştirmek için Alım Satım Prototipi makalesinden hazır bir expert advisor şablonu kullanalım. Acemi bir MQL5 programcısı dahi bu görevi yerine getirebilir; zira stratejileriniz için temel sınıflar, işlevler, şablonlar zaten geliştirildi. Alım satım fikrinizi uygulamak için minimum miktarda kod yazmanız yeterlidir.  

Hazırlamamız gerekenler şu şekildedir:
  • Strateji seçimi
  • Bir Expert Advisor Yazma
  • Test
  • Strateji Test Cihazında Optimizasyon
  • Stratejinin optimizasyonu
  • Farklı aralıklarla test

1. Strateji Seçimi

Trend ile alım satımın, bir aralıkta alım satım yapmaktan daha karlı olduğuna ve gün içi düzeylerinden sıçramanın, kanal sınırlarının bozulmasından daha sık meydana geldiğine inanılmaktadır.

Bu varsayımlara dayanarak, kanal sınırlarından (Zarflar) sıçramadaki mevcut eğilime doğru pozisyon açacağız. Pozisyonu kapatmak için bir sinyalde veya Zararı Durdur veya Kar Al düzeylerine ulaşıldığında pozisyonu kapatacağız.

  Trend sinyali olarak günlük grafikte MACD büyümesini veya küçülmesini kullanacağız ve saat zaman diliminde kanal sınırlarından sıçrama üzerinden alım satım yapacağız.  

Şekil 1. EURUSD Günlük Grafiğinde MACD Göstergesi

Şekil 1. EURUSD Günlük Grafiğinde MACD Göstergesi

MACD göstergesi art arda iki çubuk üzerinde büyürse bu, Al sinyalidir. Art arda iki çubukta küçülürse bu, Sat sinyalidir.

Şekil 2. Zarf Sınırlarından Fiyat Sıçraması

Şekil 2. Zarf Sınırlarından Fiyat Sıçraması


2. Bir Expert Advisor Yazma 

2.1. Dahil Edilen Modüller

Expert, ExpertAdvisor.mqh modülünden ExpertAdvisor sınıfını kullanacaktır.

#include <ExpertAdvisor.mqh>

2.2. Giriş Değişkenleri

input int    SL        =  50; // Stop Loss distance
input int    TP        = 100; // Take Profit distance
input int    TS        =  50; // Trailing Stop distance
input int    FastEMA   =  15; // Fast EMA
input int    SlowEMA   =  26; // Slow EMA
input int    MACD_SMA  =   1; // MACD signal line
input int    EnvelPer  =  20; // Envelopes period
input double EnvelDev  = 0.4; // Envelopes deviation
input double Risk      = 0.1; // Risk

2.3. CExpertAdvisor'dan Devralınan Bir Sınıf Oluşturun

class CMyEA : public CExpertAdvisor
  {
protected:
   double            m_risk;          // size of risk
   int               m_sl;            // Stop Loss
   int               m_tp;            // Take Profit
   int               m_ts;            // Trailing Stop
   int               m_pFastEMA;      // Fast EMA
   int               m_pSlowEMA;      // Slow EMA
   int               m_pMACD_SMA;     // MACD signal line
   int               m_EnvelPer;      // Envelopes period
   double            m_EnvelDev;      // Envelopes deviation
   int               m_hmacd;         // MACD indicator handle
   int               m_henvel;        // Envelopes indicator handle
public:
   void              CMyEA();
   void             ~CMyEA();
   virtual bool      Init(string smb,ENUM_TIMEFRAMES tf); // initialization
   virtual bool      Main();                              // main function
   virtual void      OpenPosition(long dir);              // open position on signal
   virtual void      ClosePosition(long dir);             // close position on signal
   virtual long      CheckSignal(bool bEntry);            // check signal
  };
//------------------------------------------------------------------
2.4. Göstergeleri Silin
//------------------------------------------------------------------    
void CMyEA::~CMyEA()
  {
   IndicatorRelease(m_hmacd);  // delete MACD indicator
   IndicatorRelease(m_henvel); // delete Envelopes indicator
  }
//------------------------------------------------------------------    
2.5. Değişkenleri Başlatın
//------------------------------------------------------------------    Init
bool CMyEA::Init(string smb,ENUM_TIMEFRAMES tf)
  {
   if(!CExpertAdvisor::Init(0,smb,tf)) return(false);    // initialize parent class
   // copy parameters
    m_risk=Risk; 
   m_tp=TP; 
   m_sl=SL; 
   m_ts=TS;
   m_pFastEMA=FastEMA; 
   m_pSlowEMA=SlowEMA; 
   m_pMACD_SMA=MACD_SMA;
   m_EnvelPer = EnvelPer;
   m_EnvelDev = EnvelDev;
   m_hmacd=iMACD(m_smb,PERIOD_D1,m_pFastEMA,m_pSlowEMA,m_pMACD_SMA,PRICE_CLOSE);      // create MACD indicator
   m_henvel=iEnvelopes(m_smb,PERIOD_H1,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev); // create Envelopes indicator
   if(m_hmacd==INVALID_HANDLE ||m_henvel==INVALID_HANDLE ) return(false);             // if there is an error, then exit
   m_bInit=true; 
   return(true);                                                                      // trade allowed
  } 

2.6. Alım Satım İşlevi

//------------------------------------------------------------------    CheckSignal
long CMyEA::CheckSignal(bool bEntry)
  {
   double macd[4],   // Array of MACD indicator values
         env1[3],    // Array of Envelopes' upper border values
         env2[3];    // Array of Bollinger Bands' lower border values
   MqlRates rt[3];   // Array of price values of last 3 bars
   
   if(CopyRates(m_smb,m_tf,0,3,rt)!=3) // Copy price values of last 3 bars to array
     {
       Print("CopyRates ",m_smb," history is not loaded"); 
        return(WRONG_VALUE);
     }
   // Copy indicator values to array
   if(CopyBuffer(m_hmacd,0,0,4,macd)<4 || CopyBuffer(m_henvel,0,0,2,env1)<2 ||CopyBuffer(m_henvel,1,0,2,env2)<2)
     { 
        Print("CopyBuffer - no data"); 
       return(WRONG_VALUE);
     }
   // Buy if MACD is growing and if there is a bounce from the Evelopes' lower border
   if(rt[1].open<env2[1] && rt[1].close>env2[1] && macd[1]<macd[2] &&  macd[2]<macd[3])
      return(bEntry ? ORDER_TYPE_BUY:ORDER_TYPE_SELL); // condition for buy
   // Sell if MACD is dwindling and if there is a bounce from the Evelopes' upper border
   if(rt[1].open>env1[1] && rt[2].close<env1[1]&& macd[1]>macd[2] &&  macd[2]>macd[3])
      return(bEntry ? ORDER_TYPE_SELL:ORDER_TYPE_BUY); // condition for sell

   return(WRONG_VALUE); // if there is no signal
  }

CMyEA ea; // class instance

Ve böylece, kodu yazdıktan sonra, ortaya çıkan expert'i Strateji Test Cihazı'na gönderin.


3. Test 

EURUSD'deki "Geçen yıl" dönemi için Strateji Test Cihazında aşağıdaki tabloyu alıyoruz:

Şekil 3. Alım Satım Sisteminin Başlangıç Parametreleri ile Test Edilmesine İlişkin Sonuçlar

Şekil 3. Alım Satım Sisteminin Başlangıç Parametreleriyle Test Edilmesine İlişkin Sonuçlar

Sonuçlar etkileyici değil; bu nedenle Zararı Durdur ve Kar Al düzeylerini optimize etmeye başlayalım.


4. Strateji Test Cihazında Optimizasyon

Adım 50 ile 10-500 aralığında Zararı Durdur ve Kar Al parametrelerini optimize edeceğiz.

En iyi sonuçlar şu şekildedir: Zararı Durdur = 160, Kar Al = 310. Zararı Durdur ve Kar Al optimizasyonundan sonra, önceki %36'lık karlı alım satımların %67'sini ve 1522.97$'lık net karı aldık. Böylece, basit işlemlerle, sistemimizi başabaş ve hatta bir miktar kar elde edecek şekilde yükselttik.

Şekil 4. Alım Satım Sisteminin Optimize Edilmiş Zararı Durdur ve Kar Al ile Test Edilmesine İlişkin Sonuçlar

Şekil 4. Alım Satım Sisteminin Optimize Edilmiş Zararı Durdur ve Kar Al ile Test Edilmesine İlişkin Sonuçlar

Şimdi Zarflar dönemini ve sapmasını optimize edelim.

Zarf dönemi, adım 4'te 10'dan 40'a ve sapma, adım 0,1'de 0,1'den 1'e değişecektir.

En iyi optimizasyon sonuçları şu şekildedir: Zarf dönemi = 22, Zarf sapması = 0,3. Şu anda dahi 14418.92$ net kar ve %79 karlı alım satım işlemine sahibiz.

Şekil 5. Alım Satım Sisteminin Optimize Edilmiş Zarfların Dönem ve Sapmasıyla Test Edilmesine İlişkin Sonuçlar

Şekil 5. Alım Satım Sisteminin Optimize Edilmiş Zarfların Dönem ve Sapmasıyla Test Edilmesine İlişkin Sonuçlar

Riski 0,8'e çıkarırsak, 77330,95$ net kar elde ederiz.

Şekil 6. Alım Satım Sisteminin Optimize Edilmiş Riskle Test Edilmesine İlişkin Sonuçlar

Şekil 6. Alım Satım Sisteminin Optimize Edilmiş Riskle Test Edilmesine İlişkin Sonuçlar

 

5. Stratejinin Optimizasyonu

Stratejinin optimizasyonu aşağıdaki adımlardan oluşabilir:

  • Trend göstergesini değiştirme
  • Başka bir zarf seçme
  • Başka bir zaman dilimi seçme
  • Alım satım koşullarını değiştirme

5.1. Trend Göstergesini Değiştirme

MQL5'te Trend Bulmanın Birkaç Yolu makalesinden görebileceğimiz gibi, en iyi trend göstergeleri hareketli ortalama ve hareketli ortalamaların "yelpazesi"dir.

MACD göstergesini basit hareketli ortalama ile değiştirelim. Expert'in kodu ekteki Macena.mq5 dosyasında bulunabilir.

5.2. Başka Bir Zarf Seçme

Zarflar'ın yanı sıra elimizin altındaki başka bir zarfı da seçebilirsiniz. Örneğin, Fiyat Kanalı, Bollinger Bantları veya hareketli ortalamalara dayalı bir zarf.

MA ve Bollinger Bantlarını kullanan bir expert örneği, ekteki Maboll.mq5 dosyasında bulunabilir.

5.3. Başka Bir Zaman Dilimi Seçme

Zaman dilimini daha büyük veya daha küçük olarak değiştirelim. Daha büyük bir zaman dilimi olarak H4'ü, daha küçük bir zaman dilimi olarak M15'i alın ve ardından sisteminizi test edin ve optimize edin.

Bunu yapmak için koddaki yalnızca bir satırı değiştirin:

m_henvel=iEnvelopes(m_smb,PERIOD_H1,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev);  // create Envelopes indicator

H4 zaman dilimi durumunda:

m_henvel=iEnvelopes(m_smb,PERIOD_H4,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev);  // create Envelopes indicator 

M15 zaman dilimi için: 

m_henvel=iEnvelopes(m_smb,PERIOD_M15,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev);  // create Envelopes indicator

5.4. Alım Satım Koşullarını Değiştirme

Denemek için alım satım koşullarını da değiştirelim.  

  1. Sistemi tersine çevirebilir hale getirin. Zarfın alt sınırından sıçrama üzerine satın alacağız ve Zarfın üst sınırından sıçrama üzerine satış yapacağız.
  2. Sistemi, gün trendini takip etmeden kontrol edin. Bu işlem, basitçe aşağıdaki kodun alım satım bloğuna eklenmesiyle yapılır:
    //------------------------------------------------------------------ CheckSignal
    long CMyEA::CheckSignal(bool bEntry)
      {
       double env1[3],   // Array of Envelopes' upper border values
             env2[3];    // Array of Bollinger Bands' lower border values
       MqlRates rt[3];   // Array of price values of last 3 bars
    
       if(CopyRates(m_smb,m_tf,0,3,rt)!=3) // Copy price values of last 3 bars to array
         {
          Print("CopyRates ",m_smb," history is not loaded");
          return(WRONG_VALUE);
         }
    // Copy indicator values to array
       if(CopyBuffer(m_henvel,0,0,2,env1)<2 || CopyBuffer(m_henvel,1,0,2,env2)<2)
         {
          Print("CopyBuffer - no data");
          return(WRONG_VALUE);
         }
    // Buy if there is a bounce from the Evelopes' lower border
       if(rt[1].open<env2[1] && rt[1].close>env2[1])
          return(bEntry ? ORDER_TYPE_BUY:ORDER_TYPE_SELL); // condition for buy
    // Sell if there is a bounce from the Evelopes' upper border
       if(rt[1].open>env1[1] && rt[2].close<env1[1])
          return(bEntry ? ORDER_TYPE_SELL:ORDER_TYPE_BUY); // condition for sell
    
       return(WRONG_VALUE); // if there is no signal
      }
    
    CMyEA ea; // class instance
    //------------------------------------------------------------------    OnInit
    

     3. Kısa pozisyonu, fiyat çok düşmediği, tersine döndüğü ve yükseldiği zaman kapatacağız.

     4. Uzun pozisyonu, fiyat fazla yükselmediği, tersine döndüğü ve düştüğü zaman kapatacağız.

Bir alım satım stratejisini optimize etmek için birçok başka yol bulabilirsiniz; bunlardan bazıları ilgili literatürde açıklanmıştır.

Daha fazla araştırma yapıp yapmamak size kalmış.


6. Farklı Aralıklarda Test Etme

Expert Advisor'ımızı 1 aylık bir kayma ile eşit zaman aralıklarında test edin. Test dönemi olarak "geçen yılı" ele alalım. Süre - 3 ay.

Test aralığı
Kar, USD
Karlı alım satımlar
 1.01.2010 - 30.03.2010
7239,50 %76,92
 1.02.2010 - 30.04.2010 -6577,50 %0
 1.03.2010 - 30.05.2010 -8378,50 %50
 1.04.2010 - 30.06.2010 -6608,00 %0
 1.05.2010 - 30.07.2010  41599,50 %80
  1.06.2010 - 30.08.2010  69835,50  %85
Özet: Böyle agresif bir para yönetimi ile Expert Advisor'ın kullanılması arzu edilmez. Riski azaltın.


Sonuç

Kısa sonuç: Bu şablona dayanarak, alım satım fikrinizi minimum zaman ve çaba ile oldukça hızlı bir şekilde uygulayabilirsiniz.

Sistem parametrelerinin ve alım satım kriterlerinin optimizasyonu da sorun yaratmaz.

Daha istikrarlı çalışan bir alım satım sistemi oluşturmak için, tüm parametrelerin daha uzun zaman aralıklarında optimize edilmesi arzu edilir.

Kullanılan kaynakların listesi:
  1. MQL5'de 20 Alım Satım Sinyalleri makalesi.
  2. Alım Satım Robotunun Prototipi makalesi.
  3. MQL5'te Bir Trendi Tespit Etmenin Birkaç Yolu makalesi.
  4. Popüler Alım Satım Sistemlerine ve Alım Satım Robotu Optimizasyonunun Simyasına Dayalı Expert Advisor'lar makalesi.
  5. Expert Advisor'lardaki Sınırlamalar ve Doğrulamalar makalesi.
  6. MQL5 Nesne Yönelimli Programlama Yaklaşımını Kullanarak Expert Advisor Yazma makalesi.
  7. Expert Advisor'da Para Yönetimi İşlevleri makalesi.   

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

Ekli dosyalar |
mabol.mq5 (6.65 KB)
macena.mq5 (6.94 KB)
maena.mq5 (6.58 KB)
Hataları Bulma ve Günlüğe Kaydetme Hataları Bulma ve Günlüğe Kaydetme
MetaEditor 5 hata ayıklama özelliğine sahiptir. Ancak MQL5 programlarınızı yazarken, genellikle ayrı değerleri değil, test ve çevrimiçi çalışma sırasında görünen tüm mesajları görüntülemek istersiniz. Günlük dosyası içeriğinin boyutu büyük olduğunda, gerekli mesajın hızlı ve kolay alınmasını otomatikleştirmek aşikardır. Bu makalede MQL5 programlarında hata bulma yollarını ve günlüğe kaydetme yöntemlerini ele alacağız. Ayrıca, dosyalara günlük tutmayı basitleştireceğiz ve günlüklerin rahat bir şekilde görüntülenmesi için basit LogMon programı hakkında bilgi edineceğiz.
Expert Advisor'ın Çalışması Sırasında Denge Eğrisinin Eğimini Kontrol Etme Expert Advisor'ın Çalışması Sırasında Denge Eğrisinin Eğimini Kontrol Etme
Bir alım satım sistemi için kurallar bulmak ve bunları bir Expert Advisor'da programlamak işin yarısıdır. Bir şekilde, alım satım işleminin sonuçlarını biriktirdiği için Expert Advisor'ın çalışmasını düzeltmeniz gerekir. Bu makalede, denge eğrisinin eğimini ölçen bir geri bildirim oluşturmak yoluyla bir Expert Advisor'ın performansını artırmaya olanak tanıyan yaklaşımlardan biri açıklanmaktadır.
Simulink: Expert Advisor'ların Geliştiricileri için Bir Kılavuz Simulink: Expert Advisor'ların Geliştiricileri için Bir Kılavuz
Profesyonel bir programcı değilim. Ve bu nedenle, alım satım sistemi geliştirme üzerinde çalışırken "basitten karmaşığa gitmek" prensibi benim için birincil öneme sahiptir. Benim için basit olan tam olarak nedir? Her şeyden önce, sistemi oluşturma sürecinin ve çalışmasının mantığının görselleştirilmesidir. Ayrıca, minimum elle yazılmış koddur. Bu makalemde, bir Matlab paketine dayalı alım satım sistemini oluşturup test etmeye çalışacak ve ardından MetaTrader 5 için bir Expert Advisor yazacağım. MetaTrader 5'in geçmiş verileri, test süreci için kullanılacaktır.
Expert Advisor yazarken MQL5 Standard Alım Satım Sınıfı kitaplıklarının kullanımı Expert Advisor yazarken MQL5 Standard Alım Satım Sınıfı kitaplıklarının kullanımı
Bu makalede, bir alım satım işlemi yapmadan önce pozisyon kapatma ve değiştirme, bekleyen talimat verme ve Marjın silinmesi ve doğrulanmasını uygulayan Expert Advisor'ları yazarken MQL5 Standart Kitaplık Alım Satım Sınıflarının başlıca işlevlerinin nasıl kullanılacağı açıklanmaktadır. Ayrıca, talimat ve yatırım ayrıntılarını elde etmek için Alım Satım sınıflarının nasıl kullanılabileceğini de gösterdik.