English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
Yeni Başlayanlar için MQL5'te Özel Göstergeler

Yeni Başlayanlar için MQL5'te Özel Göstergeler

MetaTrader 5Örnekler | 9 Aralık 2021, 10:39
264 0
Nikolay Kositsin
Nikolay Kositsin

Giriş

Herhangi bir entelektüel konuyu (matematik, müzik veya programlama fark etmeksizin) derinlemesine anlamanın temeli, bunların temellerinin incelenmesidir. Oldukça genç bir yaşta benzer bir çalışmanın başlatılması harikadır, bu nedenle temelleri anlamak çok daha kolaydır ve bilgi spesifik ve kapsamlıdır.

Ne yazık ki, çoğu insan finans ve hisse senedi piyasalarını orta yaşta incelemeye başlar, bu nedenle çalışma kolay değildir. Bu makalede, MQL5'i anlamada ve MetaTrader 5 istemci terminali için özel göstergeler yazmada bu ilk engeli aşmaya yardımcı olmaya çalışacağım.

Basit Bir Örnek Olarak SMA Göstergesi

Bir şeyi incelemenin en etkili ve rasyonel yolu, pratik problemlerin çözümüdür. Özel göstergeleri ele alırken, MQL5'te göstergenin işleyişinin temellerini gösteren bir kod içeren basit göstergenin incelenmesiyle başlayacağız.

Örnek olarak, teknik analizin en ünlü göstergesi olan Basit Hareketli Ortalamayı (SMA) ele alalım. Hesaplaması basittir:

SMA = SUM (CLOSE (i), MAPeriod) / MAPeriod

burada:

  • SUM — değerlerin toplamı;
  • CLOSE (i) — i. çubuğun kapanış fiyatı;
  • MAPeriod — ortalamaya ulaşılacak çubuk sayısı (ortalama periyot).

Bu göstergenin herhangi bir fazlalıktan arınmış bir kodu aşağıdadır:

//+------------------------------------------------------------------+
//|                                                          SMA.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
  
input int MAPeriod = 13;
input int MAShift = 0; 
  
double ExtLineBuffer[]; 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+  
void OnInit()
  {
   SetIndexBuffer(0, ExtLineBuffer, INDICATOR_DATA);
   PlotIndexSetInteger(0, PLOT_SHIFT, MAShift);
   PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, MAPeriod - 1);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
  {
   if (rates_total < MAPeriod - 1)
    return(0);
    
   int first, bar, iii;
   double Sum, SMA;
   
   if (prev_calculated == 0)
    first = MAPeriod - 1 + begin;
   else first = prev_calculated - 1;

   for(bar = first; bar < rates_total; bar++)
    {
     Sum = 0.0;
     for(iii = 0; iii < MAPeriod; iii++)
      Sum += price[bar - iii];
     
     SMA = Sum / MAPeriod;
      
     ExtLineBuffer[bar] = SMA;
    }
     
   return(rates_total);
  }
//+------------------------------------------------------------------+

MetaTrader 5 istemci terminalindeki çalışmasının bir sonucu aşağıdadır:

İlk önce iki şeyi dikkate almalıyız - bir yanda kodun her bir dizisinin amacı ve diğer yanda bu program kodu ile istemci terminali arasındaki etkileşim.

Yorumları Kullanma

Gösterge koduna ilk bakışta, göz aşağıdaki gibi nesneleri yakalar:

//+------------------------------------------------------------------+
//|                                                          SMA.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+

Doğrudan kodla ilgili olmadıklarını, sadece yorum olduklarını, kod okunabilirliği için tasarlandıklarını ve bu kodun bazı kısımlarının belirli bir anlamsal içeriğini gösterdiğini belirtmek gerekir. Tabii ki, daha fazla basitleştirme için herhangi bir zarar görmeden koddan çıkarılabilirler, ancak bu durumda kod, anlamadaki özlü ve kısa oluşunu kaybeder. Bizim durumumuzda, her zaman bir çift "//" karakteriyle başlayan ve yeni satır başı karakteri ile biten tek satır yorumlarla ilgileniyoruz.

