Program Çalıştırma

Her bir komut dosyası, servis ve Uzman Danışman ayrı bir iş parçacığında çalışır. Bir sembolde hesaplanan tüm göstergeler, farklı grafiklere eklense bile, aynı iş parçacığında çalışır. Böylece, bir semboldeki tüm göstergeler bir iş parçacığının kaynaklarını paylaşır.

Tiklerin işlenmesi ve geçmiş senkronizasyonu gibi, bir sembolle ilişkili tüm diğer eylemler de tutarlı bir şekilde, göstergeler ile aynı iş parçacığında gerçekleştirilir. Yani gösterge içinde sonsuz bir eylemin gerçekleştirilmesi durumunda, sembolle ilişkili diğer olayların hiçbiri gerçekleştirilmez.

Bir Uzman Danışmanı çalıştırırken, gerçek bir alım-satım ortamına sahip olduğundan, istenen sembol ve periyodun geçmişine erişim gerçekleştirebildiğinden ve terminal ile sunucu arasındaki veriyi senkronize edebildiğinden emin olun. Uzman Danışmanın mevcut veri ile başlatılmasının ardından tüm bu prosedürler için, terminal 5 saniyeden uzun olmayan bir gecikme oluşturur. Bu yüzden, sunucu bağlantısının olmaması durumunda, Uzman Danışmanın başlangıcında gecikmeler yaşanabilir.

Aşağıdaki tablo MQL5 programlarının kısa bir açıklamasını içerir:

MQL5 program

Çalışma

Not

Hizmet

Ayrı bir iş parçacığı, hizmetler için iş parçacığı sayısı hizmet sayısına eşittir

Döngüsel bir servis diğer programların çalışmasını bozamaz

Script

Ayrı iş parçacığı; gereken iş parçacıklarının sayısı, script sayısına eşittir

Döngülü bir script, diğer programların çalışmasını etkilemez

Uzman Danışman

Ayrı iş parçacığı; gereken iş parçacıklarının sayısı, Uzman Danışman sayısına eşittir

Döngülü bir Uzman Danışman, diğer programların çalışmasını etkilemez

Gösterge

Bir sembol üzerindeki tüm göstergeler için tek bir iş parçacığı. Gereken iş parçacıklarının sayısı, göstergeli sembollerin sayısına eşittir

Gösterge içindeki sonsuz bir döngü, sembol üzerindeki tüm diğer göstergeleri durdurur

Bir program, çizelgeye eklenmesinin hemen ardından, global değişkenlerin başlatılmasıyla birlikte, müşteri terminalinin belleğine yüklenir. Sınıf tipli bir global değişkenin bir yapıcısı varsa, bu yapıcı global değişkenlerin başlatılmasıyla birlikte çağrılacaktır.

Bunun ardından program, müşteri terminalinden gelecek bir olayı beklemeye başlar. Her MQL5 programı en az bir olay işleyicisine sahip olmalıdır, aksi durumda yüklenen program çalıştırılmayacaktır. Olay işleyicileri ön-tanımlı isimlere, parametrelere ve dönüş tiplerine sahiptir.

Tip

Fonksiyon ismi

Parametreler

Uygulama

Yorum

int

OnInit

yok

Uzman Danışmanlar ve göstergeler

Init olay işleyicisi. void dönüş tipinin kullanımını destekler.

void

OnDeinit

const int reason

Uzman Danışmanlar ve göstergeler

Deinit olay işleyicisi.

void

OnStart

yok

komut dosyaları ve hizmetler

Start olay yöneticisi.

int

OnCalculate

const int rates_total,

const int prev_calculated,

const datetime &Time[],

const double &Open[],

const double &High[],

const double &Low[],

const double &Close[],

const long &TickVolume[],

const long &Volume[],

const int &Spread[]

göstergeler

tüm fiyatlar için Calculate olay işleyicisi.

int

OnCalculate

const int rates_total,

const int prev_calculated,

const int begin,

const double &price[]

göstergeler

Calculate olay işleyicisi - tek bir veri dizisi için.

Göstergeler aynı anda iki olay işleyicisine sahip olamazlar.

BU durumda, veri dizisi üzerinde sadece bir olay işleyicisi çalışacaktır.

void

OnTick

yok

Uzman Danışmanlar

NewTick olay işleyicisi. Yeni tik olayı işlendiği sırada bu türden başka bir olay kabul edilmez.

void

OnTimer

yok

Uzman Danışmanlar ve göstergeler

Timer olay işleyicisi.

void

OnTrade

yok

Uzman Danışmanlar

Trade olay işleyicisi.

double

OnTester

yok

Uzman Danışmanlar

Tester olay işleyicisi.

void

OnChartEvent

const int id,

const long &lparam,

const double &dparam,

const string &sparam

Uzman Danışmanlar ve göstergeler

ChartEvent olay işleyicisi.

void

OnBookEvent

const string &symbol_name

Uzman Danışmanlar ve göstergeler

BookEvent olay işleyici.

Müşteri terminali karşılık gelen açık durumdaki çizelgeye yeni olaylar gönderir. Olaylar, çizelgeler tarafından (çizelge olayları) veya MQL5 programları tarafından (özel olaylar) da gönderilebilir. Bir çizelge üzerindeki grafiksel nesnelerin oluşturulması ve silinmesi olayları, CHART_EVENT_OBJECT_CREATE ve CHART_EVENT_OBJECT_DELETE çizelge özelliklerinin ayarlanmasıyla devreye sokulabilir veya devre dışı bırakılabilir. Her MQL5 programı ve her çizelge kendilerine ait (yeni gelen olayların eklendiği) olay kuyruklarına sahiptir.

Bir program, sadece üzerinde çalıştığı çizelgedeki olayları alır. Tüm olaylar, alım sıralarına göre, birbiri ardına işlenirler. Eğer bir kuyrukta NewTick olayı zaten bulunuyorsa veya bu olay işlenmekteyse, yeni NewTick olayı MQL5 programının olay kuyruğuna eklenmeyecektir. Aynı şekilde, eğer ChartEvent olayı zaten kuyrukta ise, veya bu olay işlenmekteyse, bu türde yeni bir olay kuyruğa eklenmeyecektir. Zamanlayıcı olayları da aynı şekilde işlenir – eğer kuyrukta bir Timer olayı varsa veya bu olay işlenmekteyse, yeni zamanlayıcı olayı kuyruğa eklenmez.

Olay kuyrukları sınırlı ama yeterli büyüklüğe sahiptir, bu yüzden kuyruk aşımı durumu nadiren gerçekleşir. Kuyruk aşımı durumunda, yeni olaylar gözardı edilir.

Olayları yönetmek için sonsuz döngüler kullanmamanız şiddetle önerilir. Muhtemel istisnalar, tek bir Start olayını yöneten komut dosyaları ve hizmetlerdir.

Kütüphaneler olayları işlemezler.

 

Göstergelerde ve Uzman Danışmanlarda İzin verilmeyen Fonksiyonlar

Göstergeler, scriptler ve Uzman Danışmanlar, MQL5 dilinde yazılan çalıştırılabilir programlardır. Farklı görev tipleri için tasarlanmışlardır. Bu yüzden, program tipine bağlı olarak, bazı fonksiyonların kullanımında sınırlamalar vardır. Aşağıdaki fonksiyonların göstergelerde kullanılmasına izin verilmez:

 

Göstergeler için tasarlanmış olan ve Uzman Danışman ve scriptlerde kullanımına izin verilmeyen fonksiyonlar:

Kütüphaneler bağımsız programlar değildir ve onları çağıran başka bir MQL5 programı (scriptler, Uzman Danışmanlar, vaya göstergeler) içinde çalıştırılırlar. Bu nedenle, yukarıdaki kısıtlamalar çağrılan kütüphaneye de uygulanır.

 

Hizmetlerde yasaklanan fonksiyonlar

Hizmetler, bir grafiğe bağlı olmadıkları için hiçbir olayı kabul etmemektedir.  Hizmetlerde aşağıdaki fonksiyonlar yasaktır:

ExpertRemove();

EventSetMillisecondTimer();

EventSetTimer();

EventKillTimer();

SetIndexBuffer();

IndicatorSetDouble();

IndicatorSetInteger();

IndicatorSetString();

PlotIndexSetDouble();

PlotIndexSetInteger();

PlotIndexSetString();

PlotIndexGetInteger();

 

Göstergelerin Yüklenmesi ve Kaldırılması

Göstergeler şu durumlarda yüklenirler:

  • bir göstergenin çizelgeye eklenmesi;
  • terminal başlangıcı (gösterge terminal kapanmadan önce çizelgeye eklenmişse);
  • bir şablonun yüklenmesi (göstergenin eklendiği çizelge, şablonda belirtilmişse);
  • profilin değişimi (gösterge profil çizelgelerinden birine eklenmişse);
  • göstergenin eklendiği çizelgenin sembolünün veya zaman aralığının değiştirilmesi;
  • terminalin bağlı olduğu hesabın değiştirilmesi;
  • göstergenin başarılı bir şekilde yeniden derlenmesi sonucunda, eğer gösterge çizelgeye eklenmiş durumdaysa;
  • göstergenin giriş parametrelerinin değiştirilmesi.

 

Göstergeler şu durumlarda çizelgeden kaldırılırlar:

  • göstegenin çizelgeden açık yolla kaldırılması;
  • terminalin kapatılması (gösterge çizelgeye ekli durumdaysa);
  • bir şablonun yüklenmesi durumunda, gösterge çizelgeye ekli durumdaysa;
  • göstergenin eklendiği çizelgenin kapatılması;
  • profil değişimi, gösterge değiştirilen profildeki çizelgeye ekli durumdaysa;
  • göstergenin eklendiği çizelgenin sembolünün veya zaman aralığının değiştirilmesi;
  • terminalin bağlı olduğu hesabın değiştirilmesi;

 

Uzman Danışmanların Yüklenmesi ve Kaldırılması

Uzman danışmanlar şu durumlarda yüklenirler:

  • çizelgeye bir Uzman Danışman eklendiğinde;
  • terminalin başlatılması (Uzman Danışman terminal kapanmadan önce çizelgeye eklenmişse);
  • bir şablonun yüklenmesi (Uzman Danışmanın eklendiği çizelge, şablonda belirtilmişse);
  • profil değişimi (Uzman Danışman profil çizelgelerinden birine eklenmişse);
  • bir hesaba bağlanılması, hesap numarası aynı olsa bile (Uzman Danışman, terminal sunucu üzerinde yetkilendirilmeden öce çizelgeye eklenmişse).
     

Uzman Danışmanlar şu durumlarda kaldırılırlar:

  • Uzman Danışmanın açık şekilde çizelgeden kaldırılması;
  • eğer çizelge üzerinde zaten bir Uzman Danışman mevcutsa, yeni bir Uzman Danışmanın çizelgeye eklenmesiyle eskisi kaldırılacaktır.
  • terminalin kapatılması (eğer Uzman Danışman çizelgeye ekli durumdaysa);
  • bir şablonun yüklenmesi (eğer Uzman Danışman çizelgeye ekli durumdaysa);
  • Uzman Danışmanın eklendiği çizelgenin kapatılması.
  • profil değişimi; Uzman Danışman değiştirilen profildeki çizelgeye ekli durumdaysa; profile;
  • terminalin bağlı olduğu hesabın değiştirilmesi (Uzman Danışman, terminal sunucu üzerinde yetkilendirilmeden öce çizelgeye eklenmişse);

Uzman Danışmanın eklendiği çizelgenin zaman aralığı veya sembolünün değişmesi durumunda Uzman Danışman yüklenmez veya kaldırılmaz. bu durumda müşteri terminali sırayla eski sembol/zaman aralığı için OnDeinit() işleyicisini ve sembol/zaman aralığı için (eğer varsa) OnInit() işleyicisini çağırır; global değişkenlerin ve statik değişkenlerin değerleri sıfırlanmaz. Uzman Danışmanın başlatılmasından önceki tüm olaylar (OnInit() fonksiyonu) atlanır.

 

Scriptlerin Yüklenmesi ve Kaldırılması

Scriptler bir çizelgeye eklenmelerinin hemen ardından yüklenirler ve işlemlerinin bitmesiyle kaldırılırlar. OnInit() ve OnDeinit() fonksiyonları scriptlerde çağrılmaz.

Bir program kaldırıldığında (çizelge üzerinden silindiğinde), müşteri terminali global değişkenleri sonlandırır ve olay kuyruğunu siler. Bu durumda, sonlandırma, string tipli değişkenlerin sıfırlanması, dinamik dizi nesnelerinin bellek alanlarının boşaltılması ve değişken iseler yıkıcılarının çağrılması anlamına gelir.

 

Hizmetleri Yükleme ve Kaldırma

Eğer hizmetler terminal kapatılırken başlatıldılarsa, bu hizmetler terminal başlatıldıktan hemen sonra yüklenir. Hizmetler işlerini tamamladıktan hemen sonra kaldırılır.

Hizmetlerin, örneğin ağ fonksiyonlarını kullanarak kullanıcı tanımlı semboller oluşturma ve güncelleme gibi, sonsuz bir veri alma ve işleme döngüsü uygulayabileceğiniz tek bir OnStart() işleyicisi vardır.

Uzman Danışmanlar, göstergeler ve komut dosyalarından farklı olarak, hizmetler belirli bir grafiğe bağlı değildir, bu nedenle hizmetleri başlatmak için ayrı bir mekanizma sağlanmaktadır.  Kılavuz'da "Hizmet Ekle" komutu kullanılarak yeni bir hizmet örneği oluşturulur. Bir hizmet örneği, uygun örnek menüsü kullanılarak başlatılabilir, durdurulabilir ve kaldırılabilir. Tüm örnekleri yönetmek için hizmet menüsünü kullanın.

 

Uzman Danışman İşleminin daha iyi anlaşılması için aşağıdaki kodun derlenmesi ve yükleme/kaldırma, şablon değişimi, sembol değişimi, zaman aralığının değişimi vb. işlemlerinin gerçekleştirilmesi tavsiye edilir

Örnek:

//+------------------------------------------------------------------+
//|                                                   TestExpert.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
class CTestClass
  {
public:  
   CTestClass() { Print("CTestClass constructor"); }
   ~CTestClass() { Print("CTestClass destructor"); }
  };
CTestClass global;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Print("Başlatma");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Print("Sonlandırma sebebi",reason);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+------------------------------------------------------------------+

Ayrıca Bakınız

Müşteri terminali olayları, Olay işleyiciler