English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
MQL5'te göstergeler nasıl çağrılır

MQL5'te göstergeler nasıl çağrılır

MetaTrader 5Örnekler | 9 Aralık 2021, 10:42
123 0
KlimMalgin
KlimMalgin

Giriş

MQL5'te göstergeleri çağırmanın birkaç yolu vardır ve bunlar çoğunlukla IndicatorCreate() ve iCustom() fonksiyonları kullanılarak gerçekleştirilir. Ayrıca, bu fonksiyonlar yalnızca gösterge tanıtıcısını verir ve göstergeler üzerinde daha fazla çalışma bunun aracılığıyla yapılır. Peki tanıtıcı nedir? IndicatorCreate() ve iCustom() fonksiyonları nasıl ele alınır? Ve uzmanınız gösterge verilerini nasıl alacak? Tüm bu sorular bu makalede ele alınmıştır.

Bir kaynak dosyası oluşturma

Uzmanımızla başlamak için kaynak dosyasını oluşturalım. Bunu hemen hemen MetaEditor4'teki gibi Dosya -> Yeni menüsünden MQL5 Sihirbazını çağırarak yapacağız. İlk adımda Uzman Danışmanı (EA) seçin ve İleri düğmesine basın.


İkinci adımda, Uzman Danışman (EA) için adı, yazarın iletişim bilgilerini ve giriş parametrelerini girmemiz önerilir. Yalnızca danışmanın Adını (zorunlu alan) ve Yazarı girin. Gerekirse giriş parametrelerini daha sonra doğrudan program koduna ekleyebilirsiniz.


Bitir düğmesine tıkladıktan sonra Sihirbaz aşağıdaki kaynak kodunu oluşturacaktır:

//+------------------------------------------------------------------+
//|                                                   SampleMQL5.mq5 |
//|                                             Copyright KlimMalgin |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "KlimMalgin"
#property link      ""
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

Kaynak dosya yapısı

Bir uzmanın kaynak dosya yapısını kısaca inceleyelim ve daha ileri gidelim.

