English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
MQL5 Sihirbazı: Açık Pozisyonların İzlenme Modülü Nasıl Oluşturulur

MQL5 Sihirbazı: Açık Pozisyonların İzlenme Modülü Nasıl Oluşturulur

MetaTrader 5Uzman Danışmanlar | 16 Aralık 2021, 15:10
58 0
MetaQuotes
MetaQuotes

Giriş

MetaTrader 5, alım satım fikirlerinin hızlı bir şekilde kontrol edilmesi için güçlü bir araca sahiptir. Bu, MQL5 Sihirbazının alım satım stratejileri üreticisidir. Uzman Danışman kodlarının otomatik olarak oluşturulması için MQL5 Sihirbazının kullanımı “ MQL5 Sihirbazı: Programlamadan Uzman Danışmanlar Oluşturma” makalesinde açıklanmıştır. Kod oluşturma sisteminin açıklığı sayesinde standart sınıflar özel alım satım sinyal sınıfları, para yönetim sistemleri ve takip modülleri ile tamamlanabilir.

Bu makalede MQL5 Sihirbazında daha sonraki kullanımlarına ilişkin takip eden açık pozisyon modüllerinin yazılma ilkeleri açıklanmaktadır.

MQL5 Sihirbazı ile oluşturulan Uzman Danışman dört temel sınıfa dayanır:

Şekil 1. CExpert temel sınıfının yapısı

Şekil 1. CExpert temel sınıfının yapısı.


CExpert sınıfı (veya alt sınıfı) alım satım robotunun ana “motorudur”. CExpert sınıfının örneği CExpertSignal, CExpertMoney ve CExpertTrailing sınıflarının (veya alt sınıflarının) örneklerini içerir:

  1. CExpertSignal alım satım sinyallerinin ana üreticisidir. CExpert’te bulunan CExpertSignal alt sınıfının örneği, Uzman Danışmana iç algoritmalara dayanarak piyasaya girme olasılıkları, giriş seviyeleri ve koruyucu emirlerin ayarlanması hakkında bilgi sağlar. Alım satım işlemlerinin gerçekleştirilmesine ilişkin nihai karar Uzman Danışman tarafından verilir. Alım satım sinyalleri modülünün nasıl yazılacağını “MQL5 Sihirbazı: Alım Satım Sinyalleri Modülü Nasıl Oluşturulur” adlı makalede okuyabilirsiniz.
  2. CExpertMoney para ve risk yönetiminin ana sistemidir. CExpertMoney alt sınıfının örneği açılacak pozisyon ve verilecek bekleyen emirlerin hacimlerini hesaplar. Hacimlere ilişkin nihai karar Uzman Danışman tarafından verilir. Para ve risk yönetimi modüllerinin geliştirme ilkeleri “MQL5 Sihirbazı: Para ve Risk Yönetimi Modülü Nasıl Oluşturulur” adlı makalede açıklanmıştır.
  3. CExpertTrailing açık pozisyon takibinin ana modülüdür. CExpertTrailing alt sınıfının örneği bir pozisyonun koruyucu emirlerini değiştirmenin gerekli olup olmadığını Uzman Danışmana bildirir. Emir değişikliğine ilişkin nihai karar EA tarafından verilir.

Buna ek olarak, aşağıdaki sınıf örnekleri CExpert sınıfının üyeleridir:

  • CExpertTrade (alım satım işlemlerini gerçekleştirmek için)
  • CIndicators (Uzman Danışmanın çalışmasında kullanılan göstergeleri ve zaman serilerini yönetmek için)
  • CSymbolInfo (bir sembol hakkında bilgi almak için)
  • CAccountInfo (alım satım hesabının durumu hakkında bilgi almak için)
  • CPositionInfo (pozisyonlar hakkında bilgi almak için)
  • COorderInfo (bekleyen emirler hakkında bilgi almak için)

Bu metinde ayrıca “Uzman Danışman” derken alt sınıfının CExpert sınıfının bir örneğini kastediyoruz.

CExpert sınıfının daha ayrıntılı bir tanımı ve onunla çalışma süreci ayrı bir makalede verilecektir.


1. Temel Sınıf CExpertTrailing

CExpertTrailing açık pozisyon takibinin temel modülüdür. “Dış alan” ile etkileşim kurmak için CExpertTrailing sınıfı bir dizi genel sanal yönteme sahiptir:

Başlatma

Tanım

sanal Init

Sınıf örneğinin başlatılması modül verilerinin EA verileriyle senkronizasyonunu sağlar

sanal ValidationSettings

Ayar parametrelerinin doğrulanması

sanal InitIndicators

Alım satım sinyalleri üreticisinin çalışması için gereken tüm göstergelerin ve zaman serilerinin oluşturulması ve başlatılması

Pozisyon Değişiklik Sinyalleri

 

sanal CheckTrailingStopLong

Stop emri için yeni fiyatın belirlenmesi ile uzun bir pozisyonun değiştirilmesine ilişkin bir sinyal oluşturulması

sanal CheckTrailingStopShort

Stop emri için yeni fiyatın belirlenmesi ile kısa bir pozisyonun değiştirilmesine ilişkin bir sinyal oluşturulması


Yöntemlerin Tanımı

1.1. Başlatma Yöntemleri

1.1.1 Init

Init() yöntemi Uzman Danışmana bir sınıf örneği eklendikten hemen sonra otomatik olarak çağrılır. Yöntemin geçersiz kılınması gerekli değildir.

virtual bool Init(CSymbolInfo* symbol, ENUM_TIMEFRAMES period, double adjusted_point);

1.1.2 ValidationSettings

ValidationSettings() yöntemi tüm parametreler ayarlandıktan hemen sonra Uzman Danışmandan çağrılır. Kurulum ayarları varsa yöntemi geçersiz kılmak gerekir.

virtual bool ValidationSettings();

Tüm parametreler doğruysa (kullanıma uygunsa) geçersiz kılınan yöntem true değerini döndürmelidir. Parametrelerden herhangi biri geçersizse parametre false değerini döndürmelidir (daha fazla işlem yapılamaz).

Temel sınıf CExpertTrailing'in ayarlanabilecek hiçbir parametresi yoktur, bu nedenle yöntem herhangi bir kontrol gerçekleştirmeden her zaman true değerini döndürür.

1.1.3 InitIndicators

InitIndicators() yöntemi gerekli tüm göstergeleri ve zaman serilerini oluşturur ve başlatır. Tüm parametreler ayarlanıp doğrulandıktan sonra Uzman Danışmandan çağrılır. Alım satım sinyali üreticisi en az bir gösterge veya zaman serisi kullanıyorsa yöntem geçersiz kılınmalıdır.

virtual bool InitIndicators(CIndicators* indicators);

Göstergeler veya zaman serileri Standart Kütüphanenin uygun sınıfları aracılığıyla kullanılmalıdır. Tüm göstergelerin veya zaman serilerinin işaretçileri Uzman Danışmanın gösterge koleksiyonuna eklenmelidir (parametre olarak geçirilen bir işaretçi).

Göstergeler veya zaman serileri ile yapılan tüm manipülasyonlar başarılı olursa (kullanım için uygunsa) geçersiz kılınan yöntem true değerini döndürmelidir. Göstergeler veya zaman serileri ile en az bir işlem başarısız olursa yöntem false değerini döndürmelidir (daha fazla çalışma mümkün değildir).

Temel sınıf CExpertTrailing göstergeleri veya zaman serilerini kullanmaz, bu nedenle temel sınıf yöntemi herhangi bir işlem gerçekleştirmeden her zaman true değerini döndürür.


1.2. Pozisyon Değiştirme Sinyalini Kontrol Etme Yöntemleri

1.2.1 CheckTrailingStopLong

CheckTrailingStopLong() yöntemi, Zarar Durdur emrinin (ve gerekirse Kâr Al emrinin) yeni bir fiyatını tanımlayarak uzun bir pozisyonun değişiklik sinyalini üretir. Uzun bir pozisyonu değiştirmenin gerekli olup olmadığını belirlemek için Uzman Danışman tarafından çağrılır. Uzun bir pozisyonun değişiklik sinyalini oluşturmak istiyorsanız yöntem geçersiz kılınmalıdır.

virtual bool CheckTrailingStopLong(CPositionInfo* position,double& sl,double& tp)

Yöntem uzun pozisyonun değişiklik durumunu kontrol etme algoritmasını uygulamalıdır. Koşul yerine getirilirse fiyat (gerekirse tp) değişkenine uygun değer atanmalı ve yöntem true değerini döndürmelidir. sl ve tp değişkenlerine bağlantılar parametre olarak iletilmelidir. Koşul yerine getirilmezse yöntem false değerini döndürmelidir.

