
Otomatik Alım Satım Şampiyonası 2010 için Bir Expert Advisor Nasıl Hızlı Bir Şekilde Oluşturulur?
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
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ı
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ıç 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
Ş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
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
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.
- 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.
- 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 |
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:- MQL5'de 20 Alım Satım Sinyalleri makalesi.
- Alım Satım Robotunun Prototipi makalesi.
- MQL5'te Bir Trendi Tespit Etmenin Birkaç Yolu makalesi.
- Popüler Alım Satım Sistemlerine ve Alım Satım Robotu Optimizasyonunun Simyasına Dayalı Expert Advisor'lar makalesi.
- Expert Advisor'lardaki Sınırlamalar ve Doğrulamalar makalesi.
- MQL5 Nesne Yönelimli Programlama Yaklaşımını Kullanarak Expert Advisor Yazma makalesi.
- 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





- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz