English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
Bir Göstergenin Diğerine Uygulanması

Bir Göstergenin Diğerine Uygulanması

MetaTrader 5Örnekler | 9 Aralık 2021, 10:13
86 0
MetaQuotes
MetaQuotes

Giriş

Başka bir göstergenin değerlerine uygulanan bir göstergeyi iyileştirme görevini ele alalım. Bu makalede, bir önceki makalede oluşturulan ve ele alınan Doğru Güç Endeksi (TSI) ile çalışmaya devam edeceğiz (önceki makale "MQL5: Kendi Göstergenizi Oluşturma").

Başka Göstergenin Değerlerine Dayalı Özel Gösterge

OnCalculate() fonksiyon çağrısının kısa biçimini kullanan bir gösterge yazarken, bir göstergenin yalnızca fiyat verileriyle değil, aynı zamanda başka bir göstergenin verileriyle de hesaplanabileceği gerçeğini gözden kaçırabilirsiniz.

Basit bir deney yapalım: Standart ayarlara sahip yerleşik RSI göstergesini bir grafiğe ekleyin ve True_Strength_Index_ver2.mq5 özel göstergesini RSI gösterge penceresine sürükleyin. Görüntülenen pencerenin Parametreler sekmesinde, göstergenin Önceki Gösterge'nin Verilerine (RSI(14)) uygulanması gerektiğini belirtin.

Sonuç beklediğimizden oldukça farklı olacak. TSI göstergesinin ek satırı, RSI gösterge penceresinde görünmedi; Veri Penceresinde değerlerinin de belirsiz olduğunu göreceksiniz.

RSI değerleri neredeyse tüm geçmiş boyunca tanımlanmış olmasına rağmen, TSI değerleri (RSI verilerine uygulanan) ya hiç yoktur (başlangıçta) ya da her zaman -100'e eşittir:

Böyle bir davranış, başlangıç parametresinin değerinin True_Strength_Index_ver2.mq5'in OnCalculate() fonksiyonu içinde hiçbir yerde kullanılmamasından kaynaklanır. Başlangıç parametresi, price[] girdi parametresindeki boş değerlerin sayısını belirtir. Bu boş değerler, gösterge değerlerinin hesaplanmasında kullanılamaz. OnCalculate() fonksiyon çağrısının ilk formunun tanımını hatırlayalım.
int OnCalculate (const int rates_total,      // price[] array length
                 const int prev_calculated,  // number of bars calculated after previous call
                 const int begin,            // start index of meaningful data
                 const double& price[]       // array for calculation
   );

Göstergeyi fiyat sabitlerinden birini belirten fiyat verilerine uygularken, her çubuk için belirlenmiş bir fiyat türü olduğundan, başlangıç parametresi 0'a eşittir. Bu nedenle,price[] girdi dizisi, ilk öğe olan price[0]'dan başlayarak her zaman doğru verilere sahip olur. Ancak hesaplamalar için kaynak olarak başka bir göstergenin verilerini belirtirsek, bu artık garanti edilemez.

OnCalculate() öğesinin başlangıç parametresi

Başka bir göstergenin verileri kullanılarak hesaplama yapılıp yapılmadığını görmek için price[] dizisindeki değerleri kontrol edelim. Bunu yapmak için, OnCalculate() fonksiyonunda kontrol etmek istediğimiz değerleri verecek bazı kodlar ekleyeceğiz. Şimdi OnCalculate() fonksiyonunun başlangıcı şöyle görünür:

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,    // price[] array length;
                 const int prev_calculated,// number of available bars after previous call;
                 const int begin,          // start index of meaningful data in price[] array 
                 const double &price[])    // data array, that will be used for calculations;
  {
//--- flag for single output of price[] values
   static bool printed=false;
//--- if begin isn't zero, then there are some values that we shouldn't take into account

   if(begin>0 && !printed)
     {
      //--- let's output them
      Print("Data for calculation begin from index equal to ",begin,
            "   price[] array length =",rates_total);

      //--- let's show the values that we shouldn't take into account for calculation
      for(int i=0;i<=begin;i++)
        {
         Print("i =",i,"  value =",price[i]);
        }
      //--- set printed flag to confirm that we have already logged the values
      printed=true;
     }

Bir kez daha göstergemizin değiştirilmiş versiyonunu RSI(14) penceresine sürükleyip bırakalım ve hesaplama için önceki göstergenin verilerini belirleyelim. Şimdi RSI(14) göstergesinin değerlerinin kullanıldığı noktalarda hesaplamalar için çizilmeyen ve dikkate alınmaması gereken değerleri göreceğiz.


Gösterge Arabelleklerinde ve DBL_MAX'te Boş Değerler

0'dan 13'e kadar olan indekslerle price[] dizisinin ilk 14 elemanı, 1.797693134862316e+308 değerine eşit olmak üzere aynı değere sahiptir. Yerleşik EMPTY_VALUE sabitinin sayısal değeri olduğundan, bu sayıyla çok sık karşılaşacaksınız; bu, gösterge arabelleğindeki boş değerleri belirtmek için kullanılır.

Boş değerleri sıfırlarla doldurmak evrensel bir çözüm değildir, çünkü bu değer diğer bazı göstergeler tarafından yapılan hesaplamanın sonucu olabilir. Bu nedenle, müşteri terminalinin tüm yerleşik göstergeleri, boş değerler için bu sayıyı döndürür. 1.797693134862316e+308 değeri, çift tipin olası maksimum değeri olduğundan ve MQL5'te DBL_MAX sabiti olarak sunduğu kolaylık için seçilmiştir.

Belirli bir çift tip sayının boş olup olmadığını kontrol etmek için onu EMPTY_VALUE veya DBL_MAX sabitleriyle karşılaştırabilirsiniz. Her iki değişken de eşittir, ancak netleştirmek adına kodunuzda EMPTY_VALUE sabitini kullanmak daha iyidir.

//+------------------------------------------------------------------+
//| returns true for "empty" values                               |
//+------------------------------------------------------------------+
bool isEmptyValue(double value_to_check)
  {
//--- if the value is equal DBL_MAX, it has an empty value
   if(value_to_check==EMPTY_VALUE) return(true);
//--- it isn't equal DBL_MAX
   return(false);
  }

DBL_MAX çok büyük bir sayıdır ve RSI göstergesi doğası gereği bu tür değerleri döndüremez! Dizinin (14 indeksli) yalnızca on beşinci öğesi 50'ye eşit makul bir değere sahiptir. Dolayısıyla, hesaplanacak bir veri kaynağı olarak gösterge hakkında hiçbir şey bilmesek bile, bu gibi durumlarda başlangıç parametresini kullanarak veri işlemeyi düzgün bir şekilde düzenleyebiliriz. Daha kesin konuşmak gerekirse, hesaplamalarımızda bu boş değerleri kullanmaktan kaçınmalıyız.

başlangıç Parametresi ile PLOT_DRAW_BEGIN Özelliği arasındaki ilişki

OnCalculate() fonksiyonuna aktarılan başlangıç parametresi ile çizim yapılmadan ilk çubuk sayısını tanımlayan PLOT_DRAW_BEGIN özelliği arasında yakın bir ilişki olduğuna dikkat edilmelidir. MetaTrader5 standart paketindeki RSI kaynak koduna bakarsak OnInit() fonksiyonunda aşağıdaki kodu görürüz:
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtPeriodRSI);

Yani, 0 indeksli grafiksel çizim, yalnızca indeksi ExtPeriodRSI'ye eşit olan çubuktan başlar (bu, RSI göstergesinin periyodunu belirten bir girdi değişkenidir) ve daha önceki çubukların çizimi söz konusu değildir.

MQL5 dilinde, gösterge B'nin verilerine dayalı olarak bir gösterge A'nın hesaplanması, her zaman gösterge B'nin sıfır arabellek değerleri üzerinde gerçekleştirilir. B göstergesinin sıfır arabellek değerleri, price[] girdi parametresi olarak A göstergesinin OnCalculate() fonksiyonuna aktarılır. Doğal olarak, sıfır arabellek, SetIndexBuffer() fonksiyonu ile sıfır grafik çizime atanır. Öyleyse:

PLOT_DRAW_BEGIN özelliğini başlangıç parametresine aktarma kuralı: Özel gösterge A'nın diğer (temel) gösterge B'nin verilerine dayalı hesaplamaları için, OnCalculate() fonksiyonundaki başlangıç girdi parametresinin değeri, her zaman temel göstergenin B sıfır grafik çiziminin PLOT_DRAW_BEGIN özelliğinin değerine eşittir.

Yani, 14. periyotta RSI göstergesi (gösterge B) oluşturduysak ve ardından bunun verilerine dayanarak Doğru Güç Endeksi özel göstergemizi (Gösterge A) oluşturduysak:

  • RSI (14) göstergesi, PlotIndexSetIntegerr(0,PLOT_DRAW_BEGIN,14) nedeniyle 14. çubuktan başlayarak çizilir;
  • OnCalculate() fonksiyonundaki price[] girdi dizisi, RSI göstergesinin sıfır arabelleğinin değerlerini içerir;
  • TSI göstergesinin OnCalculate() fonksiyonundaki başlangıç girdi parametresinin değeri, RSI göstergesinin sıfır grafik çiziminin PLOT_DRAW_BEGIN özelliğinden elde edilir.

Bazı ilk çubuklar için gösterge değeri belirlenmediği için TSI göstergesinin grafiğin başından çizilmediğini göz önünde bulundurun. TSI göstergesinde satır olarak çizilecek olan ilk çubuk indeksi, r+s-1'e eşittir; burada:

  • r - MTMBuffer[] ve AbsMTMBuffer[] dizilerinin karşılık gelen EMA_MTMBuffer[] ve EMA_AbsMTMBuffer[] dizilerine ilk üstel düzeltme periyodu;
  • s - EMA_MTMBuffer[] ve EMA_AbsMTMBuffer[] dizilerinin sonraki düzeltme periyodu.

İndeksleri r+s-1'den küçük olan çubuklar için TSI göstergesini çizecek değer yoktur. Bu nedenle, TSI göstergesini hesaplamak için kullanılan nihai MA2_MTMBuffer[] ve EMA2_AbsMTMBuffer[] dizileri için veriler ek ofsete sahip olur ve r+s-1 indeksinden başlar. Daha fazla bilgi için "MQL5: Kendi Göstergenizi Oluşturma" makalesine göz atın.

OnInit() fonksiyonunda, ilk r+s-1 çubuklarının çizimini devre dışı bırakmaya yönelik bir ifade vardır:

//--- first bar to draw
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,r+s-1);

Girdi verilerinin başlangıcı, başlangıç çubukları ile ileriye kaydırıldığı için, bunu dikkate almalı ve OnCalculate() fonksiyonunda veri çiziminin başlangıç konumunu başlangıç çubuklarıyla artırmalıyız:

   if(prev_calculated==0)
     { 
      //--- let's increase beginning position of data by begin bars,
      //--- because we use other indicator's data for calculation
      if(begin>0)PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin+r+s-1);
     }
Şimdi TSE göstergesinin değerlerini hesaplamak için başlangıç parametresini dikkate alıyoruz. Ayrıca başka bir gösterge, hesaplama için TSI değerlerini kullanacaksa, başlangıç parametresi düzgün bir şekilde aktarılacaktır: beginother_indicator=beginour_indicator+r+s-1. Bu nedenle, bir göstergeyi diğer göstergenin değerlerine empoze etme kuralını formülleştirebiliriz:

Gösterge empoze etme kuralı: Na konumundan başlayarak özel bir gösterge A çizilirse (ilk Na değerleri çizilmez) ve Nb konumundan çizilen diğer B göstergesinin verilerine dayandırılırsa,ortaya çıkan gösterge A{B}, Nab=Na+Nb konumundan başlayarak çizilecektir; burada A{B}, gösterge A'nın, gösterge B'nin sıfır arabellek değerleri üzerinde hesaplandığı anlamına gelir.

