
MQL5'te göstergeler nasıl çağrılır
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:
- 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.
- Grafik periyodu. Periyodu belirtmek için önceden tanımlanmış grafik zaman dilimlerini ve mevcut zaman çerçevesine atıfta bulunmak için 0 - kullanabilirsiniz.
- 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.
- 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:
- Hangi verileri almak istediğinizi gösteren gösterge tanıtıcı.
- 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.
- Saymanın başladığı ilk çubuk.
- Kopyalamak istediğiniz çubuk sayısı.
- 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





- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz