English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
Semafor Göstergelerini Kullanan Basit Alım Satım Sistemleri

Semafor Göstergelerini Kullanan Basit Alım Satım Sistemleri

MetaTrader 5Ticaret sistemleri | 9 Aralık 2021, 12:48
77 0
Nikolay Kositsin
Nikolay Kositsin

Giriş

Semafor veya sinyal göstergeleri, piyasaya giriş veya çıkış anlarını gösteren basit detektörlerdir. Geçerli çubukta bir giriş sinyali olması durumunda, bir sembol grafiğinde uygun bir etiket görünür. Bu etiket daha sonra bir sözleşme gerçekleştirmek için bir koşul olarak kullanılabilir.

Bu tür birçok gösterge vardır, ancak bu tür göstergelere dayanan orijinal alım satım sisteminin özü hiç değişmemiştir. Bu nedenle, bunu en basit ve evrensel biçimde uygulamak iyi bir fikirdir. Bu, önemli değişiklikler olmadan benzer göstergelerle çalışırken elde edilen sonucun daha fazla kullanılmasına izin verecektir.

Şekil 1. ASCtrend semafor sinyal göstergesi

Şekil 1. ASCtrend semafor sinyal göstergesi

Şekil. 2. ASCtrend göstergesi. Bir sözleşme gerçekleştirmek için alım satım sinyali 

Şekil 2. ASCtrend semafor sinyal göstergesini kullanarak bir sözleşme yapmak için alım satım sinyali


Tipik Semafor Sinyal Göstergelerinin Örnekleri

Şu anda Kod Tabanında bu tür birçok gösterge var. Bu makalede uygun web sayfalarına yalnızca birkaç bağlantı sağlayacağım:

Semafor sinyal göstergelerine ek olarak, bir grup semafor trend göstergesi vardır:

Şekil 3. Heiken_Ashi_Smoothed göstergesini kullanarak alım satım sinyalleri 

Şekil 3. Semafor trend göstergesi

 

Şekil 4. Heiken Ashi Smoothed semafor trend göstergesini kullanarak bir sözleşme yapmak için alım satım sinyali

Şekil 4. Heiken Ashi Smoothed semafor trend göstergesini kullanarak bir sözleşme yapmak için alım satım sinyali

Bu tür göstergeleri kullanan alım satım sistemleri, alım satım sinyallerini almak için biraz farklı kodlara sahipken, Uzman Danışman (EA) kodu neredeyse değişmeden kalır.

Tipik Semafor Trend Göstergelerinin Örnekleri

Kod Tabanı, bu tür birçok gösterge içerir. Bu makalede uygun web sayfalarına yalnızca birkaç bağlantı sağlayacağım:

 

Alım Satım Sistemi Oluşturmak için Temel Veriler:

  1. Uzman Danışanda (EA) bulunması gereken giriş parametreleri ile semafor göstergesi;
  2. Ek giriş Uzman Danışman (EA) alım satım parametrelerinin listesi:
    • bir sözleşmede kullanılan mevduat finansal kaynaklarının payı;
    • Zarar Durdur ve Kar Al boyutu (sıfır değerler olması durumunda bekleyen emirler kullanılmamalıdır);
    • kayma (belirlenen ve gerçek sözleşme fiyatları arasında izin verilen maksimum fark);
    • alım satım sinyallerinin alınacağı çubuğun dizini;
    • uzun ve kısa pozisyon açma izinleri;
    • gösterge sinyallerine göre uzun ve kısa pozisyonların zorla kapatılması için izinler.

Tabii ki, evrensel alım satım sinyallerini kullanarak işlem yapmak için emir vermek çok daha uygun olacaktır. Bu fonksiyonlar oldukça karmaşıktır ve uygulama kodunu olabildiğince kolaylaştırmak için ayrı bir kitaplık dosyasında paketlenmeleri gerekir.

Semafor alım satım sistemini uygulayan Uzman Danışmanın (EA) kodu:

//+------------------------------------------------------------------+
//|                                                 Exp_ASCtrend.mq5 |
//|                             Copyright © 2011,   Nikolay Kositsin | 
//|                              Khabarovsk,   farria@mail.redcom.ru | 
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, Nikolay Kositsin"
#property link      "farria@mail.redcom.ru"
#property version   "1.00"
//+----------------------------------------------+
//| Expert Advisor indicator input parameters    |
//+----------------------------------------------+
input double MM=-0.1;             // Share of a deposit in a deal, negative values - lot size
input int    StopLoss_=1000;      // Stop loss in points
input int    TakeProfit_=2000;    // Take profit in points
input int    Deviation_=10;       // Max. price deviation in points
input bool   BuyPosOpen=true;     // Permission to buy
input bool   SellPosOpen=true;    // Permission to sell
input bool   BuyPosClose=true;    // Permission to exit long positions
input bool   SellPosClose=true;   // Permission to exit short positions
//+----------------------------------------------+
//| ASCtrend indicator input parameters          |
//+----------------------------------------------+
input ENUM_TIMEFRAMES InpInd_Timeframe=PERIOD_H1; // ASCtrend indicator time frame
input int  RISK=4;                               // Risk level
input uint SignalBar=1;                          // Bar index for getting an entry signal
//+----------------------------------------------+

int TimeShiftSec;
//---- declaration of integer variables for the indicators handles
int InpInd_Handle;
//---- declaration of integer variables of the start of data calculation
int min_rates_total;
//+------------------------------------------------------------------+
//| Trading algorithms                                               | 
//+------------------------------------------------------------------+
#include <TradeAlgorithms.mqh>
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---- getting ASCtrend indicator handle
   InpInd_Handle=iCustom(Symbol(),InpInd_Timeframe,"ASCtrend",RISK);
   if(InpInd_Handle==INVALID_HANDLE) Print(" Failed to get handle of ASCtrend indicator");

//---- initialization of a variable for storing a chart period in seconds  
   TimeShiftSec=PeriodSeconds(InpInd_Timeframe);

//---- initialization of variables of the start of data calculation
   min_rates_total=int(3+RISK*2+SignalBar);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//----
   GlobalVariableDel_(Symbol());
//----
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---- checking the number of bars to be enough for calculation
   if(BarsCalculated(InpInd_Handle)<min_rates_total) return;
   
//---- uploading history for IsNewBar() and SeriesInfoInteger() functions normal operation  
   LoadHistory(TimeCurrent()-PeriodSeconds(InpInd_Timeframe)-1,Symbol(),InpInd_Timeframe);

//---- declaration of local variables
   double DnVelue[1],UpVelue[1];
//---- declaration of static variables
   static bool Recount=true;
   static bool BUY_Open=false,BUY_Close=false;
   static bool SELL_Open=false,SELL_Close=false;
   static datetime UpSignalTime,DnSignalTime;
   static CIsNewBar NB;

//+----------------------------------------------+
//| Searching for deals performing signals       |
//+----------------------------------------------+
   if(!SignalBar || NB.IsNewBar(Symbol(),InpInd_Timeframe) || Recount) // checking for a new bar
     {
      //---- zeroing out trading signals
      BUY_Open=false;
      SELL_Open=false;
      BUY_Close=false;
      SELL_Close=false;
      Recount=false;

      //---- copy newly appeared data into the arrays
      if(CopyBuffer(InpInd_Handle,1,SignalBar,1,UpVelue)<=0) {Recount=true; return;}
      if(CopyBuffer(InpInd_Handle,0,SignalBar,1,DnVelue)<=0) {Recount=true; return;}

      //---- getting buy signals
      if(UpVelue[0] && UpVelue[0]!=EMPTY_VALUE)
        {
         if(BuyPosOpen) BUY_Open=true;
         if(SellPosClose) SELL_Close=true;
         UpSignalTime=datetime(SeriesInfoInteger(Symbol(),InpInd_Timeframe,SERIES_LASTBAR_DATE))+TimeShiftSec;
        }

      //---- getting sell signals
      if(DnVelue[0] && DnVelue[0]!=EMPTY_VALUE)
        {
         if(SellPosOpen) SELL_Open=true;
         if(BuyPosClose) BUY_Close=true;
         DnSignalTime=datetime(SeriesInfoInteger(Symbol(),InpInd_Timeframe,SERIES_LASTBAR_DATE))+TimeShiftSec;
        }

      //---- searching for the last trading direction for getting positions closing signals
      //if(!MQL5InfoInteger(MQL5_TESTING) && !MQL5InfoInteger(MQL5_OPTIMIZATION)) //if execution is set to "Random delay" in the Strategy Tester 
      if((BuyPosOpen && BuyPosClose || SellPosOpen && SellPosClose) && (!BUY_Close && !SELL_Close))
        {
         int Bars_=Bars(Symbol(),InpInd_Timeframe);

         for(int bar=int(SignalBar+1); bar<Bars_; bar++)
           {
            if(SellPosClose)
              {
               if(CopyBuffer(InpInd_Handle,1,bar,1,UpVelue)<=0) {Recount=true; return;}
               if(UpVelue[0]!=0 && UpVelue[0]!=EMPTY_VALUE)
                 {
                  SELL_Close=true;
                  break;
                 }
              }

            if(BuyPosClose)
              {
               if(CopyBuffer(InpInd_Handle,0,bar,1,DnVelue)<=0) {Recount=true; return;}
               if(DnVelue[0]!=0 && DnVelue[0]!=EMPTY_VALUE)
                 {
                  BUY_Close=true;
                  break;
                 }
              }
           }
        }
     }

//+----------------------------------------------+
//| Performing deals                             |
//+----------------------------------------------+
//---- Closing a long position
   BuyPositionClose(BUY_Close,Symbol(),Deviation_);

//---- Closing a short position   
   SellPositionClose(SELL_Close,Symbol(),Deviation_);

//---- Buying
   BuyPositionOpen(BUY_Open,Symbol(),UpSignalTime,MM,0,Deviation_,StopLoss_,TakeProfit_);

//---- Selling
   SellPositionOpen(SELL_Open,Symbol(),DnSignalTime,MM,0,Deviation_,StopLoss_,TakeProfit_);
//----
  }
//+------------------------------------------------------------------+