Program kodu bir başlık ile başlar. Bu, dosya adını ve yazarını içeren bir yorumdur. Başlıktan sonra bir uzmanın Program Özellikleri (#property) gelir. Burada program sürümünün yanı sıra yazarın adı ve girdiyseniz sayfanızın bağlantısı otomatik olarak belirtilir. Özellikleri tanımladıktan sonra giriş parametreleri belirtilir (bunları henüz belirlemedik) ve ardından global değişkenler bildirilir.

Özelliklerin ana mql5 dosyasında ayarlanması gerektiğini belirtmek isterim. Dahil edilen dosyalardaki tüm özellikler yoksayılacaktır!

Ardından etkinlikleri işleyen üç fonksiyon gelir:

  • OnInit() - Uzman başlangıcında, karakter değişikliğinde veya uzmanın ayarlandığı periyot değişikliğinde bir kez çalışır.
  • OnDeinit(const int reason) - Ayrıca, uzman işini bitirdiğinde veya yeniden başlatma gerçekleştirildiğinde bir kez yürütülür. Neden parametresi, sıfırlamanın neden kodunu içerir.
  • OnTick() - Uzmanın bağlı olduğu çizelgede yeni bir tik aldığınız her seferde başlar.

Bağlantı göstergeleri

MQL5'te göstergelerle çalışma yöntemleri değişti! MQL4’te, belirli çubukta göstergenin değerini almak için, iCustom() fonksiyonuna geçirilen bu çubuğun indeksi parametre görevi görür. Şimdi göstergenin tampon değerini alamıyoruz, ancak tanıtıcısını alıyoruz.  Ve bu tanıtıcıyı kullanarak, CopyBuffer() adlı özel fonksiyonu kullanarak belirli bir aralıkta göstergenin değerlerini elde edebiliriz. Peki, bir tanıtıcı nedir?

Tanıtıcı, belirli bir göstergeyle kullanılmak üzere oluşturulmuş benzersiz bir tanımlayıcıdır. Bir tamsayı olarak temsil edilir ve int değişken türünde saklanır. MQL5:\'te gösterge tanıtıcısını almanın 2 yolu vardır:

  • Başarı durumunda gösterge tanıtıcısını ve başarısızlık durumunda -1 değeri verecek IndicatorCreate() fonksiyonunun çağrılması.
  • Teknik gösterge fonksiyonlarından birinin çağrılması. Yürütmelerinin sonucu benzerdir.

Her iki yöntem de eşit derecede geçerlidir ve hangisini kullanacağınıza karar vermek size kalmıştır. Her iki yolu da ayrıntılı olarak ele alalım.

IndicatorCreate() fonksiyonunu kullanarak göstergenin tanıtıcısını alma

Böylece, IndicatorCreate() fonksiyonunun başarılı bir şekilde yürütülmesinin bir sonucu olarak, göstergenin tanıtıcısını alacağız ve başarısızlık durumunda fonksiyon, INVALID_HANDLE değerini -1'e eşit olarak verecektir. Çağrılan göstergenin parametreleri varsa, fonksiyonu çağırmadan önce bir dizi MqlParam türü parametreyi doldurmalıyız. Bu dizinin her öğesi, 4 alan içeren MqlParam türü bir yapı olarak temsil edilir. Bu yapının ilk alanı, kalan üç alandan hangisinin gösterge için parametre olarak kullanıldığını gösterir.

Hareketli Ortalama ve ParabolikSAR göstergelerinin tanıtıcılarını oluşturacak kodu yazalım. Tanıtıcıları depolayacak olan global değişkenlerin bildirilmesiyle başlayacağız ve göstergeler için parametreleri ayarlamak için bir MqlParam türü dizisi bildireceğiz:

int MA1 = 0,            // Declaring variable to store fast MA handle
    MA2 = 0,            // Declaring variable to store slow MA handle
    SAR = 0;            // Declaring variable to store SAR handle
    
MqlParam params[];      // Array for storing indicators parameters

Bu kod, uzman özellikleri tanımlandıktan hemen sonra yerleştirilmelidir.

Artık değişkenler bildirildiğinde, parametreler dizisini doldurabilir ve IndicatorCreate() fonksiyonunu çağırabilirsiniz. Bunu OnInit() fonksiyonunda yapmak daha iyidir, çünkü gösterge her tikte değil, programın başında bir kez oluşturulacaktır!

Parametre dizisini dolduralım ve ilk göstergeyi çağıralım:

int OnInit()
{
//---
   // Setting the params size equal to number of called indicator parameters
   ArrayResize(params,4);

   // Setting the period of fast MA
   params[0].type         =TYPE_INT;
   params[0].integer_value=5;
   // Offset
   params[1].type         =TYPE_INT;
   params[1].integer_value=0;
   // Calculation method: simple averaging
   params[2].type         =TYPE_INT;
   params[2].integer_value=MODE_SMA;
   // Price type for calculation: the Close prices
   params[3].type         =TYPE_INT;
   params[3].integer_value=PRICE_CLOSE;
   
   MA1 = IndicatorCreate(Symbol(), // Symbol used to calculate the indicator
                         0,        // Timeframe. 0 means current
                         IND_MA,   // Indicator type from the ENUM_INDICATOR enumeration
                         4,        // Number of parameters passed in the params array
                         params    // Parameters array
                         );   
//---
return(0);
}

Params dizisi dinamik bir dizi olarak bildirildiğinden, yani dizinin boyutu parantez içinde ayarlanmadığından, bunu kullanmadan önce boyutunu ayarlamalıyız. ArrayResize() fonksiyonunu kullanarak diziye aktaracağımız parametre sayısına eşit bir boyut tanımlayacağız. Hareketli ortalama için dört parametreye ihtiyaç vardır.

İlk parametre MA periyodudur. Tamsayı olarak ayarlanır. Bu nedenle, ilk parametrenin tür alanına TYPE_INT değerini ayarlayacağız, böylece IndicatorCreate() fonksiyonumuz değerin integer_value alanından alınması gerektiğini “anlayacaktır”. Hareketli ortalamanın tüm parametreleri int türünde olduğundan, bunlar uygun şekilde ayarlanacaktır.

Dizi dolduğunda, IndicatorCreate() fonksiyonunu çağırabilirsiniz. Çıkışı MA1 değişkeninde depolanacaktır. Fonksiyonu çağırmada herhangi bir zorluk olmamalıdır ve sadece beş parametrenin transfer edilmesi gerekir:

  • Birincisi, çalışma aracının adıdır. Symbol() fonksiyonu, uzmanın üzerinde çalıştığı mevcut aracın adını verir. 
  • İkinci parametre, gösterge değerlerinin sayıldığı zaman dilimini belirtir.
  • Üçüncü parametre, çağrılacak olan göstergenin türünü belirtir.
  • Dördüncü parametre, params dizisinde iletilecek parametre sayısını belirtir.
  • Ve son olarak, beşinci parametre, göstergenin giriş parametreleri dizisidir.

Hepsi bu! Hızlı MA tanıtıcımız var ve yavaş MA ve SAR gösterge tanıtıcılarını almamız gerekiyor. Sonuç olarak, OnInit() fonksiyonu şöyle görünecektir:

int OnInit()
  {
//---

   // Setting the params size equal to number of called indicator's parameters
   ArrayResize(params,4);

//*    Calling indicators   *
//***************************
   // Setting the period of fast MA
   params[0].type         =TYPE_INT;
   params[0].integer_value=5;
   // Offset
   params[1].type         =TYPE_INT;
   params[1].integer_value=0;
   // Calculation method: simple averaging
   params[2].type         =TYPE_INT;
   params[2].integer_value=MODE_SMA;
   // Price type for calculation: the Close prices
   params[3].type         =TYPE_INT;
   params[3].integer_value=PRICE_CLOSE;
   
   MA1 = IndicatorCreate(Symbol(), 0, IND_MA, 4, params);
   
   // Setting the period of slow MA
   params[0].type         =TYPE_INT;
   params[0].integer_value=21;
   // Offset   
   params[1].type         =TYPE_INT;
   params[1].integer_value=0;
   // Calculation method: simple averaging
   params[2].type         =TYPE_INT;
   params[2].integer_value=MODE_SMA;
   // Price type for calculation: the Close prices
   params[3].type         =TYPE_INT;
   params[3].integer_value=PRICE_CLOSE;
   
   MA2 = IndicatorCreate(Symbol(), 0, IND_MA, 4, params);
   
   
   // Changing array size to store the SAR indicator parameters
   ArrayResize(params,2);
   // Step
   params[0].type         =TYPE_DOUBLE;
   params[0].double_value = 0.02;
   // Maximum
   params[1].type         =TYPE_DOUBLE;
   params[1].double_value = 0.2;
   
   SAR = IndicatorCreate(Symbol(), 0, IND_SAR, 2, params);
   
//---
   return(0);
  }

Yavaş MA tanıtıcısını elde etmek için periyodu yalnızca 5'ten 21'e değiştirebilirsiniz. Ve ParabolikSAR çağrıldığında, kayan nokta sayıları (çift) bunun parametreleri olarak aktarılır. Diziyi doldururken bunu dikkate almalı ve sırasıyla tür alanına TYPE_DOUBLE, double_value alanına parametrenin kendisini koymalısınız. Ayrıca, SAR yalnızca iki parametre gerektirir, bu nedenle dizi boyutu ArrayResize() kullanılarak 2 olarak değiştirilir.

Şimdilik IndicatorCreate() fonksiyonu sona erer. Düşünceme göre, göstergeleri çağırmak için bu yöntem, sınıf kitaplığı göstergelerle çalışmak üzere oluşturulduğunda, nesne yönelimli yaklaşımda en uygunudur. Bu kitaplık, büyük ölçekli projelerin işlenmesini kolaylaştıracaktır. Hızlı uzmanların yazılması ve test edilmesi için aşağıdaki yöntemi kullanmak en iyisidir.

Teknik gösterge fonksiyonlarını kullanarak tanıtıcıyı alma

Gösterge tanıtıcısını almanızı sağlayan ikinci yöntem, teknik gösterge fonksiyonlarından birini çağırmaktır. Bu fonksiyonların her biri, MetaTrader 5 ile birlikte gelen standart göstergelerden birinin tanıtıcısının alınmasını amaçlar. Hepsinin, amaçlanan göstergeye bağlı olarak belirli bir dizi parametresi vardır. Örneğin, CCI göstergesi için iCCI() fonksiyonu çağrılır ve aşağıdaki gibi görünür:

   CCI = iCCI(
              Symbol(),            // symbol name
              PERIOD_CURRENT,      // period
              20,                  // averaging period
              PRICE_CLOSE          // price type or handle
              );

Teknik göstergeler fonksiyonunda fiyat türü yerine diğer göstergenin tanıtıcısı son parametre olarak gönderilebilir. Daha sonra bu şekilde adlandırılan gösterge, fiyat verisi değil, diğer göstergenin verisi kullanılarak hesaplanacaktır.

iCustom() fonksiyonu, özel olanlar da dahil olmak üzere herhangi bir göstergeyi çağırabildiğinden, diğer teknik gösterge fonksiyonları arasında özel bir ilgiye neden olur. Yukarıdakine benzer bir kodu iCustom() fonksiyonunu kullanarak yazalım:

int OnInit()
  {
//---

   MA1 = iCustom(NULL,0,"Custom Moving Average",
                          5,          // Period
                          0,          // Offset
                          MODE_SMA,   // Calculation method
                          PRICE_CLOSE // Calculating on Close prices
                 );

   MA2 = iCustom(NULL,0,"Custom Moving Average",
                          21,         // Period
                          0,          // Offset
                          MODE_SMA,   // Calculation method
                          PRICE_CLOSE // Calculating on Close prices
                 );

   SAR = iCustom(NULL,0,"ParabolicSAR",
                          0.02,        // Step
                          0.2          // Maximum
                 );

//---
   return(0);
  }

Uzman başlatma sırasında tanıtıcıyı hemen almanın en iyisi olduğunu unutmayın, bu yüzden OnInit() fonksiyonunda çağrı yapalım.

iCustom() fonksiyonu aşağıdaki parametreleri içerir:

  1. Göstergeyi hesaplamak için verilerin kullanıldığı çalışma aracının adı. NULL - mevcut araç anlamına gelir. NULL yerine Symbol () kullanabilirsiniz, çok fark yoktur. Symbol() durumunda, bir aracın adı iCustom() fonksiyonuna aktarılır, ancak NULL durumunda iCustom() finansal aracın kendisini bulur.
  2. Grafik periyodu. Periyodu belirtmek için önceden tanımlanmış grafik zaman dilimlerini ve mevcut zaman çerçevesine atıfta bulunmak için 0 - kullanabilirsiniz.
  3. Gösterge adı. Çağrılan gösterge derlenmeli ve "MQL5\Indicators\" klasöründe veya bunun herhangi bir alt klasöründe olmalıdır.
  4. Kalan parametreler. Bu değerler, çağrılan gösterge için giriş parametreleri olarak kullanılacaktır, bu nedenle türleri ve sıraları birbiriyle eşleşmelidir. Belirtilmezlerse, varsayılan değerler kullanılacaktır.

Söylendiği gibi - bu yöntem, çalışmak için kullandığınız kitaplığınız yoksa, göstergelerle kullanmak için daha uygundur. Şimdi, tanıtıcılar alındığında, gösterge değerleriyle çalışmaya başlayabilirsiniz!

Gösterge verilerini alma

MQL5'te gösterge verileriyle çalışmanın güzel yanı, artık yalnızca ihtiyacımız olan aralıkta veri alma fırsatına sahip olmamızdır. Aralığı farklı şekillerde ayarlayabilirsiniz:

  • Seçilen çubuğa göre belirtilen sayıda çubuk alma.
  • Seçilen tarihe göre belirtilen sayıda çubuk alma.
  • Belirli bir zaman aralığında, yani başlangıç ve bitiş tarihlerini belirterek göstergeden veri alma.

Göstergenin tarihini okumak için CopyBuffer() fonksiyonu kullanılır. Hangi veri alma yönteminin kullanılacağı, bu fonksiyona hangi giriş parametrelerinin aktarılacağına bağlıdır.

Gösterge verilerini kopyalayan kodu (daha önce tanıtıcılarını aldık) dizilere yazalım:

void OnTick()
  {
//---

// Dynamic arrays to store indicators values
double _ma1[],
       _ma2[],
       _sar[];

// Setting the indexing in arrays the same as in timeseries, i.e. array element with zero
// index will store the values of the last bar, with 1th index - the last but one, etc.
   ArraySetAsSeries(_ma1, true);
   ArraySetAsSeries(_ma2, true);
   ArraySetAsSeries(_sar, true);

// Using indicators handles, let's copy the values of indicator
// buffers to arrays, specially prepared for this purpose
   if (CopyBuffer(MA1,0,0,20,_ma1) < 0){Print("CopyBufferMA1 error =",GetLastError());}
   if (CopyBuffer(MA2,0,0,20,_ma2) < 0){Print("CopyBufferMA2 error =",GetLastError());}
   if (CopyBuffer(SAR,0,0,20,_sar) < 0){Print("CopyBufferSAR error =",GetLastError());}


//---
  }

Artık tüm çalışmalarımız OnTick() fonksiyonuna odaklanacak, çünkü her bir tik göstergesinde veriler değişiyor ve güncellenmesi gerekiyor.

İlk önce, her gösterge tamponu için dinamik diziler bildirelim. Düşünceme göre, dizi indeksleme zaman serisi ile aynı olacaksa, yani 0. dizi öğesinde, sondan bir önceki olan 1 numaralı öğede son çubuğun verileri olacaksa gösterge verileriyle çalışmak daha uygundur. İndeksleme yöntemi, ArraySetAsSeries() fonksiyonu kullanılarak ayarlanır.

İndeksleme yöntemi ayarlandıktan sonra dizileri doldurmaya başlayabiliriz. Her bir göstergeyi hesaplamak için aşağıdaki parametre setiyle CopyBuffer() fonksiyonunu çağıracağız:

  1. Hangi verileri almak istediğinizi gösteren gösterge tanıtıcı.
  2. Gösterge tamponu numarası. MA ve SAR göstergeleri bir tampona sahip olduğundan, bunları 0 olarak ayarlayacağız. Birden fazla tampon varsa, ikincisi 1 numara, üçüncüsü 2 numara vb. olacaktır.
  3. Saymanın başladığı ilk çubuk.
  4. Kopyalamak istediğiniz çubuk sayısı.
  5. Verilerin kopyalandığı dizi{/0}

Başarılı çağrıda, CopyBuffer() fonksiyonu kopyalanan öğelerin sayısını verir, başarısızlık durumunda -1 değerini verir. Başarısızlık durumunda hatanın izlenmesi gerekir, bu nedenle döndürülen değer 0'dan küçükse Print() fonksiyonunu kullanarak hatayı uzmanlar günlüğüne yazacağız.

Sonuç

Şimdilik göstergelerle ilgili çalışmalarımız sona ermekten çok uzaktır. Bu makale, yalnızca verilere erişmenin temel yöntemlerini kapsamaktadır. Ve kolaylık sağlamak için, MQL5'te oldukça iyi bir seviyede uygulanan nesne yönelimli yaklaşımı kullanmak en iyisidir!

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

Ekli dosyalar |
samplemql5_en.mq5 (5.13 KB)
MQL5'teki Çizim Stilleri MQL5'teki Çizim Stilleri
MQL4'te 6 çizim stili ve MQL5'te 18 çizim stili vardır. Bu nedenle, MQL5'in çizim stillerini tanıtmak için bir makale yazmaya değer olabilir. Bu yazıda MQL5'teki çizim stillerinin detaylarını ele alacağız. Ek olarak, bu çizim stillerinin nasıl kullanılacağını göstermek için bir gösterge oluşturacağız ve çizimi iyileştireceğiz.
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.
MQL5'te Tik Göstergeleri Oluşturma MQL5'te Tik Göstergeleri Oluşturma
Bu makalede, iki göstergenin oluşturulmasını ele alacağız: fiyatın tik grafiğini çizen tik göstergesi ve belirtilen sayıda tik ile mumları çizen tik mum göstergesi. Göstergelerin her biri gelen fiyatları bir dosyaya yazar ve göstergenin yeniden başlatılmasından sonra kaydedilen verileri kullanır (bu veriler diğer programlar tarafından da kullanılabilir)
Yeni Başlayanlar için MQL5'te Özel Göstergeler Yeni Başlayanlar için MQL5'te Özel Göstergeler
Herhangi bir yeni konu, bir acemi için karmaşık ve öğrenmesi zor görünür. Bildiğimiz konular ise bize çok basit ve anlaşılır gelir. Ancak, herkesin bir şeyi sıfırdan ve hatta ana dilimizden öğrenmek zorunda olduğunu hatırlamıyoruz. Aynısı, kişinin kendi alım satım stratejilerini geliştirmesi için geniş olanaklar sunan MQL5 programlama dili için de geçerlidir - bunu temel kavramlardan ve en basit örneklerden öğrenmeye başlayabilirsiniz. Teknik bir göstergenin MetaTrader 5 istemci terminali ile etkileşimi, bu makalede basit özel gösterge SMA örneğinde ele alınmaktadır.