English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
MQL5 Sihirbazı: EA'ya Herhangi bir Fiyattaki Bekleyen Emirleri Açması Nasıl Öğretilir?

MQL5 Sihirbazı: EA'ya Herhangi bir Fiyattaki Bekleyen Emirleri Açması Nasıl Öğretilir?

MetaTrader 5Örnekler | 13 Ocak 2022, 16:40
190 0
Vladimir Karputov
Vladimir Karputov

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

Şekil 1. Signal_PriceLevel=-50

Signal_PriceLevel=50:

Şekil 2. 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

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

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

  1. 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.
  2. 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ığı

Ş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

Ş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

Ş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ı. Bir içerik dosyası oluşturma

Ş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

Ş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

Ş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

Ş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

Ş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 13. D1'de EURUSD için Test

Şekil 14. D1'de USDJPY 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

Kullanılabilir Teknolojiler Kokteyli ile MQL5 Müşterilerinizi Büyüleyin! Kullanılabilir Teknolojiler Kokteyli ile MQL5 Müşterilerinizi Büyüleyin!
MQL5, programcılara MetaTrader ortamında istedikleri her şeyi yapabilecekleri eksiksiz bir fonksiyonlar ve nesne yönelimli API seti sağlar. Bununla birlikte, Web Teknolojisi günümüzde çok özel bir şey yapmanız gerektiğinde, müşterilerinizi farklı bir şeyle hayrete düşürmek istediğinizde veya basitçe MT5 Standart Kitaplığının belirli bir bölümünde ustalaşmak için yeterli zamanınız olmadığında imdadınıza yetişecek son derece çok yönlü bir araçtır. Bugünkü alıştırma, inanılmaz bir teknoloji kokteyli oluştururken aynı anda geliştirme zamanınızı nasıl yönetebileceğinize dair pratik bir örnek ile size yol gösterir.
Otomatik Haber Yatırımcısı Oluşturma Otomatik Haber Yatırımcısı Oluşturma
Bu makale, size basit bir OO EA'nın sıfırdan nasıl oluşturulacağını gösteren ve nesne yönelimli programlamaya dair bazı ipuçları sağlayan bir diğer MQL5 OOP sınıfı makalesinin devamıdır. Bugün size haberlere göre alım satım yapabileceğiniz bir EA geliştirmek için gereken teknik temelleri göstereceğim. Amacım, size OOP hakkında fikir vermeye devam etmek ve ayrıca, bu makale dizisinde dosya sistemi ile çalışan yeni bir konuyu ele almak.
Doğrusal Alım Satım Sistemlerinizi Güçlendirin Doğrusal Alım Satım Sistemlerinizi Güçlendirin
Bugünün makalesi, orta düzeyde MQL5 programcılarının, üstünü alma tekniğinin kolayca uygulanması ile doğrusal alım satım sistemlerinden nasıl daha fazla kâr elde edebileceğini gösterir. Bunun nedeni, elde edilen öz varlık eğrisi büyümesinin geometrik veya üstel olması ve bir parabol şeklini almasıdır. Özellikle, Ralph Vince tarafından geliştirilen Sabit Kesirli pozisyon boyutlandırmasının pratik bir MQL5 varyantını uygulayacağız.
MQL5 Sihirbazı ve Hlaiman EA Oluşturucu Kullanarak Sinir Ağı EA'ları Oluşturma MQL5 Sihirbazı ve Hlaiman EA Oluşturucu Kullanarak Sinir Ağı EA'ları Oluşturma
Makale, MQL5 Sihirbazı ve Hlaiman EA Oluşturucu kullanarak otomatik sinir ağı EA'ları oluşturma yöntemini açıklar. Teorik bilgilerin tamamını öğrenmek ve kendi kodunuzu yazmak zorunda kalmadan nasıl kolay bir şekilde sinir ağları ile çalışmaya başlayabileceğinizi gösterir.