MQL5 program yapısı hakkında bilmeniz gereken her şey
Giriş
Tüm programlama dillerinde programların belirli bir yapısı vardır. Bu yapıyı öğrendikten sonra kendi programlarımızı rahat bir şekilde geliştirebiliriz. MQL5 programlarının da kendi yapısı vardır ve bir geliştirici, projesinin hedeflerine sorunsuz ve verimli bir şekilde ulaşmasını sağlamak için bu yapıyı öğrenmelidir. Aşağıdaki konular aracılığıyla MQL5 program yapısını inceleyeceğiz:
- Önişlemci
- Makro ikamesi (#define)
- Program özellikleri (#property)
- Dosyaları dahil etme (#include)
- Fonksiyonları içe aktarma (#import)
- Koşullu derleme (#ifdef, #ifndef, #else, #endif)
- Girdi ve global değişkenler
- Fonksiyonlar, sınıflar
- Olay işleyicileri
- MQL5 program örnekleri
- Sonuç
Bu makaleyi okuduktan sonra, herhangi bir MQL5 programının yapısını çok iyi anlayacak ve bu yapıya dayalı kendi yazılımınızı sorunsuz ve verimli bir şekilde geliştirebileceksiniz.
Önişlemci
Bu bölümde, bir programlama kavramı olarak önişlemci hakkında ayrıntılı bilgi edineceğiz. Önişlemci, derleme sürecinde önemli bir adımdır. Programın derlemesinden önce gerçekleşir. Ön işleme adımı, dosyaların dahil edilmesi, yazılım özelliklerinin tanımlanması, sabitlerin tanımlanması ve fonksiyonların içe aktarılması gibi çeşitli faaliyetleri içerir.
Tüm önişlemci yönergeleri “#” ile başlar. Bu yönergeler dil ifadeleri olarak kabul edilmez. Yani, noktalı virgül (;) ile bitmemelidirler. Bir önişlemci yönergesinin sonuna noktalı virgül eklenmesi yönergenin türüne bağlı olarak hatalara neden olabilir.
Başka bir deyişle, önişlemcinin derleme işleminden önce programın kaynak kodunun hazırlanması için kullanıldığını söyleyebiliriz. MQL5 programında tanımlamamız gereken parametrelere bağlı olarak birçok önişlemci yönergesi türü vardır:
- Makro ikamesi (#define)
- Program özellikleri (#property)
- Dosyaları dahil etme (#include)
- Fonksiyonları içe aktarma (#import)
- Koşullu derleme (#ifdef, #ifndef, #else, #endif)
Makro ikamesi (#define):
Sembolik sabitler oluşturmak veya programda kullanılacak sabitleri tanımlamak için #define önişlemci yönergesi kullanılabilir. Sabit, değeri değişmeyen bir tanımlayıcıdır. Belirli bir tanımlayıcı için bir ikame değer kullanacağımızdan, #define yönergesi sabitlere anımsatıcı adlar atamak için kullanılabilir. Bu önişlemci yönergesinin ilk biçimi aşağıdaki gibidir:
#define identifier replacement-value Bu kod satırı, program derlenmeden önce tanımlayıcının bir ikame değerle değiştirileceği anlamına gelir. Bu biçim parametresiz bir #define yönergesidir. MQL5'te, aşağıda gösterildiği gibi #define yönergesi ile kullanılabilen maksimum sekiz parametreye izin verilen başka bir parametrik biçim daha vardır:
#define identifier (param1, param2,... param5) Değişkenler için geçerli olan kuralların aynısı sabitlerin tanımlanması için de geçerlidir:
- Değer integer, double veya string gibi herhangi bir türde olabilir.
- İfade birkaç belirteçten oluşabilir. Satır bittiğinde sona erer ve bir sonraki kod satırına taşınamaz.
Aşağıda bir örnek verilmiştir:
//Parameter-free format #define INTEGER 10 //int #define DOUBLE 10.50 //double #define STRING_VALUE "MetaQuotes Software Corp." //str #define INCOMPLETE_VALUE INTEGER+DOUBLE //Incomlete #define COMPLETE_VALUE (INTEGER+DOUBLE) //complete //Parametic format #define A 2+3 #define B 5-1 #define MUL(a, b) ((a)*(b)) double c=MUL(A,B); //function to print values void defValues() { Print("INTEGER Value, ",INTEGER); //result: INTEGER Value, 10 Print("DOUBLE Value, ",DOUBLE); //result: DOUBLE Value, 10.50 Print("STRING Value, ",STRING_VALUE); //result: STRING Value, MetaQuotes Software Corp. Print("INCOMPLETE Value, ",INCOMPLETE_VALUE*2); //result: INCOMPLETE Value, 31 Print("COMPLETE Value, ",COMPLETE_VALUE*2); //result: STRING Value, 41 Print("c= ",c); //result: c= 41 }
Ayrıca, önceden tanımlanmış olanı iptal eden #undef önişlemci yönergesi de vardır.
Program özellikleri (#property):
Yazılımımızı oluştururken ek parametreler belirtmemiz gerektiğini fark edebiliriz, bunu #property kullanarak yapabiliriz. Bu özellikler include dosyasında değil ana MQL5 dosyasında belirtilmelidir ve include dosyalarında belirtilenler göz ardı edilecektir. #property yönergesi program için ek özellikler belirtir. Bu bağlamda neyi belirtmemiz gerektiğini sorarsanız, örneğin gösterge, komut dosyası, açıklayıcı bilgiler ve kütüphane özellikleri gibi birçok şey olduğunu söyleyebilirim. Diğer önişlemci yönergeleri gibi #property de kaynak kodun en üstünde belirtilecek ve program çalıştırılırken program penceresindeki Genel sekmesinde görüntülenecektir.
Aşağıda bu önişlemci yönergesine bir örnek verilmiştir:
#property copyright "Copyright 2023, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property description "Property preprocessor"
Bu değerleri program penceresinde görebiliriz:

Yukarıdaki şekilde gördüğümüz gibi, Uzman Danışmanı çalıştırırken Genel sekmesinde, ihtiyacımız olan tanımladığımız özelliklere sahibiz. “Copyright 2023, MetaQuotes Ltd.” metni bir köprüdür. İmleci bu yazının üzerine getirdiğimizde, nereye gittiğini görebiliriz (link özelliği).
Dosyaları dahil etme (#include):
Tüm #include yönergeleri de programın başına yerleştirilir. Değişkenler, fonksiyonlar ve sınıflar gibi içeriğini kullanmak için yazılıma dahil edilmesi gereken dosyayı belirtir.
Dosyaları #include yönergesini kullanarak dahil etmek için iki biçim vardır:
#include <File_Name.mqh> #include "File_Name.mqh"
Bu iki biçim arasındaki fark, derleyicinin dahil edilecek dosyayı nerede araması gerektiğidir: İlki, derleyicinin dosyayı MetaTrader 5 kurulumunun Include klasöründe veya standart kütüphanenin header dosyasında aramasını sağlar, ikincisi ise derleyicinin dosyayı program dosyasıyla aynı dizinde aramasını sağlar.
Fonksiyonları içe aktarma (#import):
#import yönergesi, derlenmiş MQL5 modüllerinden (*.ex5 dosyaları) ve işletim sistemi modüllerinden (*.dll dosyaları) fonksiyonları yazılıma aktarmak için kullanılır. Fonksiyon tam olarak belirtilmeli ve biçimi aşağıdakiyle aynı olmalıdır:
#import "File_Name" func1 define; func2 define; ... funcN define; #import
Koşullu derleme (#ifdef, #ifndef, #else, #endif):
Koşullu derleme, programın derlenmesine ek olarak ön işleme yönergelerinin yürütülmesini kontrol etmemizi sağlar. Aşağıdaki biçimlerden birinde olabilen belirli bir koşula dayalı olarak program kodunun bir kısmının derlenmesini veya atlanmasını kontrol etmemize olanak sağlar:
#ifdef identifier //If the identifier has been defined, the code here will be compiled. #endif
#ifndef identifier // If the identifier is not defined, the code here will be compiled. #endif
Daha önce de belirttiğimiz gibi, yeni bir satıra geçersek, önişlemci yönergeleri devam etmeyecektir, ancak burada #else ve #endif kullanıldığında bu tür bir yönergeyi herhangi bir sayıda satır izleyebilir. Koşul doğruysa, bu #else ve #endif arasındaki satırlar yoksayılır, ancak koşul karşılanmazsa, kontrol ve #else (veya ilki eksikse #endif) arasındaki satırlar yoksayılır.
MQL5'te önişlemci hakkında daha fazla bilgiyi dokümantasyondan edinebilirsiniz.
Girdi ve global değişkenler
Bu bölümde, önişlemci yönergelerinden sonra MQL5 program yapısının diğer bileşenleri olan girdi ve global değişkenleri tanımlayacağız. Harici bir değişken tanımlayan girdi değişkenleri ile başlayalım. input değiştiricisi veri türünden önce belirtilir. input değiştiricisine sahip bir değişken MQL5 programının içinde değiştirilemez ve değerler yalnızca program kullanıcısı tarafından program çalıştırılırken “Girdiler” sekmesinden değiştirilebilir. Bu harici değişkenleri input değiştiricisini kullanarak tanımladığımızda, OnInIt() çağrılmadan önce her zaman yeniden başlatılırlar.
Giriş değişkenlerinin biçimi aşağıda verilmiştir:
input int MA_Period=20; input int MA_Shift=0; input ENUM_MA_METHOD MA_Method=MODE_SMA;
Kullanıcı tarafından belirlenecek girdi penceresi:

Gördüğümüz gibi, hareketli ortalamanın periyodunu, kayma miktarını ve türünü ayarlayabiliriz. Ayrıca, Girdiler sekmesinde girdi parametrelerinin nasıl görüneceğini, pencerede görmek istediklerimizi yorum olarak yerleştirerek tanımlayabiliriz:
input int MA_Period=20; //Moving Average Period input int MA_Shift=0; //Moving Average Shift input ENUM_MA_METHOD MA_Method=MODE_SMA; //Moving Average Type
Böylece, Girdiler sekmesinde parametreleri aşağıdaki gibi görebiliriz:

Gördüğümüz gibi, parametreler önceki şekilden farklı görünüyor. MQL5'te girdi değişkenleri hakkında daha fazla bilgiyi dokümantasyondan edinebilirsiniz.
Global değişkenler olay işleyicilerinin ve fonksiyonların dışında oluşturulmalıdır:
int Globalvar; // Global variable before or outside the event handler and functions int OnInit() { ... }
Dolayısıyla, global değişkenlerin kapsamının tüm program olduğunu, programdaki tüm fonksiyonlardan kullanılabildiklerini ve program yüklendiğinde, OnInit() veya OnStart() olay işleyicilerinden önce başlatıldıklarını söyleyebiliriz. Olay işleyicileri hakkında daha sonra konuşacağız. MQL5 program yapısında global değişkenlerin konumunu göstermek için bunlardan burada bahsediyorum.
MQL5'te global değişkenler hakkında daha fazla bilgiyi dokümantasyondan edinebilirsiniz.
Fonksiyonlar, sınıflar
Bu bölümde, MQL5 program yapısının diğer bileşenleri olan fonksiyonlar ve sınıflar hakkında konuşacağız. Fonksiyonlar, “MQL5'te fonksiyonları uygulamalarla anlama” başlıklı önceki makalemde ayrıntılı olarak açıklanmıştır. Ayrıca, MQL5'te nesne yönelimli programlama (OOP) bağlamında sınıflar hakkında daha fazla bilgi edinmek istiyorsanız, “MQL5’te Nesne Yönelimli Programlama (Object-Oriented Programming, OOP)” makalemi okumanızı tavsiye ederim. Umarım sizin için faydalı olurlar.
Burada, bu önemli bileşenlerin herhangi bir yazılımdaki konumundan bahsedeceğiz, çünkü bunları #include yönergesi kullanılarak dahil edilebilen include dosyaları da dahil olmak üzere yazılımın herhangi bir yerinde tanımlayabiliriz. Girdi ve global değişkenlerden sonra olmak üzere olay işleyicilerinden önce veya sonra yerleştirilebilirler.
Fonksiyonların biçimi aşağıdaki gibidir:
returnedDataType functionName(param1, param2)
{
bodyOfFunction
} Sınıfların biçimi aşağıdaki gibidir:
class Cobject { int var1; // variable1 double var2; // variable1 void method1(); // Method or function1 };
MQL5'te fonksiyonlar ve sınıflar hakkında daha fazla bilgiyi dokümantasyondan edinebilirsiniz.
Olay işleyicileri
Bu bölümde, MQL5 programlarının çok önemli bileşenleri olan olay işleyicilerini ele alacağız. Olay işleyicisi, çalıştırılabilir bir fonksiyondur. Belirli bir olay meydana geldiğinde, örneğin yeni tik olayını temsil eden yeni bir fiyat oluştuğunda, OnTick() olay işleyicisi çalıştırılabilir hale gelir, çünkü yeni bir fiyat veya tik alındığında çalıştırılabilecek bir kod gövdesine sahiptir.
MQL5 programının türüne bağlı olarak, farklı olay işleyicileri vardır:
| Olay işleyicisi | Açıklama | Biçim |
|---|---|---|
| OnStart | Komut dosyalarında, program başlatıldığında çağrılır |
int OnStart(void);
void OnStart(void); |
| OnInit | Uzman Danışmanlar ve göstergelerde, program başlatıldığında çağrılır |
int OnInit(void);
void OnInit(void); |
| OnDeinit | Uzman Danışmanlar ve göstergelerde, program sonlandırıldığında çağrılır | void OnDeinit( const int reason // deinitialization reason code ); |
| OnTick | Uzman Danışmanlar ve göstergelerde, yeni fiyat alındığında çağrılır | void OnTick(void); |
| OnCalculate | Göstergelerde, Init olayından hemen sonra ve fiyat verilerinde herhangi bir değişiklik olduğunda çağrılır |
int OnCalculate( const int rates_total, // price[] array size const int prev_calculated, // number of handled bars at the previous call const int begin, // index number in the price[] array meaningful data starts from const double& price[] // array of values for calculation );
int OnCalculate( const int rates_total, // size of input time series const int prev_calculated, // number of handled bars at the previous call const datetime& time{}, // Time array const double& open[], // Open array const double& high[], // High array const double& low[], // Low array const double& close[], // Close array const long& tick_volume[], // Tick Volume array const long& volume[], // Real Volume array const int& spread[] // Spread array ); |
| OnTimer | Uzman Danışmanlar ve göstergelerde, işlem terminali tarafından Timer periyodik olayı oluşturulduğunda çağrılır | void OnTimer(void); |
| OnTrade | Uzman Danışmanlarda, işlem sunucusunda bir alım-satım işlemi tamamlandığında çağrılır | void OnTrade(void); |
| OnTradeTransaction | Uzman Danışmanlarda, TradeTransaction olayı gerçekleştiğinde çağrılır (bu fonksiyon aracılığıyla işlem talebi sonuçları kontrol edilebilir) | void OnTradeTransaction() const MqlTradeTransaction& trans, // trade transaction structure const MqlTradeRequest& request, // request structure const MqlTradeResult& result // response structure ); |
| OnBookEvent | Uzman Danışmanlarda, piyasa derinliği değiştiğinde çağrılır | void OnBookEvent( const string& symbol // symbol ); |
| OnChartEvent | Göstergelerde, kullanıcı grafik üzerinde çalışırken çağrılır | void OnChartEvent() const int id, // event ID const long& lparam, // long type event parameter const double& dparam, // double type event parameter const string& sparam // string type event parameter ); |
| OnTester | Uzman Danışmanlarda, Uzman Danışmanın geçmiş veriler üzerinde test edilmesi sona erdiğinde çağrılır | double OnTester(void); |
| OnTesterInit | Uzman Danışmanlarda, ilk optimizasyon geçişinden önce strateji sınayıcıda optimizasyon başladığında çağrılır |
int OnTesterInit(void);
void OnTesterInit(void); |
| OnTesterDeinit | Uzman Danışmanlarda, strateji sınayıcıda Uzman Danışmanın optimizasyonu sona erdiğinde çağrılır | void OnTesterDeinit(void); |
| OnTesterPass | Uzman Danışmanlarda, yeni bir veri çerçevesi alındığında çağrılır | void OnTesterPass(void); |
MQL5'te olay işleme hakkında daha fazla bilgiyi dokümantasyondan edinebilirsiniz.
MQL5 program örnekleri
Bu bölümde, doğru MQL5 yapısını kullanarak basit bir uygulama oluşturmak için edindiğimiz bilgileri uygulayacağız. Programın türüne ve gerekli göreve bağlı olarak MQL5 yapısının bileşenlerini kullanabileceğimizden bahsetmiştik. Bu bileşenlerden #include önişlemcisi gibi bazılarını kullanma zorunluluğu yoktur, çünkü herhangi bir harici dosyanın dahil edilmesi gerekli olmayabilir. Aynı durum #property için de geçerlidir. Programda özel sınıflar veya fonksiyonlar oluşturmak da gerekli olmayabilir. Her durumda, programınız için gerekli olanı kullanacaksınız. Aşağıda, farklı program türlerine göre gerekli tüm yapısal bileşenlerin uygulanmasına ilişkin basit bir örnek yer almaktadır.
Komut dosyası türü
Aşağıda, girdi değişkenlerini kullanarak kullanıcı tarafından girilen iki sayıyı toplayabilen ve sonucu Print fonksiyonunu kullanarak Uzmanlar sekmesinde yazdırabilen basit bir MQL5 komut dosyası programı örneği bulunmaktadır. Kullanıcının sayıları girmesi için komut dosyasının girdi değişkenlerinin görüntülenmesini sağlayan #property özelliğini ekleyelim.
//+------------------------------------------------------------------+ //| Script program example.mq5 | //| Copyright 2023, MetaQuotes Ltd.| //| https://www.mql5.com | //+------------------------------------------------------------------+ //property preprocessor #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property script_show_inputs //inputs input int userEntryNum1; input int userEntryNum2; //global variable int result; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ //event handler void OnStart() { result=userEntryNum1+userEntryNum2; Print("Result: ", result); } //+------------------------------------------------------------------+
Başka bir Uzman Danışman veya gösterge oluşturmak istiyorsak, programın türüne bağlı olarak farklı olay işleyicileri kullanmamız gerekir. Örneğin, bir Uzman Danışman, OnTick() işleyicisini kullanarak yeni bir tik alındığında bir eylem gerçekleştirebilir.
Artık MQL5 program yapısını tanımladığımıza göre, bazı bileşenlerin programın türüne ve hedeflerine bağlı olarak farklılık gösterdiğini biliyoruz. Bu anlayış, her bir bileşenin yazılımdaki konumunu belirlememize yardımcı olur.
Bu bilgiyi uygulamak için, daha önce de belirtildiği gibi basit bir komut dosyası programı ile başlayabiliriz.
Sonuç
MQL5 program yapısını analiz ettik ve hangi bileşenlerin hangi program türünde kullanıldığını gördük. MQL5 programı bileşenleri:
- Önişlemci
- Makro ikamesi (#define)
- Program özellikleri (#property)
- Dosyaları dahil etme (#include)
- Fonksiyonları içe aktarma (#import)
- Koşullu derleme (#ifdef, #ifndef, #else, #endif)
- Girdi ve global değişkenler
- Fonksiyonlar ve sınıflar
- Olay işleyicileri
- OnStart
- OnInit
- OnDeinit
- OnTick
- OnCalculate
- OnTimer
- OnTrade
- OnTradeTransaction
- OnBookEvent
- OnChartEvent
- OnTester
- OnTesterInit
- OnTesterDeinit
- OnTesterPass
Umarım bu makaleyi faydalı bulmuşsunuzdur. Popüler teknik göstergeleri kullanarak bir alım-satım sistemi oluşturma hakkında daha fazla bilgi edinmek istiyorsanız, diğer makalelerimi okuyabilirsiniz.
Ayrıca, Uzman Danışmanlarda özel göstergeler oluşturma ve kullanma, nesne yönelimli programlama (OOP) ve fonksiyonlar gibi diğer önemli MQL5 programlama konuları hakkında da makalelerim var. Bu makalelerin öğrenme ve alım-satım yolculuğunuzda değerli olacağına inanıyorum.
MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal makale: https://www.mql5.com/en/articles/13021
Uyarı: Bu materyallerin tüm hakları MetaQuotes Ltd.'a aittir. Bu materyallerin tamamen veya kısmen kopyalanması veya yeniden yazdırılması yasaktır.
Bu makale sitenin bir kullanıcısı tarafından yazılmıştır ve kendi kişisel görüşlerini yansıtmaktadır. MetaQuotes Ltd, sunulan bilgilerin doğruluğundan veya açıklanan çözümlerin, stratejilerin veya tavsiyelerin kullanımından kaynaklanan herhangi bir sonuçtan sorumlu değildir.
Python'da bir alım-satım robotu geliştirme (Bölüm 3): Model tabanlı bir alım-satım algoritmasının uygulanması
- Ü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
MQL5 programının yapısı hakkında bilmeniz gereken her şey makalesi yayınlandı:
Yazar: Mohamed Abdelmaaboud
Keşke bu tür belgelerin açıklama yapılmadan yeniden basılması daha az olsaydı.
+