Yorumlarda yazarın bir süre sonra bu kodu anlamaya yardımcı olacak gerekli her şeyi yazabileceği açıktır. Bizim durumumuzda, yorumlanan dizelerin birinci kısmında, göstergenin adı ve yazarı hakkında bilgi var, yorumların ikinci ve üçüncü kısımları OnInit() ve OnCalculate() fonksiyonlarını ayırır. Sondaki son satır sadece program kodunu kapatır.

SMA Kodunun Yapısı

Gördüğümüz gibi, göstergemizin tüm kodu 3 kısma ayrılabilir:

1. Global seviyede parantez olmadan yazılan kod, ilk iki yorum arasında yer alır.
2. OnInit() fonksiyonunun açıklaması.

3. OnCalculate() fonksiyonunun açıklaması.

Programlamada fonksiyonun anlamının matematikten çok daha geniş olduğunu belirtmek gerekir. Örneğin, programlama dillerinde matematiksel fonksiyonlar her zaman bazı giriş parametreleri alır ve hesaplanan değerleri verir, ek olarak, MQL5'teki fonksiyonlar ayrıca bazı grafik işlemlerini, alım satım işlemlerini, dosya işlemlerini vb. gerçekleştirebilir.

Aslında, MQL5'te yazılan herhangi bir gösterge, her zaman, içeriği bireysel olan ve oluşturulan bir göstergenin özelliklerine bağlı olan, kullanıcı tarafından yazılan minimal bir parça setine sahiptir.

Bu bileşenlerin yanı sıra, minimal fonksiyon seti, başka bir MQL5 fonksiyonunun tanımını içerebilir - OnDeInit():

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+  
void OnDeinit(const int reason)
  {

  }

Bizim durumumuzda bu gerekli değil, bu yüzden burada yoktur.

SMA ve MetaTrader İstemci Terminali Arasındaki Etkileşim

Şimdi SMA.mq5 açıkken MetaEditor'da "Derle" tuşuna bastıktan sonra elde ettiğimiz SMA.ex5 derlenmiş dosya çalışmasını ele alalım. .mq5 uzantılı metin dosyalarının yalnızca metin biçimindeki bir kaynak kodu olduğunu, istemci terminalinde kullanılmak üzere ilk önce derlenmesi gerektiğini belirtmek gerekir.

Bu göstergeyi Gezgin penceresinden bir grafiğe ekledikten sonra MetaTrader, göstergenin ilk kısmının kodunu yürütecektir. Bundan sonra, bu fonksiyonun tek bir uygulaması için OnInit() fonksiyonunu çağıracak ve dahası, her yeni tikte (yeni fiyat teklifinin gelmesinden sonra) OnCalculate() fonksiyonunu çağıracak ve sonuç olarak bu fonksiyonun kodunu çalıştıracaktır.  Göstergede OnDeInit() varsa, MetaTrader göstergeyi grafikten ayırdıktan veya zaman dilimi değiştikten sonra bu fonksiyonu çağırır.

Bu açıklamadan sonra göstergenin tüm kısımlarının anlamı ve amacı açıktır. Kodun global seviyedeki ilk kısmında, göstergenin başlangıcından sonra bir kez yürütülen bazı basit operatörler vardır. Ayrıca, göstergenin tüm bloklarında "görünür" olan ve gösterge grafikteyken değerlerini hatırlatan bir değişken bildirimi vardır.

Bir kez yürütülen sabitler ve fonksiyonlar OnInit() fonksiyonunun içinde yer almalıdır, çünkü bunları OnCalculate() fonksiyonunun bloğuna yerleştirmek uygun olmayacaktır. Her bir çubuk için değerlerinin hesaplanmasını sağlayan gösterge hesaplama kodu OnCalculate() fonksiyonuna yerleştirilmelidir.

Gösterge kaldırıldıktan sonra gereksiz çöpleri (varsa) grafikten silen prosedürler OnDeInit() içerisine yerleştirilmelidir. Örneğin, gösterge tarafından oluşturulan grafik nesnelerinin silinmesi için gereklidir.

Bu açıklamalardan sonra yukarıda ele aldığımız gösterge kodunu detaylı olarak incelemeye hazırız.

SMA Göstergesinin Program Kodu

Birinci kod satırı grubu, gösterge ayarlarının ek parametrelerinin belirlenmesine izin veren #property operatörü ile başlar. Olası program özelliklerinin tam listesi MQL5 belgelerinde bulunabilir. Gerekirse, göstergenin ek özelliklerini yazmak mümkündür. Bizim durumumuzda kodun 5 satırı var, her satırın amacı yorumlarda açıklanıyor:

//---- the indicator will be plotted in the main window
#property indicator_chart_window
//---- one buffer will be used for the calculations and plot of the indicator
#property indicator_buffers 1
//---- only one graphic plot is used 
#property indicator_plots   1
//---- the indicator should be plotted as a line
#property indicator_type1   DRAW_LINE
//---- the color of the indicator's line is red 
#property indicator_color1  Red 

Satırların sonunda noktalı virgül (";") olmadığına dikkat edin. Nedeni şudur: aslında bizim durumumuzda bu sabitlerin tanımıdır, ancak başka bir şekilde sunulmuştur.

Basit hareketli ortalamamız, bir kullanıcı tarafından değiştirilebilen yalnızca 2 parametreye sahiptir - bu, bir ortalama periyodu ve göstergenin zaman eksenleri boyunca yatay kaymasıdır (çubuk cinsinde). Bu iki parametre, diğer iki kod satırında bildirildiği için, göstergenin giriş değişkenleri olarak bildirilmelidir:

//---- indicator input parameters
input int MAPeriod = 13; //averaging period
nput int MAShift = 0; //horizontal shift (in bars)

Bu giriş parametrelerinin bildirilmesinden sonra yorumların olduğunu ve bu yorumların göstergenin "Özellikler" penceresinde giriş parametrelerinin adları olarak görüneceğini unutmayın:


Bizim durumumuzda, bu adlar göstergenin değişken adlarından çok daha açıktır. Bu nedenle, bu yorumlar basit olmalıdır.

Ve parantez içermeyen son kod satırı, ExtLineBuffer[] dinamik dizisinin bildirimidir.

//---- the declaration of the dynamic array
//that will be used further as an indicator's buffer
double ExtLineBuffer[];  

Birkaç nedenden dolayı bir global değişken olarak bildirilmiştir.

Her şeyden önce, bu dizi gösterge tamponuna dönüştürülmelidir, bu, OnInit() fonksiyonunun bloğunda uygulanır. İkinci olarak, gösterge tamponunun kendisi OnCalculate() fonksiyonu içinde kullanılacaktır. Üçüncü olarak, bu dizi, grafikte bir eğri olarak çizilecek olan göstergenin değerlerini depolayacaktır. Global bir değişken olarak bildirilmiş olması nedeniyle, göstergenin tüm blokları için mevcuttur ve gösterge grafikten ayrılana kadar değerlerini her zaman depolar.

OnInit() fonksiyonunun içeriği yalnızca 3 operatör tarafından sunulur, bunlar MetaTrader istemci terminalinin yerleşik fonksiyonlarıdır.

Birinci fonksiyonun çağrısı, bir boyutlu ExtLineBuffer[] dinamik dizisi ile sıfırıncı gösterge tamponunu atar. Farklı giriş parametreleri değerlerine sahip başka bir fonksiyonun iki çağrısı, göstergenin fiyat ekseni boyunca kaydırılmasına ve MAPeriod numaralı çubuktan çizilmesinin belirtilmesine izin verir.

void OnInit()
  {
//----+
//---- assign the dynamic array ExtLineBuffer with 0th indicator's buffer
   SetIndexBuffer(0,ExtLineBuffer,INDICATOR_DATA);
//---- set plot shift along the horizontal axis by MAShift bars
   PlotIndexSetInteger(0,PLOT_SHIFT,MAShift);
//---- set plot begin from the bar with number MAPeriod
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,MAPeriod);
//----+
  }

PlotIndexSetInteger() fonksiyonunun son çağrısı, göstergemizin değerlerine uygulanıyorsa, MAPeriod'a eşit değeri (OnCalculate() fonksiyonunun başlangıç parametresi aracılığıyla) başka bir göstergeye geçirir. Mantık basittir, birinci MaPeriod-1 çubuklarında ortalama bir şey yoktur, bu nedenle bu göstergenin çizilmesi işe yaramaz. Ancak, başka bir göstergenin hesaplamalarının kökenini kaydırmak için bu değer geçirilmelidir.

Özel göstergelerde kullanılan ve göstergenin bu bloğunda bulunabilen yerleşik fonksiyonların tam listesi değildir. Ayrıntılar için MQL5 belgelerine bakın.

Son olarak, OnCalculate() fonksiyonunun kodunu ele alalım. Bu fonksiyonda OnInit() fonksiyonu gibi herhangi bir özel çağrı yoktur, çünkü bu fonksiyonlar MetaTrader istemci terminali tarafından çağrılır. Bu nedenle, fonksiyonun giriş parametreleri sabitler olarak bildirilir.

int OnCalculate(
                const int rates_total,    // number of available bars in history at the current tick
                const int prev_calculated,// number of bars, calculated at previous tick
                const int begin,          // index of the first bar
                const double &price[]     // price array for the calculation
                )

Bu giriş parametreleri değiştirilemez, değerleri bu fonksiyonun kodunda daha sonra kullanılmak üzere istemci terminali tarafından iletilir. OnCalculate fonksiyonunun giriş değişkenleri MQL5'in belgelerinde açıklanmıştır. OnCalculate() fonksiyonu, return(rates_total) fonksiyonunu kullanarak istemci terminali için değerlerini verir. İstemci terminali, OnCalculate() yürütüldükten sonra mevcut tikin bu değerini alır ve verilen değeri başka bir prev_calculated parametresine iletir. Bu nedenle, çubuk dizinlerinin aralığını belirlemek ve hesaplamaları bir kerede yalnızca göstergenin bir önceki tikten sonra görünen yeni değerleri için yapmak her zaman mümkündür.

MetaTrader istemci terminalinde çubukların sıralanması soldan sağa doğru gerçekleştirildiğine dikkat etmek gerekir, bu nedenle grafikte sunulan çok eski çubuk (sol), 0 indeksine, sonrakinin 1 indeksine vb. sahiptir. ExtLineBuffer[] tamponunun öğeleri aynı sıraya sahiptir.

Göstergemizin OnCalculate fonksiyonu içerisindeki basit kod yapısı evrenseldir ve birçok teknik analiz göstergesi için tipiktir. O halde, bunu ayrıntılı ele alalım. OnCalcualte() fonksiyonunun mantığı şudur:

1. Hesaplamalar için gerekli olan çubukların varlığını kontrol edin.
2. Yerel değişkenlerin bildirilmesi.
3. Hesaplama için başlangıç çubuğunun dizinini alın.
4. Göstergenin hesaplanmasının ana döngüsü
5. return() operatörünü kullanarak, rates_total değerini istemci terminaline döndürün.

Birinci terimin açık olduğunu düşünüyorum. Örneğin, Hareketli Ortalamanın ortalama periyodu 200'e eşitse, ancak istemci terminalinde yalnızca 100 çubuk varsa, hesaplama için yeterli çubuk olmadığından hesaplama yapılması gerekmez. Bu yüzden, operatör dönüşünü kullanarak istemci terminaline 0 döndürmeliyiz.

//---- check for the presence of bars, sufficient for the calculation
   if(rates_total<MAPeriod-1+begin)
      return(0);

Göstergemiz, hesaplama için minimum sayıda çubuğa da sahip olabilen başka bir göstergenin verilerine uygulanabilir.  Sabit başlangıcının kullanımında bu olgu dikkate alınmalıdır. Ayrıntılar için Bir Göstergeyi Diğerine Uygulama makalesine bakın.

Bu blokta bildirilen yerel değişkenler, yalnızca OnCalculate() fonksiyonu içindeki ara hesaplamalar için gereklidir. Bu değişkenler, fonksiyonun çağrısından sonra bilgisayar RAM'inden serbest bırakılır.

//---- declaration of local variables 
   int first,bar,iii;
   double Sum,SMA;

Ana döngünün başlangıç dizinine (birinci değişken) dikkat etmek gerekir. Fonksiyonun ilk çağrısında (bunu prev_calculated parametresinin değerine göre belirleyebiliriz) tüm çubuklar için gösterge değerlerinin hesaplanmasını yapmamız gerekir. İstemci terminalinin diğer tüm tikleri için, yalnızca görünen yeni çubuklar için hesaplama yapmamız gerekir. Bu, 3 kod satırı ile yapılır:

//---- calculation of starting index first of the main loop
   if(prev_calculated==0) // check for the first start of the indicator
      first=MAPeriod-1+begin; // start index for all the bars
   else first=prev_calculated-1; // start index for the new bars

Gösterge yeniden hesaplamasının ana döngü operatöründeki değişken değişikliklerinin aralığı zaten açıklanmıştır.

//---- main loop of the calculation
   for(bar=first;bar<rates_total;bar++)

Ana döngüdeki çubuk işleme, doğal ve doğru bir şekilde, artan sırada (bar++), yani soldan sağa doğru gerçekleştirilir. Göstergemizde, bu başka bir şekilde uygulanabilir (ters sırada). Göstergelerde artan sırayı kullanmak daha iyidir. Ana döngünün değişkeni "bar" olarak adlandırılır, ancak birçok programcı "i" adını kullanmayı tercih eder. Kodu daha net ve okunabilir hale getirdiği için "bar" kullanmayı tercih ederim.

Ana döngüde uygulanan ortalama algoritması basittir.

     {
      Sum=0.0;
       //---- summation loop for the current bar averaging
      for(iii=0;iii<MAPeriod;iii++)
         Sum+=price[bar-iii]; // Sum = Sum + price[bar - iii]; // eqaual to 
      
      //---- calculate averaged value
      SMA=Sum/MAPeriod;

      //---- set the element of the indicator buffer with the value of SMA we have calculated
      ExtLineBuffer[bar]=SMA;
     }

İkinci döngüde, periyodun önceki çubuklarından fiyatların kümülatif toplamını alıyoruz ve bunu ortalama süreye bölüyoruz. Sonuç olarak, SMA'nın nihai değerine sahibiz.

Ana döngü tamamlandıktan sonra OnCalculate fonksiyonu, rates_total değişkeninden kullanılabilir çubukların sayısını verir. OnCalculate() fonksiyonunun sonraki çağrısında, bu değer istemci terminali tarafından prev_calculated değişkenine iletilecektir. 1 azaltılan bu değer, ana döngü için bir başlangıç dizini olarak kullanılacaktır.

Her kod satırı için ayrıntılı yorumlarla birlikte göstergenin tam kaynak kodu aşağıdadır:

//+------------------------------------------------------------------+
//|                                                          SMA.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
//---- the indicator will be plotted in the main window
#property indicator_chart_window
//---- one buffer will be used for the calculations and plot of the indicator
#property indicator_buffers 1
//---- only one graphic plot is used 
#property indicator_plots   1
//---- the indicator should be plotted as a line
#property indicator_type1   DRAW_LINE
//---- the color of the indicator's line is red 
#property indicator_color1  Red 

//---- indicator input parameters
input int MAPeriod = 13; //Averaging period
input int MAShift = 0; //Horizontal shift (in bars)

//---- the declaration of the dynamic array
//that will be used further as an indicator's buffer
double ExtLineBuffer[]; 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+  
void OnInit()
  {
//----+
//---- assign the dynamic array ExtLineBuffer with 0th indicator's buffer
   SetIndexBuffer(0,ExtLineBuffer,INDICATOR_DATA);
//---- set plot shift along the horizontal axis by MAShift bars
   PlotIndexSetInteger(0,PLOT_SHIFT,MAShift);
//---- set plot begin from the bar with number MAPeriod
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,MAPeriod);  
//----+
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,    // number of available bars in history at the current tick
                const int prev_calculated,// number of bars, calculated at previous tick
                const int begin,          // index of the first bar
                const double &price[]     // price array for the calculation
                )
  {
//----+   
   //---- check for the presence of bars, sufficient for the calculation
   if (rates_total < MAPeriod - 1 + begin)
    return(0);
   
   //---- declaration of local variables 
   int first, bar, iii;
   double Sum, SMA;
   
   //---- calculation of starting index first of the main loop
   if(prev_calculated==0) // check for the first start of the indicator
      first=MAPeriod-1+begin; // start index for all the bars
   else first=prev_calculated-1; // start index for the new bars

   //---- main loop of the calculation
   for(bar = first; bar < rates_total; bar++)
    {    
      Sum=0.0;
      //---- summation loop for the current bar averaging
      for(iii=0;iii<MAPeriod;iii++)
         Sum+=price[bar-iii]; // It's equal to: Sum = Sum + price[bar - iii];
         
      //---- calculate averaged value
      SMA=Sum/MAPeriod;

      //---- set the element of the indicator buffer with the value of SMA we have calculated
      ExtLineBuffer[bar]=SMA;
    }
//----+     
   return(rates_total);
  }
