English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
Özel Göstergeye Dayalı Alım Satım Sinyali Üreteci

Özel Göstergeye Dayalı Alım Satım Sinyali Üreteci

MetaTrader 5Örnekler | 22 Aralık 2021, 15:47
176 0
Vladimir Karputov
Vladimir Karputov

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 

Ş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

Ş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  

Ş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

Ş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

Ş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

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

Ekli dosyalar |
mysignal.mqh (9.38 KB)
2013'ün İkinci Çeyreği için MQL5 Market Sonuçları 2013'ün İkinci Çeyreği için MQL5 Market Sonuçları
1,5 yıldır başarıyla faaliyet gösteren MQL5 Market, en büyük yatırımcıların alım satım stratejileri ve teknik göstergeleri mağazası haline geldi. Dünyanın dört bir yanından 350 geliştirici tarafından sağlanan yaklaşık 800 alım satım uygulaması sunmaktadır. 100.000'den fazla alım satım programı, yatırımcılar tarafından satın alınmış ve MetaTrader 5 terminallerine indirilmiştir.
2013'ün İlk Çeyreği için MQL5 Market Sonuçları 2013'ün İlk Çeyreği için MQL5 Market Sonuçları
Kuruluşundan bu yana, MQL5 Market alım satım robotları ve teknik göstergeler mağazası, 580 ürün yayınlamış 250'den fazla geliştiriciyi cezbetti. 2013'ün ilk çeyreği, ürünlerini satarak ciddi kazançlar elde etmeyi başaran bazı MQL5 Market satıcıları için oldukça başarılı geçti.
MetaTrader 4 ve MetaTrader 5 Alım Satım Platformları ile Sosyal Alım Satım MetaTrader 4 ve MetaTrader 5 Alım Satım Platformları ile Sosyal Alım Satım
Sosyal alım satım nedir? Bu, başarılı yatırımcıların alım satım işlemlerinin izlenmesine izin verdiği ve potansiyel yatırımcıların performanslarını izleme ve daha umut vaat edici görünenlerin alım satım işlemlerini kopyalama fırsatı bulduğu yatırımcılar ve sermaye sahiplerinin karşılıklı olarak gerçekleştirdiği yararlı bir işbirliğidir.
Jeremy Scott - Başarılı MQL5 Market Satıcısı Jeremy Scott - Başarılı MQL5 Market Satıcısı
MQL5.community'de Johnnypasado takma adıyla daha iyi tanınan Jeremy Scott, MQL5 Market hizmetimizde ürün sunarak ün kazandı. Jeremy, Market'ta şimdiden birkaç bin dolar kazandı, ancak sınır bu değil. Gelecekteki milyonere daha yakından bakmaya ve MQL5 Market satıcıları için bazı tavsiyeler almaya karar verdik.