MQL5 Sihirbazı: Açık Pozisyonların İzlenme Modülü Nasıl Oluşturulur
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ı.
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:
- 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.
- 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.
- 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).
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).
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.
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.
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
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. 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:
- Stop emrinin kayıpsız bir seviyeye taşınmasını önermek için gereken, pozisyonun kâr puanı.
- 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.
Ş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
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.
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
- Ücretsiz ticaret uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz