English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
6 Adımda Kendi Alım Satım Robotunuzu Oluşturun!

6 Adımda Kendi Alım Satım Robotunuzu Oluşturun!

MetaTrader 5Örnekler | 9 Aralık 2021, 12:49
345 0
MetaQuotes
MetaQuotes

Bir Kez Daha MQL5 Sihirbazı Hakkında

Çevremizdeki dünya hızla değişiyor ve biz buna ayak uydurmaya çalışıyoruz. Yeni bir şey öğrenmek için zamanımız yok ve bu, normal bir insanın normal bir tavrıdır. Yatırımcılar da herkes gibi insandır, minimum çabayla maksimum sonuç almak isterler. Özellikle yatırımcılar için MetaEditor 5 harika bir MQL5 Sihirbazı sunar. Bir "hafif sürüm" olan Sahte Veriler için MQL5 Sihirbazı ve bir "geliştiriciler için sürüm" olan MQL5 Sihirbazı dahil olmak üzere, sihirbazı kullanarak otomatik bir alım satım sisteminin nasıl oluşturulacağını açıklayan birkaç makale vardır: Yeni Sürüm.

Her şey yolunda görünüyor - 5 fare tıklamasıyla bir alım satım robotu oluşturuldu, bunu Strateji Test Cihazında test edebilir ve bir alım satım sisteminin parametrelerini optimize edebilirsiniz, elde edilen robotun, manuel olarak başka bir şey yapmanıza gerek kalmadan hesabınızda alım satım yapmasına izin verebilirsiniz. Ancak sorun, bir yatırımcı/MQL5 geliştiricisi kendine ait bir şey, hiçbir yerde tanımlanmamış benzersiz bir şey oluşturmak istediğinde ve kendi alım satım sinyalleri modülünü yazacağı zaman ortaya çıkar. Yatırımcı MQL5 belgelerini açar, Standart Kitaplığa ulaşır ve şunu görerek dehşete düşer...


Beş Korkunç Sınıf

Doğru, MQL5 Sihirbazı, Uzman Danışmanların (EA) oluşturulmasını büyük ölçüde basitleştirir, ancak önce bunun için neyin giriş olarak kullanılacağını öğrenmeniz gerekir. MQL5 Sihirbazını kullanarak bir Uzman Danışmanı otomatik olarak oluşturmak için, bileşenlerinin Temel Uzman Danışman Sınıfları bölümündeki beş temel sınıfa uyduğundan emin olun:

  • CExpertBase, diğer dört sınıf için bir temel sınıftır.
  • CExpert, bir alım satım robotu oluşturma sınıfıdır; alım satımı yapan sınıf budur.
  • CExpertSignal , alım satım sinyalleri modülü oluşturmaya yönelik bir sınıftır; makale bu sınıf hakkındadır.
  • CExpertTrailing, koruyucu bir Zarar Durdur takibine yönelik bir sınıftır.
  • CExpertMoney para yönetimi sınıfıdır.

Nesne yönelimli programlama (OOP) olarak adlandırılan "büyük ve korkunç" yaklaşımın tüm gücü buradadır. Ama korkmayın, artık hemen hemen herkesin birçok fonksiyonu olan bir cep telefonu var ve neredeyse hiç kimse nasıl çalıştığını bilmiyor. Bütün bunları incelememize gerek yok, sadece CExpertSignal sınıfının bazı fonksiyonlarını tartışacağız.


Bu makalede alım satım sinyalleri modülü oluşturma aşamalarını inceleyeceğiz ve bunun OOP veya sınıfları öğrenmek zorunda kalmadan nasıl yapıldığını göreceksiniz. Ama isterseniz daha sonra biraz daha ileri gidebilirsiniz.


1. Sıfırdan Bir Sınıf Oluşturma

Mevcut herhangi bir alım satım sinyali modülünü ihtiyaçlarımıza göre değiştirmeyeceğiz, çünkü bu şekilde kafamız karışır. Bu nedenle, sadece kendi sınıfımızı yazacağız, ancak önce sinyallerimizi MQL5/Include/Expert/ klasöründe depolamak için yeni bir klasör oluşturmak için Gezgin fonksiyonunu kullanacağız.



Oluşturduğumuz klasöre sağ tıklayın, "Yeni Dosya" seçeneğini seçin ve alım satım sinyalleri modülümüz için yeni bir sınıf oluşturun.


Alanları doldurun:

  • Sınıf Adı - sınıfın adı. Bu, iki hareketli ortalamanın kesişiminde sinyal üretmeye yönelik bir modül olacak, bu yüzden bunu MA_Cross olarak adlandıralım.
  • Taban Adı, sınıfımızın türetildiği sınıftır. Ve bunu CExpertSignal temel sınıfından türetmeliyiz.

"Bitir" düğmesine tıklayın ve modülümüzün bir taslağı hazırdır. Şimdiye kadar hepsi kolaydı. Derleyicinin CExpertSignal temel sınıfını nerede bulacağını bilmesi için yalnızca sonuç dosyasına #include bildirimini eklememiz gerekir.

#include "..\ExpertSignal.mqh"   // CExpertSignal is in the file ExpertSignal

Sonuç:

//+------------------------------------------------------------------+
//|                                                     MA_Cross.mqh |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include "..\ExpertSignal.mqh"   // CExpertSignal is in the file ExpertSignal
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class MA_Cross : public CExpertSignal
  {
private:

public:
                     MA_Cross();
                    ~MA_Cross();
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MA_Cross::MA_Cross()
  {
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MA_Cross::~MA_Cross()
  {
  }
//+------------------------------------------------------------------+

Ortaya çıkan sınıfı kontrol edin (derleme hatası içermemelidir) ve F7 tuşuna tıklayın. Hata yok ve devam edebiliriz.


2. Modüle Bir Tanıtıcı

Sınıfımız tamamen boş, hiçbir hatası yok ve bunu test edebiliriz - buna göre MQL5 Sihirbazında yeni bir Uzman Danışman (EA) oluşturmaya çalışalım. Bir alım satım sinyalleri modülü seçme aşamasına geldik ve modülümüzün burada olmadığını görüyoruz.


Ve bu, nasıl orada olabilir? Sınıfımızın faydalı bir şey olabileceğini anlamak için MQL5 Sihirbazı için herhangi bir gösterge eklemiyoruz. Bunu düzeltelim. Standart paketin modüllerine bakarsanız, her birinin dosyanın başlangıcında bir başlık içerdiğini görürsünüz. Bu, belirli kurallara göre derlenmiş modülün tanıtıcısıdır. Ve kurallar çok basittir.

Örneğin, AMA tabanlı alım satım sinyalleri modülünün kaynak kodunu açın (Uyarlanabilir Hareketli Ortalama Sinyalleri bölümündeki mantık açıklamasına bakın.) Ve bu modülü seçerek MQL5 Sihirbazını çalıştırın. Karşılaştır:

Tanıtıcıdaki son blok modül parametrelerine atıfta bulunur, birinci satır MQL5 Sihirbazında görüntülenecek modülün adını içerir. Gördüğünüz gibi, karmaşık bir şey yok. Böylece, her modülün tanıtıcısı aşağıdaki girişleri içerir:

  • Başlık  - MQL5 Sihirbazında gösterilecek modül adı.
  • Tip - sinyal modülünün versiyonu. Her zaman SignalAdvanced olmalıdır.
  • Ad - MQL5 Sihirbazında seçildikten sonra modülün adı ve oluşturulan Uzman Danışmanın (EA) (tercihen belirtilir) dahili parametrelerini açıklamak için yorumlarda kullanılır.
  • ShortName - oluşturulan Uzman Danışmanda (EA) harici parametrelerin otomatik olarak adlandırılması için bir önek (Signal_<ShortName>_<ParameterName> biçiminde).
  • Sınıf - modülde bulunan sınıfın adı.
  • Sayfa - bu modül için Yardım almak için bir parametre (yalnızca standart teslimattaki modüller için).

Ardından, aşağıdakilerin belirtildiği (virgülle ayrılmış) Parameter=list_of_values biçimindeki parametrelerin açıklaması gelir:

  1. Uzman Danışman (EA) başlatılırken parametrenin değerini ayarlayacak fonksiyonun adı.
  2. Parametre türü numaralandırma olabilir.
  3. Parametre için varsayılan değer, yani MQL5 Sihirbazında değiştirmezseniz parametreye ayarlanacak değer.
  4. MQL5 Sihirbazında oluşturulan Uzman Danışmanı (EA) başlattığınızda gördüğünüz parametrenin açıklaması.

Şimdi, tüm bunları bilerek, alım satım sinyalleri modülümüzün tanıtıcısını oluşturalım. Bu nedenle, iki hareketli ortalamanın kesiştiği noktada alım satım sinyalleri almak için bir modül yazıyoruz. En az dört harici parametre ayarlamamız gerekiyor:

  • FastPeriod - hızlı hareketli ortalamanın periyodu
  • FastMethod - hızlı hareketli ortalamanın düzleme türü
  • SlowPeriod - yavaş hareketli ortalamanın periyodu
  • SlowMethod - yavaş hareketli ortalamanın düzleme türü

Hareketli ortalamaların her birini hesaplamak için bir kayma ve fiyat türü de ekleyebilirsiniz, ancak bu temelde hiçbir şeyi değiştirmez. Yani mevcut sürüm aşağıdaki gibidir:

// wizard description start
//+------------------------------------------------------------------+
//| Description of the class                                         |
//| Title=Signals at the intersection of two MAs                     |
//| Type=SignalAdvanced                                              |
//| Name=My_MA_Cross                                                 |
//| ShortName=MaCross                                                |
//| Class=MA_Cross                                                   |
//| Page=Not needed                                                  |
//| Parameter=FastPeriod,int,13,Period of fast MA                    |
//| Parameter=FastMethod,ENUM_MA_METHOD,MODE_SMA,Method of fast MA   |
//| Parameter=SlowPeriod,int,21,Period of slow MA                    |
//| Parameter=SlowMethod,ENUM_MA_METHOD,MODE_SMA,Method of slow MA   |
//+------------------------------------------------------------------+
// wizard description end

Modül tanıtıcı hazır ve içinde aşağıdakileri tanımladık:

  1. MQL5 Sihirbazında görüntülenen ad - "İki hareketli ortalamanın kesişimindeki sinyaller".
  2. Alım satım sinyallerini yapılandırmak için dört harici parametre.
    • FastPeriod - varsayılan değeri 13 olan hızlı hareketli ortalamanın periyodu.
    • FastMethod - hızlı hareketli ortalamanın düzleme türü, varsayılan olarak basit düzleme.
    • SlowPeriod - varsayılan değeri 21 olan yavaş hareketli ortalamanın periyodu.
    • SlowMethod - yavaş hareketli ortalamanın düzleme türü, varsayılan olarak basit düzleme.

Değişiklikleri kaydedin ve derleyin. Hiçbir hata olmamalıdır. Kontrol etmek için MQL5 Sihirbazını çalıştırın. Görüyorsunuz, modülümüz artık seçim için hazır ve tüm parametrelerimizi gösteriyor!


Tebrikler, alım satım sinyali modülümüz şimdi harika görünüyor!


3. Parametre Ayarlama Yöntemleri

Şimdi harici parametrelerle çalışma zamanı. Alım satım modülümüz MA_Cross sınıfı tarafından temsil edildiğinden, parametreleri özel üyelerle aynı sınıf içinde depolanmalıdır. Sınıf bildirimine dört satır (parametre sayısına eşit) ekleyelim. Parametreyi tanıtıcıda zaten tanımladık ve aşağıdakileri biliyoruz:

class MA_Cross : public CExpertSignal
  {
private:
   //--- Configurable module parameters
   int               m_period_fast;    // Period of the fast MA
   int               m_period_slow;    // Period of the slow MA
   ENUM_MA_METHOD    m_method_fast;    // Type of smoothing of the fast MA
   ENUM_MA_METHOD    m_method_slow;    // Type of smoothing of the slow MA

Ancak modülün harici parametrelerinin değerleri nasıl MA_Cross sınıfımızın uygun üyelerinde görünür? Her şey çok basittir, sadece sınıfta aynı ada sahip genel yöntemleri bildirmeniz, yani herkese bölüme dört satır eklemeniz gerekir:

class MA_Cross : public CExpertSignal
  {
private:
   //--- Configurable module parameters
   int               m_period_fast;    // Period of the fast MA
   int               m_period_slow;    // Period of the slow MA
   ENUM_MA_METHOD    m_method_fast;    // Type of smoothing of the fast MA
   ENUM_MA_METHOD    m_method_slow;    // Type of smoothing of the slow MA

public:
   //--- Constructor of class
                     MA_Cross();
   //--- Destructor of class
                    ~MA_Cross();
   //--- Methods for setting
   void              FastPeriod(int value)               { m_period_fast=value;        }
   void              FastMethod(ENUM_MA_METHOD value)    { m_method_fast=value;        }
   void              SlowPeriod(int value)               { m_period_slow=value;        }
   void              SlowMethod(ENUM_MA_METHOD value)    { m_method_slow=value;        }
   };

MQL5 Sihirbazını kullanarak bu modül temelinde bir Uzman Danışman oluşturup grafik üzerinde çalıştırdığınızda, Uzman Danışman (EA) başlatılırken bu dört yöntem otomatik olarak çağrılır. Yani burada basit bir kural vardır:

Modülde parametre oluşturma kuralı - tanıtıcıda bildirdiğimiz her parametre için, sınıfta değerini depolamak için özel bir üye ve buna bir değer ayarlamak için bir herkese açık üye oluşturmalıyız. Yöntem adı, parametrenin adıyla eşleşmelidir.

Ve son eylem, değer ayarlama yöntemlerinin çağrılmadığı durumda kullanılacak parametrelerimizin varsayılan değerlerini ayarlamaktır. Bildirilen her değişken veya sınıf üyesi başlatılmalıdır. Bu teknik, bulunması zor birçok hatadan kaçınmayı sağlar.

Otomatik başlatma için en uygun olanı sınıf yapıcısıdır; bu, bir nesne oluştururken her zaman ilk çağrılır. Varsayılan değerler için modül tanıtıcısında yazılanları kullanacağız.

class MA_Cross : public CExpertSignal
  {
private:
   //--- Configurable module parameters
   int               m_period_fast;    // Period of the fast MA
   ENUM_MA_METHOD    m_method_fast;     // Type of smoothing of the fast MA
   int               m_period_slow;    // Period of the slow MA
   ENUM_MA_METHOD    m_method_slow;     // Type of smoothing of the slow MA

public:
   //--- Constructor of class
                     MA_Cross(void);
   //--- Destructor of class
                    ~MA_Cross(void);
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
MA_Cross::MA_Cross(void) : m_period_fast(13),          // Default period of the fast MA is 3
                           m_method_fast(MODE_SMA),    // Default smoothing method of the fast MA
                           m_period_slow(21),          // Default period of the slow MA is 21
                           m_method_slow(MODE_SMA)     // Default smoothing method of the slow MA
  {
  }

Burada sınıf üyeleri, başlatma listesi kullanılarak başlatılır.

Gördüğünüz gibi, henüz hareketli ortalama göstergelerini kullanmadık. Basit bir kural bulduk - modülün tanıtıcısında birçok parametre belirtildiğinden, modülü uygulayan sınıfta çok fazla yöntem ve üye olmalıdır. Karmaşık bir şey yok! Ancak, yapıcıda parametrelerin varsayılan değerlerini ayarlamayı unutmayın.


4. Giriş Parametrelerinin Doğruluğunun Kontrolü

Alım satım modülümüz için parametreler, bunlara değerleri ayarlamak için yazılı yöntemler ​​oluşturduk ve şimdi bir sonraki önemli aşama geliyor, parametrelerin doğruluğu kontrol edilmelidir. Bizim durumumuzda, hesaplamaları için hareketli ortalamaların periyotlarını ve düzleme türünü kontrol etmeliyiz. Bunun için sınıfta kendi ValidationSettings() yönteminizi yazmalısınız. Bu yöntem, CExpertBase üst sınıfında tanımlanır ve tüm alt sınıflarında zorunlu olarak yeniden tanımlanır.

Ancak nesne yönelimli programlama hakkında hiçbir şey bilmiyorsanız, unutmayın, sınıfımızda parametre gerektirmeyen ve doğru veya yanlış veren ValidationSettings() fonksiyonunu yazmalıyız.

class MA_Cross : public CExpertSignal
  {
...
   //--- Constructor of class
                     MA_Cross(void);
   //--- Destructor of class
                    ~MA_Cross(void);
   //--- Checking correctness of input data
   bool              ValidationSettings();
...
   };
//+------------------------------------------------------------------+
//| Checks input parameters and returns true if everything is OK     |
//+------------------------------------------------------------------+
bool MA_Cross:: ValidationSettings()
  {
   //--- Call the base class method
   if(!CExpertSignal::ValidationSettings())  return(false);
   //--- Check periods, number of bars for the calculation of the MA >=1
   if(m_period_fast<1 || m_period_slow<1)
     {
      PrintFormat("Incorrect value set for one of the periods! FastPeriod=%d, SlowPeriod=%d",
                  m_period_fast,m_period_slow);
      return false;
     }
//--- Slow MA period must be greater that the fast MA period
   if(m_period_fast>m_period_slow)
     {
      PrintFormat("SlowPeriod=%d must be greater than FastPeriod=%d!",
                  m_period_slow,m_period_fast);
      return false;
     }
//--- Fast MA smoothing type must be one of the four values of the enumeration
   if(m_method_fast!=MODE_SMA && m_method_fast!=MODE_EMA && m_method_fast!=MODE_SMMA && m_method_fast!=MODE_LWMA)
     {
      PrintFormat("Invalid type of smoothing of the fast MA!");
      return false;
     }
//--- Show MA smoothing type must be one of the four values of the enumeration
   if(m_method_slow!=MODE_SMA && m_method_slow!=MODE_EMA && m_method_slow!=MODE_SMMA && m_method_slow!=MODE_LWMA) 
     {
      PrintFormat("Invalid type of smoothing of the slow MA!");
      return false;
     }
//--- All checks are completed, everything is ok
   return true;
  }
Gördüğünüz gibi, MA_Cross sınıfının herkese açık kısmına ValidationSettings() yönteminin bildirimini ekledik ve ardından yöntem gövdesini aşağıdaki biçimde ekledik:
bool MA_Cross:: ValidationSettings()

Önce dönüş türü, ardından sınıf adı, ardından kapsam çözümleme operatörü gelir ve tüm bunları daha önce bildirilen yöntemin adı izler. Sınıf yönteminin bildiriminde ve açıklamasında parametre adı ve türünün eşleşmesi gerektiğini unutmayın. Ancak derleyici sizi böyle bir hata konusunda uyaracaktır.

Önce temel sınıf yönteminin çağrıldığını ve ardından giriş parametrelerinin kontrol edildiğini unutmayın.

//--- Call the base class method
   if(!CExpertSignal::ValidationSettings())  return(false);
//--- Our code to check the values of parameters

Bu satırı eklemezseniz, oluşturulan Uzman Danışman (EA) alım satım sinyalleri modülümüzü başlatamaz.


5. Göstergelerimiz Nerede?

Bunlar için parametrelerle ilgili tüm hazırlık çalışmaları tamamlandığından, göstergelerle çalışma zamanı. Alım satım sinyallerinin her modülü, oluşturulan Uzman Danışmanı (EA) çalıştırdığınızda otomatik olarak çağrılan InitIndicators() yöntemini içerir. Bu yöntemde, modülümüz için hareketli ortalamaların göstergelerini sağlamalıyız.

İlk olarak, sınıfta InitIndicators() yöntemini bildirin ve taslağını yapıştırın:

public:
   //--- Constructor of class
                     MA_Cross(void);
   //--- Destructor of class
                    ~MA_Cross(void);
   //--- Methods for setting
   void              FastPeriod(int value)               { m_period_fast=value;        }
   void              FastMethod(ENUM_MA_METHOD value)    { m_method_fast=value;        }
   void              SlowPeriod(int value)               { m_period_slow=value;        }
   void              SlowMethod(ENUM_MA_METHOD value)    { m_method_slow=value;        }
   //--- Checking correctness of input data
   bool              ValidationSettings();
   //--- Creating indicators and timeseries for the module of signals
   bool              InitIndicators(CIndicators *indicators);
  };
...
//+------------------------------------------------------------------+
//| Creates indicators                                               |
//| Input:  a pointer to a collection of indicators                  |
//| Output: true if successful, otherwise false                      |
//+------------------------------------------------------------------+
bool MA_Сross::InitIndicators(CIndicators* indicators)
  {
//--- Standard check of the collection of indicators for NULL
   if(indicators==NULL)                           return(false);
//--- Initializing indicators and timeseries in additional filters
   if(!CExpertSignal::InitIndicators(indicators)) return(false);
//--- Creating our MA indicators
   ... Some code here
//--- Reached this part, so the function was successful, return true
   return(true);
  }

Dolayısıyla karmaşık bir şey yok, yöntemi bildiriyoruz ve ardından ValidationSettings() yöntemi için yaptığımız gibi yöntem gövdesini oluşturuyoruz. Her şeyden önce, fonksiyon tanımına sınıf adını ve operatörü eklemeyi unutmayın. Hareketli ortalamalar oluşturmak için bir koda ekleyebileceğimiz bir taslağımız var. Bunu düzgün bir şekilde yapalım - her gösterge için sınıfta başarılı olursa doğru veren ayrı bir fonksiyon oluştururuz. Fonksiyon herhangi bir ada sahip olabilir, ancak amacını yansıtmasına izin verin, bu nedenle CreateFastMA() ve CreateSlowMA() fonksiyonlarını çağıralım.

protected:
   //--- Creating MA indicators
   bool              CreateFastMA(CIndicators *indicators);
   bool              CreateSlowMA(CIndicators *indicators);
  };
//+------------------------------------------------------------------+
//| Creates indicators                                               |
//| Input:  a pointer to a collection of indicators                  |
//| Output: true if successful, otherwise false                      |
//+------------------------------------------------------------------+
bool MA_Cross::InitIndicators(CIndicators *indicators)
  {
//--- Standard check of the collection of indicators for NULL
   if(indicators==NULL) return(false);
//--- Initializing indicators and timeseries in additional filters
   if(!CExpertSignal::InitIndicators(indicators)) return(false);
//--- Creating our MA indicators
   if(!CreateFastMA(indicators))                  return(false);
   if(!CreateSlowMA(indicators))                  return(false);
//--- Reached this part, so the function was successful, return true
   return(true);
  }
//+------------------------------------------------------------------+
//| Creates the "Fast MA" indicator                                  |
//+------------------------------------------------------------------+
bool MA_Cross::CreateFastMA(CIndicators *indicators)
  {
... Some code
//--- Reached this part, so the function was successful, return true
   return(true);
  }
//+------------------------------------------------------------------+
//| Creates the "Slow MA" indicator                                  |
//+------------------------------------------------------------------+
bool MA_Cross::CreateSlowMA(CIndicators *indicators)
  {
... Some code
//--- Reached this part, so the function was successful, return true
   return(true);
  }

Hepsi bu, sadece MA göstergelerini oluşturan ve bir şekilde bu göstergelerin tanıtıcılarını alım satım modülüne entegre eden bir kod yazmamız gerekiyor, böylece modül bu göstergelerin ​değerlerini kullanabilir. Bu nedenle, CIndicators türünde bir değişkene bir işaretçi parametre olarak iletilir. Bununla ilgili Belgelerde aşağıdakiler yazılmıştır:

CIndicators, zaman serisi ve teknik gösterge ve sınıflarının örneklerini toplamak için tasarlanmış bir sınıftır. CIndicators sınıfı, teknik gösterge sınıflarının örneklerinin oluşturulmasını, depolanmasını ve yönetilmesini (veri senkronizasyonu, işleme ve bellek yönetimi) sağlar.

Bu, göstergelerimizi oluşturmamız ve bu koleksiyona yerleştirmemiz gerektiği anlamına gelir. Koleksiyonda yalnızca CIndicator formunun göstergeleri ve alt öğeleri depolanabileceği için bu gerçeği kullanmalıyız. Yukarıda bahsedilen CiCustom alt sınıfını kullanacağız. Her hareketli ortalama için, sınıfın özel bölümünde CiCustom türünde bir nesne bildiririz:

class MA_Cross : public CExpertSignal
  {
private:
   CiCustom          m_fast_ma;            // The indicator as an object
   CiCustom          m_slow_ma;            // The indicator as an object
   //--- Configurable module parameters
   int              m_period_fast;   // Period of the fast MA
   ENUM_MA_METHOD    m_method_fast;    // Type of smoothing of the fast MA
   int              m_period_slow;   // Period of the slow MA
   ENUM_MA_METHOD    m_method_slow;    // Type of smoothing of the slow MA

Tabii ki, CIndicator sınıfından türetilen kendi gösterge sınıfınızı oluşturabilir ve MQL5 Sihirbazı ile kullanmak için gerekli tüm yöntemleri uygulayabilirsiniz. Ancak bu durumda, CiCustom kullanarak alım satım sinyalleri modülünde herhangi bir özel göstergeyi nasıl kullanabileceğinizi göstermek istiyoruz.

Bu, kodda aşağıdaki gibi görünür:

//+------------------------------------------------------------------+
//| Creates the "Fast MA" indicator                                  |
//+------------------------------------------------------------------+
bool MA_Cross::CreateFastMA(CIndicators *indicators)
  {
//--- Checking the pointer
   if(indicators==NULL) return(false);
//--- Adding an object to the collection
   if(!indicators.Add(GetPointer(m_fast_ma)))
     {
      printf(__FUNCTION__+": Error adding an object of the fast MA");
      return(false);
     }
//--- Setting parameters of the fast MA
   MqlParam parameters[4];
//---
   parameters[0].type=TYPE_STRING;
   parameters[0].string_value="Examples\\Custom Moving Average.ex5";
   parameters[1].type=TYPE_INT;
   parameters[1].integer_value=m_period_fast;      // Period
   parameters[2].type=TYPE_INT;
   parameters[2].integer_value=0;                  // Shift
   parameters[3].type=TYPE_INT;
   parameters[3].integer_value=m_method_fast;      // Averaging method
//--- Object initialization  
   if(!m_fast_ma.Create(m_symbol.Name(),m_period,IND_CUSTOM,4,parameters))
     {
      printf(__FUNCTION__+": Error initializing the object of the fast MA");
      return(false);
     }
//--- Number of buffers
   if(!m_fast_ma.NumBuffers(1)) return(false);
//--- Reached this part, so the function was successful, return true
   return(true);
  }

CreateFastMA() yönteminde, önce göstergeler koleksiyonunun işaretçisini kontrol edin ve ardından bu koleksiyona hızlı MA m_fast_ma işaretçisini ekleyin. Ardından, özel göstergelerin parametrelerini depolamak için özel olarak tasarlanmış MqlParam yapısını tanımlayın ve değerlerle doldurun.

Özel MA göstergesi olarak standart terminal teslimat paketinden Özel Hareketli Ortalama öğesini kullanıyoruz. Göstergenin adı data_folder/MQL5/Indicators/ klasörüne göre belirtilmelidir. Standart paketteki Custom Moving Average.mq5' dosyası data_folder/MQL5/Indicators/Examples/ dizininde bulunduğundan, yolunu Örnekler klasörüyle birlikte belirtiyoruz:

parameters[0].string_value="Examples\\Custom Moving Average.ex5";

Bu göstergenin koduna bakarsanız, gerekli tüm verileri görebilirsiniz:

//--- input parameters
input int            InpMAPeriod=13;       // Period
input int            InpMAShift=0;         // Shift
input ENUM_MA_METHOD InpMAMethod=MODE_SMMA;  // Method

Yapınındeğerleri tür-değer çiftlerini içerir:

  1. parametre türü - dize (göstergenin adını aktarmak için)
  2. özel göstergenin yürütülebilir dosyasının adı - "Custom Moving Averages.exe"
  3. parametre türü - int (periyot değeri)
  4. hareketli ortalama periyodu
  5. parametre türü - int (kayma değeri)
  6. çubuk cinsinde ortalamanın yatay kayması
  7. parametre türü - int (numaralandırma değeri bir tamsayıdır)
  8. ortalama yöntemi

Yapı doldurulduktan sonra gösterge, gerekli tüm parametrelerin Create() yöntemiyle başlatılır: sembol adı ve hesaplandığı zaman dilimi, ENUM_INDICATOR numaralandırmasından göstergenin türü, gösterge parametrelerinin sayısı ve parametre değerlerine sahip MqlParam yapısı. Ve sonuncusu, NumBuffers() yöntemini kullanarak gösterge tamponlarının sayısını belirtmektir.

Yavaş hareketli ortalamayı oluşturmak için CreateSlowMA() yöntemi basittir. Modülde özel göstergeler kullanırken, MQL5 Sihirbazı tarafından oluşturulan Uzman Danışmanın (EA) test cihazında da çalışacağını unutmayın. Bu nedenle, dosyamızın başlangıcına, test cihazına gerekli göstergelerin konumunu bildiren #property tester_indicator özelliğini ekliyoruz:

#include "..\ExpertSignal.mqh"   // The CExpertSignal class is in the file ExpertSignal
#property tester_indicator "Examples\\Custom Moving Average.ex5"

Birkaç farklı gösterge kullanırsak, her biri için bu satırı eklemeliyiz. Böylece, göstergeleri ekledik. Daha fazla kolaylık sağlamak için MA değerlerini almak için iki yöntem sunalım:

   //--- Checking correctness of input data
   bool              ValidationSettings(void);
   //--- Creating indicators and timeseries for the module of signals
   bool              InitIndicators(CIndicators *indicators);
   //--- Access to indicator data
   double            FastMA(const int index)             const { return(m_fast_ma.GetData(0,index)); }
   double            SlowMA(const int index)             const { return(m_slow_ma.GetData(0,index)); }

Gördüğünüz gibi, yöntemler çok basittir, belirtilen pozisyonda belirtilen gösterge tamponundan bir değer veren SIndicator üst sınıfının GetData() yöntemini kullandılar.

Standart paketin klasik göstergeleriyle çalışmak için sınıflara ihtiyacınız varsa, bunlar Göstergelerle çalışma sınıfları bölümünde mevcuttur. Son aşamaya geçmeye hazırız.


6. LongCondition ve ShortCondition Yöntemlerini Tanımlayın

Modülümüzün çalışması ve alım satım sinyalleri üretmesi için her şey hazır. Bu fonksiyon, her bir CExpertSignal alt sınıfında açıklanması gereken iki yöntemle sağlanır:

  • LongCondition() alış koşullarını kontrol eder ve Uzun sinyalin gücünü 0 ila 100 arasında verir.
  • ShortCondition() - satış koşulunu kontrol eder ve Kısa sinyalin gücünü 0 ila 100 arasında verir.

Fonksiyon boş bir değer verirse alım satım sinyali olmadığı anlamına gelir. Sinyal için koşullar varsa, sinyalin gücünü tahmin edebilir ve 100'ü aşmayan herhangi bir değer döndürebilirsiniz. Sinyal gücünün değerlendirilmesi, çeşitli modüllere ve piyasa modellerine dayalı alım satım sistemlerini esnek bir şekilde oluşturmanıza olanak tanır. MQL5 Sihirbazında bununla ilgili daha fazla bilgi edinin: Yeni Sürüm.

Basit bir alım satım sinyali modülü yazdığımızdan, alım ve satım sinyallerinin eşit değerde (100) olduğu konusunda hemfikir olabiliriz. Sınıf bildirimine gerekli yöntemleri ekleyelim.

   ...
   bool              InitIndicators(CIndicators *indicators);
   //--- Access to data of the indicators
   double            FastMA(const int index)             const { return(m_fast_ma.GetData(0,index)); }
   double            SlowMA(const int index)             const { return(m_slow_ma.GetData(0,index)); }
   //--- Checking buy and sell conditions
   virtual int       LongCondition();
   virtual int       ShortCondition();

Ayrıca, fonksiyonların açıklamasını oluşturalım. Alış sinyali şu şekilde kontrol edilir (satış sinyali ile aynı şey geçerlidir):

//+------------------------------------------------------------------+
//| Returns the strength of the buy signal                           |
//+------------------------------------------------------------------+
int MA_Cross::LongCondition()
  {
   int signal=0;
//--- For operation with ticks idx=0, for operation with formed bars idx=1
   int idx=StartIndex();
//--- Values of MAs at the last formed bar
   double last_fast_value=FastMA(idx);
   double last_slow_value=SlowMA(idx);
//--- Values of MAs at the last but one formed bar
   double prev_fast_value=FastMA(idx+1);
   double prev_slow_value=SlowMA(idx+1);
//---If the fast MA crossed the slow MA from bottom upwards on the last two closed bars
   if((last_fast_value>last_slow_value) && (prev_fast_value<prev_slow_value))
     {
      signal=100; // There is a signal to buy
     }
//--- Return the signal value
   return(signal);
  }

CExpertBase üst sınıfının StartIndex() fonksiyonu tarafından döndürülen değerin atandığı idx değişkenini bildirdiğimizi unutmayın. Uzman Danışman (EA) tüm tikler üzerinde çalışmak üzere tasarlandıysa StartIndex() fonksiyonu 0 verir ve bu durumda analiz geçerli çubukla başlar. Uzman Danışman açık fiyatlarla çalışmak üzere tasarlanmışsa, StartIndex() 1 verir ve analiz en son oluşturulan çubukla başlar.

Varsayılan olarak StartIndex() 1 değerini verir; bu, MQL5 Sihirbazı tarafından oluşturulan Uzman Danışmanın (EA) yalnızca yeni bir çubuğun açılışında çalışacağı ve mevcut çubuğun oluşumu sırasında gelen tikleri yok sayacağı anlamına gelir.

Bu modun nasıl etkinleştirileceği ve nasıl kullanılacağı daha sonra bitirme vuruşunda açıklanacaktır.

Modül kullanıma hazır, bu yüzden MQL5 Sihirbazında bu modüle dayalı bir alım satım robotu oluşturalım.


Test Cihazında Uzman Danışmanı (EA) Kontrol Etme

Modülümüzün verimliliğini test etmek için MQL5 Sihirbazında buna dayalı bir Uzman Danışman (EA) oluşturalım ve grafik üzerinde çalıştıralım. Açılan başlangıç penceresinin "Girişler" sekmesi MA_Cross modülünün parametrelerini içerir.

Diğer tüm parametreler, ayrıca seçilen para yönetimi modülü ve pozisyon bakım modülü (Takip Eden Durdurma) temelinde EA oluşturulurken MQL5 Sihirbazı tarafından eklenmiştir. Bu nedenle, yalnızca bir alım satım sinyali modülü yazmamız gerekti ve hazır bir çözüm kullandık. MQL5 Sihirbazını kullanmanın ana avantajı budur! 

Şimdi alım satım robotunu MetaTrader 5 Strateji Test Cihazında test edelim. Anahtar parametrelerin hızlı bir optimizasyonunu çalıştırmayı deneyelim.

Bu giriş parametreleri ayarlarında, tam optimizasyon için yarım milyondan fazla geçiş gereklidir. Bu nedenle hızlı optimizasyonu (genetik algoritma) seçiyoruz ve ayrıca optimizasyonu hızlandırmak için MQL5 Cloud Network'ü kullanıyoruz. Optimizasyon 10 dakika içinde yapıldı ve sonuçları aldık.


Gördüğünüz gibi, MQL5'te bir alım satım robotu oluşturma ve giriş parametrelerinin optimizasyonu, pozisyon yönetimi servis mantığını yazmak, hata ayıklamak ve en iyi algoritmaları aramak için gerekenden çok daha az zaman aldı. 


Bitirici Vuruş

Bu öğeyi atlayabilir veya daha sonra bir alım satım sinyali modülü yazma tekniği konusunda tamamen rahat olduğunuzda geri dönebilirsiniz.

MQL5 Sihirbazı tarafından oluşturulan Uzman Danışmanın (EA) kaynak kodunu açarsanız, yanlış değeriyle Expert_EveryTick global değişkenini bulacaksınız. Bu değişkene bağlı olarak StartIndex() fonksiyonu değerini verir. Çalışması gereken modu Uzman Danışmana (EA) bildirir.

//+------------------------------------------------------------------+
//|                                                 TestMA_Cross.mq5 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include                                                          |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- available signals
#include <Expert\MySignals\MA_Cross.mqh>
//--- available trailing
#include <Expert\Trailing\TrailingNone.mqh>
//--- available money management
#include <Expert\Money\MoneyFixedLot.mqh>
//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
//--- inputs for expert
input string         Expert_Title             ="TestMA_Cross";  // Document name
ulong               Expert_MagicNumber       =22655;          // Expert Advisor ID
bool                  Expert_EveryTick             =false;          // Work of the EA inside the bar
//--- 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]

Expert_EveryTick'i doğru olarak ayarlarsanız ve kodu derlerseniz, alım satım robotu gelen her bir tiki analiz edecek ve böylece mevcut tamamlanmamışçubuğun değerleri üzerinde kararlar alacaktır. Bunu yalnızca nasıl çalıştığını anlıyorsanız yapın. Tüm alım satım sistemleri çubuğun içinde çalışmak üzere tasarlanmamıştır.

Ayrıca Expert_EveryTick parametresi için bir anahtar sözcük girişi ekleyebilir ve ardından Uzman Danışmanın (EA) ayarlayabileceğiniz yeni bir giriş parametresine sahip olursunuz, bunu EA başlangıcında bir grafikte veya test cihazında ayarlayabilirsiniz:

input bool          Expert_EveryTick         =false;          // Work of the EA inside the bar

Ve şimdi yaptıklarımızı özetleme zamanı.


Alım Satım Sinyalleri Modülü Oluşturmak için 6 Adım

MQL5'te uzmanlaştıysanız, artık sıfırdan bir Uzman Danışman (EA) yazmanıza gerek yoktur. Sadece bir alım satım sinyali modülü oluşturun ve bu modüle dayalı olarak, etkinleştirilmiş takip ve alım satım hacmi yönetimi modülleriyle otomatik olarak bir alım satım robotu oluşturun. OOP'ye aşina olmasanız veya alım satım sınıflarının yapısını çok fazla araştırmak istemeseniz bile, sadece 6 adımdan geçebilirsiniz:

  1. MQL5 Sihirbazını ayrı bir klasörde MQL5/Include/MySignals/ içinde kullanarak yeni bir sınıf oluşturun. Alım satım sinyalleri modülümüz burada depolanacaktır.
  2. Parametreleri, türlerini ve varsayılan değerlerini açıklayan bir modül tanıtıcısı oluşturun.
  3. Modül parametrelerini sınıfta bildirin ve yapıcıda başlatma için yöntemler ekleyin.
  4. Giriş parametrelerini kontrol edin ve CExpertSignal temel sınıfının ValidationSettings() öğesini çağırmayı unutmayın.
  5. Gösterge nesneleri oluşturun ve önceden tanımlanmış bir başlatma yöntemi InitIndicators() ekleyin.
  6. LongCondition() ve ShortCondition() yöntemlerinde alım satım sinyallerinin koşullarını tanımlayın.

Her adım basittir ve MQL5 programlamada çok az beceri gerektirir. Talimatları izleyerek modülünüzü yalnızca bir kez yazmanız yeterlidir ve herhangi bir alım satım fikrinin daha fazla doğrulanması, saatlerce kodlama ve hata ayıklama olmadan bir saatten fazla sürmez. 


Basitten Karmaşığa

MQL5 Sihirbazı kullanılarak oluşturulan alım satım robotunuz tarafından uygulanan alım satım stratejisinin, kullandığı alım satım sinyalleri modülü kadar karmaşık olduğunu unutmayın. Ancak giriş ve çıkış için bir dizi kurala dayalı karmaşık bir alım satım sistemi oluşturmaya başlamadan önce, onu birkaç basit sisteme bölün ve her birini ayrı ayrı kontrol edin.

Basit modüllere dayalı olarak, hazır alım satım sinyali modüllerini kullanarak karmaşık alım satım stratejileri oluşturabilirsiniz, ancak bu başka bir makalenin konusudur!

MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/367

Ekli dosyalar |
testma_cross.mq5 (7.14 KB)
ma_cross.mqh (11.57 KB)
MetaTrader 5 - Hayal Ettiğinizden Daha Fazlası! MetaTrader 5 - Hayal Ettiğinizden Daha Fazlası!
MetaTrader 5 istemci terminali sıfırdan geliştirildi ve elbette selefini geride bıraktı. Yeni alım satım platformu, herhangi bir finansal piyasada alım satım için sınırsız fırsatlar sunar. Dahası, fonksiyonu daha da kullanışlı özellikler ve kolaylıklar sunmak için genişlemeye devam ediyor. Bu nedenle, MetaTrader 5'in sayısız avantajını listelemek artık oldukça zordur. Bunları bir makalede kısaca anlatmaya çalıştık ve çıkan sonuç bizi şaşırttı, makale kısa olmaktan çok uzak!
Semafor Göstergelerini Kullanan Basit Alım Satım Sistemleri Semafor Göstergelerini Kullanan Basit Alım Satım Sistemleri
Herhangi bir karmaşık alım satım sistemini dikkatlice incelersek, bunun bir dizi basit alım satım sinyaline dayandığını göreceğiz. Bu nedenle, acemi geliştiricilerin hemen karmaşık algoritmalar yazmaya başlamasına gerek yoktur. Bu makale, sözleşmeleri gerçekleştirmek için semafor göstergelerini kullanan bir alım satım sistemine bir örnek sunmaktadır.
MetaTrader 5 Test Cihazında Bir Stratejiyi Görselleştirme MetaTrader 5 Test Cihazında Bir Stratejiyi Görselleştirme
"Yüz kere duymaktansa bir kez görmek daha iyidir." sözünü hepimiz biliriz. Paris ya da Venedik hakkında çeşitli kitaplar okuyabilirsiniz, ancak zihinsel görüntülere dayanarak, bu muhteşem şehirlerde akşam yürüyüşünde olduğu gibi aynı duyguları hissetmezsiniz. Görselleştirmenin avantajı, örneğin, göstergeler kullanılarak grafikler üzerinde fiyat analizi ve tabii ki strateji testinin görselleştirilmesi gibi piyasadaki işler de dahil olmak üzere hayatımızın herhangi bir yönüne kolayca yansıtılabilir. Bu makale, MetaTrader 5 Strateji Test Cihazının tüm görselleştirme özelliklerinin açıklamalarını içerir.
Çok Zaman Dilimli ve Çok Para Birimli Paneller Oluşturmaya Yönelik Nesne Yönelimli Yaklaşım Çok Zaman Dilimli ve Çok Para Birimli Paneller Oluşturmaya Yönelik Nesne Yönelimli Yaklaşım
Bu makale, MetaTrader 5 için çok zaman dilimli ve çok para birimli paneller oluşturmak için nesne yönelimli programlamanın nasıl kullanılabileceğini açıklar. Ana amaç, panelin kodunu değiştirmeye gerek kalmadan fiyatlar, fiyat değişiklikleri, gösterge değerleri veya özel alım/satım koşulları gibi birçok farklı veri türünü görüntülemek için kullanılabilecek evrensel bir panel oluşturmaktır.