English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
Standart Kitaplığın Alım Satım Stratejisi Sınıflarını Keşfetme - Stratejileri Özelleştirme

Standart Kitaplığın Alım Satım Stratejisi Sınıflarını Keşfetme - Stratejileri Özelleştirme

MetaTrader 5Ticaret sistemleri | 22 Aralık 2021, 14:55
91 0
Harvester Trading
Harvester Trading

Giriş

Bu makale, sıfırdan bir EA yazmadan işlevsellikli bir tür özelleştirme girişiminde bulunmak isteyen acemi/yeni başlayan kullanıcılar için hazırlanmıştır.

MetaTrader 5'te, tek bir MetaEditor özelliği sayesinde, programlama dili ve kaynakların kodlanması hakkında minimum veya sıfır bilgi (ve beceri) ile uzman alım satım işlemi için harika bir olasılığımız var: MQL5 Sihirbazı. Sihirbaz (bu makalede buna ilişkin ayrıntılı çalışmayı açıklamayacağız) bitmiş programlar (.mq5 ve .ex5 dosyaları), algoritmalar ve kodlar üretmeyi amaçlamaktadır. MQL5 Standart Kitaplığı ve Alım Satım Stratejisi Sınıflarını (bunlar mükemmel kaynaklardır) kullanmaktan yararlanır.

Standart Kitaplığın Alım Satım Stratejisi Sınıflarını Keşfetme: Stratejileri Özelleştirme

Aslında Standart Kitaplıkta çok sayıda alım satım stratejisi sınıfı var; bunların bazıları zaten çok iyi ve temelleri, finansal piyasalar ve karlılık analizi hakkında az çok ünlü çalışmalara dayanıyor. MetaTrader 5 ile birlikte gelen standart gösterge kümesinin her gösterge için en az bir strateji vardır.

Bu Alım Satım Stratejisi Sınıflarından alım satım sinyalleri oluşturmak için MQL5 Sihirbazı, "alım satım modelleri" biçiminde kodlanmış bir mantık tarafından oluşturulan gösterge davranışlarını çağıran bir mekanizma kullanır. Ve her özel oluşturulan EA, göstergeleri (#include yönergeleri aracılığıyla) ve daha sonra alım satım amacıyla EA çekirdeğine aktarılan model kümelerini ve alım satım kararlarını çağırır.


MQL5 Sihirbazı

İlk adım, MQL5 Sihirbazını kullanarak bir Expert Advisor oluşturmaktır. MQL5 Sihirbazını MetaEditor'da açmak için "Dosya" menüsünden "Yeni"yi seçin veya "Yeni" düğmesine basın, ardından "Expert Advisor (oluştur)" seçeneğini seçin.

Şekil 1. Yeni Dosya Oluşturma (Sihirbazda "oluştur" seçeneğini seçin)

MQL5 Sihirbazında oluşturulan Expert Advisor'ımıza "MyExpert" adını verelim.

Şekil 2. MQL5 Sihirbazında oluşturulan EA'nın adı ve parametreleri

Ardından, onunla çalışmak için iki gösterge/sinyal ekleyelim (mevcut göstergelerden istediğiniz kadar koşul seçebilirsiniz). Örneğimiz için iki ünlü gösterge ekleyelim: Göreceli Güç İndeksi (RSI) ve Hareketli Ortalama (MA). Önce RSI göstergesini, ardından MA göstergesini ekleyin.

Şekil 3. Önce RSI'yi ve ardından MA'yı seçin

Bazı parametreleri istediğimiz gibi ayarlayabilir veya örneğimiz için varsayılan parametreleri bırakabiliriz.

Şekil 4. Sinyal parametreleri

Tamam'a tıkladıktan ve Sihirbaz ile devam ettikten sonra, bir sonraki pencerede (şimdilik) herhangi bir Takip Eden Zarar Durdurucu seçmeyeceğiz, ancak dilerseniz ekleyebilirsiniz: Bu, makalenin konusunu etkilemeyecektir. Bir sonraki pencerede, alım satım yüzdesi olarak 5,0 ve 0,1 lotu veya istediğiniz diğer parametreleri seçeceğiz: Yine bu, makalemizin konusunu etkilemeyecektir.


Oluşturulan Kodu Analiz Etme

Bitirdikten sonra "MyExpert.mq5" dosyasına sahip olacaksınız. Oluşturulan kodun ana noktalarını analiz edelim.

//+------------------------------------------------------------------+
//|                                                     MyExpert.mq5 |
//|                                                        Harvester |
//|                        https://www.mql5.com/en/users/Harvester |
//+------------------------------------------------------------------+
#property copyright "Harvester"
#property link      "https://www.mql5.com/en/users/Harvester"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include                                                          |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- available signals
#include <Expert\Signal\SignalRSI.mqh>
#include <Expert\Signal\SignalMA.mqh>
//--- available trailing
#include <Expert\Trailing\TrailingNone.mqh>
//--- available money management
#include <Expert\Money\MoneyFixedLot.mqh>

Öncelikle Sihirbaz tarafından oluşturulan koda eklenen #include dosyalarına dikkat edin. Şunu görebiliriz:

  • Expert.mqh
  • SignalRSI.mq
  • SignalMA.mqh

Ardından, kodun aşağıdaki kısmı:

//--- Creating filter CSignalRSI
   CSignalRSI *filter0=new CSignalRSI;
   if(filter0==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating filter0");
      ExtExpert.Deinit();
      return(-3);
     }
   signal.AddFilter(filter0);

Başlıktan da anlaşılacağı gibi, bu, bir grafiğe eklenecek veya Strateji Test Cihazı'nda test edilecek olan, oluşturulan EA'nın piyasa koşullarına uygulanacak "filtre"dir. filter0 "indeksi"i sıfır olan ilk filtredir ve bu ilk filtre için örneğimizde RSI'yı seçtik.

CSignalRSI, RSI Sınıf Sinyali anlamına gelir. Bu sınıf, RSI göstergesini çağırmak ve ona Sihirbazın kalıp mantığını kullanarak al veya sat sinyalleri oluşturmak için bazı koşullar uygulamak için kullanılır. O zaman RSI bizim ilk filtremizdir (filtre numarası 0).

Kodun aşağıdaki kısmında bazı filtre parametreleri, ardından Takip Eden Zarar Durdurucu Bölümü (takip edeni seçmedik) ve daha sonra kodun Para Yönetimi ile ilgili bölümü vardır.

Devam ediyoruz, elimizde şu var:

//--- Tuning of all necessary indicators
   if(!ExtExpert.InitIndicators())
     {
      //--- failed
      printf(__FUNCTION__+": error initializing indicators");
      ExtExpert.Deinit();
      return(-10);
     }
//--- ok
   return(0);
  }

Bu bölüm, Expert.mqh içerme dosyasına aittir. Bu, expert çalışması için gerekli olan göstergelerin başlatılması ile ilgilidir.

Ve oluşturulan EA kodunun son kısmı, başlatmayı geri alma ve diğer olağan Expert Advisor olaylarıyla ilgilidir:

//+------------------------------------------------------------------+
//| Deinitialization function of the expert                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ExtExpert.Deinit();
  }
//+------------------------------------------------------------------+
//| "Tick" event handler function                                    |
//+------------------------------------------------------------------+
void OnTick()
  {
   ExtExpert.OnTick();
  }
//+------------------------------------------------------------------+
//| "Trade" event handler function                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
   ExtExpert.OnTrade();
  }
//+------------------------------------------------------------------+
//| "Timer" event handler function                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   ExtExpert.OnTimer();
  }
//+------------------------------------------------------------------+

Aslında bu EA, "filtreler" ve "ağırlıklar" mantığını kullanan standart alım satım sınıfları kitaplığı aracılığıyla alım satım kararları için iki gösterge (RSI ve MA) kullanır. Bununla ilgili daha fazla bilgiyi MQL5 Referansı'nın Alım Satım Sinyali Modülleri bölümünde bulabilirsiniz. Ama amacımız kendi alım satım stratejilerimizi yeni filtreler olarak kullanmak.

Bu nedenle, ilk adım için (kendi alım satım stratejilerimizi kullanarak) MyExpert.mq5'imizi biraz değiştireceğiz. İlk olarak, başka bir filtre ekleyelim. Bu filter2 olacak ve onu kodun filter1 kısmının hemen sonrasına yerleştireceğiz.

//--- Creating filter CSignalCCIxx
   CSignalCCIxx *filter2=new CSignalCCIxx;
   if(filter2==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating filter2");
      ExtExpert.Deinit();
      return(-4);
     }
   signal.AddFilter(filter2);
//--- Set filter parameters
   filter2.PeriodCCIxx(Signal_CCIxx_PeriodCCI);
   filter2.Applied(Signal_CCIxx_Applied);
   filter2.Weight(Signal_CCIxx_Weight);

Filtrelerin ve piyasa karar verme sürecinin özü olan #include dosyalarına geri dönelim. İlki #include <Expert\Expert.mqh> dosyasıdır. Bu içerme dosyası, sırayla diğer dosyaları içerir:

  • #include "ExpertBase.mqh"
  • #include "ExpertTrade.mqh"
  • #include "ExpertSignal.mqh"
  • #include "ExpertMoney.mqh"
  • #include "ExpertTrailing.mqh"

Bu içerme dosyaları, sırasıyla EA'nın ana yapısı, Alım Satım yapısı, Sinyal, Para ve Takip eden zarar durdurucu işlemlerini içerir. Bu dosyaları derinlemesine analiz etmeyeceğiz veya değiştirmeyeceğiz. Amacımız, MetaTrader 5 standart gösterge kümesindeki mevcut göstergeleri kullanarak ve bunların içerme dosyasını ekleyerek kendi stratejilerimizi eklemeye odaklanmak.

MyExpert.mq5 kodunda, bu örnekte piyasa alım satım kararı için sinyaller/filtreler olarak kullandığımız RSI ve MA göstergelerinin #include dosyalarına sahibiz. Bu noktada, kendi özel içerme dosyamızı ekleyelim. Bu amaçla, CCI göstergesine ait Sinyallerin değiştirilmiş ("geliştirilmiş") bir sürümünü kullanacağız.

//+------------------------------------------------------------------+
//| Include                                                          |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- available signals
#include <Expert\Signal\SignalRSI.mqh>
#include <Expert\Signal\SignalMA.mqh>

#include <Expert\Signal\SignalCCIxx.mqh>   // This is our own 'custom' indicator for custom Signal management of the EA

SignalCCIxx.mqh dosyası \MQL5\Include\Expert\Signal\ klasörüne yerleştirilmelidir ve Standart Kitaplığın diğer #include alım satım sınıfları gibi sihirbaz tarafından oluşturulan EA'nın bütünleştirilebilirliği ile uyumlu olmalıdır - Sinyal dosyaları zaten bu klasörde mevcuttur (SignalRSI.mqh ve SignalMA.mqh).

Bu örnek için, orijinal CCI dosyasını kopyalayacağız, biraz değiştirilmiş kodla CCIxx adında başka bir tane oluşturacağız ve onu #include dosyası olarak kullanacağız. Şimdi, basit olması açısından, CCI göstergesinin Standart Kitaplıktan kopyalanmış bir sürümünü kullanalım.

Yapmamız gereken şey, "\MQL5\Include\Expert\Signal\SignalCCI.mqh" dosyasını "\MQL5\Include\Expert\Signal\SignalCCIxx.mqh" dosyasına kopyalamaktır. Bunu yapmanın en kolay yolu, klasördeki dosyanın bir kopyasını oluşturmak ve ardından onu yeniden adlandırmaktır.

Şimdi bu dosyaya bakalım. Bu 'özel' yolun sihirbaz tarafından oluşturulan MyExpert.mq5'e entegrasyonu yalnızca bitmiş bir çalışmadır. Yukarıda açıklandığı gibi filter2 kodunu ekledik; aşağıdakileri daha sonra tamamlayacağız. Dolayısıyla artık MyExpert.mq5 dosyasına odaklanmayacağız, ancak bundan sonra CCI göstergesinin filter2 alım satım sinyali nedeniyle EA'nın gerçek özü olan SignalCCIxx.mqh dosyasına odaklanacağız.


Stratejiyi Özelleştirme

SignalCCI.mqh'nin değiştirilmiş sürümü olan CCIxx olarak adlandırdığımız 'yarı özel' strateji filtrelerini eklemeye dönelim. Bunu yarı özel olarak tanımlıyorum; zira aslında tamamen yeni bir özel Sinyal değildir; bundan ziyade MetaTrader 5 ile birlikte gelen standart gösterge kümesinden CCI göstergesinin yeniden tasarlanmış bir sürümüdür. Bu şekilde, deneyimsiz kullanıcılar ve programcılar dahi çok sayıda mevcut göstergeyi kullanarak MQL5 Sihirbazı tarafından oluşturulan bir EA'nın kalıplarını ve filtrelerini kısmen değiştirebilir; yani başka bir deyişle, al ve sat piyasa sinyalleri oluşturmak için kendi filtre ve kalıp sürümlerinizi oluşturabilirsiniz. Bu, stratejilerle çalışmak için hala mükemmel bir temeldir.

Bu örneğe bakalım. Bu, sadece bu özelliğe ihtiyaç duyanlar (mevcut göstergelere bazı özel kalıplar eklemek için) ve yalnızca bazı tür özelleştirmelere sahip tamamen işlevsel (ve geçerli) bir EA'yı hızlı bir şekilde oluşturmak için Sihirbazı kullanarak Otomatik Alım Satım Şampiyonası'na katılmak isteyenler için faydalı olacaktır.

Bu, sadece 1 saatlik bir çalışma ile elde edilebilir - Takip Eden Zarar Durdurucu, Para Yönetimi ve rekabetçi alım satım için gereken her şey ile tamamen işlevsel, Şampiyona dostu bir EA oluşturmak. EA'nın Sihirbaz tarafından oluşturulduğuna tekrar odaklanarak, onu Şampiyona dostu olarak adlandırdım; bu, aslında oluşturulan kodun hatasız olduğu anlamına gelir; bu nedenle katılımcıların herhangi bir şeyi düzeltmesi veya hata korkusu olmaması gerekir!

EA yalnızca alım satım yapacak ve alım satım işlemi için mükemmel olacaktır; en azından katılmak isteyenler, ancak programlama hakkında bilgisi olmayanlar ve İşler hizmetinden bir EA sipariş etmek istemeyenler için (Şampiyonaya katılmak için güzel bir alternatif). Aklınızdaki stratejiye yakın kendi alım satım robotunuza sahip olmak için atanabilecek birçok giriş parametresi vardır.

Ancak aslında yalnızca standart gösterge kümesini, MetaQuotes tarafından Sihirbaz ve alım satım stratejisi sınıflarının Standart Kitaplığı aracılığıyla sunulan standart filtreler/kalıplar kümesi ile kullanabilirsiniz. Göstergelerin birçok parametresi (zaman dilimi, sembol) ve göstergelerin kendisinin tüm parametreleri örneğin Dönem, Uygulanan Fiyat vb. olduğu için, bu, çok sayıda kombinasyon ve başarılı alım satım imkanı sunar. Bu makalede, MetaTrader 5 standart göstergelerini nasıl özelleştireceğinizi ve kalıpları/filtreleri nasıl ekleyeceğinizi hızlı ve kolay bir şekilde öğreneceksiniz.

Davranışını özelleştirmek ve değiştirmek, kendi CCI sinyal alım satım modelimizi (CCIxx) yapmak için SignalCCIxx.mqh dosyasına devam edelim. Öncelikle, MyExpert.mq5 dosyasında aşağıdaki örnekte olduğu gibi giriş bölümünde yeni kod için yeni değişkenler ekleyelim (vurgulanan koda bakınız):

//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
//--- inputs for expert
input string             Expert_Title         ="MyExpert";  // Document name
ulong                    Expert_MagicNumber   =26287;       // 
bool                     Expert_EveryTick     =false;       // 
//--- inputs for main signal
input int                Signal_ThresholdOpen =40;          // Signal threshold value to open [0...100]
input int                Signal_ThresholdClose=60;          // 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    =4;           // Expiration of pending orders (in bars)
input int                Signal_RSI_PeriodRSI =8;           // Relative Strength Index(8,...) Period of calculation
input ENUM_APPLIED_PRICE Signal_RSI_Applied   =PRICE_CLOSE; // Relative Strength Index(8,...) Prices series
input double             Signal_RSI_Weight    =0.7;         // Relative Strength Index(8,...) Weight [0...1.0]
input int                Signal_MA_PeriodMA   =90;          // Moving Average(12,0,...) Period of averaging
input int                Signal_MA_Shift      =0;           // Moving Average(12,0,...) Time shift
input ENUM_MA_METHOD     Signal_MA_Method     =MODE_SMA;    // Moving Average(12,0,...) Method of averaging
input ENUM_APPLIED_PRICE Signal_MA_Applied    =PRICE_CLOSE; // Moving Average(12,0,...) Prices series
input double             Signal_MA_Weight     =0.6;         // Moving Average(12,0,...) Weight [0...1.0]

input int                Signal_CCIxx_PeriodCCI =8;            // Commodity Channel Index(8,...) Period of calculation
input ENUM_APPLIED_PRICE Signal_CCIxx_Applied   =PRICE_CLOSE;  // Commodity Channel Index(8,...) Prices series
input double             Signal_CCIxx_Weight    =0.8;          // Commodity Channel Index(8,...) Weight [0...1.0]

Signal_RSI_Weight ve Signal_MA_Weight değişkenlerinin değerlerini sırasıyla 1,0'dan 0,7 ve 0,6'ya değiştirdik ve yukarıda vurgulanan satırları ekledik. Alım satım stratejisi sınıflarında CCI göstergesine ait kalıbın CCIxx değiştirilmiş sürümü için giriş parametreleriyle doğru bir şekilde çalışmak için, aslında bu 3 satırlık kodu SignalCCI.mqh dosyasından kopyaladık ve "CCI"dan sonra "xx" sonekini ekledik.

Sınıf bildiriminin "korumalı" bölümünde birçok ilginç öğe vardır:

class CSignalCCI : public CExpertSignal
  {
protected:
   CiCCI             m_cci;            // object-oscillator
   //--- adjusted parameters
   int               m_periodCCI;      // the "period of calculation" parameter of the oscillator
   ENUM_APPLIED_PRICE m_applied;       // the "prices series" parameter of the oscillator
   //--- "weights" of market models (0-100)
   int               m_pattern_0;      // model 0 "the oscillator has required direction"
   int               m_pattern_1;      // model 1 "reverse behind the level of overbuying/overselling"
   int               m_pattern_2;      // model 2 "divergence of the oscillator and price"
   int               m_pattern_3;      // model 3 "double divergence of the oscillator and price"
   //--- variables
   double            m_extr_osc[10];   // array of values of extremums of the oscillator
   double            m_extr_pr[10];    // array of values of the corresponding extremums of price
   int               m_extr_pos[10];   // array of shifts of extremums (in bars)
   uint              m_extr_map;       // resulting bit-map of ratio of extremums of the oscillator and the price

m_pattern adlı int türlerine bir göz atın. Bu değişkenler kademeli olarak 0'dan 3'e kadar numaralandırılır; bunların her biri bir "kalıp" veya başka bir deyişle, bir finansal enstrümanın alım satımına ilişkin piyasa karar verme koşullarının bir modelidir.

İki özel 2 kalıp ekleyeceğiz: m_pattern_4 ve m_pattern_5. Bu, basitçe iki kod satırı, iki tamsayı türü değişkeni ekleyerek yapılır.

//--- "weights" of market models (0-100)
   int               m_pattern_0;      // model 0 "the oscillator has required direction"
   int               m_pattern_1;      // model 1 "reverse behind the level of overbuying/overselling"
   int               m_pattern_2;      // model 2 "divergence of the oscillator and price"
   int               m_pattern_3;      // model 3 "double divergence of the oscillator and price"

   int               m_pattern_4;      // model 4 "our own first new pattern: values cross the zero"
   int               m_pattern_5;      // model 5 "our own second new pattern: values bounce around the zero"

Koda bakmaya devam ederseniz alım ve satım mantığını ve diğer her şeyi anlayacaksınız. Ama biz burada yalnızca kendi kalıplarımızı nasıl ekleyeceğimize ilişkin kısımlara odaklanacağız; zira dosyaları içerenleri satır satır açıklamayacağız (bu amaçla, okuyucu dosyaları kendisi açıp inceleyebilir; anlaşılmalarına yardımcı olacak MQL5 Referansı da mevcuttur).

Ayrıca, bunu da yapmak istiyoruz: CSignalCCIxx.mqh file dosyasında CTRL+H'ye basın, "CCI"yı arayın ve "CCIxx" ile değiştirin. "Tümünü Değiştir"e tıklayın - 41 olay bulunmalı ve değiştirilmelidir. Buraya, dosyanın en üst kısmına gidelim:

//+------------------------------------------------------------------+
//| Class CSignalCCIxx.                                              |
//| Purpose: Class of generator of trade signals based on            |
//|          the 'Commodity Channel Index' oscillator.               |
//| Is derived from the CExpertSignal class.                         |
//+------------------------------------------------------------------+
class CSignalCCIxx : public CExpertSignal
  {
protected:
   CiCCIxx             m_CCIxx;            // object-oscillator

ve bunu orijinal

protected:
   CiCCIxx             m_CCIxx;            // object-oscillator

SignalCCI.mqh'deki gibi değiştirelim.

protected:
   CiCCI             m_CCIxx;            // object-oscillator

Bunu, CiCCI başka bir içermeden çağrıldığı ve adını değiştirirsek açıkçası birkaç hata meydana geleceği için yapıyoruz. Artık SignalCCIxx.mqh dosyasını derleyebiliriz; 0 hata ve 0 uyarı olmalıdır. Hata veya uyarı varsa, muhtemelen bazı hatalar yaptınız demektir; bu durumda işlemi tekrarlamalısınız.

Şimdi kendi kalıplarımızı eklemenin özüne gidelim. Yalnızca fantezi olsun diye, 2 piyasa alım satım davranışı kalıbı ekleyelim. Toplamda, 2'si al ve 2'si sat olmak üzere 4 yeni sinyalimiz (kalıp) olacak. Değiştirilecek kısım şudur:

//+------------------------------------------------------------------+
//| Constructor CSignalCCIxx.                                        |
//| INPUT:  no.                                                      |
//| OUTPUT: no.                                                      |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
void CSignalCCIxx::CSignalCCIxx()
  {
//--- initialization of protected data
   m_used_series=USE_SERIES_HIGH+USE_SERIES_LOW;
//--- setting default values for the oscillator parameters
   m_periodCCIxx  =14;
//--- setting default "weights" of the market models
   m_pattern_0  =90;         // model 0 "the oscillator has required direction"
   m_pattern_1  =60;         // model 1 "reverse behind the level of overbuying/overselling"
   m_pattern_2  =100;        // model 2 "divergence of the oscillator and price"
   m_pattern_3  =50;         // model 3 "double divergence of the oscillator and price"
   m_pattern_4  =90;         // model 4 "our own first new pattern: "
   m_pattern_5  =90;         // model 5 "our own second new pattern: 
}

90 değerini m_pattern_4 ve m_pattern_5'e atadık, ancak bunları kendinizinkiyle değiştirmelisiniz (bunu yapmanız gerekir): Bunlar, tüm Expert Advisor alım satım davranışını etkilediği için yeni piyasa modellerinize atamak istediğiniz ağırlıklardır.

Fantezi için iki yeni market modeli ekleyelim. Bunlar, çok basit olacaklar - Yalnızca eğitim amaçlı olup test edilmemiş alım satım sinyalleridir; bu nedenle onlarla alım satım yapmayın. artı işareti, karşılık gelen çubuklar için aşağıdaki şekillerde CCI göstergesinin değerlerini belirlememize yardımcı olacaktır.


İlk Kalıp

Sıfır çizgisini aşağıdan yukarıya geçen

Bu bizim ilk kalıbımız: "bu fiyatın artacağı teklif".

  • Şekil 5'te, Çubuk 1'e (mevcut çubuktan bir çubuk önce) karşılık gelen CCI değeri gösterilmiştir. Değeri, 45,16 böylece > 0.
  • Şekil 6'da, Çubuk 2'ye (mevcut çubuktan iki çubuk önce) karşılık gelen CCI değeri gösterilmiştir. Değeri, -53,92 böylece < 0.
  • CCI göstergesinin sıfır çizgisi (0,00 değeri) 2 çubuk içinde aşağıdan yukarıya geçildi.

Şekil 5. İlk Kalıbımız, Fiyat Artışı - Çubuk 1'deki CCI 1   Şekil 6. İlk Kalıbımız, Fiyat Artışı - Çubuk 2'deki CCI


Sıfır çizgisini yukarıdan aşağıya geçen

Bu bizim ilk kalıbımız: "bu fiyatın azalacağı teklif".

  • Şekil 7'de, Çubuk 1'e (mevcut çubuktan bir çubuk önce) karşılık gelen CCI değeri gösterilmiştir. Değeri, -28,49 böylece < 0.
  • Şekil 8'de, Çubuk 2'ye (mevcut çubuktan iki çubuk önce) karşılık gelen CCI değeri gösterilmiştir. Değeri, 2,41 böylece > 0.
  • CCI göstergesinin sıfır çizgisi (0,00 değeri) 2 çubuk içinde yukarıdan aşağıya geçildi.

Şekil 7. İlk Kalıbımız, Fiyat Düşüşü - Çubuk 1'deki CCI   Şekil 8. İlk Kalıbımız, Fiyat Düşüşü - Çubuk 2'deki CCI


İkinci Kalıp

Sıfır çizgisini yukarıdan aşağıya geçen ve yukarıya geri dönen

Bu bizim ikinci kalıbımız: "bu fiyatın artacağı teklif".

  • Şekil 9'da, Çubuk 1'e (mevcut çubuktan bir çubuk önce) karşılık gelen CCI değeri gösterilmiştir. Değeri, 119,06 böylece > 0.
  • Şekil 10'da, Çubuk 2'ye (mevcut çubuktan iki çubuk önce) karşılık gelen CCI değeri gösterilmiştir. Değeri, -20,38 böylece < 0.
  • Şekil 11'de, Çubuk 3'e (mevcut çubuktan üç çubuk önce) karşılık gelen CCI değeri gösterilmiştir. Değeri, 116,85 böylece tekrar > 0.
  • CCI göstergesinin sıfır çizgisi (0,00 değeri) yukarıdan aşağıya geçildi. Daha sonra CCI gösterge çizgisi, 3 çubuk içinde sıfır çizgisinin etrafında sıçrayarak yukarıya döndü.

Şekil 9. İkinci Kalıbımız, Fiyat Artışı - Çubuk 1'deki CCI   Şekil 10. İkinci Kalıbımız, Fiyat Artışı - Çubuk 2'deki CCI   Şekil 10. İkinci Kalıbımız, Fiyat Artışı - Çubuk 3'teki CCI


Sıfır çizgisini aşağıdan yukarıya geçen ve aşağıya geri dönen

Bu bizim ikinci kalıbımız: "bu fiyatın azalacağı teklif".

  • Şekil 12'de, Çubuk 1'e (mevcut çubuktan bir çubuk önce) karşılık gelen CCI değeri gösterilmiştir. Değeri, -58,72 böylece < 0.
  • Şekil 13'te, Çubuk 2'ye (mevcut çubuktan iki çubuk önce) karşılık gelen CCI değeri gösterilmiştir. Değeri, 57,65 böylece > 0.
  • Şekil 14'te, Çubuk 3'e (mevcut çubuktan üç çubuk önce) karşılık gelen CCI değeri gösterilmiştir. Değeri, -85,54 böylece tekrar < 0.
  • CCI göstergesinin sıfır çizgisi (0,00 değeri) aşağıdan yukarıya geçildi. Daha sonra CCI gösterge çizgisi, 3 çubuk içinde sıfır çizgisinin etrafında sıçrayarak aşağıya döndü.

Şekil 12. İkinci Kalıbımız, Fiyat Düşüşü - Çubuk 1'deki CCI   Şekil 13. İkinci Kalıbımız, Fiyat Düşüşü - Çubuk 2'deki CCI   Şekil 14. İkinci Kalıbımız, Fiyat Düşüşü - Çubuk 3'teki CCI


Kalıpları Uygulama

Bu 4 koşulu (kalıp başına iki tane) uygulamak için aşağıdaki kod bölümünü bu şekilde değiştirmemiz gerekiyor. En altta, "satın al" koşulu için vurgulanan kod satırlarını ekledik (yukarıdaki yorumlara bakınız: Bu fiyatın artacağı "teklif").

//+------------------------------------------------------------------+
//| "Voting" that price will grow.                                   |
//| INPUT:  no.                                                      |
//| OUTPUT: number of "votes" that price will grow.                  |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
int CSignalCCIxx::LongCondition()
  {
   int result=0;
   int idx   =StartIndex();
//---
   if(Diff(idx)>0.0)
     {
      //--- the oscillator is directed upwards confirming the possibility of price growth
      if(IS_PATTERN_USAGE(0)) result=m_pattern_0;      // "confirming" signal number 0
      //--- if the model 1 is used, search for a reverse of the oscillator upwards behind the level of overselling
      if(IS_PATTERN_USAGE(1) && Diff(idx+1)<0.0 && CCIxx(idx+1)<-100.0)
         result=m_pattern_1;      // signal number 1
      //--- if the model 2 or 3 is used, perform the extended analysis of the oscillator state
      if(IS_PATTERN_USAGE(2) || IS_PATTERN_USAGE(3))
        {
         ExtState(idx);
         //--- if the model 2 is used, search for the "divergence" signal
         if(IS_PATTERN_USAGE(2) && CompareMaps(1,1))      // 00000001b
            result=m_pattern_2;   // signal number 2
         //--- if the model 3 is used, search for the "double divergence" signal
         if(IS_PATTERN_USAGE(3) && CompareMaps(0x11,2))   // 00010001b
            return(m_pattern_3);  // signal number 3
        }
      // if the model 4 is used, look for crossing of the zero line
      if(IS_PATTERN_USAGE(4) && CCIxx(idx+1)>0.0 && CCIxx(idx+2)<0.0)
         result=m_pattern_4;      // signal number 4 
      // if the model 5 is used, look for the bouncing around the zero line
      if(IS_PATTERN_USAGE(5) && CCIxx(idx+1)>0.0 && CCIxx(idx+2)<0.0 && CCIxx(idx+3)>0.0)
         result=m_pattern_5;      // signal number 5
     }
//--- return the result
   return(result);
  }

"Sat" koşulu için kodun ilgili bölümünü değiştirelim. En altta, "sat" koşulu için vurgulanan kod satırlarını ekledik (yukarıdaki yorumlara bakınız: Bu fiyatın azalacağı "teklif").

//+------------------------------------------------------------------+
//| "Voting" that price will fall.                                   |
//| INPUT:  no.                                                      |
//| OUTPUT: number of "votes" that price will fall.                  |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
int CSignalCCIxx::ShortCondition()
  {
   int result=0;
   int idx   =StartIndex();
//---
   if(Diff(idx)<0.0)
     {
      //--- the oscillator is directed downwards confirming the possibility of falling of price
      if(IS_PATTERN_USAGE(0)) result=m_pattern_0;      // "confirming" signal number 0
      //--- if the model 1 is used, search for a reverse of the oscillator downwards behind the level of overbuying
      if(IS_PATTERN_USAGE(1) && Diff(idx+1)>0.0 && CCIxx(idx+1)>100.0)
         result=m_pattern_1;      // signal number 1
      //--- if the model 2 or 3 is used, perform the extended analysis of the oscillator state
      if(IS_PATTERN_USAGE(2) || IS_PATTERN_USAGE(3))
        {
         ExtState(idx);
         //--- if the model 2 is used, search for the "divergence" signal
         if(IS_PATTERN_USAGE(2) && CompareMaps(1,1))      // 00000001b
            result=m_pattern_2;   // signal number 2
         //--- if the model 3 is used, search for the "double divergence" signal
         if(IS_PATTERN_USAGE(3) && CompareMaps(0x11,2))   // 00010001b
            return(m_pattern_3);  // signal number 3
        }
      if(IS_PATTERN_USAGE(4) && CCIxx(idx+1)<0.0 && CCIxx(idx+2)>0.0)
         result=m_pattern_4;      // signal number 4 
      if(IS_PATTERN_USAGE(5) && CCIxx(idx+1)<0.0 && CCIxx(idx+2)>0.0 && CCIxx(idx+3)<0.0)
         result=m_pattern_5;      // signal number 5  
     }
//--- return the result
   return(result);
  }

Son eklenen satırların (idx+1) veya (idx+2) ... (idx+n) çok basit ama sorunun çok önemli bir noktası: +1, +2, +3, vb. Mevcut olandan önceki çubuk sayısı (mevcut olan aslında canlı "mum", 0. çubuktur).

Şekil 15. Koddaki (idx) değişkenine çubuklar (mumlar) karşılık gelir.

Yani, idx+N ne kadar fazlaysa, o kadar çok çubuk geriye gideriz. Her çubuk (idx+n), aynı zaman diliminde aynı 'dikey' pozisyondaki gösterge değerine karşılık gelir.

Şekil 16. Her çubuk (idx), göreli CCI değerine karşılık gelir

Bu Şekil 16'da sıfırıncı çubuk (kodda idx veya (idx+0)'a karşılık gelen en sağdaki ilk mum) 0,00'ın altında karşılık gelen CCI değerine sahiptir. Ayrıca ikinci çubuk (idx+1) ve üçüncü çubuk (idx+2) 0,00 satırının altında değerlere sahiptir. Diğer çubukları dikey ok ile işaretlemedik, ancak farenizi 4. çubuğun arkasına (idx+3) getirdiğinizde karşılık gelen CCI değerinin 0,00'ın üzerinde olduğunu görebilirsiniz.

Kullanıcıların çoğu için bu gerçek açıktır, ancak acemi kullanıcılar için fiyat grafiğinin grafik çubuklarının/mumlarının, CCI göstergesinin grafik görünümünün ve sırasıyla (idx) değişkeninin ve CCIxx göstergesinin değerinin birbirine nasıl karşılık geldiğini bilmek daha iyidir.

Bu, çubuk indeksini (idx) ve gösterge değişkeninin değerini kullanarak kolayca kodlayabileceğiniz bir strateji için bir varsayımda bulunmayı deneyerek, seçtiğiniz göstergeleri bir grafik üzerinde görüntülemek ve fiyat çubukları/mumları ile seçilen göstergenin davranışı arasındaki uyumluluğu "görselleştirmeye" (veya keşfetmeye) çalışmak için önemlidir.

SignalCCIxx.mqh dosyasında sözcüklerle yazılmış

CCIxx(idx+1)>0.0 && CCIxx(idx+2)<0.0

şu kod şu anlama gelir:

CCI Indicator value (one bar before, named idx+1) is above the zero line of CCI indicator
AND
CCI Indicator value (two bars before, named idx+2) is below the zero line of CCI indicator

Bu, yalnızca seçtiğimiz gösterge değerine (bu durumda - CCI) dayalı olarak iki özel kalıbın nasıl ekleneceğinin en küçük örneğidir.

"Fiyatın aratacağı" veya "fiyatın azalacağı" koşulu bu şekilde Kalıplara yazılmalı ve eklenmelidir ve hiç kimse daha karmaşık koşullar oluşturulmasına engel olmaz. Son testten önce pozisyonların nasıl açılıp kapandığına ilişkin mekanizmalara bir göz atalım.

Mekanizma ve mantık, Standart Kitaplığın Alım Satım Stratejisi Sınıfları bölümünde MQL5 Referans Kılavuzu'nda zaten çok iyi açıklandı.

Kısaca, MyExpert.mq5 dosyasında 2 giriş parametremiz var (iki tamsayı değişkeni):

//--- inputs for main signal
input int                Signal_ThresholdOpen =40;          // Signal threshold value to open [0...100]
input int                Signal_ThresholdClose=60;          // Signal threshold value to close [0...100]

Bu açılış ve kapanış eşikleri, (alım satım işlemi modellerimize göre) bir alım satım uzun veya kısa açılıp ardından kapatılırsa hesaplama için kullanılan iki değerdir. Eşikler, 0 ile 100 arasında bir tamsayı türünde sayı olduğunu varsayar. Bu parametreler ne anlama geliyor?

Signal_ThresholdOpen, uzun veya kısa bir pozisyon açma değeridir, Signal_ThresholdClose daha önce açılmış pozisyonu kapatma değeridir. Bu değerler, Sihirbaz tarafından oluşturulan EA'ların tüm mantığına tutkallanmış basit ama mükemmel bir mekanizma bağlamında hesaplanır.

Signal__.mqh dosyalarındaki her sinyal (__, bizim durumumuzda kullanılan göstergenin adı anlamına gelir - MA, RSI ve CCIxx), daha önce ayrıntılı bir şekilde gördüğümüz gibi kalıplardan oluşur. Örneğimizde onlara tekrar bakalım. SignalMA.mqh dosyasından, her kalıp için göreli "ağırlığı" olan 4 kalıbımız var:

//--- setting default "weights" of the market models
   m_pattern_0 =80;          // model 0 "price is on the necessary side from the indicator"
   m_pattern_1 =10;          // model 1 "price crossed the indicator with opposite direction"
   m_pattern_2 =60;          // model 2 "price crossed the indicator with the same direction"
   m_pattern_3 =60;          // model 3 "piercing"

ve aynı şekilde SignalRSI.mqh dosyasındaki RSI için:

//--- setting default "weights" of the market models
   m_pattern_0  =70;         // model 0 "the oscillator has required direction"
   m_pattern_1  =100;        // model 1 "reverse behind the level of overbuying/overselling"
   m_pattern_2  =90;         // model 2 "failed swing"
   m_pattern_3  =80;         // model 3 "divergence of the oscillator and price"
   m_pattern_4  =100;        // model 4 "double divergence of the oscillator and price"
   m_pattern_5  =20;         // model 5 "head/shoulders"

"Kendi" SignalCCIxx.mqh dosyamızda (neredeyse tamamı SignalCCI.mqh'nin bir kopyasıdır) şu değerlere sahibiz:

//--- setting default "weights" of the market models
   m_pattern_0  =90;         // model 0 "the oscillator has required direction"
   m_pattern_1  =60;         // model 1 "reverse behind the level of overbuying/overselling"
   m_pattern_2  =100;        // model 3 "divergence of the oscillator and price"
   m_pattern_3  =50;         // model 4 "double divergence of the oscillator and price"
   m_pattern_4  =80;         // model 4 "our own first new pattern: "
   m_pattern_5  =90;         // model 5 "our own second new pattern: "

Bunlar standart 0, 1, 2, 3 artı son iki değeri 80 ve 90 olan kendi 4 ve 5 kalıplarımızdır. MyExpert.ex5'i grafiğe eklediğimizde veya Strateji Test Cihazı'nda test ettiğimizde, seçtiğimiz tüm Sinyallerin (RSI, MA ve CCIxx) kalıpları sürekli olarak hesaplanır.

Bir veya daha fazla kalıbın koşulu başarılıysa, bir sonraki hesaplama için o kalıbın sinyali etkinleştirilir. Örneğin, SignalCCIxx.mqh dosyasından m_pattern_4 oluyorsa, şu koşuldan:

// if the model 4 is used, look for crossing of the zero line
       if(IS_PATTERN_USAGE(4) && CCIxx(idx+1)>0.0 && CCIxx(idx+2)<0.0)
          result=m_pattern_4;      // signal number 4 

potansiyel bir alım satım sinyali haline gelir. Yani, Şekil 5 ve Şekil 6'daki gibi çubuk 1'deki CCI değeri > 0,0 ve aynı anda çubuk 2'deki CCI değeri < 0,0 ise koşul gerçekleşir ve m_pattern_4 (sinyal numarası 4) etkinleştirilir.

CCIxx stratejimizin bu sinyali için belirlediğimiz ağırlık değeri 80 mutlak değerine eşittir, ancak "bu fiyatın azalacağı teklif" durumunda -80 ve "bu fiyatın artacağı teklif" durumunda 80 kabul edecektir. "Bu fiyatın azalacağı teklif", kalıbın ağırlığının orijinal değerine olumsuz bir işaret koyar.

m_pattern_4 koşulunun başarılı olduğunu varsayarsak, yalnızca bir alım satım işlemi açılır:

  • 4 numaralı sinyal (m_pattern_4), koşulun doğru olduğu (sinyal etkinleştirilir) tek sinyaldir VE bu, Signal_ThresholdOpen hedefine ulaşır (değeri bir katsayı ile çarpılır, Signal_ThresholdOpen değerine ulaşılır ve bu değeri aşar)

  • 4 numaralı sinyal, Signal_ThresholdOpen hedefine ulaşırken, CCIxx stratejisinin kendi karşıtı diğer sinyalleriyle rekabet eder (CCIxx stratejisinin sinyalleri/kalıpları "fiyatın azalacağı teklif") ve diğer göstergelerin (RSI sinyalleri ve MA sinyalleri) zıt yönlerdeki diğer tüm sinyalleriyle rekabet eder (bu durumda ters yön kısa yöndür; zira "fiyatın artacağı teklif" hakkındaki m_pattern_4'ü analiz ediyoruz).

Böylece, her kalıbı 2 grupta bir rakip olarak düşünebiliriz: Boğa sinyalleri ve ayı sinyalleri. Aynı yöndeki bu kalıplar/sinyaller ("fiyatın artacağı teklif") başarılı olduğunda (etkinleştirilir), birbiriyle toplanır ve toplam, Signal_ThresholdOpen değeriyle karşılaştırılır. Açılan herhangi bir pozisyon veya toplam, daha önce zıt bir pozisyon (bu örnekte, kısa bir pozisyon) durumunda Signal_ThresholdClose değeriyle karşılaştırılmazsa, SignalCCIxx.mqh'nin m_pattern_4'ü şu değere sahip olur:

  • "fiyat artışı" durumunda 80
  • "fiyat azalması" durumunda -80

TÜM Sinyallerin TÜM diğer kalıplarının (SignalRSI.mqh, SignalMA.mqh ve SignalCCIxx.mqh'nin 0,1,2,3 ve 5 kalıpları) 0 değerini aldığını varsayalım. Bu, "sinyal rakipleri"nin "oyun" dışı kalması gibidir ve tek rakip m_pattern_4'ün ikisidir - biri al, diğeri sat için. Yani yalnızca m_pattern_4 çalışır durumda; zira 0'dan farklı bir değere sahip (80).

//--- setting default "weights" of the market models
   m_pattern_0 =0;          // model 0 "price is on the necessary side from the indicator"
   m_pattern_1 =0;          // model 1 "price crossed the indicator with opposite direction"
   m_pattern_2 =0;          // model 2 "price crossed the indicator with the same direction"
   m_pattern_3 =0;          // model 3 "piercing"

Ve aynı şekilde SignalRSI.mqh dosyasındaki RSI için:

//--- setting default "weights" of the market models
   m_pattern_0  =0;         // model 0 "the oscillator has required direction"
   m_pattern_1  =0;        // model 1 "reverse behind the level of overbuying/overselling"
   m_pattern_2  =0;        // model 2 "failed swing"
   m_pattern_3  =0;        // model 3 "divergence of the oscillator and price"
   m_pattern_4  =0;        // model 4 "double divergence of the oscillator and price"
   m_pattern_5  =0;        // model 5 "head/shoulders"

"Kendi" SignalCCIxx.mqh dosyamızda (neredeyse tamamı SignalCCI.mqh'nin bir kopyasıdır) şu değerlere sahibiz:

//--- setting default "weights" of the market models
   m_pattern_0  =0;        // model 0 "the oscillator has required direction"
   m_pattern_1  =0;        // model 1 "reverse behind the level of overbuying/overselling"
   m_pattern_2  =0;        // model 3 "divergence of the oscillator and price"
   m_pattern_3  =0;        // model 4 "double divergence of the oscillator and price"
   m_pattern_4  =80;       // model 4 "our own first new pattern: "
   m_pattern_5  =0;        // model 5 "our own second new pattern: "

Makalenin başına şu satırları ekledik:

input int                Signal_CCIxx_PeriodCCI =8;            // Commodity Channel Index(8,...) Period of calculation
input ENUM_APPLIED_PRICE Signal_CCIxx_Applied   =PRICE_CLOSE;  // Commodity Channel Index(8,...) Prices series
input double             Signal_CCIxx_Weight    =0.8;          // Commodity Channel Index(8,...) Weight [0...1.0]

0,8 değerine sahip Signal_CCIxx_Weight değişkenine odaklandık. Signal_ThresholdOpen, eşik değerine ulaşıldığında elde edilir (tetiklenir). Değer, şu şekilde hesaplanır:

0.8 (Signal_CCIxx_Weight input parameter)
*
80 (m_pattern_4's weight value)
= 64 is the signal strength for the "voting that price will grow"

Algoritma bir "fiyat artışı" sinyali (SignalCCIxx'in m_pattern_4'ü) yakaladığı için bu, "fiyatın artacağı teklif"tir ve değer 80'dir.

Varsayımsal olarak bu, "fiyatın azalacağı teklifi" yakalarsa (SignalCCIxx'in m_pattern_4'ü), değer -80'dir. "Düşen fiyat" için algoritma, kalıp değerine sadece bir eksi işareti koyar. "Fiyatın azalacağı teklifi" varsayarsak, hesaplamalar şu şekildedir:

0.8 (Signal_CCIxx_Weight input parameter)
*
-80 (m_pattern_4's weight value)
= -64 = the negative value is considered for short positions

-64 64 (mutlak değerde), "fiyatın azalacağı teklif" için sinyal kuvveti'dir. Sinyal kuvveti her zaman mutlak değer olarak ifade edilir, kısa pozisyon değerlerinden önce bir eksi işareti ve uzun pozisyon değerlerinden önce bir artı işareti gelir.

Elde edilen değeri 64 ve sinyal kuvveti 64 olan uzun pozisyonun yukarıdaki örneğine dönelim. Rekabet eden başka zıt (negatif işaretli) sinyaller (Sinyal__'in m_pattern_N'si) yoksa, uzun sinyalin kuvveti 64 olduğu ve Signal_ThresholdOpen'daki düzey 40'a ulaşıldığı ve 24 oranında (40+24=64) aşıldığı için, değeri 40 olan Signal_ThresholdOpen elde edilir. Signal_ThresholdOpen'a ulaşıldığı için uzun bir pozisyon açılır.

Örneğin, Signal_CCIxx_Weight'te 0,4 değerini ayarlarsak, hiçbir uzun pozisyon açılmaz; zira:

0.4 (the Signal_CCIxx_Weight)
*
80(m_pattern_4)
= 32 (strength of "long signal")

ve düzey 40'a (Signal_ThresholdOpen) 32 < 40 olduğu için ulaşılmaz; dolayısıyla uzun pozisyonlar açılmaz.

Yukarıdaki örnek değerler kümesi (SignalCCIxx.mqh'nin m_pattern_4'ünde 80 hariç tüm 0 değerler) Sihirbazın arkasındaki mükemmel mantığı ve ağırlıklar ve eşikler sistemini anlamamız için yalnızca örnek olarak kullanılmıştır. Normal programlamada, her Signal__'in m_pattern_N'sinin her birine tercih edilen bir ağırlık atarsınız. Bir kalıba 0 değerini atarsanız, bu yalnızca bu kalıbın kullanılmayacağı anlamına gelir.

Yukarıdaki örnekte başka bir değeri değiştirirsek (SignalCCIxx.mqh'nin m_pattern_4'ü dışında tüm parametreler 0'a ayarlanmış olarak), SignalRSI.mqh'nin m_pattern_1 değerini 100 olarak bildirin, hesaplamalar artık 4 takiplerimiz olacak şekilde değişir:

  • SignalCCIxx.mqh dosyasından m_pattern_4 (Boğa) ve m_pattern_4 (Ayı), sırasıyla 80 ve -80 değerleri.
  • SignalRSI.mqh dosyasından m_pattern_1 (Boğa) ve m_pattern_1 (Ayı), sırasıyla 100 ve -100 değerleri.
m_pattern_4 Bullish --> 0.8 * 80 = 64
m_pattern_2 Bullish --> 0.7 * 100 = 70
m_pattern_4 Bearish --> 0.8 * (-80) = -64
m_pattern_2 Bearish --> 0.7 * (-100) = -70

Böylece 4 olası kombinasyonumuz olacak:

A) m_pattern_4 Bullish + m_pattern_2 Bullish = {[0.8 * (80)] + [0.7 * (100)]}/2 = [64 + (70)]/2 = 134/2 = 67
B) m_pattern_4 Bullish + m_pattern_2 Bearish = {[0.8 * (80)] + [0.7 * (-100)]}/2 = [64 + (-70)]/2 = -6/2 = -3
C) m_pattern_4 Bearish + m_pattern_2 Bullish = {[0.8 * (-80)] + [0.7 * (100)]}/2 = [(-64) + 70]/2 = 6/2 = 3
D) m_pattern_4 Bearish + m_pattern_2 Bearish = {[0.8 * (-80)] + [0.7 * (-100)]}/2 = [(-64) + (-70)]/2 = -134/2 = -67

Durum A
Pozitif değer 67. 40 değerindeki Signal_ThresholdOpen sağlandığı ve aşıldığı için uzun pozisyon açılır. 60 değerindeki Signal_ThresholdClose değerine ulaşıldığında ve D = -67 = |67| (mutlak değer) durumunun mutlak değeri tarafından aşıldığında uzun pozisyon daha sonra kapatılır; bunun nedeni 67 > 60 mutlak değerindeki durum D'nin kuvvetidir (yani Signal_ThresholdClose eşiğidir).

Durum B
Negatif değer -3. Hiçbir kısa pozisyon açılmaz; zira 40 değerindeki Signal_ThresholdOpen elde edilemez ve B durumu mutlak değeri tarafından açılır: "Sinyal kuvvetini" ve 3 < 40'ü (bir sinyalin açık pozisyona ilişkin değeri) hesaplamak için mutlak değerini dikkate aldığımızda -3, 3 haline gelir. Açılmış kısa pozisyon yoktur ve açıkçası kısa pozisyonları kapatmak için herhangi bir hesaplama yoktur.

Durum C
Pozitif değer 3. Uzun pozisyonlar açılmaz; zira 40 değerindeki Signal_ThresholdOpen elde edilemez ve 3 < 40 (bir sinyalin açık pozisyona ilişkin değeri) olduğu için durum C'nin değeri tarafından aşılır. Açılmış uzun pozisyon yoktur ve açıkçası uzun pozisyonları kapatmak için herhangi bir hesaplama yoktur.

Durum D
Negatif değer -67. Kısa pozisyon açılır; zira 40 değerindeki Signal_ThresholdOpen'a ulaşılır ve basitçe -67 mutlak değeri olan 67 ile hesaplanan sinyal kuvveti ve 67 > 40 tarafından aşılır. Kısa pozisyon daha sonra 60 değerindeki Signal_ThresholdClose elde edildiğinde kapatılır ve A = 67 durumunun değeri tarafından aşılır; zira 67 (durum A'nın eşiği) > 60'tır (yani Signal_ThresholdClose'un eşiğidir).

Yani kısa pozisyonları açmak için önce sinyallerin negatif değeri nedeniyle yönü belirlememiz gerekir, bunun ardından önceki >= sonraki olup olmadığını görmek için Signal_ThresholdOpen değeriyle karşılaştırılacak sinyal kuvvetini hesaplamak için negatif değer mutlak değerine dönüştürülür.

Uzun pozisyonları kapatmak benzer şekilde gerçekleştirilir: İlk olarak uzun pozisyonu kapatmak için negatif değeri dikkate alırız (aksine, kısa pozisyonu kapatmak için değer pozitiftir), bunun ardından bu negatif değer, önceki >= sonraki olup olmadığını görmek için Signal_ThresholdClose ile karşılaştırılacak mutlak değerine dönüştürülür.

Uzun pozisyonları açmak ve kısa pozisyonları kapatmak için hesaplamalar pozitif sayılar üzerinde yapılır (eksi işaretli sinyal yoktur); bu nedenle hesaplamalar için mutlak değerlerin dikkate alınmasına gerek yoktur. Uzun pozisyonların açılması, pozitif bir sinyal kuvveti değeri ile tetiklenir ve kısa pozisyonların kapanması, pozitif bir sinyal kuvveti değeri tarafından da tetiklenir.

İlk olarak sırasıyla uzun veya kısa pozisyon açmak için ve kısa veya uzun pozisyonu kapatmak için artı işareti ve eksi işaretini dikkate aldık. Ardından, her zaman pozitif işaretle hesaplanan Signal_ThresholdOpen ve Signal_ThresholdClose eşik değerleriyle karşılaştırma için mutlak değerlerini hesapladık (Signal_ThresholdOpen ve Signal_ThresholdClose için negatif işaret yoktur).


Pozisyon Ayrıntıları

Konumun ayrıntılarını daha derinlemesine incelemeye devam edelim:

  • Normal alım satım. Pozisyon açılır ve ardından kapatılır. Bundan sonra, pozisyon hemen tekrar açılmaz.
  • Pozisyonu tersine çevirme. Pozisyon açılır, sonra kapatılır ve sonra ters yönde tekrar açılır.

Uzun pozisyon şu durumlarda açılır:

Open_long >= Signal_ThresholdOpen
Signal_ThresholdClose <= Signal_ThresholdOpen İSE
Bir sat sinyali alıyoruz; bu nedenle uzun pozisyon şu durumlarda tersine çevrilecektir:
Open_short > Signal_ThresholdClose VE Open_short > Signal_ThresholdOpen
Bir sat sinyali alıyoruz; bu nedenle uzun pozisyon şu durumlarda kapatılacaktır:
Open_short > Signal_ThresholdClose VE Open_short < Signal_ThresholdOpen

Signal_ThresholdClose >= Signal_ThresholdOpen İSE
Bir sat sinyali alıyoruz; bu nedenle uzun pozisyon şu durumlarda tersine çevrilecektir:
Open_short > Signal_ThresholdClose VEYA Open_short > Signal_ThresholdOpen
Bir sat sinyali alıyoruz; bu nedenle uzun pozisyon şu durumlarda kapatılacaktır:
Open_short > Signal_ThresholdClose VEYA Open_short < Signal_ThresholdOpen

Signal_ThresholdClose >= Signal_ThresholdOpen durumunda bu, "VEYA" boolesidir, çünkü Signal_ThresholdClose >= Signal_ThresholdOpen, Signal_ThresholdOpen değerini içerir . Böylece pozisyon kapatılacak ve Signal_ThresholdClose >= Signal_ThresholdOpen değeri tarafından geçersiz kılınacak, yine de kısa-ters çevrilecektir.


Kısa Pozisyon şu durumlarda açılır:

Open_short >= Signal_ThresholdOpen.
Signal_ThresholdClose <= Signal_ThresholdOpen
Bir al sinyali alıyoruz; bu nedenle kısa pozisyon şu durumlarda tersine çevrilecektir:
Open_long > Signal_ThresholdClose VE Open_long > Signal_ThresholdOpen
Bir al sinyali alıyoruz; bu nedenle kısa pozisyon şu durumlarda kapatılacaktır:
Open_long > Signal_ThresholdClose VE Open_long < Signal_ThresholdOpen

Signal_ThresholdClose >= Signal_ThresholdOpen İSE
Bir al sinyali alıyoruz; bu nedenle kısa pozisyon şu durumlarda tersine çevrilecektir:
Open_long > Signal_ThresholdClose VEYA Open_long > Signal_ThresholdOpen
Bir al sinyali alıyoruz; bu nedenle kısa pozisyon şu durumlarda kapatılacaktır:
Open_long > Signal_ThresholdClose VEYA Open_long < Signal_ThresholdOpen

Signal_ThresholdClose >= Signal_ThresholdOpen durumunda bu, "VEYA" boolesidir, çünkü Signal_ThresholdClose >= Signal_ThresholdOpen, Signal_ThresholdOpen değerini içerir . Böylece pozisyon kapatılacak ve Signal_ThresholdClose >= Signal_ThresholdOpen değeri tarafından geçersiz kılınacak, yine de uzun-ters çevrilecektir.

Sihirbaz tarafından oluşturulan EA'ların pozisyonlarını açma ve kapatma mekanizması, bir ağırlıklar, değerler ve eşikler sistemine dayandığı için çok bilgilendirici ve akıllıdır. Bu mekanizma kullanılarak pozisyonlar mükemmel bir 'metodoloji' ile ve mantık hatası olmadan yönetilecektir.


Fiyat Düzeyi ve Sinyalin Sona Erme Süresi

Önemli bir değişken daha vardır:

input double             Signal_PriceLevel    =0.0;         // Price level to execute a deal

Bu değişken, Sihirbaz tarafından oluşturulan EA mekanizmasının esas olarak anlaşılması için çok önemlidir ve şu şekilde basitleştirilebilir:

  • Signal_PriceLevel, Uzun sinyalin Buy-Stop veya Buy-Limit olarak mı yoksa Kısa sinyalin Sell-Stop veya Sell-Limit olarak mı işleneceğini belirler. Stop ve Limit talimatlarıyla ilgili ayrıntılar için ilgili MetaTrader 5 Yardım bölümüne bakın.

  • Signal_PriceLevel giriş değişkenine atanan negatif değerler her zaman Durdurma Talimatları (Al veya Sat) anlamına gelir.

  • Signal_PriceLevel giriş değişkenine atanan pozitif değerler her zaman Limit-Orders (Buy veya Sell) anlamına gelir.

Şekil 17. Signal_PriceLevel'a bağlı olarak Durdurma Talimatları ve Sınırlama Talimatları

Örneğin:

EURUSD - Uzun pozisyonlar

Signal_PriceLevel = -70 (eksi 70)
yani Sinyal Açık etkinleştirildiğinde (örneğin mevcut fiyat = 1.2500),
EA, 1.2500 + 70 = 1.2570'den oluşan bir Buy Stop talimatı verecektir
(yükseliş açısından mevcut fiyattan daha kötü)


Signal_PriceLevel = 60 (artı 60)
yani Sinyal Açık etkinleştirildiğinde (örneğin mevcut fiyat = 1.2500),
EA, 1.2500 - 60 = 1.2440'tan oluşan bir Buy Limit talimatı verecektir
(yükseliş açısından mevcut fiyattan daha iyi)


EURUSD - Kısa pozisyonlar

Signal_PriceLevel = -70 (eksi 70)
yani Sinyal Açık etkinleştirildiğinde (örneğin mevcut fiyat = 1.2500),
EA, 1.2500 - 70 = 1.2430'dan oluşan bir Sell Stop talimatı verecektir
(düşüş açısından mevcut fiyattan daha iyi)


Signal_PriceLevel = 60 (artı 60)
yani Sinyal Açık etkinleştirildiğinde (örneğin mevcut fiyat = 1.2500),
EA, 1.2500 + 60 = 1.2560'tan oluşan bir Sell-Limit talimatı verecektir
(düşüş açısından mevcut fiyattan daha kötü)


Son olarak, giriş değişkeni

input int                Signal_Expiration    =4;           // Expiration of pending orders (in bars)

Stop/Limit talimatlarının kaç kez (çubuklarla ifade edilir) canlı olacağını belirler.


Akış Grafiği

Daha iyi anlamak için, Sihirbaz tarafından oluşturulan EA'ların nasıl çalıştığına ilişkin dinamiklerin mekanizmasını az çok gösteren bu basitleştirilmiş akış grafiğini düşünebilirsiniz.

Şekil 18. Çalışan Talimat ve Pozisyonların Basitleştirilmiş Akış Grafiği


Strateji Test Cihazı

Şimdi özelleştirilmiş stratejimizin içeriğine dönelim ve SignalCCIxx.mqh dosyasını derleyelim. Hata yoksa, her şey yolunda olmalıdır. Aslında şimdi 2 yeni piyasa alım satım karar modeli deseni ekledik. Her desenin bir Al ve Sat koşulu ile açılış ve kapanış koşulları vardır.

Şimdi MyExpert.mq5 dosyasını derleyelim; her şey yolundaysa 0 hata ve 0 uyarı olacaktır. O halde, bunu Strateji Test Cihazı'nda test edelim. Son Otomatik Alım Satım Şampiyonası 2011'e benzer bir süre boyunca EUR/USD sembolü için Strateji Test Cihazı'nda bazı parametreleri kullandım.

Şekil 19. ATC2011'i MyExpert.mq5 ile taklit etmek için bazı basit parametreler

'İyi' sonuçlar vermesine ve sabit bir lot miktarıyla 3 aydan kısa sürede ilk mevduatı iki katından fazlasına çıkarmasına rağmen, bu EA'yı gerçek alım satım için kullanmanızı tavsiye etmiyorum, bunun yerine kendi desenlerinizi/modellerinizi ekleyerek ve onlarla denemeler yaparak, size uygun iyi sonuçlar elde edene kadar optimize etmenizi öneriyorum.

Buradaki amacımız, mevcut Alım Satım Stratejisi Sınıflarını güçlendirme fikrinin işe yaradığını göstermektir.

Şekil 20. MyExpert.mq5 ile sözde ATC2011'in sonuçları

Yeni desenler/modeller oluşturabilir ve bunları MQL5.community ile paylaşabilirsiniz. MQL5 Sihirbazını ve bu makalede tartışılan bu basit yöntemi kullanarak, bunları test etmek ve denemek kolay olacaktır. Bu makale, Standart Kitaplığın Alım Satım Stratejisi Sınıflarını nasıl keşfedeceğinize ve kendi alım satım sistemlerinizi oluşturmak için kitaplıkları değiştirmenin ne kadar basit olduğuna ilişkin bir örnektir.


Sonuç

CCI Signal'e kolayca 2 yeni filtre/desen ekledik. Aynısını diğer tüm göstergeler için yapabilir ve kendi özelleştirilmiş sinyal grubunuzu oluşturabilirsiniz. Fazlasıyla yapılandırılmış ve üzerinde detaylı düşünülmüş bir çalışma yaparsanız, bu, alım satım için çok güçlü bir enstrüman haline gelebilir.

Bu, yalnızca göstergelerle çalışan stratejilerin özüne odaklanarak kendi stratejilerinizi eklemenin güçlü ve kullanışlı bir yoludur. MQL5 Sihirbazının EA'nın alım satım işlevleri ve işlemleriyle ilgili diğer tüm işleri yapmasına izin verin - Bu, hem zamandan tasarruf sağlar hem de Expert Advisor'ın doğruluğunun garantisidir.

MetaTrader 5 Standart Göstergelerini kullanarak ve bunları ATC hazır EA'ya uygulayarak kendi stratejilerinizi kolayca yazabilirsiniz.

MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal makale: https://www.mql5.com/en/articles/488

Ekli dosyalar |
myexpert.mq5 (8.57 KB)
signalccixx.mqh (21.02 KB)
İstatistiksel Carry Trade Stratejisi İstatistiksel Carry Trade Stratejisi
Açık pozitif swap pozisyonlarının istenmeyen fiyat hareketlerinden istatistiksel olarak korunması için bir algoritma. Bu makale, açık pozisyonunkinin tersi yöndeki fiyat hareketinin potansiyel riskini telafi etmeye olanak tanıyan, carry trade koruma stratejisinin bir türünü içermektedir.
MetaTrader Mobil Terminalinde MetaQuotes Kimliği MetaTrader Mobil Terminalinde MetaQuotes Kimliği
Android ve iOS destekli cihazlar bize bilmediğimiz birçok özellik sunuyor. Bu özelliklerden biri, telefon numaramız veya mobil şebeke operatörümüz ne olursa olsun kişisel mesajlar almamızı sağlayan push bildirimleridir. MetaTrader mobil terminali, bu tür mesajları doğrudan alım satım robotunuzdan alabilir. Cihazınızın yalnızca MetaQuotes Kimliğini bilmeniz gerekir. Buna, 9 000 000'in üzerinde mobil terminal halihazırda sahiptir.
Nöral Ağlar: Teoriden Pratiğe Nöral Ağlar: Teoriden Pratiğe
Günümüzde her yatırımcının, nöral ağlar hakkında bilgisi olması gerekir; bunları kullanmanın ne kadar havalı olduğunu bilirler. Çoğunluk, nöral ağlarla uğraşan kişilerin insanüstü olduklarına inanıyor. Bu makalede, sizlere nöral ağ mimarisini açıklamaya, uygulamalarını anlatmaya ve pratik kullanım örneklerini göstermeye çalışacağım.
Ampirik Mod Ayrıştırma Yöntemine Giriş Ampirik Mod Ayrıştırma Yöntemine Giriş
Bu makale, okuyucunun ampirik mod ayrıştırma (EMD) yöntemi konusunda bilgi sahibi olması için yazılmıştır. Bu, Hilbert-Huang dönüşümünün temel parçasıdır ve durağan olmayan ve doğrusal olmayan süreçlerden gelen verileri analiz etmek için tasarlanmıştır. Ayrıca, bu makale, bu yöntemin olası bir yazılım uygulamasını ve özelliklerinin kısa bir değerlendirmesini içerir ve kullanımına ilişkin bazı basit örnekler verir.