Böyle bir fikri gerçekleştirmek için kod oldukça basit ve açıktır, ancak bazı detayların açıklığa kavuşturulması gerekir.

Bir sinyal göstergesi ve bir Uzman Danışman (EA) tarafından kullanılan grafik periyodu, Uzman Danışmanın (EA) InpInd_Timeframe giriş değişkeninde sabitlenir. Bu nedenle Uzman Danışmanın (EA) bulunduğu bir grafiğin değişmesi, Uzman Danışman (EA) için bu parametreyi değiştirmez.

Yeni bir çubuğun varış anını belirlemek için gerekli olan IsNewBar() fonksiyonu, TradeAlgorithms.mqh dosyasına yerleştirilen bir sınıf olarak uygulanır. Bu, her biri için ayrı bir statik CIsNewBar değişkeni ayarlayarak bu tür herhangi bir sayıda fonksiyonu kodda kolayca kullanmanıza olanak tanır.

UpSignalTime ve DnSignalTime değişkenleri, zamanı depolamak ve aktarmak için kullanılır, bundan sonra bir öncekinden sonraki sözleşmenin alım satım fonksiyonlarına uygulanması mümkündür. Bizim durumumuzda bu özellik, aynı çubukta aynı yönde birkaç sözleşme yapmaktan kaçınmak için kullanılır (bir sözleşme gerçekleştirirken, alım satım fonksiyonu mevcut çubuğun bitiş zamanını depolar ve bu ana kadar aynı yönde yeni sözleşmeler gerçekleştirmez).

OnTick() fonksiyonundaki "Pozisyonları kapatmak için sinyal almak için son alım satım yönünün aranması" bloğu, alım satım sinyali olmayan çubuklarda pozisyon kapatma sinyallerini almak için gereklidir. Uzman Danışmanın (EA) normal çalışması durumunda bunlara gerek yoktur. Ancak internet bağlantısının kesilmesi durumunda yeni bir alım satım sinyalinin kaçırılması oldukça olasıdır. Piyasaya sonra girmek pek iyi bir fikir değil, ancak açık pozisyonları kapatmak akıllıca bir hareket olacaktır.

Alım Satım Sistemini Diğer Semafor Sinyal Göstergeleriyle Kullanma

Şimdi bu kodu başka bir semafor sinyal göstergesi ile kullanma zorunluluğu varsa aşağıdaki işlemler yapılmalıdır:

  1. Bir Uzman Danışman (EA) giriş parametrelerinde önceki gösterge verilerini yenisinin gerekli parametreleriyle değiştirin;
  2. OnInit() bloğundaki gösterge tanıtıcısını alma kodunu değiştirin;
  3. Gösterge kodundan alım ve satım işlem sinyallerini depolamak için kullanılan gösterge tamponları için dizinleri belirleyin ve bunları OnTick() bloğunun CopyBuffer() fonksiyon çağrılarına uygun şekilde girin. Bu durumda sıfır ve birinci gösterge tamponları kullanılır;
  4. Bir Uzman Danışmanda (EA) veri hesaplama başlangıç noktası değişkeninin (min_rates_total) başlatılmasını aşağıdakilere göre değiştirin. gösterge kodu;
  5. Gösterge koduna göre OnTick() fonksiyonunda "Pozisyonları kapatmak için sinyal almak için son alım satım yönünün aranması" bloğunu değiştirin. 

Alım Satım Sistemini Diğer Semafor Trend Göstergeleriyle Kullanma

Bu alım satım sistemini semafor trend göstergesi ile kullanırken, Uzman Danışman (EA) kodu, OnTick() fonksiyon işlemleri için sinyalleri belirlemek için blokta biraz değişmiştir. Örneğin, FiboCandles göstergesine dayalı Uzman Danışman (EA) için kod aşağıdaki gibi görünecektir:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---- checking the number of bars to be enough for calculation
   if(BarsCalculated(InpInd_Handle)<min_rates_total) return;
   
//---- uploading history for IsNewBar() and SeriesInfoInteger() functions  
   LoadHistory(TimeCurrent()-PeriodSeconds(InpInd_Timeframe)-1,Symbol(),InpInd_Timeframe);

//---- declaration of local variables
   double TrendVelue[2];
//---- declaration of static variables
   static bool Recount=true;
   static bool BUY_Open=false,BUY_Close=false;
   static bool SELL_Open=false,SELL_Close=false;
   static datetime UpSignalTime,DnSignalTime;
   static CIsNewBar NB;