Temel sınıf CExpertTrailing uzun bir pozisyonun değişiklik sinyalini oluşturmak için yerleşik bir algoritmaya sahip değildir, bu nedenle temel sınıf yöntemi her zaman false değerini döndürür.

1.2.2 CheckTrailingStopShort

CheckTrailingStopShort() yöntemi, Zarar Durdur emrinin (ve gerekirse Kâr Al emrinin) yeni bir fiyatını tanımlayarak kısa bir pozisyonun değişiklik sinyalini üretir. Kısa bir pozisyonu değiştirmenin gerekli olup olmadığını belirlemek için Uzman Danışman tarafından çağrılır. Kısa bir pozisyonun değişiklik sinyalini oluşturmak istiyorsanız yöntem geçersiz kılınmalıdır.

virtual bool CheckTrailingStopShort(CPositionInfo* position,double& sl,double& tp)

Yöntem kısa pozisyonun değişiklik durumunu kontrol etme algoritmasını uygulamalıdır. Koşul yerine getirilirse fiyat (gerekirse tp) değişkenine uygun değer atanmalı ve yöntem true değerini döndürmelidir. sl ve tp değişkenlerine bağlantılar parametre olarak iletilmelidir. Koşul yerine getirilmezse yöntem false değerini döndürmelidir.

Temel sınıf CExpertTrailing kısa bir pozisyonun değişiklik sinyalini oluşturmak için yerleşik bir algoritmaya sahip değildir, bu nedenle temel sınıf yöntemi her zaman false değerini döndürür.


2. Açık Pozisyonların Takibi İçin Kendi Modülünüzü Yazma

Artık CExpertTrailing temel sınıfının yapısını incelediğimize göre açık pozisyon takibi için kendi modülünüzü yazmaya başlayabilirsiniz.

Yukarıda bahsedildiği üzere CExpertTrailingsınıfı, bir dizi genel sanal “usul”dür; Uzman Danışmanın, koruyucu emirlerinin değiştirilmesinin gerekliliği üzerine takip eden açık pozisyonlar modülünün görüşünü bilebileceği yöntemlerdir.

Bu nedenle birincil hedefimiz, CExpertTrailing sınıfından türeterek, uygun sanal yöntemleri geçersiz kılarak ve gerekli algoritmaları uygulayarak açık pozisyonların takibine ilişkin kendi sınıfımızı oluşturmaktır.

İkinci hedefimiz de (ki bu da önemlidir), MQL5 Sihirbazında sınıfımızı “görünür” hale getirmektir Fakat her şey sırayla.

2.1. Alım Satım Sinyali Üreticinin Sınıfını Oluşturma

Hadi başlayalım.

İlk olarak, (örneğin, aynı MQL5 Sihirbazını kullanarak) mqh uzantılı bir ekleme dosyası oluşturuyoruz.

Dosya menüsünde “Create” (Oluştur) seçeneğini seçin (veya Ctrl+N basın) ve eklenen bir dosyanın oluşturulmasını belirtin:

Şekil 2. MQL5 Sihirbazını kullanarak bir ekleme dosyası oluşturma.

Şekil 2. MQL5 Sihirbazını kullanarak bir ekleme dosyası oluşturma

Dosyanın daha sonra MQL5 Sihirbazı tarafından bir açık pozisyon takibi modülü olarak “algılanması” için dosya Include\Expert\ klasöründe oluşturulmalıdır.

Standart Kütüphane'ye gereksiz dosya atmamak için МQL5 Sihirbazında ilgili parametreleri belirterek SampleTrailing.mqh dosyasını oluşturduğumuz Include\Expert\Trailing\MyTrailing klasörünü oluşturun:

Şekil 3. Ekleme dosyasının konumunu ayarlama

Şekil 3. Eklenen dosyanın konumunu ayarlama.

MQL5 Sihirbazı işleminin bir sonucu olarak aşağıdaki düzeni oluşturmuş oluruz:

//+------------------------------------------------------------------+
//|                                               SampleTrailing.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//+------------------------------------------------------------------+
//| defines                                                          |
//+------------------------------------------------------------------+
// #define MacrosHello   "Hello, world!"
// #define MacrosYear    2010
//+------------------------------------------------------------------+
//| DLL imports                                                      |
//+------------------------------------------------------------------+
// #import "user32.dll"
//   int      SendMessageA(int hWnd,int Msg,int wParam,int lParam);
// #import "my_expert.dll"
//   int      ExpertRecalculate(int wParam,int lParam);
// #import
//+------------------------------------------------------------------+
//| EX5 imports                                                      |
//+------------------------------------------------------------------+
// #import "stdlib.ex5"
//   string ErrorDescription(int error_code);
// #import
//+------------------------------------------------------------------+

Aşağıdakiler sadece “manuel” olarak yapılmalıdır. Gereksiz bölümleri kaldırın ve gerekli olanı ekleyin (Standart Kütüphanenin ExpertTrailing.mqh dosyasını ve şu anda boş olan bir sınıf tanımını ekleyin).

//+------------------------------------------------------------------+
//|                                               SampleTrailing.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//+------------------------------------------------------------------+
//| include files                                                    |
//+------------------------------------------------------------------+
#include <Expert\ExpertTrailing.mqh>
//+------------------------------------------------------------------+
//| Class CSampleTrailing.                                           |
//| Purpose: Class for trailing of open positions.                   |
//|             Is derived from the CExpertTrailing class.          |
//+------------------------------------------------------------------+
class CSampleTrailing : public CExpertTrailing
  {
  };
//+------------------------------------------------------------------+

Şimdi de algoritmaları seçmemiz gerek.

Açık pozisyonları takip etme modülümüzün temeli olarak aşağıdaki algoritmayı ele alalım: fiyat belirtilen bir mesafeye kadar gerekli bir yönde giderse Stop emri kayıpsız bir seviyeye taşınır. Bunu dosyamıza ekleyelim.

//+------------------------------------------------------------------+
//|                                               SampleTrailing.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//+------------------------------------------------------------------+
//| include files                                                    |
//+------------------------------------------------------------------+
#include <Expert\ExpertTrailing.mqh>
//+------------------------------------------------------------------+
//| Class CSampleTrailing.                                           |
//| Purpose: Class for trailing of open positions by                 |
//|             moving the Stop order "to the loseless level".       |
//|             Is derived from the CExpertTrailingclass.            |
//+------------------------------------------------------------------+
class CSampleTrailing : public CExpertTrailing
  {
  };
//+------------------------------------------------------------------+

Şimdi koruyucu emir değişikliklerine ilişkin kararlar almak için hangi verilerin gerekli olduğunu tanımlayalım. Bizim durumumuzda bu, değiştirilmiş bir pozisyonun kâr puanıdır.

Açık pozisyonları takip etme modülümüze ilişkin kurulum parametrelerinin listesini tanımlayın. İki parametreye ihtiyacımız var:

  1. Stop emrinin kayıpsız bir seviyeye taşınmasını önermek için gereken, pozisyonun kâr puanı.
  2. Kayıpsız seviye, yani taşınan Stop emriyle birlikte değişmeyecek olan kâr puanı

Modülün ayarları sınıfın korumalı veri üyelerinde saklanacaktır. Ayarlara erişim uygun genel yöntemlerle gerçekleştirilecektir.

Bu değişiklikleri dosyamıza ekleyelim:

//+------------------------------------------------------------------+
//|                                               SampleTrailing.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//+------------------------------------------------------------------+
//| include files                                                    |
//+------------------------------------------------------------------+
#include <Expert\ExpertTrailing.mqh>
//+------------------------------------------------------------------+
//| Class CSampleTrailing.                                           |
//| Purpose: Class for trailing of open positions                    |
//|             by moving Stop order to a lossless level.            |
//|             Is derived from the CExpertTrailing class.           |
//+------------------------------------------------------------------+
class CSampleTrailing : public CExpertTrailing
  {
protected:
   int                m_profit;             //threshold level of profit
   int                m_stop_level;         // lossless level

public:
   //--- methods of setting adjustable parameters
   void               Profit(int value)       { m_profit=value;     }
   void               StopLevel(int value)    { m_stop_level=value; }
  };
//+------------------------------------------------------------------+

Ayarlanabilir parametreleri varsayılan değerlerle başlatmak için sınıf oluşturucusunu eklememiz gerekiyor.

Ayarları doğrulamak için ValidationSettings sanal yöntemini geçersiz kılın (temel sınıfın açıklamasına göre).

Sınıfın tanımı:

//+------------------------------------------------------------------+
//|                                               SampleTrailing.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//+------------------------------------------------------------------+
//| include files                                                    |
//+------------------------------------------------------------------+
#include <Expert\ExpertTrailing.mqh>
//+------------------------------------------------------------------+
//| Class CSampleTrailing.                                           |
//| Purpose: Class for trailing of open positions                    |
//|             by moving Stop order to a lossless level.            |
//|             Is derived from the CExpertTrailing class.           |
//+------------------------------------------------------------------+
class CSampleTrailing : public CExpertTrailing
  {
protected:
   int                m_profit;             // threshold level of profit
   int                m_stop_level;         // lossless level

public:
                      CSampleTrailing();
   //--- methods of setting adjustable parameters
   void               Profit(int value)       { m_profit=value;     }
   void               StopLevel(int value)    { m_stop_level=value; }
   //--- method of validating the adjustable parameters
   virtual bool        ValidationSettings();
  };
//+------------------------------------------------------------------+

ValidationSettings() yönteminin uygulanması:

//+------------------------------------------------------------------+
//| Validation of adjustable parameters.                             |
//| INPUT:  no.                                                      |
//| OUTPUT: true if parameter are correct, false - if not.           |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
bool CSampleTrailing::ValidationSettings()
  {
   if(!CExpertTrailing::ValidationSettings())
      return(false);
//--- check wheter the Init method is called
   if(m_symbol==NULL) return(false);
//--- check parameters
   if((m_profit-m_stop_level)*m_adjusted_point<=m_symbol.StopsLevel()*m_symbol.Point() && m_profit!=0.0)
     {
      printf(__FUNCTION__+": threshold level of profit must be greater than the level of  setting of orders");
      return(false);
     }
//--- ok
   return(true);
  }

Tüm hazırlık çalışmaları tamamlandı.

Algoritmalarımızı daha ayrıntılı olarak tekrar ele alalım.

1. Aşağıdaki koşullar yerine getirildiğinde, uzun bir pozisyonun değiştirilme sinyali görünür:

  • Modül ayarlarının parametreleri pozisyonun değiştirilmesi gerektiğini belirtir (Kâr=0 olarak ayarlama yaparsanız değişiklik yapılmayacaktır);
  • Pozisyon henüz değiştirilmedi (Stop emri kayıpsız bir seviyeye taşınmadı);
  • Pozisyonun kârı parametrelerde ayarlanan bir eşik seviyesini aştı.

Bu durumda Stop emrini ayarlara göre değiştirmenizi öneririz. Bu amaçla CheckTrailingStopLong sanal yöntemini geçersiz kılın ve ilgili fonksiyonu ekleyin.

2. Aşağıdaki koşullar yerine getirildiğinde, kısa bir pozisyonun değiştirilme sinyali görünür:

  • Modül ayarlarının parametreleri pozisyonun değiştirilmesi gerektiğini belirtir (Kâr=0 olarak ayarlama yaparsanız değişiklik yapılmayacaktır);
  • Pozisyon henüz değiştirilmedi (Stop emri kayıpsız bir seviyeye taşınmadı);
  • Pozisyonun kârı parametrelerde ayarlanan bir eşik seviyesini aştı.

Bu durumda Stop emrini ayarlara göre değiştirmenizi öneririz. Bu amaçla CheckTrailingStopShort sanal yöntemini geçersiz kılın ve ilgili fonksiyonu ekleyin.

Sınıfın tanımı:

class CSampleTrailing : public CExpertTrailing
  {
protected:
   int                m_profit;             // threshold level of profit
   int                m_stop_level;         // lossless level

public:
                      CSampleTrailing();
   //--- methods of setting adjustable parameters
   void               Profit(int value)       { m_profit=value;     }
   void               StopLevel(int value)    { m_stop_level=value; }
   //--- method of validation of adjustable parameters
   virtual bool       ValidationSettings();
   //--- methods of generation of position modification signals
   virtual bool       CheckTrailingStopLong(CPositionInfo* position,double& sl,double& tp);
   virtual bool       CheckTrailingStopShort(CPositionInfo* position,double& sl,double& tp);
  };

CheckTrailingStopLong ve CheckTrailingStopShort yöntemlerinin uygulanması:

//+------------------------------------------------------------------+
//| Check for modification of stop orders of a long position.        |
//| INPUT:  position - pointer to a position object,                 |
//|         sl       - link for a new price of stop loss order,      |
//|         tp       - link for a new price of take profit order.    |
//| OUTPUT: true if condition is satisfied, false - if not.          |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
bool CSampleTrailing::CheckTrailingStopLong(CPositionInfo* position,double& sl,double& tp)
  {
//--- check of pointer
   if(position==NULL) return(false);
//--- check of parameter
   if(m_profit==0.0)  return(false);
//--- already in a lossless zone?
   double open=position.PriceOpen();
   if(position.StopLoss()>=open) return(false);
//--- check of profit
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(m_symbol.Bid()-open>m_profit*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open+m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }
//+------------------------------------------------------------------+
//| Check for modification of stop orders of a short position.       |
//| INPUT:  position - pointer to a position object,                 |
//|         sl       - link to a new price of stop loss order,       |
//|         tp       - link to a new price of take profit order.     |
//| OUTPUT: true if condition is satisfied, false - if not.          |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
bool CSampleTrailing::CheckTrailingStopShort(CPositionInfo* position,double& sl,double& tp)
  {
//--- check of pointer
   if(position==NULL) return(false);
//--- check of parameter
   if(m_profit==0.0)  return(false);
//--- already in a lossless zone?
   double open=position.PriceOpen();
   if(position.StopLoss()<=open) return(false);
//--- check of profit
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(open-m_symbol.Ask()>m_profit*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open-m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }

2.2. MQL5 Sihirbazı için oluşturulan alım satım sinyalleri sınıfının bir tanımını yazma

Şimdi ikinci sorunu çözmeye dönelim. Açık pozisyonları takip etme modülümüz, MQL5 Sihirbazı alım satım stratejileri üreticisi tarafından “tanınmalıdır”.

İlk gerekli koşulu sağladık: dosyayı MQL5 Sihirbazı tarafından “bulunacağı” yere yerleştirdik. Ama bu yeterli değil. MQL5 Sihirbazı dosyayı yalnızca “bulmak”la kalmamalı, aynı zamanda da “tanımalıdır”. Bunu yapmak için orijinal metne MQL5 Sihirbazı için sınıf tanımlayıcısını eklemeliyiz.

Sınıf tanımlayıcısı belirli kurallara göre oluşturulmuş bir yorum grubudur.

Şimdi bu kuralları ele alalım.

1. Yorum grubu aşağıdaki satırlarla başlamalıdır:

// wizard description start
//+------------------------------------------------------------------+
//| Description of the class                                         |

2. Sonraki satır “//| Title=<Text> |” formatında olan bir metin tanımlayıcısıdır (sinyali seçerken MQL5 Sihirbazında göreceğimiz şey) Metin bir satır için çok büyükse ondan sonra bir satır daha (daha fazlasını değil) ekleyebilirsiniz. </p>

Durumumuz aşağıdaki gibi oldu:

//| Title=Signal on the crossing of a price and the MA               |
//| entering on its back movement                                    |

3. Daha sonra “//| Type=<Type> |” formatında belirtilen sınıf türüne sahip bir satır olacaktır. <Type> alanı Sinyal değerine sahip olmalıdır (sinyallere ek olarak MQL5 Sihirbazı diğer sınıf türlerini bilir).

Şunu yazın:

//| Type=Trailing                                                    |

4. “//| Name=<Name> |” formatında olan aşağıdaki satır sinyalin kısa adıdır (uzmanın global değişkenlerinin adlarını oluşturmak için MQL5 Sihirbazı tarafından kullanılır).

Durum aşağıdaki gibi olacaktır:

//| Name=BreakEven                                                   |

5. Bir sınıfın adı tanımın önemli bir unsurudur. “//| Class=<ClassNamea> |” formatında olan satırda, <ClassName> parametresi sınıfımızın adıyla eşleşmelidir:

//| Class=CSampleTrailing                                            |

6. Bu satırı doldurmuyoruz ancak mevcut olması gerekiyor (bu, dil referansı bölümüne giden bir bağlantıdır):

//| Page=                                                            |

7. Bir de modül ayarlarının parametrelerinin tanımları vardır.

Bu bir satır kümesidir (satır sayısı parametre sayısına eşittir).

Her satırın formatı “//| Parameter=<NameOfMethod>,<TypeOfParameter>,<DefaultValue> |” şeklindedir.

İşte parametre grubumuz:

//| Parameter=Profit,int,20                                          |
//| Parameter=StopLevel,int,0                                        |

8. Yorum grubu aşağıdaki satırlarla bitmelidir:

//+------------------------------------------------------------------+
// wizard description end

Tanımlayıcıyı kaynak koduna ekleyelim.

//+------------------------------------------------------------------+
//|                                               SampleTrailing.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//+------------------------------------------------------------------+
//| include files                                                    |
//+------------------------------------------------------------------+
#include <Expert\ExpertTrailing.mqh>
// wizard description start
//+------------------------------------------------------------------+
//| Description of the class                                         |
//| Title=Moving a position to a lossless level                      |
//| Type=Trailing                                                    |
//| Name=BreakEven                                                   |
//| Class=CSampleTrailing                                            |
//| Page=                                                            |
//| Parameter=Profit,int,20                                          |
//| Parameter=StopLevel,int,0                                        |
//+------------------------------------------------------------------+
// wizard description end
//+------------------------------------------------------------------+
//| Class CSampleTrailing.                                           |
//| Purpose: Class for trailing of open positions                    |
//|             by moving Stop order to a lossless level.            |
//|             Is derived from the CExpertTrailing class.           |
//+------------------------------------------------------------------+
class CSampleTrailing : public CExpertTrailing
  {
protected:
   int                m_profit;             // threshold level of profit
   int                m_stop_level;         // lossless level

public:
                      CSampleTrailing();
   //--- method of setting adjustable parameters
   void               Profit(int value)       { m_profit=value;     }
   void               StopLevel(int value)    { m_stop_level=value; }
   //--- method of validation of adjustable settings
   virtual bool       ValidationSettings();
   //--- methods of generation of position modification signals
   virtual bool       CheckTrailingStopLong(CPositionInfo* position,double& sl,double& tp);
   virtual bool       CheckTrailingStopShort(CPositionInfo* position,double& sl,double& tp);
  };
//+------------------------------------------------------------------+
//| Constructor CSampleTrailing.                                     |
//| INPUT:  no.                                                      |
//| OUTPUT: no.                                                      |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
void CSampleTrailing::CSampleTrailing()
  {
//--- setting default values
   m_profit    =20;
   m_stop_level=0;
  }
//+------------------------------------------------------------------+
//| Check of adjustable parameters.                                  |
//| INPUT:  no.                                                      |
//| OUTPUT: true if the parameters are correct, false if not.        |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
bool CSampleTrailing::ValidationSettings()
  {
//--- what if the Init has not been called?
   if(m_symbol==NULL) return(false);
//--- check of parameters
   if((m_profit-m_stop_level)*m_adjusted_point<=m_symbol.StopsLevel()*m_symbol.Point() && m_profit!=0.0)
     {
      printf(__FUNCTION__+": threshold level of profit must be greater than the level of setting stop orders");
      return(false);
     }
//--- ok
   return(true);
  }
//+------------------------------------------------------------------+
//| Check for modification of stop orders of a long position.        |
//| INPUT:  position - pointer to a position object,                 |
//|         sl       - link for a new price of stop loss order,      |
//|         tp       - link for a new price of take profit order.    |
//| OUTPUT: true if condition is satisfied, false if not.            |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
bool CSampleTrailing::CheckTrailingStopLong(CPositionInfo* position,double& sl,double& tp)
  {
//--- check of pointer
   if(position==NULL) return(false);
//--- check of parameters
   if(m_profit==0.0)  return(false);
//--- already in a lossless zone?
   double open=position.PriceOpen();
   if(position.StopLoss()>=open) return(false);
//--- check of profit
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(m_symbol.Bid()-open>m_profit*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open+m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }
//+------------------------------------------------------------------+
//| Check for modification of stop orders of a short position.       |
//| INPUT:  position - pointer to a position object,                 |
//|         sl       - link for a new price of stop loss order,      |
//|         tp       - link for a new take profit order.             |
//| OUTPUT: true if condition is satisfied, false if not.            |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
bool CSampleTrailing::CheckTrailingStopShort(CPositionInfo* position,double& sl,double& tp)
  {
//--- check of pointer
   if(position==NULL) return(false);
//--- check of parameters
   if(m_profit==0.0)  return(false);
//--- already in a lossless zone?
   double open=position.PriceOpen();
   if(position.StopLoss()<=open) return(false);
//--- check of profit
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(open-m_symbol.Ask()>m_profit*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open-m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }
//+------------------------------------------------------------------+

Pekâlâ, hepsi bu. Takip modülü kullanıma hazırdır.

MQL5 Sihirbazı üretici alım satım stratejilerinin modülümüzü kullanabilmesi için MetaEditor’u yeniden başlatmalıyız (MQL5 Sihirbazı Include\Expert klasörünü yalnızca açılışta tarar).

MetaEditor'u yeniden başlattıktan sonra, açık pozisyonları yönetmeye ilişkin oluşturulan modül MQL5 Sihirbazında kullanılabilir:

Şekil 5. MQL5 Sihirbazında açık pozisyonları yönetmeye ilişkin oluşturulan modül

Şekil 5. MQL5 Sihirbazında açık pozisyonları yönetmeye ilişkin oluşturulan modül

Açık pozisyonları yönetmeye ilişkin modülün parametrelerinin tanımı bölümünde belirtilen girdi parametreleri artık mevcuttur:

Şekil 6. MQL5 Sihirbazında açık pozisyonları yönetmeye ilişkin oluşturulan modülün girdi parametreleri.

Şekil 6. MQL5 Sihirbazında açık pozisyonları yönetmeye ilişkin oluşturulan modülün girdi parametreleri.

Uygulanan alım satım stratejisinin girdi parametrelerinin en iyi değerleri MetaTrader 5 terminalindeki Strateji Test Edici kullanılarak bulunabilir.


Sonuç

MQL5 Sihirbazının alım satım stratejileri üreticisi alım satım fikirlerinin test edilmesini büyük ölçüde basitleştirir. Oluşturulan uzmanın kodu alım satım sinyali sınıflarının, para ve risk yönetimi sınıflarının ve pozisyon destek sınıflarının belirli uygulamalarını oluşturmak için kullanılan Standart Kütüphanenin alım satım stratejileri sınıflarına dayanmaktadır. 

Bu makale MQL5 Sihirbazının alım satım stratejileri üreticisine nasıl bağlanılacağını ve alım satım yaparken kârınızı korumaya izin veren ve düşüşleri azaltan, fiyat pozisyon yönünde gittiğinde Zarar Durdur seviyesini kayıpsız bir bölgeye taşıyarak açık pozisyonları yöneten sınıfınızı nasıl yazacağınızı ele alır. Ayrıca MQL5 Sihirbazı için oluşturulan sınıfın tanımının yapısı ve formatı hakkında bilgi verir.

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

Ekli dosyalar |
sampletrailing.mqh (6.46 KB)
MetaTrader 5'te Çoklu Para Birimi Modunun Uygulanması MetaTrader 5'te Çoklu Para Birimi Modunun Uygulanması
Uzun zamandır çoklu para birimi analizi ve çoklu para birimi alım satımı insanların ilgisini çekmiştir. Tam teşekküllü bir çoklu para birimi rejimi uygulama fırsatı MetaTrader 5'in ve MQL5 programlama dilinin herkese açılmasıyla mümkün olmuştur. Bu makalede çeşitli sembollere yönelik gelen tüm tikleri analiz etmenin ve işlemenin bir yolunu öneriyoruz. Örnek olarak USDx dolar endeksinin çoklu para birimli RSI göstergesini ele alalım.
HTML'de grafikler ve şemalar HTML'de grafikler ve şemalar
Günümüzde içinde ağ tarayıcısı yüklü olmayan bir bilgisayar bulmak zordur. Ağ tarayıcıları uzun zamandır evrimleşip iyileşiyorlar. Bu makale, grafik ve şemaların tarayıcılarda görüntülenmesini sağlayan bir işlem platformu olan MetaTrader 5’ten alınan bilgilere dayanarak güvenli bir şekilde nasıl grafik ve şema oluşturulabileceğini anlatır.
NeuroSolutions Yapay Sinir Ağlarını Bağlama NeuroSolutions Yapay Sinir Ağlarını Bağlama
NeuroSolutions yazılım paketi, yapay sinir ağlarının oluşturulmasına ek olarak bunların DLL olarak dışa aktarılmasına da izin verir. Bu makale yapay bir sinir ağı ve bir DLL oluşturma ve bunu MetaTrader 5'te alım satım yapmak için bir Uzman Danışmana bağlama sürecini açıklar.
Zigzag ve ATR örneklerini Kullanarak Göstergelerin Sınıflara Uyarlanması Zigzag ve ATR örneklerini Kullanarak Göstergelerin Sınıflara Uyarlanması
Göstergeleri hesaplamanın en iyi yolunun ne olduğu hakkındaki tartışmalar asla bitmez. Gösterge değerlerini nerede hesaplamalıyız - göstergenin kendi içinde mi yoksa bütün mantığı kullanacak bir Expert Advisor’a (Uzman Danışman) mı yüklenmeli? Bu makale özel bir gösterge olan iCustom’ın kaynak kodunu bir Expert Advisor’ın koduna taşımak ile hesaplamaları optimize edilmiş bir komut dizisi oluşturmak ve prev_calculated (daha önce hesaplanmış) değeri örnek almak arasındaki değişkenlerden biri hakkındadır.