
MQL5 Sihirbazı: EA'ya Herhangi bir Fiyattaki Bekleyen Emirleri Açması Nasıl Öğretilir?
Giriş
MQL5 Sihirbazı kullanılarak oluşturulan bir Uzman Danışman, yalnızca mevcut fiyattan sabit uzaklıktaki bekleyen emirleri açabilir. Bunun anlamı, piyasa durumu değişirse (örneğin piyasa volatilitesinde bir değişiklik), Uzman Danışmanın yeni parametreler ile yeniden çalıştırılmasının gerekmesidir.
Bu da, birçok alım satım sistemi için uygun olmaz. Birçok durumda, bekleyen emirler için fiyat seviyesi bir alım satım sistemi tarafından dinamik olarak belirlenir. Ve mevcut fiyattan uzaklık sürekli olarak değişir. Bu makalede, MQL5 Sihirbazı kullanılarak oluşturulan bir Uzman Danışmanın, mevcut fiyattan değişen uzaklıklardaki bekleyen emirleri açabileceği şekilde nasıl değiştirileceğini tartışacağız.
1. MQL5 Sihirbazı kullanılarak oluşturulan Uzman Danışmanda Bekleyen Emirleri Açma Mekanizması
Oluşturulan bir Uzman Danışman, başlığında aşağıda sağlanan ile neredeyse aynı koda sahip olacaktır:
//+------------------------------------------------------------------+ //| Inputs | //+------------------------------------------------------------------+ //--- inputs for expert input string Expert_Title="ExpertMySignalEnvelopes.mq5"; // Document name ulong Expert_MagicNumber =3915; // bool Expert_EveryTick =false; // //--- inputs for main signal input int Signal_ThresholdOpen =10; // Signal threshold value to open [0...100] input int Signal_ThresholdClose =10; // Signal threshold value to close [0...100] input double Signal_PriceLevel =0.0; // Price level to execute a deal input double Signal_StopLevel =85.0; // Stop Loss level (in points) input double Signal_TakeLevel =195.0; // Take Profit level (in points) input int Signal_Expiration =0; // Expiration of pending orders (in bars) input int Signal_Envelopes_PeriodMA =13; // Envelopes(13,0,MODE_SMA,...) Period of averaging input int Signal_Envelopes_Shift =0; // Envelopes(13,0,MODE_SMA,...) Time shift input ENUM_MA_METHOD Signal_Envelopes_Method =MODE_SMA; // Envelopes(13,0,MODE_SMA,...) Method of averaging input ENUM_APPLIED_PRICE Signal_Envelopes_Applied =PRICE_CLOSE; // Envelopes(13,0,MODE_SMA,...) Prices series input double Signal_Envelopes_Deviation=0.2; // Envelopes(13,0,MODE_SMA,...) Deviation input double Signal_Envelopes_Weight =1.0; // Envelopes(13,0,MODE_SMA,...) Weight [0...1.0] //--- inputs for money input double Money_FixLot_Percent =10.0; // Percent input double Money_FixLot_Lots =0.1; // Fixed volume //+------------------------------------------------------------------+
Lütfen Signal_PriceLevel parametresini not alın. Varsayılan olarak Uzman Danışman Signal_PriceLevel=0 ile oluşturulur. Bu parametre mevcut fiyattan uzaklığı tanımlar. Eğer sıfıra eşitse, mevcut piyasa fiyatından bir emir açılacaktır. Bekleyen bir emri açmak için, Signal_PriceLevel parametresi için sıfır olmayan bir değer ayarlamalısınız, yani Signal_PriceLevel hem pozitif hem negatif olabilir.
Signal_PriceLevel değeri genellikle büyük bir sayıdır. Negatif ve pozitif değerler arasındaki fark aşağıda gösterilmiştir:
Signal_PriceLevel=-50:
Şekil 1. Signal_PriceLevel=-50
Signal_PriceLevel=50:
Şekil 2. Signal_PriceLevel=50
Dolayısıyla, Signal_PriceLevel=-50ise, bir bekleyen emir mevcut fiyattan daha az olumlu fiyattan açılacakken Signal_PriceLevel=50 ise, bir bekleyen emir mevcut fiyattan daha iyi fiyattan açılacaktır.
Uzman Danışmanın bu sürümü, Satış Durdur (Sell Stop) ve Alış Durdur (Buy Stop) emirlerini açar.
2. Bir Bekleyen Emri Açma Fiyatından Uzaklığa dair Verileri Nerede Saklarız?
İlk olarak aşağıdaki şekle bakalım ve daha sonra yorumlara geçelim:
Şekil 3. Mevcut fiyattan uzaklığa dair verileri saklama
Yukarıdaki şeklin yorumlanması.
Uzman Danışman MQL5 Sihirbazı kullanılarak oluşturulan Uzman Danışmandır.
- CExpert sınıfının ExtExpert nesnesi, Uzman Danışmanda global düzeyde bildirilir.
- Ardından, Uzman Danışmanın OnInit() fonksiyonunda, CExpertSignal sınıfının sinyal nesnesine bir işaretçi bildiririz ve sinyal nesnesi, yeni işleci kullanılarak hemen oluşturulur.
- OnInit() fonksiyonundayken, ExtExpert nesnesinin InitSignal fonksiyonunu çağırırız ve sinyal nesnesini başlatırız.
- OnInit() fonksiyonundayken, sinyal nesnesinin, Signal_PriceLevel parametresini elde eden PriceLevel fonksiyonunu çağırırız.
Dolayısıyla, mevcut fiyattan uzaklığın saklandığı ve Uzman Danışmanda bildirilen Signal_PriceLevel parametresi, CExpertSignal sınıfının sinyal nesnesine aktarılır.
CExpertSignal sınıfı, korunan sınıf kapsamı ile bildirilen m_price_level değişkeninde mevcut fiyattan uzaklık değerini saklar:
class CExpertSignal : public CExpertBase { protected: //--- variables double m_base_price; // base price for detection of level of entering (and/or exit?) //--- variables for working with additional filters CArrayObj m_filters; // array of additional filters (maximum number of fileter is 64) //--- Adjusted parameters double m_weight; // "weight" of a signal in a combined filter int m_patterns_usage; // bit mask of using of the market models of signals int m_general; // index of the "main" signal (-1 - no) long m_ignore; // bit mask of "ignoring" the additional filter long m_invert; // bit mask of "inverting" the additional filter int m_threshold_open; // threshold value for opening int m_threshold_close;// threshold level for closing double m_price_level; // level of placing a pending orders relatively to the base price double m_stop_level; // level of placing of the "stop loss" order relatively to the open price double m_take_level; // level of placing of the "take profit" order relatively to the open price int m_expiration; // time of expiration of a pending order in bars
3. MQL5 Sihirbazı kullanılarak oluşturulan Uzman Danışmanın Yapısı
Uzman Danışman farklı fonksiyonellikleri olan birkaç bloktan oluşur.
Şekil 4. Uzman Danışmanın Yapısı
Yukarıdaki resmin yorumlanması:
- Uzman Danışman MQL5 Sihirbazı kullanılarak oluşturulan Uzman Danışmandır.
- CExpert alım satım stratejilerinin uygulanması için temel bir sınıftır.
- CExpertSignal, alım satım sinyalleri oluşturucular için temel sınıftır.
- filtre0 ... filtren alım satım sinyali oluşturucularıdır, CExpertSignal sınıfı soyundan gelir. Alım satım sistemimizin, Zarflar Göstergesi alım satım oluşturucu temelli olduğu, ancak oluşturucu içerisindeki sinyallerin değiştirildiği belirtilmelidir. Bu değişikliklerden bölüm 7'de bahsedeceğiz.
4. Değişiklik için Tavsiye Edilen Uzman Danışman Blokları
MQL5 Sihirbazı kullanılarak oluşturulan Uzman Danışmanın yapısından görebileceğiniz üzere temel sınıf blokları vardır. Temel sınıflar, Standart Kitaplığın bir parçasıdır.
Sınıfların kendisi diğer temel sınıfların soyundan gelir ve bir veya birkaç temel sınıftan oluşur. Aşağıda, CExpert ve CExpertSignal olmak üzere iki sınıfın kodunun ilk birkaç satırını bulabilirsiniz:
//+------------------------------------------------------------------+ //| Expert.mqh | //| Copyright 2009-2013, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #include "ExpertBase.mqh" #include "ExpertTrade.mqh" #include "ExpertSignal.mqh" #include "ExpertMoney.mqh" #include "ExpertTrailing.mqh" //+------------------------------------------------------------------+ . . . class CExpert : public CExpertBase
ve
//+------------------------------------------------------------------+ //| ExpertSignal.mqh | //| Copyright 2009-2013, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #include "ExpertBase.mqh" . . . class CExpertSignal : public CExpertBase
Temel sınıfların herhangi bir şekilde değiştirilmesine kesinlikle karşıyım:
- MetaEditor güncellendiğinde, temel sınıflarda yaptığınız tüm değişikliklerin üzerine yazılacaktır ve temel sınıflar başlangıç durumuna geri döndürülecektir.
- Bu durumda devralma daha uygun olacaktır. Ancak o zaman da BÜTÜN Standart Kitaplığı değiştirmeniz gerekecektir.
Bunun yerine, özellikle alım satım sistemimizin halihazırda kullanımda olan bir değiştirilmiş modülü -Zarflar göstergesinin alım satım sinyali oluşturucusu- olduğundan Uzman Danışman ve alım satım sinyali oluşturucu modüllerin bloğunu değiştirmek en iyisidir.
Öyleyse karar verildi: Değişiklikleri Uzman Danışman bloklarında ve alım satım sinyali oluşturucu bloğunda yapacağız.
5. Uygulama Mantığı
İşaretçi, Uzman Danışmandan alım satım sinyali oluşturucuya aktarılacaktır.
Bunun için, ek olarak korunan kapsama sahip bir değişken bildirmemiz ve Uzman Danışmandan işaretçiyi dahili değişkende saklayan bir yöntem yazmamız gerekir:
Şekil 5. Uygulama Mantığı
6. Alım Satım Sistemi
Grafik zaman aralığı D1'dir. Kullanılacak gösterge, 13'lük ortalamalı dönem ve Üstel ortalamalı yöntem ile Zarflar göstergesidir. Uzman Danışmanın açabileceği emir türleri şunlardır: Satış Durdur (Sell Stop) ve Alış Durdur (Buy Stop).
Daha önceki çubuk yukarı yönlü ise bir Satış Durdur emri ayarlarız. Daha önceki çubuk aşağı yönlü ise bir Alış Durdur emri ayarlarız. Diğer bir deyişle geri çekilme ümit ederiz:
Şekil 6. Alım Satım Sistemi
Alım satım sisteminin gerektirdiği alım satım sinyallerini oluşturmak için, SignalEnvelopes.mqh alım satım sinyali oluşturucunun standart modülü değiştirilmiştir.
Burada, Standart Kitaplıktan herhangi bir alım satım sinyali oluşturucuyu kullanabileceğinizi unutmayın.
7. Alım Satım Sinyali Oluşturucu Değişikliği Çubuk Fiyatını Elde Etme
Öyleyse başlayalım. Belirtmeliyim ki, programlarımı MQL5 Depolama içinde saklamayı tercih ediyorum.
Alım satım sinyali oluşturucuyu değiştirmeye başlamak için yapmamız gereken ilk şey, bir boş içerik dosyası oluşturmak, her şeyi buradan silmek ve Zarflar göstergesinin standart alım satım sinyali oluşturucusunun tüm içeriğini buraya kopyalamaktır.
Varsayılan olarak alım satım sinyali oluşturucu ...MQL5\Include\Expert\Signal yolunda bulunmalıdır. Standart Kitaplığın ...\Signal klasörünü çok fazla bilgi ile doldurmamak için ...\Expert klasörü altında bir başka klasör oluşturalım ve bunu \MySignals olarak adlandıralım:
Şekil 7. MySignals klasörü oluşturma
Daha sonra MQL5 Sihirbazını kullanarak bir içerik dosyası oluşturacağız.
MetaEditor'da Dosya menüsü altında "Yeni" seçeneğini seçin ve ardından "İçerik dosyası (*.mqh)" öğesini seçin.
Şekil 8. MQL5 Sihirbazı. İçerik dosyası oluşturma
Sinyal oluşturucu sınıfımızın adı MySignalEnvelopes olacaktır.
Ve aşağıdaki yolda bulunacaktır: Include\Expert\MySignals\MySignalEnvelopes. Bunu belirtelim:
Şekil 9. MQL5 Sihirbazı. İçerik dosyasının konumu
"Bitir" tuşuna tıkladıktan sonra, MQL5 Sihirbazı boş bir şablon oluşturacaktır.
Oluşturulan MySignalEnvelopes.mqh dosyası daha sonra MQL5 Depolamasına eklenmelidir:
Şekil 10. MQL5 Depolama. Dosya ekleme
Dosya eklendikten sonra MQL5 Depolamasına yapılan değişiklikleri uygulamamız gerekir:
Şekil 11. MQL5 Depolama. Değişiklikleri uygulama
Yukarıdaki adımları tamamladıktan sonra, alım satım sinyali oluşturucumuzu değiştirmeye geçebiliriz.
Oluşturucu \Include\Expert\Signal\SignalEnvelopes.mqh dosyasına dayandığından, yalnızca orijinal başlığı bırakarak dosyanın tüm içeriğini kopyalıyoruz ve bunu oluşturucu dosyasına yapıştırıyoruz:
//+------------------------------------------------------------------+ //| MySignalEnvelopes.mqh | //| Copyright © 2013, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2013, Vladimir Karputov" #property link "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. | //| 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 timeseries 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 timeseries 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 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 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); } //+------------------------------------------------------------------+
Şimdi, kodun bazı kısımlarındaki değişiklikler üzerinde çalışacağız.
Kafa karışıklığını önlemek için değiştirilmiş kod vurgulanacaktır:
//+------------------------------------------------------------------+
//| MySignal.mqh |
//| Copyright © 2013, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
Değiştirilmiş kod, kopyalanması ve alım satım sinyali oluşturucuya yapıştırılması gereken koddur. Bu vurgulamanın kodu daha iyi anlamanıza yardımcı olmasını umuyorum.
Alım satım sinyali oluşturucunun kendi sınıfını yazdığımız için adı temel sınıf adından farklı olmalıdır. Bu nedenle, bütün kod boyunca CSignalEnvelopes ifadesini CMySignalEnvelopes ile değiştiriyoruz:
Şekil 12. Sınıfı yeniden adlandırma
Alım satım sinyali oluşturucu sınıfının MQL5 Sihirbazında kendi adı altında görüntülendiğinden emin olmak için, açıklama bloğundaki sınıf
//| Title=Signals of indicator 'Envelopes' |
adını
//| Title=Signals of indicator 'MySignalEnvelopes' |
MA periyodu değerini şu değerle değiştir:
//| Parameter=PeriodMA,int,45,Period of averaging |
13 (bu sadece benim önerimdir, tercih ettiğiniz herhangi bir değeri ayarlayabilirsiniz)
//| Parameter=PeriodMA,int,13,Period of averaging |
Ek olarak, daha büyük bir değer ayarlayarak Sapma
//| Parameter=Deviation,double,0.15,Deviation |
parametresini de değiştiriyoruz.
//| Parameter=Deviation,double,1.15,Deviation |
Uygulama mantığımıza göre, ana sinyale işaretçiyi saklayacak bir dahili değişken bildirmemiz gerekiyor.
Bunun bir dahili değişken (yalnızca alım satım sinyali oluşturucu sınıf kapsamında) olması gerektiğinden bu, aşağıdaki kod bloğuna eklenecektir:
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 //--- "weights" of market models (0-100) int m_pattern_0; // model 0 CExpertSignal *m_signal; // storing the pointer to the main signal
Bazı gereksiz değişkenleri koddan sildiğimi lütfen unutmayın.
Ana sinyale işaretçiyi saklama yöntemi bir diğer kod bloğunda -"ana sinyale işaretçiyi ayarlama yöntemi"- bildirilecektir. Burada bazı ilgisiz yöntemleri de sildim.
public: CMySignalEnvelopes(void); ~CMySignalEnvelopes(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; } //--- methods of adjusting "weights" of market models void Pattern_0(int value) { m_pattern_0=value; } //--- method of verification of settings virtual bool ValidationSettings(void); //--- method of creating the indicator and timeseries virtual bool InitIndicators(CIndicators *indicators); //--- methods of checking if the market models are formed virtual int LongCondition(void); virtual int ShortCondition(void); //--- method of setting the pointer to the main signal virtual bool InitSignal(CExpertSignal *signal=NULL);
Şimdi oluşturucudaki bazı değiştirilmiş parametreleri belirtelim ve artık gerekli olmayan değişkenleri silelim:
//+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CMySignalEnvelopes::CMySignalEnvelopes(void) : m_ma_period(13), m_ma_shift(0), m_ma_method(MODE_SMA), m_ma_applied(PRICE_CLOSE), m_deviation(1.15), m_pattern_0(50)
Bu noktada, alım satım sinyali oluşturma mantığını bizim alım satım sistemimize göre değiştirmeye geçebiliriz.
Bir alış sinyalinden sorumlu kod bloğu:
int CMySignalEnvelopes::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); }
gerekli değişiklikleri takiben aşağıda gösterildiği gibi olacaktır:
int CMySignalEnvelopes::LongCondition(void) //---buy
{
int result=0;
int idx =StartIndex();
double open=Open(idx);
double close=Close(idx);
double prlevel;
if(IS_PATTERN_USAGE(0) && close<open)
{
prlevel=GetPriceLevelStopp(open,Open(0));
m_signal.PriceLevel(prlevel);
result=m_pattern_0;
}
//--- return the result
return(result);
}
Bir satış sinyalinden sorumlu kod bloğu:
int CMySignalEnvelopes::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); }
gerekli değişiklikleri takiben aşağıda gösterildiği gibi olacaktır:
int CMySignalEnvelopes::ShortCondition(void) //---sell
{
int result =0;
int idx =StartIndex();
double open=Open(idx);
double close=Close(idx);
double prlevel;
if(IS_PATTERN_USAGE(0) && close>open)
{
prlevel=GetPriceLevelStopp(Open(0),open);
m_signal.PriceLevel(prlevel);
result=m_pattern_0;
}
//--- return the result
return(result);
}
8. Sinyal Kodu Bloğuna Dair Birkaç Yorum
Belirli bir sinyal için gerekli koşul karşılanırsa, mevcut fiyattan uzaklık değeri olan "20" veya "15" gibi bir sayı döndüren GetPriceLevelStopp yöntemini çağırırız.
Bunu, m_signal nesnesinin PriceLevel yönteminin çağrılması (bekleyen emir seviyesi fiyatını belirlemek için uzaklığı ayarlar) izler. m_signal öğesinin, ana sinyale işaretçiyi saklayan CExpertSignal sınıfı nesne olduğu hatırlatılmalıdır.
GetPriceLevelStopp yönteminin kodu aşağıda verilmektedir:
double CMySignalEnvelopes::GetPriceLevelStopp(double price_0,double min)
{
double level;
double temp;
temp-=(price_0-min)/PriceLevelUnit();
level=NormalizeDouble(temp,0);
return(level);
}
Bu yöntemi sınıf başlığında bildirmeliyiz:
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)); } double GetPriceLevelStopp(double price,double min); };
İhtiyacımız olacak bir diğer yöntem, ana sinyale işaretçinin dahili değişkene aktarılması yöntemidir:
bool CMySignalEnvelopes::InitSignal(CExpertSignal *signal)
{
m_signal=signal;
return(true);
}
Bundan sonra, MQL5 Sihirbazında bir Uzman Danışman oluşturmamız ve bunu "MySignalEnvelopes" sinyal modülüne eklememiz gerekiyor.
Ayrıca InitSignal yöntemi çağrısını da MQL5 Sihirbazı kullanılarak oluşturulan Uzman Danışmana eklememiz gerekiyor:
//--- Set filter parameters filter0.PeriodMA(Signal_Envelopes_PeriodMA); filter0.Shift(Signal_Envelopes_Shift); filter0.Method(Signal_Envelopes_Method); filter0.Applied(Signal_Envelopes_Applied); filter0.Deviation(Signal_Envelopes_Deviation); filter0.Weight(Signal_Envelopes_Weight); filter0.InitSignal(signal); //...
Uzman Danışmanın çalışmasının daha iyi görselleştirilmesi için kısa bir video hazırladım:
MQL5 Sihirbazı kullanılarak oluşturulan Uzman Danışman kodunun yanı sıra sinyal modülü kodu makaleye eklenmiştir.
Aşağıda, Uzman Danışmanın test sonuçlarını görebilirsiniz. Aşağıdaki parametreler ile EURUSD ve USDJPY için test edilmiştir: test dönemi 2013.01.01 - 2013.09.01, zaman aralığı - D1, Zarar Durdur seviyesi= 85, Kâr Al seviyesi= 195.
Şekil 13. D1'de EURUSD için Test
Şekil 14. D1'de USDJPY için test
Sonuç
Mevcut fiyattan herhangi bir uzaklıkta olan bekleyen emirleri ayarlamanıza olanak sağlayan fonksiyonelliğin uygulanması için bir alım satım sinyali modülünün kodunun nasıl değiştirileceğini görmüş olduk: bu fiyat, önceki çubuğun Kapanış veya Açılış fiyatı veya hareketli ortalama değeri olabilir. Birçok seçenek vardır. Önemli olan, bekleyen bir emir için herhangi bir açılış fiyatı belirleyebilmenizdir.
Makale, ana sinyale işaretçiye nasıl erişebileceğimizi ve dolayısıyla CExpertSignal sınıfı yöntemleri göstermiştir. Bu makalenin, bekleyen emirler ile alım satım yapan yatırımcılar için faydalı olacağına inanıyorum..
MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/723





- Ü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