Dolayısıyla TSI (25,13) {RSI (14)}, TSI (25,13) göstergesinin RSI (14) göstergesinin değerlerinden oluştuğu anlamına gelir. Empoze etme sonucunda artık verinin başlangıcı (25+13-1)+14=51'dir. Diğer bir deyişle, göstergenin çizimi 52. çubuktan başlayacaktır (çubuk indisleme 0 ile başlar).

Gösterge Hesaplamalarında Kullanılmak Üzere Başlangıç Değerlerinin Eklenmesi

Şimdi tam olarak biliyoruz ki, price[] dizisinin anlamlı değerleri her zaman başlangıç parametresi ile belirtilen pozisyondan başlar. Adım adım kodumuzu değiştirelim. Önce MTMBuffer[] ve AbsMTMBuffer[] dizi değerlerini hesaplayan kod gelir. Başlangıç parametresi olmayınca, dizi doldurma indeks 1 ile başladı.

//--- calculate values for mtm and |mtm|
   int start;
   if(prev_calculated==0) start=1;  // start filling MTMBuffer[] and AbsMTMBuffer[] arrays from 1st index 
   else start=prev_calculated-1;    // set start equal to last array index
   for(int i=start;i<rates_total;i++)
     {
      MTMBuffer[i]=price[i]-price[i-1];
      AbsMTMBuffer[i]=fabs(MTMBuffer[i]);
     }

Şimdi (begin+1) konumundan başlayacağız ve değiştirilen kod aşağıdaki gibi görünecek (kod değişiklikleri kalın harflerle gösterilmiştir):

//--- calculate values for mtm and |mtm|
   int start;
   if(prev_calculated==0) start=begin+1;  // start filling MTMBuffer[] and AbsMTMBuffer[] arrays from begin+1 index 
   else start=prev_calculated-1;           // set start equal to the last array index
   for(int i=start;i<rates_total;i++)
     {
      MTMBuffer[i]=price[i]-price[i-1];
      AbsMTMBuffer[i]=fabs(MTMBuffer[i]);
     }

price[0] ile price[begin-1] arasındaki değerler, hesaplamalar için kullanılamayacağından, price[begin]'den başlıyoruz. MTMBuffer[] ve AbsMTMBuffer[] dizileri için hesaplanan ilk değerler aşağıdaki gibi görünecektir:

      MTMBuffer[begin+1]=price[begin+1]-price[begin];
      AbsMTMBuffer[begin+1]=fabs(MTMBuffer[begin+1]);

Bu nedenle for döngüsündeki start değişkeni artık 1 yerine start=begin+1 ilk değerine sahiptir.

Bağımlı Diziler için başlangıç hesabı

Şimdi MTMBuffer[] ve AbsMTMBuffer[] dizilerinin üstel düzeltmesi geliyor. Kural da basittir: Eğer temel dizinin başlangıç konumu başlangıç çubukları ile artırılmış ise, tüm bağımlı diziler için başlangıç konumu da başlangıç çubukları ile artırılmalıdır.

//--- calculating the first moving average on arrays
   ExponentialMAOnBuffer(rates_total,prev_calculated,
                         1,               // index of the starting element in array 
                         r,               // period of exponential average
                         MTMBuffer,       // source buffer for average
                         EMA_MTMBuffer);  // target buffer
   ExponentialMAOnBuffer(rates_total,prev_calculated,
                         1,r,AbsMTMBuffer,EMA_AbsMTMBuffer);

Burada, MTMBuffer [] ve AbsMTMBuffer [], temel dizilerdir ve bu dizilerdeki hesaplanan değerler artık, başlangıçtan daha büyük olan indeksten başlamaktadır. Bu yüzden, sadece bu ofseti ExponentialMAOnBuffer() fonksiyonuna ekleyeceğiz.

Şimdi, bu blok şöyle görünüyor:

//--- calculating the first moving average on arrays
   ExponentialMAOnBuffer(rates_total,prev_calculated,
                         begin+1,        // index of the starting element in array 
                         r,               // period for exponential average
                         MTMBuffer,       // source buffer for average
                         EMA_MTMBuffer);  // target buffer
   ExponentialMAOnBuffer(rates_total,prev_calculated,
                         begin+1,r,AbsMTMBuffer,EMA_AbsMTMBuffer);

Gördüğünüz gibi, tüm değişikliğin amacı başlangıç parametresi tarafından tanımlanan başlangıç veri konumunun artışını barındırmaktı. Karmaşık bir şey yok. Aynı şekilde ikinci düzeltme bloğunu da değiştireceğiz.

Önce:

//--- calculating the second moving average on arrays
   ExponentialMAOnBuffer(rates_total,prev_calculated,
                         r,s,EMA_MTMBuffer,EMA2_MTMBuffer);
   ExponentialMAOnBuffer(rates_total,prev_calculated,
                         r,s,EMA_AbsMTMBuffer,EMA2_AbsMTMBuffer);

Sonra:

//--- calculating the second moving average on arrays
   ExponentialMAOnBuffer(rates_total,prev_calculated,
                         begin+r,s,EMA_MTMBuffer,EMA2_MTMBuffer);
   ExponentialMAOnBuffer(rates_total,prev_calculated,
                         begin+r,s,EMA_AbsMTMBuffer,EMA2_AbsMTMBuffer);

Aynı şekilde son hesaplama bloğunu da değiştireceğiz.

Önce:

//--- calculating values of our indicator
   if(prev_calculated==0) start=r+s-1; // set initial index for input arrays
   else start=prev_calculated-1;       // set start equal to last array index
   for(int i=start;i<rates_total;i++)
     {
      TSIBuffer[i]=100*EMA2_MTMBuffer[i]/EMA2_AbsMTMBuffer[i];
     }

Sonra:

//--- calculating values of our indicator
   if(prev_calculated==0) start=begin+r+s-1; // set initial index for input arrays
   else start=prev_calculated-1;              // set start equal to last array index
   for(int i=start;i<rates_total;i++)
     {
      TSIBuffer[i]=100*EMA2_MTMBuffer[i]/EMA2_AbsMTMBuffer[i];
     }

Göstergenin ayarlanması sona erdi; o da şimdi OnCalculate() içindeki price[] girdi dizisinin ilk başlangıç boş değerlerini atlayacak ve bu çıkarmanın neden olduğu ofseti hesaba katacaktır. Ancak diğer bazı göstergelerin hesaplamalar için TSI değerlerini kullanabileceğini unutmamalıyız. Bu nedenle göstergemizin boş değerlerini EMPTY_VALUE olarak ayarlayacağız.

Gösterge Arabelleklerinin Başlatılması Gerekli mi?

MQL5'te diziler, varsayılan olarak bazı tanımlanmış değerlerle başlatılmaz. Aynısı, SetIndexBuffer() fonksiyonu tarafından gösterge arabelleklerine belirtilen dizilere uygulanır. Bir dizi bir gösterge arabelleğiyse, boyutu OnCalculate() fonksiyonundaki rates_total parametresinin değerine bağlı olacaktır;

ArrayInitialize() fonksiyonunu kullanarak tüm gösterge arabelleklerini örneğin, OnCalculate()'in başlangıcında bir kerede olmak üzere EMPTY_VALUE değerleriyle başlatmak isteyebilirsiniz:

//--- if it is the first call of OnCalculate() 
   if(prev_calculated==0)
     {
      ArrayInitialize(TSIBuffer,EMPTY_VALUE);
     }

Ancak bu, aşağıdaki nedenden dolayı önerilmez: Müşteri terminali çalışırken, verileri gösterge hesabında kullanılan sembol için yeni teklifler alınır. Bir süre sonra çubuk sayısı artacaktır, bu nedenle müşteri terminali gösterge arabellekleri için ek bellek ayıracaktır.

Ancak yeni ("ekli") dizi öğelerinin değerleri herhangi bir değer olabilir, çünkü herhangi bir dizi için belleğin yeniden tahsisi sırasında başlatma işlemi gerçekleştirilmez. İlk başlatma, açıkça tanımlanmamış tüm dizi öğelerinin başlatma sırasında belirtilen değerlerle doldurulacağına dair yanlış bir kesinlik verebilir. Tabii ki bu doğru değil; hiçbir zaman değişkenin sayısal değerinin veya bazı dizi öğelerinin bizim için gerekli olan değerle başlatılacağını düşünmeyin.

Gösterge arabelleğinin her bir öğesi için değer ayarlamalısınız. Bazı çubukların değerleri gösterge algoritması tarafından tanımlanmamışsa, bunları açıkça boş değerlerle ayarlamalısınız. Örneğin, gösterge arabelleğinin bir değeri bölme işlemiyle hesaplanırsa, bazı durumlarda bölen sıfır olabilir.

Sıfıra bölmenin MQL5'te kritik bir çalışma zamanı hatası olduğunu ve bir mql5 programının derhal sonlandırılmasına yol açtığını biliyoruz. Sıfıra bölmekten kaçınmak üzere bu özel durumu kodda işlemek yerine, bu arabellek öğesi için değer ayarlamamız gerekir. Belki de bu çizim stili için boş olarak atadığımız değeri kullanmak daha iyi olacaktır.

Örneğin, bazı çizim stilleri için PlotIndexSetDouble() fonksiyonunu kullanarak sıfırı boş değer olarak tanımladık:

   PlotIndexSetDouble(plotting_style_index,PLOT_EMPTY_VALUE,0);   

Ardından, bu çizimdeki gösterge arabelleğinin tüm boş değerleri için sıfır değerini açıkça tanımlamanız gerekir:

   if(divider==0)
      IndicatorBuffer[i]=0;
   else
      IndicatorBuffer[i]=... 

Ayrıca, bazı çizimler için DRAW_BEGIN belirtilmişse, 0'dan DRAW_BEGIN'e kadar indeksli gösterge arabelleğinin tüm öğeleri otomatik olarak sıfırlarla doldurulacaktır.

Sonuç

O halde kısa bir özet geçelim. Göstergenin başka bir göstergenin verilerine göre doğru hesaplanabilmesi için gerekli bazı koşullar vardır (ve diğer mql5 programlarında kullanıma uygun hale getirilmesi için):

  1. Yerleşik göstergelerdeki boş değerler çift tip (DBL_MAX) için maksimum değere tam olarak eşit olan EMPTY_VALUE sabitinin değerleriyle doldurulur.
  2. Bir göstergenin anlamlı değerlerinin start indeksi hakkında ayrıntılar için, OnCalculate()'in kısa formunun başlangıç girdi parametresini analiz etmelisiniz.
  3. Belirtilen çizim stili için ilk N değerlerinin çizilmesini engellemek üzere aşağıdaki kodu kullanarak DRAW_BEGIN parametresini ayarlayın:
    PlotIndexSetInteger(plotting_style_index,PLOT_DRAW_BEGIN,N);
  4. Eğer DRAW_BEGIN bazı çizimler için belirtilmişse, 0'dan DRAW_BEGIN'e kadar indeksli tüm gösterge arabellek öğeleri otomatik olarak boş değerlerle doldurulacaktır (varsayılanı EMPTY_VALUE'dur).
  5. OnCalculate() fonksiyonunda, kendi göstergenizde diğer gösterge verilerinin doğru şekilde kullanılması için başlangıç çubuklarıyla ek bir ofset ekleyin:
    //--- if it's the first call 
       if(prev_calculated==0)
         { 
          //--- increase position of data beginning by begin bars, 
          //--- because of other indicator's data use      
          if(begin>0)PlotIndexSetInteger(plotting_style_index,PLOT_DRAW_BEGIN,begin+N);
         }
    
  6. Aşağıdaki kodu kullanarak OnInit() fonksiyonunda EMPTY_VALUE değerinden farklı olarak kendi boş değerinizi belirtebilirsiniz:
    PlotIndexSetDouble(plotting_style_index,PLOT_EMPTY_VALUE,your_empty_value);
  7. Aşağıdaki kodu kullanarak, gösterge arabelleklerinin sadece bir kere başlatılması ile yetinmeyin:
    ArrayInitialize(buffer_number,value);
        
    OnCalculate() fonksiyonu için gösterge arabelleğinin tüm değerlerini açık ve tutarlı bir şekilde ayarlamalısınız, buna boş değerler de dahildir.

Elbette, gelecekte, gösterge yazma konusunda biraz tecrübeniz edindiğinizde, bu makalenin kapsamı dışında kalan bazı durumlarla karşılaşacaksınız, ancak umarım o zamanki MQL5 bilginiz bunları çözmenizi sağlayacaktır.

MetaQuotes Software Corp. tarafından Rusçadan çevrilmiştir.

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

Ekli dosyalar |
Uzman Danışmanlarda Sınırlamalar ve Doğrulamalar Uzman Danışmanlarda Sınırlamalar ve Doğrulamalar
Pazartesi günü bu sembolün alım satımına izin verilir mi? Pozisyon açmak için yeterli para var mı? Zararı Durdur tetiklenirse kayıp ne kadar büyük olur? Bekleyen emirlerin sayısı nasıl sınırlandırılır? Alım satım işlemi mevcut çubukta mı yoksa önceki çubukta mı gerçekleştirildi? Bir alım satım robotu bu tür doğrulamaları gerçekleştiremezse, herhangi bir alım satım stratejisi kaybeden bir stratejiye dönüşebilir. Bu makale, herhangi bir Uzman Danışmanda yararlı olan doğrulama örneklerini gösterir.
MQL5: Kendi Göstergenizi Oluşturma MQL5: Kendi Göstergenizi Oluşturma
Bir gösterge nedir? Ekranda uygun bir şekilde görüntülenmesini istediğimiz bir dizi hesaplanmış değerdir. Değer setleri programlarda bir dizi olarak gösterilir. Böylelikle, bir göstergenin oluşturulması, bazı dizileri (fiyat dizileri) idare eden ve diğer dizilere (gösterge değerleri) devretmenin sonuçlarını kaydeden bir algoritmanın yazılması anlamına gelir. Yazar, Doğru Güç Endeksinin oluşturulmasını açıklarken MQL5’te göstergelerin nasıl yazılacağını gösterir.
MQL5'te Nesne Yaratma ve Yok Etme MQL5'te Nesne Yaratma ve Yok Etme
İster özel bir nesne, ister dinamik bir dizi veya bir nesne dizisi olsun, her nesne MQL5 programında kendine özgü şekilde oluşturulur ve silinir. Çoğu zaman, bazı nesneler diğer nesnelerin bir parçasıdır ve sonlandırma sırasında nesne silme sırası özellikle önemli hale gelir. Bu makale, nesnelerle çalışma mekanizmalarını kapsayan bazı örnekler sunmaktadır.
Yeni Raylara Adım Atın: MQL5'te Özel Göstergeler Yeni Raylara Adım Atın: MQL5'te Özel Göstergeler
Yeni terminalin ve dilin tüm yeni olanaklarını ve özelliklerini listelemeyeceğim. Bunlar sayısızdır ve bazı yenilikler ayrı bir makalede tartışılmaya değerdir. Ayrıca burada nesne yönelimli programlama ile yazılmış bir kod yoktur, geliştiriciler için ek avantajlar olarak bir bağlamda basitçe bahsedilemeyecek kadar ciddi bir konudur. Bu makalede, MQL4'e kıyasla göstergeleri, yapılarını, çizimlerini, türlerini ve programlama ayrıntılarını ele alacağız. Umarım bu makale hem yeni başlayanlar hem de deneyimli geliştiriciler için faydalı olacaktır, belki bazıları yeni bir şeyler bulacaktır.