//+----------------------------------------------+
//| Searching for deals performing signals       |
//+----------------------------------------------+
   if(!SignalBar || NB.IsNewBar(Symbol(),InpInd_Timeframe) || Recount) // checking for a new bar
     {
      //---- zeroing out trading signals
      BUY_Open=false;
      SELL_Open=false;
      BUY_Close=false;
      SELL_Close=false;
      Recount=false;

      //---- copy the newly obtained data into the arrays
      if(CopyBuffer(InpInd_Handle,4,SignalBar,2,TrendVelue)<=0) {Recount=true; return;}

      //---- getting buy signals
      if(TrendVelue[0]==1 && TrendVelue[1]==0)
        {
         if(BuyPosOpen) BUY_Open=true;
         if(SellPosClose)SELL_Close=true;
         UpSignalTime=datetime(SeriesInfoInteger(Symbol(),InpInd_Timeframe,SERIES_LASTBAR_DATE))+TimeShiftSec;
        }

      //---- getting sell signals
      if(TrendVelue[0]==0 && TrendVelue[1]==1)
        {
         if(SellPosOpen) SELL_Open=true;
         if(BuyPosClose) BUY_Close=true;
         DnSignalTime=datetime(SeriesInfoInteger(Symbol(),InpInd_Timeframe,SERIES_LASTBAR_DATE))+TimeShiftSec;
        }

      //---- searching for the last trading direction for getting positions closing signals
      //if(!MQL5InfoInteger(MQL5_TESTING) && !MQL5InfoInteger(MQL5_OPTIMIZATION)) //if execution is set to "Random delay" in the Strategy Tester 
        {
         if(SellPosOpen && SellPosClose  &&  TrendVelue[1]==0) SELL_Close=true;
         if(BuyPosOpen  &&  BuyPosClose  &&  TrendVelue[1]==1) BUY_Close=true;
        }
     }

//+----------------------------------------------+
//| Performing deals                             |
//+----------------------------------------------+
//---- Closing a long position
   BuyPositionClose(BUY_Close,Symbol(),Deviation_);

//---- Closing a short position   
   SellPositionClose(SELL_Close,Symbol(),Deviation_);

//---- Buying
   BuyPositionOpen(BUY_Open,Symbol(),UpSignalTime,MM,0,Deviation_,StopLoss_,TakeProfit_);

//---- Selling
   SellPositionOpen(SELL_Open,Symbol(),DnSignalTime,MM,0,Deviation_,StopLoss_,TakeProfit_);
//----
  }

Bu durumda alım satım sinyalleri yalnızca bir renkli gösterge tamponundan (renk dizinlerini içeren) alınır. Bu tamponda veriler yalnızca iki değere sahip olabilir: 0 - yükselen piyasa için ve 1 - azalan piyasa için. Herhangi bir çubuktaki bir trend yönü doğrudan gösterge tamponunun uygun hücresinden alınabildiğinden, "Pozisyon kapanış sinyallerini almak için son alım satım yönünün aranması" blok kodu mümkün olduğunca basitleştirildi.

"Sözleşmeleri gerçekleştirme" bloğunda, önce pozisyon kapatma fonksiyonları, ardından açma fonksiyonları gelir. Tersi durumda, sadece bir çubuktaki sözleşmeleri kapatmak mümkün olacak, "Yalnızca açık fiyatlar" modunda test ederken bunları aynı anda açamayacaksınız! Bu nedenle, alım satım sonuçları ciddi şekilde bozulacaktır.


Alım Satım Sisteminin Test Edilmesi

Alım satım sistemi testine geçmeden önce, önemli bir detayın açıklığa kavuşturulması gerekir. SignalBar giriş değişkeni değerinin sıfıra eşit olması durumunda Uzman Danışman (EA) mevcut çubuktan sözleşme gerçekleştirme sinyalleri alacaktır. Ancak mevcut çubuk sinyali, önceki çubukta bu sinyale karşı hareket eden trendin değişimini gösterme açısından güvenilir değildir. Mevcut çubuktaki sinyaller görünebilir ve kaybolabilirken, bir trend bu tür sinyallere karşı oldukça uzun bir süre hareket edebilir. Bu, bir Uzman Danışman (EA) görselleştirmenin etkin olduğu ve SignalBar değişkeninin sıfıra eşit olduğu tüm tikler üzerinde test edildiğinde kolayca görülebilir. ASCtrend göstergesi işlem görselleştirmesi, böyle bir durumda bu gerçeğin çok açık bir kanıtını sunar.

Yine, geçerli çubuktan alınan bir sinyalle bir Uzman Danışman (EA) optimizasyonu için yalnızca "Her tik" modu uygundur. Halihazırda başka bir kapalı çubuktan alınması durumunda, "Yalnızca açık fiyatlar" modu oldukça yeterlidir. Bu, kalitesinde ciddi bir kayıp olmadan alım satım sistemi davranış analizini büyük ölçüde hızlandırır.

Bu nedenle, bu tür alım satım sistemlerinin test edilmesi ve optimizasyonu için mevcut çubuktan gelen sinyalleri kullanmamak daha iyidir!

Öyleyse, Uzman Danışmanı (EA), yılın başından Aralık ayının başına kadar EUR/USD'de varsayılan parametrelerle test edelim:

Şekil 5. EUR/USD H1 üzerinde varsayılan parametrelerle Exp_ASCtrend Uzman Danışmanının (EA) test sonuçları 

Şekil 5. EUR/USD H1 üzerinde varsayılan parametrelerle Exp_ASCtrend Uzman Danışmanının (EA) test sonuçları

Strateji Test Cihazında Uzman Danışman (EA) ayarlarını biraz değiştirdikten sonra, mevcut geçmiş veriler için Uzman Danışman (EA) parametrelerinin en uygun kombinasyonunu oldukça kolay bir şekilde bulabiliriz:

 Şekil 6. EUR/USD H1 üzerinde daha iyi parametrelerle optimizasyondan sonra Exp_ASCtrend Uzman Danışmanının (EA) test sonuçları

Şekil 6. EUR/USD H1 üzerinde daha iyi parametrelerle optimizasyondan sonra Exp_ASCtrend Uzman Danışmanının (EA) test sonuçları

Alım satım sistemi optimizasyonu sürecinin herhangi bir özelliği yoktur, bu yüzden bu süreci ayrıntılı olarak açıklayan makaleye sadece bir bağlantı vereceğim: "MQL5: MQL5'te Uzman Danışmanların (EA) Test Edilmesi ve Optimize Edilmesi Kılavuzu".

Tabii ki, bu kadar basit bir alım satım sisteminden olağanüstü karlar beklemek saflık olur. Ancak bu yarı otomatik sistemin ustaca ele alınması ve piyasanın mevcut davranışına göre düzenli olarak ayarlanması durumunda iyi sonuçlar elde etmek oldukça mümkündür.

Örneğin, 2011'de Ocak'tan Mayıs'a kadar EUR/USD H12 grafiğinde yukarı yönlü bir trend vardı. Ve erken aşamalarda bu kolayca tespit edilebilirdi:

Şekil 7. EUR/USD H12 grafiği (Ocak/Mayıs 2011)

Şekil 7. EUR/USD H12 grafiği (Ocak/Mayıs 2011)

Uzman Danışmanı (EA) bu zaman aralığında varsayılan ayarlarla, yalnızca satın alma olanağıyla ve yalnızca %5 mevduat kullanımıyla (MM=0,05) test etmek ilginç olurdu. H1 grafiği üzerinde test edilen bu tür parametrelere sahip Uzman Danışmanın (EA) sonuçları aşağıdadır:

Şekil 8. Ocak/Mayıs 2011 için EUR/USD H1'de varsayılan parametrelerle Exp_ASCtrend Uzman Danışmanının (EA) test sonuçları (sadece uzun pozisyonlar, MM=0,05) 

Şekil 8. Ocak/Mayıs 2011 için EUR/USD H1'de varsayılan parametrelerle Exp_ASCtrend Uzman Danışmanının (EA) test sonuçları (sadece uzun pozisyonlar, MM=0,05)

Tabii ki, bu durumda bir yatırımcı bir sözleşme yönünü seçmekten tamamen sorumludur. Ancak bunun büyük zaman dilimi grafikleri kullanılarak yapılması gerektiğini aklımızda tutarsak herhangi bir zorlukla karşılaşmayız.


Alım Satım Modülünün Başka Bir Göstergeyle Kullanılması İçin Değiştirilmesi

Bu makale burada bitebilirdi ancak MetaEditor, hazır alım satım modüllerine dayalı Uzman Danışmanlar oluşturma olanağını elde etti. Burada sunulan tüm materyalleri göz önünde bulundurarak bu tür modülleri oluşturma işlemi oldukça karmaşıktır ve ayrı bir çalışma gerektirir. Bu nedenle, önerdiğim alım satım sistemlerine tamamen benzeyen, önceden oluşturulmuş alım satım modüllerine odaklanacağım. Ve ancak bundan sonra, gereksiz detaylandırmadan kaçınarak belirli sinyal göstergelerine göre bu modüllerin modifikasyonunun detaylarına geçeceğim.

Halihazırda semafor sinyal sistemleri (MySignals.zip) için alım satım modülleri koleksiyonumuz olduğunu ve herhangi bir özel gösterge için analog modül oluşturmak istediğimizi varsayalım. Bu, tipik bir semafor sinyal göstergesi olan BykovTrendSignal.mq5 göstergesi olsun. Her şeyden önce, bu koleksiyondan (Indicators.zip) göstergenin en doğru analogunu bulmalıyız. Görsel olarak, bu makaledeki ilk göstergenin (ASCtrend) buna en çok benzeyen olduğunu belirledik.  Bu nedenle, değişiklik için bu göstergenin alım satım modülünü kullanacağız.

Gerekli program kodunda kullanımı göz önüne alındığında, göstergenin kendisi (BykovTrend) bir dizi giriş parametresine sahiptir:

//+----------------------------------------------+
//| Indicator input parameters                   |
//+----------------------------------------------+
input int RISK=3;
input int SSP=9;
//+----------------------------------------------+

Ve sözleşmeleri gerçekleştirmek için sinyalleri depolamak için kullanılan gösterge tamponlarının dizinlerine ihtiyacımız var. Bizim durumumuzda bunlar: 0 - satış sinyalleri için ve 1 - alış sinyalleri için.

Artık modifikasyon için hangi modülün kullanılması gerektiğini bildiğimize göre, bunu BykovTrendSignal.mqh dosya adıyla \MQL5\Include\Expert\Signal\MySignals\ klasörüne kopyalayıp MetaEditor'da açıyoruz. Kullanılan kodda düzenli olarak karşılaşılan "ASCtrend" (önceki gösterge adı) ifadesi vardır. Bu, yeni göstergenin adıyla değiştirilmelidir - "BykovTrend". Bunun için "Ctrl" ve "H" tuşlarına aynı anda basın ve gerekli değişikliği yapın:

 Alım satım modülü kodundaki gösterge adının değiştirilmesi

Şekil 9. Alım satım modülü kodundaki gösterge adının değiştirilmesi

Çalışmamızın bundan sonraki aşaması en titiz olanıdır. Alım satım modülü kodundaki gösterge giriş parametreleriyle ilgili her şeyi değiştirmemiz gerekmektedir. İşlem, "MQL5 Sihirbazı: Alım satım sinyalleri modülü nasıl oluşturulur" makalesinde belirtilene çok benzerdir.

Her şeyden önce, MQL5 Sihirbazı alım satım sinyalleri sınıf açıklamasının dışarıda bırakılan bloğunda bazı değişiklikler yapmalıyız:

//+----------------------------------------------------------------------+
//| Description of the class                                             |
//| Title=The signals based on BykovTrend indicator                      |
//| Type=SignalAdvanced                                                  |
//| Name=BykovTrend                                                      |
//| Class=CBykovTrendSignal                                              |
//| Page=                                                                |
//| Parameter=BuyPosOpen,bool,true,Permission to buy                     |
//| Parameter=SellPosOpen,bool,true,Permission to sell                   |
//| Parameter=BuyPosClose,bool,true,Permission to exit a long position   |
//| Parameter=SellPosClose,bool,true,Permission to exit a short position |
//| Parameter=Ind_Timeframe,ENUM_TIMEFRAMES,PERIOD_H1,Timeframe          |
//| Parameter=RISK,int,4,Risk level                                      |
//| Parameter=SSP,int,9,SSP                                              |
//| Parameter=SignalBar,uint,1,Bar index for entry signal                |
//+----------------------------------------------------------------------+
//--- wizard description end
//+----------------------------------------------------------------------+
//| CBykovTrendSignal class.                                             |
//| Purpose: Class of generator of trade signals based on                |
//| BykovTrend indicator https://www.mql5.com/ru/code/497/.               |
//|             Is derived from the CExpertSignal class.                 |
//+----------------------------------------------------------------------+

Her iki gösterge de aynı RISK girdi değişkenini içerir, bu nedenle bırakılabilir. Ancak bu göstergelerde, bunun varsayılan değeri farklıdır. Aslında, bu fark kritik değildir ve değişmeden bırakılabilir. SSP değişkeni hakkında yorum satırı eklendi:

//| Parameter=SSP,int,9,SSP                                    |

Ve Kod Tabanı göstergesinin bağlantısı değiştirildi:

//| Purpose: Class of generator of trade signals based on      |
//| BykovTrend values https://www.mql5.com/ru/code/497/.        |

Şimdi, giriş parametrelerinin değişiklikleriyle ilgili her şey, CBykovTrendSignal alım satım sinyalleri sınıfının açıklamasına yansıtılmalıdır. Ayar parametrelerinde yeni global m_SSP sınıfı değişken bildirimi satırına sahibiz:

   uint              m_SSP;              // SSP

 ve yeni SSP() ayarları parametrelerinin kurulum yöntemi bildirimi satırı:

   void               SSP(uint value)                         { m_SSP=value;              } 

Oluşturduğumuz alım satım sinyalleri modülündeki RISK giriş değişkeni ile ilgili her şey giriş modülüne eşdeğerdir ve bu nedenle mevcut ve diğer alım satım modülü bloklarında hiçbir değişiklik yoktur.

Şimdi CBykovTrendSignal::CBykovTrendSignal() sınıfı yapıcıya geçiyoruz. Bu bloğa yeni bir değişkenin başlatılması eklenmelidir:

   m_SSP=4;

Yeni değişkenin doğruluğunun kontrolü şurada yapılmalıdır: CBykovTrendSignal::ValidationSettings() ayarları parametreleri doğrulama bloğu:

   if(m_SSP<=0)
     {
      printf(__FUNCTION__+": SSP must be above zero");
      return(false);
     }

Bundan sonra BykovTrend gösterge başlatma bloğuna geçebiliriz - BykovTrendSignal::InitBykovTrend(). Yeni göstergenin farklı sayıda giriş değişkeni vardır ve bu nedenle, bildirilen giriş parametreleri dizisinin boyutu da farklı olacaktır:

//--- setting the indicator parameters
   MqlParam parameters[3];

Bizim durumumuzda, gösterge dizisi adı için bir boyuta ve giriş parametreleri için iki boyuta daha ihtiyacımız var.

Şimdi, içinde depolanacak değişkenin türünü belirten giriş parametreleri dizilerinin yeni bir hücresini başlatmamız gerekiyor:

   parameters[2].type=TYPE_INT;
   parameters[2].integer_value=m_SSP;

 Bundan sonra, gösterge başlatma çağrısında bu blokta giriş değişkenlerinin sayısını 3 ile değiştirin:

//--- object initialization   
   if(!m_indicator.Create(m_symbol.Name(),m_Ind_Timeframe,IND_CUSTOM,3,parameters))

Göstergedeki gösterge tamponlarının sayısı aynı ve ikiye eşit kalır, bu nedenle bizim durumumuzda gösterge tampon sayısı başlatma satırında herhangi bir şeyi değiştirmeye gerek yoktur:

//--- number of buffers
   if(!m_indicator.NumBuffers(2))  return(false);

ASCtrend ve BykovTrend göstergelerinin her biri iki gösterge tamponuna sahiptir. Tamponların fonksiyonları tamamen benzerdir. Sıfır tamponu, satış sinyallerini depolamak için kullanılırken, 1. dizine sahip tampon, alış sinyallerini depolamak için kullanılır. Dolayısıyla, CBykovTrendSignal::LongCondition() ve CBykovTrendSignal::ShortCondition() alım satım sinyallerinin iletilmesine yönelik fonksiyonların blokların hiçbir şeyin değiştirilmesi gerekmez ve alım satım sinyalleri modülü modifikasyonu üzerindeki çalışma tamamlanmış sayılabilir.

Ancak genel olarak, tüm semafor göstergeleri farklıdır ve bu nedenle, farklı semafor göstergeleri için bu bloklar birbirinden önemli ölçüde farklılık gösterebilir. MySignals.zip alım satım modülü arşivi ve uygun Indicators.zip arşivi, çeşitli göstergeler oluşturmak için yeterli miktarda örnek içerir. Biraz incelemeden sonra, değiştirme işleminin ayrıntılarını ve bunun için olası kod sürümlerini öğrenmek mümkündür.

Şimdi, alım satım sinyalleri modülünün Ind_Timeframe giriş değişkenine odaklanmak istiyorum. Bu değişken, göstergeye uygun bir zaman dilimi indirmeye izin verir. Ancak, oluşturulan Uzman Danışman (EA), atandığı zaman diliminde çalışır. Bu, Ind_Timeframe giriş değişkeni zaman diliminin, modülün normal çalışmasını sağlamak için Uzman Danışmanın (EA) üzerinde çalıştığı grafiğin bir dönemini asla aşmaması gerektiği anlamına gelir.

Son olarak, alım satım sinyalleri modülleri oluşturmanın başka bir özelliğini ortaya çıkarmak istiyorum. Bazen, modül giriş değişkenlerinin türleri olarak temel gösterge koduna özel numaralandırmalar uygulanır. Örneğin, Candles_Smoothed göstergesi için MA_SMethod değişken türü olarak Smooth_Method özel numaralandırması kullanılır:

//+-----------------------------------+
//|  Declaration of enumerations      |
//+-----------------------------------+
enum Smooth_Method
  {
   MODE_SMA_,  // SMA
   MODE_EMA_,  // EMA
   MODE_SMMA_, // SMMA
   MODE_LWMA_, // LWMA
   MODE_JJMA,  // JJMA
   MODE_JurX,  // JurX
   MODE_ParMA, // ParMA
   MODE_T3,    // T3
   MODE_VIDYA, // VIDYA
   MODE_AMA,   // AMA
  }; */
//+----------------------------------------------+
//| Indicator input parameters                   |
//+----------------------------------------------+
input Smooth_Method MA_SMethod=MODE_LWMA; // Smoothing method
input int MA_Length=30;                   // Smoothing depth                    
input int MA_Phase=100;                   // Smoothing parameter
                                          // for JJMA varying within the range -100 ... +100,
                                          // for VIDIA it is a CMO period, for AMA it is a slow average period
//+----------------------------------------------+

Böyle bir durumda, bu tür giriş değişkenleri ve alım satım sinyalleri modülündeki (Candles_SmoothedSignal.mqh) ilgili tüm öğeler, int veya uint türlerinin değişkenlerine dönüştürülmelidir. Ayrıca, bu giriş değişkenlerinin bitirilen Uzman Danışmanın (EA) halihazırda oluşturulmuş kodunda kullanım kolaylığı için, Uzman Danışman (EA) giriş parametrelerine kadar özel numaralandırmaların ters prosedürü ve gerekli giriş değişkeni türlerinin (ExpM_Candles_Smoothed Expert Advisor) değiştirilmesi gerçekleştirilmelidir:

//+------------------------------------------------------------------+
//|  Declaration of enumerations                                     |
//+------------------------------------------------------------------+
enum Smooth_Method
  {
   MODE_SMA_,  // SMA
   MODE_EMA_,  // EMA
   MODE_SMMA_, // SMMA
   MODE_LWMA_, // LWMA
   MODE_JJMA,  // JJMA
   MODE_JurX,  // JurX
   MODE_ParMA, // ParMA
   MODE_T3,    // T3
   MODE_VIDYA, // VIDYA
   MODE_AMA,   // AMA
  };