//+------------------------------------------------------------------+

Bu kod biçiminin anlaşılması ve okunması çok daha kolaydır.

Kodun anlaşılmasını kolaylaştırmak için kullanılabilecek başka bir özelliğin ana hatlarını vermek istiyorum. Netleştirmek için boşluklar ve boş satırlar kullanabilirsiniz.

Sonuç

Bu tamamen özel göstergenin kodu ile MetaTrader istemci terminali arasındaki etkileşimle ilgilidir. Elbette konu, düşündüğümüzden çok daha geniştir, bu makalenin amacı yeni başlayanların temelleri anlamalarına yardımcı olmaktır, bu nedenle ayrıntılar için belgelere bakın.

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

Ekli dosyalar |
sma.mq5 (1.78 KB)
sma_.mq5 (3.32 KB)
OnTrade() fonksiyonunu kullanarak Uzman Danışmanda (EA) alım satım etkinliklerinin işlenmesi OnTrade() fonksiyonunu kullanarak Uzman Danışmanda (EA) alım satım etkinliklerinin işlenmesi
MQL5, çeşitli türlerdeki etkinliklerle (zamanlayıcı etkinlikleri, alım satım etkinlikleri, özel etkinlikler vb.) çalışmak da dahil olmak üzere bir dizi yenilik getirmiştir. Etkinlikleri işleme becerisi, otomatik ve yarı otomatik alım satım için tamamen yeni tür programlar oluşturmanıza olanak tanır. Bu makalede, alım satım etkinliklerini ele alacağız ve Alım Satım etkinliğini işleyecek olan OnTrade() fonksiyonu için bazı kodlar yazacağız.
Nesne işaretleyicilerini MQL5'te Kullanma Nesne işaretleyicilerini MQL5'te Kullanma
Varsayılan olarak, MQL5'teki tüm nesneler referansla iletilir, ancak nesne işaretçilerini kullanma olasılığı vardır. Ancak, nesne başlatılmamış olabileceğinden, işaretçi denetiminin gerçekleştirilmesi gereklidir. Bu durumda MQL5 programı kritik bir hata ile sonlandırılır ve kaldırılır. Otomatik olarak oluşturulan nesneler böyle bir hataya neden olmaz, dolayısıyla bu anlamda oldukça güvenlidirler. Bu makalede, nesne referansı ile nesne işaretçisi arasındaki farkı anlamaya çalışacağız ve işaretçileri kullanan güvenli kodun nasıl yazılacağını ele alacağız.
MQL5'te göstergeler nasıl çağrılır MQL5'te göstergeler nasıl çağrılır
MQL programlama dilinin yeni versiyonuyla birlikte, yalnızca göstergelerle ilgilenme yaklaşımı değişmedi, aynı zamanda göstergelerin nasıl oluşturulacağının da yeni yolları var. Ayrıca, göstergenin tamponlarıyla çalışma esnekliğine sahipsiniz - artık istediğiniz indeksleme yönünü belirleyebilir ve tam olarak istediğiniz kadar gösterge değeri alabilirsiniz. Bu makale, göstergeleri çağırmanın ve göstergenin tamponundan veri almanın temel yöntemlerini açıklar.
MQL5'e Giriş: Basit Uzman Danışman (EA) ve Özel Gösterge nasıl yazılır MQL5'e Giriş: Basit Uzman Danışman (EA) ve Özel Gösterge nasıl yazılır
MetaTrader 5 İstemci Terminaline dahil edilen MetaQuotes Programlama Dili 5 (MQL5), MQL4'e kıyasla birçok yeni imkana ve daha yüksek performansa sahiptir. Bu makale, bu yeni programlama dili hakkında bilgi edinmenize yardımcı olacaktır. Uzman Danışman ve Özel Göstergenin nasıl yazılacağına dair basit örnekler bu makalede sunulmuştur. Bu örnekleri anlamak için gerekli olan MQL5 dilinin bazı ayrıntılarını da ele alacağız.