Özel Göstergeye Dayalı Alım Satım Sinyali Üreteci
Giriş
Bu makalede, size özel bir göstergeye dayalı bir alım satım sinyali üretecinin nasıl oluşturulacağını anlatacağım. Özel bir gösterge için kendi alım satım modelinizi nasıl yazabileceğinizi göreceksiniz. Ayrıca model 0'ın amacını ve alım satım sinyali modülünde neden IS_PATTERN_USAGE(0)-türü yapıların kullanıldığını açıklayacağım.
Makale iki tür kod kullanacaktır: Değiştirmek üzere olduğumuz kod ve önceden değiştirdiğimiz kod. Değiştirilen kod aşağıdaki gibi vurgulanacaktır:
//+------------------------------------------------------------------+
//| MySignal.mqh |
//| Copyright © 2012, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
Değiştirilen kod, kopyalanacak ve alım satım sinyali üretecine yapıştırılacak koddur. Vurgulama kullanarak kodu daha iyi anlayacağınızı umuyorum.
1. Özel Gösterge
Eminim uzun süredir kullanmak istediğiniz standart teslimata dahil olmayan bir gösterge mutlaka vardır. Ve bu, bir alım satım sinyali modülü oluşturmak istediğiniz temel göstergedir. Standart teslimattan MACD göstergesini böyle bir gösterge olarak kullanacağım. Göstergenin konumu şu şekildedir: ...MQL5\Indicators\Examples\MACD.mq5.
Her gösterge bir veya daha fazla piyasa modelini tanımlayabilir. Piyasa modeli, gösterge değeri ile fiyat değerinin belirli bir kombinasyonudur. MACD göstergesi için mevcut modeller ters çevirme, ana ve sinyal çizgisinin çaprazlanması, sıfır düzeyinin çaprazlanması, ıraksama ve çift ıraksamadır.
1.1 Yeni Gösterge Modeli.
Gösterge için verilen piyasa modellerinden memnun olmadığımızı ve kendi gösterge modelimizi ortaya çıkarmak istediğimizi varsayalım. Yeni gösterge modeli açıklaması: MACD göstergesi sıfır çizgisinin altındaysa ve değerleri artıyorsa, daha fazla artış bekleyebilir ve uzun bir pozisyon açabiliriz:
Şekil 1: İleriye dönük gösterge büyümesi modeli
MACD göstergesi sıfır çizgisinin üzerindeyse ve değerleri düşüyorsa, daha fazla düşüş bekleyebilir ve kısa bir pozisyon açabiliriz:
Şekil 2: Olası gösterge düşüş modeli
Bu nedenle, özel gösterge üzerinde karara vardık ve gösterge ve açıklaması için yeni alım satım modelini bulduk. Kodu yazmaya devam edelim.
2. Özel Göstergemize Dayalı Alım Satım Sinyali Üreteci Yazma
Üretecimiz, CExpertSignal temel sınıfının alt öğesidir. CExpertSignal temel sınıfı, alım satım sinyali üreteçleri oluşturmaya yönelik bir sınıftır. CExpertSignal sınıfı, bir Expert Advisor'ın, piyasaya giriş yönüne ilişkin alım satım sinyali üretecinin göstergesini görmesine olanak tanıyan bir dizi genel (yani dışarıdan erişilebilir) yöntem içerir.
Kendi alım satım sinyal üretecimiz üzerinde çalıştığımız için, bu, ilgili sanal yöntemleri yeniden tanımlanmış (karşılık gelen kodla doldurulmuş) CExpertSignal sınıfından devralınmalıdır.
3. Alım Satım Sinyali Üreteci Sınıfını Oluşturma
Alım satım sinyali üreteci, varsayılan olarak ...MQL5\Include\Expert\Signal klasöründe bulunmalıdır. Standart Kitaplığın ...\Signal klasörüne çok fazla bilgi ile aşırı yüklenmemek için ...\Expert klasörünün altında yeni bir klasör oluşturalım ve bunu \MySignalsolarak adlandıralım:
Şekil 3. Yeni MySignals klasörünü oluşturma
Ardından, MQL5 Sihirbazını kullanarak bir içerme dosyası oluşturacağız. MetaEditor'da, Dosya menüsünün altında "Yeni"yi seçin ve ardından "İçerme Dosyası (*.mqh)" seçeneğini seçin.
Şekil 4. MQL5 Sihirbazı. Bir içerme dosyası oluşturma
Sinyal üreteci sınıfının adı MySignal olacaktır. Bu, Include\Expert\MySignals\MySignal altında yer alacaktır. Onu belirtelim:
Şekil 5. MQL5 Sihirbazı. İçerme dosyasının konumu
"Son" seçeneğine tıkladıktan sonra MQL5 Sihirbazı boş bir şablon oluşturacaktır. Şu andan itibaren her şeyi manuel olarak yapacağız ve verileri kopyalayıp yapıştıracağız. Standart Kitaplık'tan gelen tüm sinyallerin dahili olarak neredeyse aynı olduğuna dikkatinizi çekmek istiyorum. Bunlar, yalnızca alım satım modellerini belirlemek için kullanılan algoritmalarda farklılık gösterir.
Bu nedenle, \Include\Expert\Signal klasöründen herhangi bir dosyayı alabilir, içeriğini kopyalayabilir ve şablonunuza yapıştırabilirsiniz. Ardından, alım satım sinyali üretecinin ortaya çıkan dosyasını düzenlemeye başlayabilirsiniz.
4. Alım Satım Sinyali Üreteci Sınıfının Açıklaması
Şablon olarak, başlık dışında her şeyi kopyaladığım \Include\Expert\Signal\SignalEnvelopes.mqh dosyasını aldım://+------------------------------------------------------------------+ //| SignalEnvelopes.mqh | //| Copyright 2009-2013, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+
ve tümünü neredeyse boş olan MySignal.mqh şablonumuza yapıştırdım. Elimde şu var:
//+------------------------------------------------------------------+ //| MySignal.mqh | //| Copyright © 2012, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #include <Expert\ExpertSignal.mqh> // wizard description start //+------------------------------------------------------------------+ //| Description of the class | //| Title=Signals of indicator 'Envelopes' | //| Type=SignalAdvanced | //| Name=Envelopes | //| ShortName=Envelopes | //| Class=CSignalEnvelopes | //| Page=signal_envelopes | //| Parameter=PeriodMA,int,45,Period of averaging | //| Parameter=Shift,int,0,Time shift | //| Parameter=Method,ENUM_MA_METHOD,MODE_SMA,Method of averaging | //| Parameter=Applied,ENUM_APPLIED_PRICE,PRICE_CLOSE,Prices series | //| Parameter=Deviation,double,0.15,Deviation | //+------------------------------------------------------------------+ // wizard description end //+------------------------------------------------------------------+ //| Class CSignalEnvelopes. | //| Purpose: Class of generator of trade signals based on | //| the 'Envelopes' indicator. | //| It is derived from the CExpertSignal class. | //+------------------------------------------------------------------+ class CSignalEnvelopes : public CExpertSignal { protected: CiEnvelopes m_env; // object-indicator //--- adjusted parameters int m_ma_period; // the "period of averaging" parameter of the indicator int m_ma_shift; // the "time shift" parameter of the indicator ENUM_MA_METHOD m_ma_method; // the "method of averaging" parameter of the indicator ENUM_APPLIED_PRICE m_ma_applied; // the "object of averaging" parameter of the indicator double m_deviation; // the "deviation" parameter of the indicator double m_limit_in; // threshold sensitivity of the 'rollback zone' double m_limit_out; // threshold sensitivity of the 'break through zone' //--- "weights" of market models (0-100) int m_pattern_0; // model 0 "price is near the necessary border of the envelope" int m_pattern_1; // model 1 "price crossed a border of the envelope" public: CSignalEnvelopes(void); ~CSignalEnvelopes(void); //--- methods of setting adjustable parameters void PeriodMA(int value) { m_ma_period=value; } void Shift(int value) { m_ma_shift=value; } void Method(ENUM_MA_METHOD value) { m_ma_method=value; } void Applied(ENUM_APPLIED_PRICE value) { m_ma_applied=value; } void Deviation(double value) { m_deviation=value; } void LimitIn(double value) { m_limit_in=value; } void LimitOut(double value) { m_limit_out=value; } //--- methods of adjusting "weights" of market models void Pattern_0(int value) { m_pattern_0=value; } void Pattern_1(int value) { m_pattern_1=value; } //--- method of verification of settings virtual bool ValidationSettings(void); //--- method of creating the indicator and time series virtual bool InitIndicators(CIndicators *indicators); //--- methods of checking if the market models are formed virtual int LongCondition(void); virtual int ShortCondition(void); protected: //--- method of initialization of the indicator bool InitMA(CIndicators *indicators); //--- methods of getting data double Upper(int ind) { return(m_env.Upper(ind)); } double Lower(int ind) { return(m_env.Lower(ind)); } }; //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CSignalEnvelopes::CSignalEnvelopes(void) : m_ma_period(45), m_ma_shift(0), m_ma_method(MODE_SMA), m_ma_applied(PRICE_CLOSE), m_deviation(0.15), m_limit_in(0.2), m_limit_out(0.2), m_pattern_0(90), m_pattern_1(70) { //--- initialization of protected data m_used_series=USE_SERIES_OPEN+USE_SERIES_HIGH+USE_SERIES_LOW+USE_SERIES_CLOSE; } //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ CSignalEnvelopes::~CSignalEnvelopes(void) { } //+------------------------------------------------------------------+ //| Validation settings protected data. | //+------------------------------------------------------------------+ bool CSignalEnvelopes::ValidationSettings(void) { //--- validation settings of additional filters if(!CExpertSignal::ValidationSettings()) return(false); //--- initial data checks if(m_ma_period<=0) { printf(__FUNCTION__+": period MA must be greater than 0"); return(false); } //--- ok return(true); } //+------------------------------------------------------------------+ //| Create indicators. | //+------------------------------------------------------------------+ bool CSignalEnvelopes::InitIndicators(CIndicators *indicators) { //--- check pointer if(indicators==NULL) return(false); //--- initialization of indicators and time series of additional filters if(!CExpertSignal::InitIndicators(indicators)) return(false); //--- create and initialize MA indicator if(!InitMA(indicators)) return(false); //--- ok return(true); } //+------------------------------------------------------------------+ //| Initialize MA indicators. | //+------------------------------------------------------------------+ bool CSignalEnvelopes::InitMA(CIndicators *indicators) { //--- check pointer if(indicators==NULL) return(false); //--- add object to collection if(!indicators.Add(GetPointer(m_env))) { printf(__FUNCTION__+": error adding object"); return(false); } //--- initialize object if(!m_env.Create(m_symbol.Name(),m_period,m_ma_period,m_ma_shift,m_ma_method,m_ma_applied,m_deviation)) { printf(__FUNCTION__+": error initializing object"); return(false); } //--- ok return(true); } //+------------------------------------------------------------------+ //| "Voting" that the price will grow. | //+------------------------------------------------------------------+ int CSignalEnvelopes::LongCondition(void) { int result=0; int idx =StartIndex(); double close=Close(idx); double upper=Upper(idx); double lower=Lower(idx); double width=upper-lower; //--- if the model 0 is used and price is in the rollback zone, then there is a condition for buying if(IS_PATTERN_USAGE(0) && close<lower+m_limit_in*width && close>lower-m_limit_out*width) result=m_pattern_0; //--- if the model 1 is used and price is above the rollback zone, then there is a condition for buying if(IS_PATTERN_USAGE(1) && close>upper+m_limit_out*width) result=m_pattern_1; //--- return the result return(result); } //+------------------------------------------------------------------+ //| "Voting" that the price will fall. | //+------------------------------------------------------------------+ int CSignalEnvelopes::ShortCondition(void) { int result =0; int idx =StartIndex(); double close=Close(idx); double upper=Upper(idx); double lower=Lower(idx); double width=upper-lower; //--- if the model 0 is used and price is in the rollback zone, then there is a condition for selling if(IS_PATTERN_USAGE(0) && close>upper-m_limit_in*width && close<upper+m_limit_out*width) result=m_pattern_0; //--- if the model 1 is used and price is above the rollback zone, then there is a condition for selling if(IS_PATTERN_USAGE(1) && close<lower-m_limit_out*width) result=m_pattern_1; //--- return the result return(result); } //+------------------------------------------------------------------+
Not satırı 6:
#include <Expert\ExpertSignal.mqh>
Burada önişlemciye, şablonumuza alım satım sinyali üreteçleri oluşturmak üzere CExpertSignal temel sınıfını ekleme talimatı verelim.
Şablonu düzenlemeye devam edeceğiz. Şablonumuzun daha sonra MQL5 Sihirbazı'nda görünür olmasını sağlamak için sınıfımızın açıklamasını değiştirmemiz geriyor:
//+------------------------------------------------------------------+ //| Description of the class | //| Title=Signals of indicator 'Envelopes' | //| Type=SignalAdvanced | //| Name=Envelopes | //| ShortName=Envelopes | //| Class=CSignalEnvelopes | //| Page=signal_envelopes | //| Parameter=PeriodMA,int,45,Period of averaging | //| Parameter=Shift,int,0,Time shift | //| Parameter=Method,ENUM_MA_METHOD,MODE_SMA,Method of averaging | //| Parameter=Applied,ENUM_APPLIED_PRICE,PRICE_CLOSE,Prices series | //| Parameter=Deviation,double,0.15,Deviation | //+------------------------------------------------------------------+
O halde bakalım. Satır,
//| Title=Signals of indicator 'Envelopes' |
MQL5 Sihirbazı'nda görüntüleneceği sinyal sınıfımızın adını gösterir. Bu adı şuna benzer bir şekilde değiştireceğiz:
//| Title=Signal of the 'Custom Indicator' indicator |
Sonraki satır:
//| Name=Envelopes |
Alım satım sinyali sınıfımızın değişkenlerini tanımlayan adı gösterir. Bu açıklama, MQL5 Sihirbazı tarafından kullanılacaktır. Bu satırı aşağıdaki gibi değiştirelim:
//| Name=MyCustomIndicator |
Sonraki satır:
//| ShortName=Envelopes |
Bu parametreye aynı adı vereceğiz:
//| ShortName=MyCustomIndicator |
Aşağıdaki satır, sınıf adını belirler:
//| Class=CSignalEnvelopes |
Bu parametreyi yeniden adlandıralım:
//| Class=CSignalMyCustInd |
Sonraki parametreyi olduğu gibi bırakın.
//| Page=signal_envelopes |
Aşağıdaki parametre grubu, alım satım sinyali üretecinin altında yatan göstergenin parametrelerinin tanımından sorumludur. Daha önce bahsettiğim gibi, özel gösterge olarak ...MQL5\Indicators\Examples\MACD.mq5 kullanacağım. Bu, aşağıdaki parametrelere sahiptir:
//--- input parameters input int InpFastEMA=12; // Fast EMA period input int InpSlowEMA=26; // Slow EMA period input int InpSignalSMA=9; // Signal SMA period input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Applied price
4.1 Parametre Açıklama Bloğu
Lütfen yukarıda verilen parametrelerin yalnızca MACD.mq5. için geçerli olduğunu unutmayın. Özel göstergeniz tamamen farklı parametrelere sahip olabilir. Buradaki ana konu, gösterge parametrelerini alım satım sinyali sınıfındaki açıklamalarıyla eşleştirmektir. İncelenmekte olan özel gösterge MACD.mq5 için alım satım sinyali sınıfındaki parametre açıklama bloğu aşağıdaki gibi olacaktır:
//| Parameter=PeriodFast,int,12,Period of fast EMA |
//| Parameter=PeriodSlow,int,24,Period of slow EMA |
//| Parameter=PeriodSignal,int,9,Period of averaging of difference |
//| Parameter=Applied,ENUM_APPLIED_PRICE,PRICE_CLOSE,Prices series |
Göstergedeki parametrelerin sınıf açıklama bloğundaki açıklamalarla şimdi nasıl eşleştiğine bir göz atın. Tüm değişikliklerin ardından sınıfımızın açıklama bloğu aşağıdaki gibi olacaktır:
//+------------------------------------------------------------------+ //| Description of the class | //| Title=Signal of the 'Custom Indicator' indicator | //| Type=SignalAdvanced | //| Name=MyCustomIndicator | //| ShortName=MyCustomIndicator | //| Class=CSignalMyCustInd | //| Page=signal_envelopes | //| Parameter=PeriodFast,int,12,Period of fast EMA | //| Parameter=PeriodSlow,int,24,Period of slow EMA | //| Parameter=PeriodSignal,int,9,Period of averaging of difference | //| Parameter=Applied,ENUM_APPLIED_PRICE,PRICE_CLOSE,Prices series | //+------------------------------------------------------------------+
Programlamada, birinin koduna yorum yapması iyi bir uygulama olarak kabul edilir; böylece bir süre sonra iletildiğinde kodun anlaşılmasını kolaylaştırır. Bu nedenle, aşağıdaki bloğu değiştireceğiz:
//+------------------------------------------------------------------+ //| Class CSignalEnvelopes. | //| Purpose: Class of generator of trade signals based on | //| the 'Envelopes' indicator. | //| It is derived from the CExpertSignal class. | //+------------------------------------------------------------------+
Sınıfımızın açıklamasına uyması için:
//+------------------------------------------------------------------+
//| Class CSignalMyCustInd. |
//| Purpose: Class of the trading signal generator based on |
//| the custom indicator. |
//| It is derived from the CExpertSignal class. |
//+------------------------------------------------------------------+
Karışıklığı önlemek için, tüm "CSignalEnvelopes" değerlerini "CSignalMyCustInd" ile değiştirmemiz gerekiyor.
Şekil 6. CSignalEnvelopes değerlerini CSignalMyCustInd ile değiştirme
Şimdi bazı teorik yönlere bir göz atalım.
5. CiCustom Sınıfı
Özel göstergenin alım satım göstergeleri sınıfının kodu üzerinde çalışmaya devam etmek için CiCustom sınıfına ihtiyacımız olacak. CiCustom sınıfı, özel göstergelerle çalışmak için özel olarak oluşturulmuştur. CiCustom sınıfı, özel gösterge verilerinin oluşturulmasına ve ayarlanmasına olanak tanır ve bunlara erişim sağlar.
6. CIndicators Sınıfı.
CIndicators, zaman serileri ve teknik gösterge sınıflarının örneklerini toplamak için kullanılan sınıftır. CIndicators sınıfı, teknik gösterge sınıfı örneklerinin oluşturulmasını, depolanmasını ve yönetilmesini (veri eşitlemesi, işleme ve bellek yönetimi) sağlar.
Create yöntemi nedeniyle özellikle CIndicators sınıfıyla ilgileniyoruz. Bu yöntem, belirtilen parametrelerle belirtilen türde bir gösterge oluşturur.
7. Alım Satım Sinyali Sınıfımızı Yazmaya Devam Edelim
Değiştireceğimiz sonraki kod bloğu (satır 28-42) aşağıdaki gibidir:class CSignalMyCustInd : public CExpertSignal { protected: CiEnvelopes m_env; // object-indicator //--- adjusted parameters int m_ma_period; // the "period of averaging" parameter of the indicator int m_ma_shift; // the "time shift" parameter of the indicator ENUM_MA_METHOD m_ma_method; // the "method of averaging" parameter of the indicator ENUM_APPLIED_PRICE m_ma_applied; // the "object of averaging" parameter of the indicator double m_deviation; // the "deviation" parameter of the indicator double m_limit_in; // threshold sensitivity of the 'rollback zone' double m_limit_out; // threshold sensitivity of the 'break through zone' //--- "weights" of market models (0-100) int m_pattern_0; // model 0 "price is near the necessary border of the envelope" int m_pattern_1; // model 1 "price crossed a border of the envelope"
8. Alım Satım Sinyali Üretecinde Özel Gösterge Oluşturma
Yukarıda verilen kod bloğuna bir göz atın. Satır,
CiEnvelopes m_env; // object-indicator
bir nesne bildirir - CiEnvelopes sınıfı göstergesi. CiEnvelopes, Standart Kitaplık'taki teknik göstergeyle çalışma sınıfıdır. CiEnvelopes sınıfı, Standart Kitaplık'taki teknik göstergeye dayalı olarak oluşturulmuştur. Ancak, üretecin kodunu özel göstergemize göre yazıyoruz. Bu nedenle, Standart Kitaplık'ta bizim göstergemiz veya özel göstergeniz için hazır bir sınıf yoktur. Yapabileceğimiz şey, CiCustom sınıfını kullanmaktır.
Göstergemizi, CiCustom sınıfı olarak bildirelim:
CiCustom m_mci; // indicator object "MyCustomIndicator"
8.1 Dört Değişken
Sınıftaki parametre açıklama bloğunu hatırlıyor musunuz? Bu açıklamada üç parametre vardı. Üreteç sınıfımızın korumalı alanında, değerleri dört parametremize iletmek için şimdi dört değişken bildireceğiz:
//--- adjustable parameters
int m_period_fast; // "fast EMA period"
int m_period_slow; // "slow EMA period"
int m_period_signal; // "difference averaging period"
ENUM_APPLIED_PRICE m_applied; // "price type"
Aşağıdaki kod bloğu:
//--- "weights" of market models (0-100) int m_pattern_0; // model 0 "price is near the necessary border of the envelope" int m_pattern_1; // model 1 "price crossed a border of the envelope"
Bu kod, alım satım sinyali üretecimizin alım satım modellerine "ağırlık" veren değişkenleri bildirir. "Ağırlıklar" bloğunu aşağıdaki kodla değiştirelim:
//--- "weights" of the market models (0-100)
int m_pattern_0; // model 0 "the oscillator has required direction"
int m_pattern_1; // model 1 "the indicator is gaining momentum - buy; the indicator is falling - sell"
9. Model 0
Hatırlayacağınız gibi, makalenin başında, alım satım sinyal üretecimiz tarafından oluşturulacak yalnızca bir yeni model tanımlamaya karar verilmişti. Ancak, yukarıdaki kodda iki piyasa modeli belirledim (model 0 ve model 1). Burada, model 0 önemli bir yardımcı modeldir. Bekleyen talimatlarla alım satım yaparken gereklidir. Model 0 uygulandığında, bekleyen talimatların fiyatla birlikte hareket etmesini sağlar. Alım satım sinyali üretecimize ve aşağıdaki koşullara bir göz atalım:
- MACD özel göstergesi sıfır çizgisinin altında,
- ve değerleri artıyor,
- çubuk açılış fiyatından (dört haneli fiyat değeri) 50 puanlık bekleyen talimatlarla alım satım yapıyoruz.
Bu koşullar, alım satım modelimizi mükemmel bir şekilde tanımlar. İşler şu şekilde ilerleyecek: Alım satım modeli koşullarımız, 1 numaralı çubuğun görünmesi üzerine kontrol edilecektir. Elimizde şunlar var: MACD sıfır çizgisinin altında ama yine de ivme kazanıyor. Bu, al sinyaline karşılık gelir. Bu nedenle, bekleyen bir Buy Stop talimatı veriyoruz:
Şekil 7. Bekleyen bir Buy Stop talimatı verme
Bir sonraki çubuk olan 2 numaralı çubuğun görünmesi üzerine, koşul kontrolü, MACD'nin sıfırın altında olduğunu ve düştüğünü tespit eder. Alım satım modelimize göre şu anda alım veya satım için herhangi bir koşul bulunmamaktadır. Ancak şuna dikkat edin: CExpertSignal sınıfı mantığına göre, alım veya satım için herhangi bir koşul bulunmadığı için, bekleyen tüm talimatlar SİLİNMELİDİR. Bu durumda, fiyat aniden ve önemli ölçüde yükselirse, bekleyen bir talimat olmayacağı için uzun süre piyasaya girme fırsatını kaçırmış olacağız.
Yardımcı model 0'ın çok kullanışlı olduğu yer burasıdır. Yardımcı model 0, şunun sağlanması koşuluyla uygulanacaktır:
- MACD özel göstergesi sıfır çizgisinin altında.
Böylece, bekleyen bir Buy Stop talimatı verebiliriz. Çubuk açılış fiyatından 50 puanlık bir talimat verdiğimiz için aslında bekleyen Buy Stop talimatını fiyat hareketine göre hareket ettiriyoruz:
Şekil 8. Buy Stop talimatını aşağı indirme
Böylece, yardımcı model 0'ı kullanarak bekleyen bir talimatı fiyat hareketine göre hareket ettirme imkanı elde ederiz.
10. Şablon Kodundaki Diğer Değişiklikler
Değiştirilecek sonraki kod bloğu aşağıdaki gibidir:public: CSignalMyCustInd(void); ~CSignalMyCustInd(void); //--- methods of setting adjustable parameters void PeriodMA(int value) { m_ma_period=value; } void Shift(int value) { m_ma_shift=value; } void Method(ENUM_MA_METHOD value) { m_ma_method=value; } void Applied(ENUM_APPLIED_PRICE value) { m_ma_applied=value; } void Deviation(double value) { m_deviation=value; } void LimitIn(double value) { m_limit_in=value; } void LimitOut(double value) { m_limit_out=value; } //--- methods of adjusting "weights" of market models void Pattern_0(int value) { m_pattern_0=value; } void Pattern_1(int value) { m_pattern_1=value; } //--- method of verification of settings virtual bool ValidationSettings(void); //--- method of creating the indicator and time series virtual bool InitIndicators(CIndicators *indicators); //--- methods of checking if the market models are formed virtual int LongCondition(void); virtual int ShortCondition(void);
Bu blokta, ayarlanabilir parametreleri ayarlama yöntemlerini, alım satım modellerinin ağırlıklarını ayarlama yöntemlerini, ayarları doğrulama yöntemini, gösterge başlatma yöntemini ve piyasa modellerinin oluşturulup oluşturulmadığını kontrol etme yöntemlerini bildiririz.
Ayarlanabilir parametrelerde dört değişken bildirdiğimizi göz önünde bulundurarak, parametreleri ayarlamak için yöntem bloğu aşağıdaki gibi olacaktır:
//--- methods of setting adjustable parameters
void PeriodFast(int value) { m_period_fast=value; }
void PeriodSlow(int value) { m_period_slow=value; }
void PeriodSignal(int value) { m_period_signal=value; }
void Applied(ENUM_APPLIED_PRICE value) { m_applied=value; }
Sonraki kod parçası değişmeden kalacaktır:
//--- methods of adjusting "weights" of market models void Pattern_0(int value) { m_pattern_0=value; } void Pattern_1(int value) { m_pattern_1=value; } //--- method of verification of settings virtual bool ValidationSettings(void); //--- method of creating the indicator and time series virtual bool InitIndicators(CIndicators *indicators); //--- methods of checking if the market models are generated virtual int LongCondition(void); virtual int ShortCondition(void);
Değiştirilecek bir sonraki kod bloğu aşağıdaki gibidir:
protected: //--- method of initialization of the indicator bool InitMA(CIndicators *indicators); //--- methods of getting data double Upper(int ind) { return(m_env.Upper(ind)); } double Lower(int ind) { return(m_env.Lower(ind)); } };
Bu blok, büyük ölçüde değiştirilecektir. CIndicator sınıfının GetData yöntemini kullandığımı lütfen unutmayın. Çağrılan yöntemlerin adları doğrudan kodda sağlanacaktır:
protected:
//--- indicator initialization method
bool InitMyCustomIndicator(CIndicators *indicators);
//--- methods for getting data
//- getting the indicator value
double Main(int ind) { return(m_mci.GetData(0,ind)); }
//- getting the signal line value
double Signal(int ind) { return(m_mci.GetData(1,ind)); }
//- difference between two successive indicator values
double DiffMain(int ind) { return(Main(ind)-Main(ind+1)); }
int StateMain(int ind);
double State(int ind) { return(Main(ind)-Signal(ind)); }
//- preparing data for the search
bool ExtState(int ind);
//- searching the market model with the specified parameters
bool CompareMaps(int map,int count,bool minimax=false,int start=0);
};
Bir sonraki kod bloğu oluşturucudur.
//+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CSignalMyCustInd::CSignalMyCustInd(void) : m_ma_period(45), m_ma_shift(0), m_ma_method(MODE_SMA), m_ma_applied(PRICE_CLOSE), m_deviation(0.15), m_limit_in(0.2), m_limit_out(0.2), m_pattern_0(90), m_pattern_1(70) { //--- initialization of protected data m_used_series=USE_SERIES_OPEN+USE_SERIES_HIGH+USE_SERIES_LOW+USE_SERIES_CLOSE; }
Oluşturucuda, değişkenlerin adlarını değiştireceğiz. Ayrıca, yalnızca iki seri kullanacağız: USE_SERIES_HIGH+USE_SERIES_LOW
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CSignalMyCustInd::CSignalMyCustInd(void) : m_period_fast(12),
m_period_slow(24),
m_period_signal(9),
m_applied(PRICE_CLOSE),
m_pattern_0(10),
m_pattern_1(50)
{
//--- initialization of protected data
m_used_series=USE_SERIES_HIGH+USE_SERIES_LOW;
}
Sınıfımızın ValidationSettings yöntemini değiştirelim.
//+------------------------------------------------------------------+ //| Validation settings protected data. | //+------------------------------------------------------------------+ bool CSignalMyCustInd::ValidationSettings(void) { //--- validation settings of additional filters if(!CExpertSignal::ValidationSettings()) return(false); //--- initial data checks if(m_ma_period<=0) { printf(__FUNCTION__+": period MA must be greater than 0"); return(false); } //--- ok return(true); }
Kontrol bloğunda, verilen özel gösterge için ana koşulu kontrol ederiz: m_period_fast>=m_period_slow
//+------------------------------------------------------------------+
//| Checking parameters of protected data |
//+------------------------------------------------------------------+
bool CSignalMyCustInd::ValidationSettings(void)
{
//--- validation settings of additional filters
if(!CExpertSignal::ValidationSettings())
return(false);
//--- initial data checks
if(m_period_fast>=m_period_slow)
{
printf(__FUNCTION__+": slow period must be greater than fast period");
return(false);
}
//--- ok
return(true);
}
Sonraki blok, göstergelerin oluşturulmasıyla ilgilidir:
//+------------------------------------------------------------------+ //| Create indicators. | //+------------------------------------------------------------------+ bool CSignalMyCustInd::InitIndicators(CIndicators *indicators) { //--- check pointer if(indicators==NULL) return(false); //--- initialization of indicators and time series of additional filters if(!CExpertSignal::InitIndicators(indicators)) return(false); //--- create and initialize MA indicator if(!InitMA(indicators)) return(false); //--- ok return(true); }
Özel göstergemize uygulandığı gibi:
//+------------------------------------------------------------------+
//| Creation of indicators. |
//+------------------------------------------------------------------+
bool CSignalMyCustInd::InitIndicators(CIndicators *indicators)
{
//--- check of pointer is performed in the method of the parent class
//---
//--- initialization of indicators and time series of additional filters
if(!CExpertSignal::InitIndicators(indicators))
return(false);
//--- creation and initialization of the custom indicator
if(!InitMyCustomIndicator(indicators))
return(false);
//--- ok
return(true);
}
Aşağıdaki blok, gösterge başlatma bloğudur:
//+------------------------------------------------------------------+ //| Initialize MA indicators. | //+------------------------------------------------------------------+ bool CSignalMyCustInd::InitMA(CIndicators *indicators) { //--- check pointer if(indicators==NULL) return(false); //--- add object to collection if(!indicators.Add(GetPointer(m_env))) { printf(__FUNCTION__+": error adding object"); return(false); } //--- initialize object if(!m_env.Create(m_symbol.Name(),m_period,m_ma_period,m_ma_shift,m_ma_method,m_ma_applied,m_deviation)) { printf(__FUNCTION__+": error initializing object"); return(false); } //--- ok return(true); }
İlk olarak, koleksiyona bir nesne ekliyoruz. Ardından göstergemizin parametrelerini ayarlıyoruz ve CIndicators sınıfının Create yöntemini kullanarak özel göstergeyi oluşturuyoruz:
//+------------------------------------------------------------------+
//| Initialization of indicators. |
//+------------------------------------------------------------------+
bool CSignalMyCustInd::InitMyCustomIndicator(CIndicators *indicators)
{
//--- add an object to the collection
if(!indicators.Add(GetPointer(m_mci)))
{
printf(__FUNCTION__+": error adding object");
return(false);
}
//--- set parameters of the indicator
MqlParam parameters[4];
//---
parameters[0].type=TYPE_STRING;
parameters[0].string_value="Examples\\MACD.ex5";
parameters[1].type=TYPE_INT;
parameters[1].integer_value=m_period_fast;
parameters[2].type=TYPE_INT;
parameters[2].integer_value=m_period_slow;
parameters[3].type=TYPE_INT;
parameters[3].integer_value=m_period_signal;
//--- object initialization
if(!m_mci.Create(m_symbol.Name(),0,IND_CUSTOM,4,parameters))
{
printf(__FUNCTION__+": error initializing object");
return(false);
}
//--- number of buffers
if(!m_mci.NumBuffers(4)) return(false);
//--- ok
return(true);
}
Sonraki blok, satın alma koşullarını kontrol eder:
//+------------------------------------------------------------------+ //| "Voting" that the price will grow. | //+------------------------------------------------------------------+ int CSignalMyCustInd::LongCondition(void) { int result=0; int idx =StartIndex(); double close=Close(idx); double upper=Upper(idx); double lower=Lower(idx); double width=upper-lower; //--- if the model 0 is used and price is in the rollback zone, then there is a condition for buying if(IS_PATTERN_USAGE(0) && close<lower+m_limit_in*width && close>lower-m_limit_out*width) result=m_pattern_0; //--- if the model 1 is used and price is above the rollback zone, then there is a condition for buying if(IS_PATTERN_USAGE(1) && close>upper+m_limit_out*width) result=m_pattern_1; //--- return the result return(result); }
Model 0 uygulamamıza göre, iki model kontrol edilir:
//+------------------------------------------------------------------+
//| "Voting" that the price will grow. |
//+------------------------------------------------------------------+
int CSignalMyCustInd::LongCondition(void)
{
int result=0;
int idx =StartIndex();
//--- check direction of the main line
if(DiffMain(idx)>0.0)
{
//--- the main line goes upwards, which confirms the possibility of the price growth
if(IS_PATTERN_USAGE(0))
result=m_pattern_0; // "confirming" signal number 0
//--- if the model 1 is used, look for a reverse of the main line
if(IS_PATTERN_USAGE(1) && DiffMain(idx+1)<0.0)
result=m_pattern_1; // signal number 1
}
//--- return the result
return(result);
}
Aşağıdaki blok, satma koşullarını kontrol eder:
//+------------------------------------------------------------------+ //| "Voting" that the price will fall. | //+------------------------------------------------------------------+ int CSignalMyCustInd::ShortCondition(void) { int result =0; int idx =StartIndex(); double close=Close(idx); double upper=Upper(idx); double lower=Lower(idx); double width=upper-lower; //--- if the model 0 is used and price is in the rollback zone, then there is a condition for selling if(IS_PATTERN_USAGE(0) && close>upper-m_limit_in*width && close<upper+m_limit_out*width) result=m_pattern_0; //--- if the model 1 is used and price is above the rollback zone, then there is a condition for selling if(IS_PATTERN_USAGE(1) && close<lower-m_limit_out*width) result=m_pattern_1; //--- return the result return(result); }
Model 0 uygulamamıza göre, iki model kontrol edilir:
//+------------------------------------------------------------------+
//| "Voting" that the price will fall. |
//+------------------------------------------------------------------+
int CSignalMyCustInd::ShortCondition(void)
{
int result=0;
int idx =StartIndex();
//--- check direction of the main line
if(DiffMain(idx)<0.0)
{
//--- the main line gown downwards, which confirms the possibility of the price fall
if(IS_PATTERN_USAGE(0))
result=m_pattern_0; // "confirming" signal number 0
//--- if the model 1 is used, look for a reverse of the main line
if(IS_PATTERN_USAGE(1) && DiffMain(idx+1)>0.0)
result=m_pattern_1; // signal number 1
}
//--- return the result
return(result);
}
Sonuç
Umarım bu makale, özel göstergenize dayalı olarak bir alım satım sinyali üretecini nasıl oluşturabileceğinizi anlamanıza yardımcı olmuştur.
MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/691
- Ücretsiz ticaret 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