//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
//--- inputs for expert
input string          Expert_Title         ="Candles_Smoothed"; // Document name
ulong                 Expert_MagicNumber   =29976;              // 
bool                  Expert_EveryTick     =false;              // 
//--- inputs for main signal
input int             Signal_ThresholdOpen =40;                 // Signal threshold value to open [0...100]
input int             Signal_ThresholdClose=20;                 // Signal threshold value to close [0...100]
input double          Signal_PriceLevel    =0.0;                // Price level to execute a deal
input double          Signal_StopLevel     =50.0;               // Stop Loss level (in points)
input double          Signal_TakeLevel     =50.0;               // Take Profit level (in points)
input int             Signal_Expiration    =1;                  // Expiration of pending orders (in bars)
input bool            Signal__BuyPosOpen   =true;               // Candles_Smoothed() Permission to buy
input bool            Signal__SellPosOpen  =true;               // Candles_Smoothed() Permission to sell
input bool            Signal__BuyPosClose  =true;               // Candles_Smoothed() Permission to exit a long position
input bool            Signal__SellPosClose =true;               // Candles_Smoothed() Permission to exit a short position
input ENUM_TIMEFRAMES Signal__Ind_Timeframe=PERIOD_H1;            // Candles_Smoothed() Timeframe
input Smooth_Method   Signal__MA_SMethod   =4;                  // Candles_Smoothed() Smoothing method (1 - 10)
input uint            Signal__MA_Length    =30;                 // Candles_Smoothed() Smoothing depth
input uint            Signal__MA_Phase     =100;                // Candles_Smoothed() Smoothing parameter
input uint            Signal__SignalBar    =1;                  // Candles_Smoothed() Bar index for the entry signal
input double          Signal__Weight       =1.0;                // Candles_Smoothed() Weight [0...1.0]
//--- inputs for money
input double          Money_FixLot_Percent =10.0;               // Percent
input double          Money_FixLot_Lots    =0.1;                // Fixed volume

Bizim durumumuzda bu, Signal__MA_SMethod giriş değişkeni ile yapıldı.

Her iki kod sürümünü de (ASCtrendSignal.mqh ve BykovTrendSignal.mqh) düzenleyicide aynı anda açarsanız (birini sol tarafa, diğerini sağ tarafa yerleştirerek) ve her iki kod sürümünü dikkatli bir şekilde karşılaştırırsanız, kod değişikliğini önemli ölçüde hızlandırabilirsiniz.

Sonuç

Acemi Uzman Danışman oluşturucularının böyle bir kod yazmanın tüm özelliklerini kolayca anlayabilmeleri veya en azından oldukça popüler göstergeleri kullanarak hazır Uzman Danışmanlar (EA) ile çalışabilmeleri için bu makalenin ekindeki Experts.zip arşivine semafor ticaret sistemine dayalı olarak yeterli miktarda Uzman Danışman (EA) yerleştirdim.

Ekli tüm Uzman Danışmanlar (EA), alım satım stratejileri oluşturucusunu kendi alım satım sistemleri için bir temel olarak kullanmak isteyenler için ayrıca alım satım modülleri olarak sunulmaktadır. Bu modüller MySignals.zip'te bulunurken, bunlara dayalı alım satım sistemleri Expertsez.zip'te bulunabilir. Uzman Danışmanlarda (EA) kullanılan göstergeler, Indicators.zip içine yerleştirilir. Dosyaları çıkarma yolları aşağıdaki gibidir:

  • Experts.zip: "\MQL5\Experts\";
  • Expertsez.zip: "\MQL5\Experts\"; 
  • MySignals.zip: "\MQL5\Include\Expert\Signal\MySignals\"; 
  • Indicators.zip: "\MQL5\Indicators\";
  • SmoothAlgorithms.mqh: "\Include\";
  • TradeAlgorithms.mqh: "\Include\".

MetaEditor'ı yeniden başlatın, Gezgin penceresini açın, MQL5 etiketine sağ tıklayın ve açılır menüden "Derle" seçeneğini seçin.

SmoothAlgorithms.mqh dosyası, Indicators.zip'ten bazı göstergelerin derlenmesi için gerekliyken, TradeAlgorithms.mqh dosyası Experts.zip'ten tüm Uzman Danışmanların (EA) derlenmesi için gereklidir.

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

Ekli dosyalar |
expertsez.zip (31.51 KB)
mysignals.zip (44.08 KB)
indicators.zip (39.15 KB)
experts.zip (34.67 KB)
6 Adımda Kendi Alım Satım Robotunuzu Oluşturun! 6 Adımda Kendi Alım Satım Robotunuzu Oluşturun!
Alım satım sınıflarının nasıl oluşturulduğunu bilmiyorsanız ve "Nesne Yönelimli Programlama" kelimelerinden korkuyorsanız, bu makale tam size göredir. Aslında, kendi alım satım sinyalleri modülünüzü yazmak için ayrıntıları bilmenize gerek yoktur. Sadece bazı basit kurallara uyun. Geri kalan her şey MQL5 Sihirbazı tarafından yapılacak ve kullanıma hazır bir alım satım robotu elde edeceksiniz!
Ç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.
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!
Nesne Yönelimli Programlamanın Temelleri Nesne Yönelimli Programlamanın Temelleri
Nesne yönelimli programlamayı (OOP) kullanmak için polimorfizm, kapsülleme vb.'nin ne olduğunu bilmenize gerek yok... basit şekilde bu özellikleri kullanabilirsiniz. Bu makale, uygulamalı örneklerle OOP'nin temellerini kapsar.