Olay İşleyici Fonksiyonları

MQL5 dili önceden tanımlanmış olayların işlenmesini sağlar. Bu olayları işleyecek fonksiyonlar MQL5 programı içinde tanımlanmalıdır. Fonksiyon ismi, dönüş tipi, (eğer varsa) parametrelerin düzenleri ve tipleri, olay işleyici fonksiyonun tarifine sıkı sıkıya uymalıdır.

Müşteri terminalinin olay işleyicisi, herhangi bir olayın işlenmesini sağlayan fonksiyonları, dönüş değeri tipine veya parametrelerin tipine göre tanımlar. Eğer bir fonksiyon için, alt tariflere uygun olmayan başka parametreler belirlenmişse, veya bu fonksiyon için istenen başka bir dönüş tipi varsa, böyle bir fonksiyon olay işleyici olarak kullanılamaz.

OnStart #

OnStart() fonksiyonu Start olayının işleyicisidir ve otomatik olarak, sadece çalışan script dosyaları için oluşturulur. Parametre içermeyen void tipinde olmalıdır:

void OnStart();

OnStart() fonksiyonu için, int dönüş tipi belirlenebilir.

OnInit #

OnInit() fonksiyonu Init olayının işleyicisidir. Parametresiz şekilde, void tipinde veya int tipinde olmalıdır:

void OnInit();

Init olayı, bir Uzman Danışmanın veya bir göstergenin yüklenmesi sonrasında hemen oluşturulur (betik dosyaları için oluşturulmaz). OnInit() fonksiyonu başlatma için kullanılır. OnInit() int tipi dönüş değerine sahiptir. Sıfır harici tüm dönüş kodları başlatmanın başarısız olduğu anlamına gelir ve bu durumda REASON_INITFAILED sonlandırma sebebi kodu ile Deinit olayı oluşturulur.

INIT_FAILED geri döndürüldüğünde, Uzman Danışman grafikten zorla kaldırılır.

INIT_FAILED geri döndürüldüğünde, gösterge grafikten kaldırılmaz. Grafik üzerinde kalan gösterge çalışmaz - olay işleyicileri göstergede çağrılmaz.

Uzman Danışmanlarda giriş parametrelerinin optimize edilmesi için, dönüş kodu olarak ENUM_INIT_RETCODE sayımının kullanılması tavsiye edilir. Bu değerler, en uygun sınama temsilcilerinin seçimi de dahil olmak üzere, optimizasyon biçiminin düzenlenmesi için kullanılır. Uzman danışmanın başlatılması sırasında, sınamaya başlamadan önce TerminalInfoInteger() fonksiyonunu kullanarak, sınama temsilcisinin yapılanması ve kaynakları (çekirdek sayısı, serbest bellek miktarı, vb.) hakkında bilgi alabilirsiniz. Elde edilen bilgi doğrultusunda Uzman Danışmanın optimizasyonu esnasında ilgili sınama temsilcisini kullanıp kullanmayacağınıza karar verebilirsiniz.

ENUM_INIT_RETCODE

Tanımlayıcı

Açıklama

INIT_SUCCEEDED

Başlatma işlemi başarılı, Uzman Danışmanın sınanmasına devam edilebilir.

Bu kod, boş değerle aynı şeyi ifade eder – Uzman Danışman, sınayıcı içinde başarılı şekilde başlatıldı.

INIT_FAILED

Başlatma işlemi başarısız oldu. Önemli hatalar nedeniyle, sınamayı devam ettirmenin bir anlamı yok. Örneğin: Uzman Danışmanın işini yapması istenen bir göstergenin oluşturulması başarısız oldu.

Bu dönüş değeri sıfırdan farklı bir değer anlamına gelir - Uzman danışman sınayıcı içinde başlatılamadı.

INIT_PARAMETERS_INCORRECT

Bu değer giriş parametrelerinin yanlış ayarlandığı anlamına gelir. Bu dönüş kodunu içeren sonuç dizgisi, genel optimizasyon tablosunda kırmızı ile vurgulanır.

Uzman Danışmanın verilen parametreleri için sınama gerçekleştirilmeyecek, sınama temsilcisi yeni bir görev için hazır.

Bu değerin alınmasından sonra, strateji sınayıcı, yeniden deneme için bu görevi diğer sınama temsilcilerine aktarmayacaktır.

INIT_AGENT_NOT_SUITABLE

Başlatma işlemi sırasında hata yok ama bir sebepten dolayı temsilci sınama için uygun değil. Örneğin, yeterli bellek yok, OpenCL desteği yok, vb.

Bu dönüşün alınmasından sonra sınama temsilcisi optimizasyon işleminin sonuna kadar yeni görev kabul etmeyecektir.

Void tipli OnInit() fonksiyonu daima başarılı başlatma işlemi anlamına gelir.

OnDeinit #

OnDeinit() fonksiyonu, sonlandırma yapılırken çağrılan Deinit olay işleyicisidir. void tipi ile bildirilmelidir ve const int tipi, sonlandırma sebebi kodunu içeren bir parametreye sahip olmalıdır. Farklı bir tip bildirildiği takdirde, derleyici bir uyarı oluşturacaktır ve fonksiyon çağrılmayacaktır. Betik dosyalarında Deinit olayı oluşturulmayacağı için OnDeinit() fonksiyonu da kullanılmayacaktır.

void OnDeinit(const int reason);

'Deinit' olayı Uzman danışmanlar ve göstergeler için şu durumlarda oluşturulur:

  • Yeniden başlatma işleminden önce, MQL5 programının iliştirildiği grafiğin sembolünün/periyodunun değişmesine bağlı olarak;
  • MQL5 programı kaldırılmadan önce.

OnTick #

NewTick olayı sadece Uzman Danışmanlar için, Uzman danışmanın iliştirilmiş olduğu çizelgede sembol için yeni bir tik alındığında oluşturulur. OnTick() fonksiyonunun özel göstergelerde ve scriptlerde kullanımı anlamsızdır, çünkü NewTick olayı bu programlar için oluşturulmaz.

Tik olayı sadece Uzman Danışmanlar için oluşturulur ama bu Uzman Danışmanlarda OnTick() fonksiyonunun kullanılmasının zorunlu olduğu anlamına gelmemektedir. Bunun nedeni, Uzman Danışmanlarda sadece NewTick olayının değil, aynı zamanda; Timer, BookEvent ve ChartEvent olaylarının da oluşturulmuş olmasıdır. fonksiyon void tipi ile, parametreler olmadan bildirilmelidir:

void OnTick();

OnTimer #

OnTimer() fonksiyonu Timer (zamanlayıcı) olayı oluştuğunda çağrılır. Bu olay, sistem saati tarafından oluşturulur ve sadece Uzman Danışmanlar ve göstergeler içindir - scriptlerde kullanılamaz. Olayın gerçekleşme sıklığı, EventSetTimer() fonksiyonu aracılığıyla alınan olay uyarılarına abone olunduğunda ayarlanır.

EventKillTimer() fonksiyonu ile timer olayının aboneliği sonlandırılabilir. Fonksiyon void tipi ile parametreler olmadan bildirilmelidir:

void OnTimer();

EventSetTimer() fonksiyonunun, OnInit() içerisinde bir kere ve EventKillTimer() fonksiyonunun da, OnDeinit() içerisinde bir kere çağrılması tavsiye edilir.

Tüm göstergeler ve Uzman Danışmanlar kendi saatleri (timer) ile çalışırlar ve olayları sadece bu saatten alırlar MQL5 programı sonlandırıldığında, EventKillTimer() fonksiyonu kullanılmamış olsa bile saat zor kullanılarak yok edilecektir.

OnTrade #

Bu fonksiyon Trade (alım-satım) olayı oluştuğunda çağrılır. Bu olay, verilmiş emirlerin, açık pozisyonların, emir ve işlem geçmişlerinin listesinde bir değişiklik görüldüğünde oluşur. Bir alım-satım aktivitesi (bekleyen emir açılması, pozisyon açılıp kapanması, durdurma ayarları, bekleyen emrin tetiklenmesi, vb.) gerçekleştiğinde, emir ve işlem geçmişi ve/veya pozisyonların ve mevcut emirlerin listesi de buna bağlı olarak değişecektir.

void OnTrade();

Böyle bir olay alındığında, kullanıcı hesap doğrulama işlemini fonksiyondan bağımsız olarak koda uygulamalıdır (alım-satım stratejisi koşullarında gerekliyse). OrderSend() fonksiyonu çağrısının başarıyla tamamlanması ve 'true' dönüş değerinin alınması, alım-satım sunucusunun emri işlem sırasına aldığını ve buna bir fiş numarası verdiğini gösterir. Sunucu bu emri işlediği anda Trade olayı oluşturulacaktır. Kullanıcı, fiş değerini OnTrade() olay işleyici içerisinde kullanarak, bu emre ne olduğunu öğrenebilir.

OnTradeTransaction #

Alım-satım hesabı üzerinde bazı kesin işlemler gerçekleştirildiği zaman hesabın durumu değişir. Bu eylemler şunları kapsamaktadır:

  • OrderSend ve OrderSendAsync fonksiyonları kullanılarak herhangi bir MQL5 uygulamasından yapılan alım-satım istekleri ve bunların ilerideki kullanımları;
  • Terminalin grafiksel arayüzü ile yapılan alım satım istekleri ve bunların ilerideki kullanımları;
  • Sunucu üzerindeki bekleyen emir ve durdurma emri aktivasyonu;
  • İşlemlerin alım-satım sunucusu tarafından gerçekleştirilmesi.

Yukarıda sayılanlar eylemlerin sonucunda şu alım-satım faaliyetleri gerçekleşir:

  • alım-satım isteğinin işlenmesi;
  • açık emirlerin değişimi;
  • emir geçmişinin değişimi;
  • işlem geçmişinin değişimi;
  • pozisyonların değişimi.

Örneğin, bir alım emri gönderildiğinde, önce işlenir, hesap için uygun bir alım emri oluşturulur, gerçekleştirilir ve açık emir listesinden çıkarılır, sonra emir geçmişine eklenir, uygun bir işlem geçmişe eklenir ve yeni pozisyon açılır. Tüm bu eylemler alım-satım faaliyetidir. Böyle bir faaliyetin terminale ulaşımı ise TradeTransaction olayıdır. Olay, (gerçekleştiğinde) OnTradeTransaction işleyicisini çağırır

void  OnTradeTransaction(
   const MqlTradeTransaction   trans,        // alım-satım faaliyeti yapısı
   const MqlTradeRequest&        request,      // istek yapısı
   const MqlTradeResult&         result        // sonuç yapısı
   );

İşleyici üç parametre içerir:

  • trans - bu parametre, hesaba uygulanan alım-satım faaliyetini tanımlayan MqlTradeTransaction yapısını alır;
  • request - bu parametre alım-satım isteğini tanımlayan MqlTradeRequest yapısını alır;
  • result - bu parametre, alım-satım isteğinin sonucunu tanımlayan MqlTradeResult yapısını alır.

request ve result şeklindeki son iki parametre sadece TRADE_TRANSACTION_REQUEST tipi faaliyet için verilerle doldurulur, faaliyet verisi trans değişkeninin type parametresinden alınabilir. Bilinmelidir ki bu durumda, trans değişkeninde tarif edilen alım-satım faaliyetinin gerçekleşmesinin ardından, result değişkeninin request_id alanı, request alım-satım talebinin tarifini içerir. Request ID, gerçekleştirilen eylemi (OrderSend veya OrderSendAsync fonksiyonlarının çağrısı) ve eylemin OnTradeTransaction()'na gönderilen sonucunu ilişkilendirir.

El yordamıyla terminalden veya kod kullanarak OrderSend()/OrderSendAsync() fonksiyonları ile gönderilen bir alım-satım isteği, alım-satım sunucusu üzerinde bir çok ardışık faaliyet oluşturabilir. Bu faaliyetlerin terminale ulaşım önceliği garanti edilmez. Bu yüzden, alım-satım algoritmanızı geliştirirken, bir grup faaliyetin bir diğerinden sonra ulaşacağını düşünmemelisiniz.

  • Alım-satım faaliyetlerinin tüm tipleri ENUM_TRADE_TRANSACTION_TYPE sayımı içerisinde tarif edilmiştir.
  • Bir alım-satım faaliyetini tanımlayan MqlTradeTransaction yapısı faaliyet tipine bağlı olarak değişik yollarla doldurulur. Örneğin, TRADE_TRANSACTION_REQUEST tipinde bir faaliyet için sadece tip alanı (alım satım faaliyeti tipi) analiz edilmelidir. OnTradeTransaction fonksiyonunun ikinci ve üçüncü parametreleri ise (request ve result), ilave veriler için analiz edilmelidir. Daha fazla bilgi için, bakınız "Bir Alım-Satım Faaliyetinin yapısı".
  • Bir alım satım faaliyetinin tarifi, emirler, işlemler ve pozisyonlarla ilgili bütün bilgileri içermez (ör. yorumlar). OrderGet*, HistoryOrderGet*, HistoryDealGet* ve PositionGet* fonksiyonları ayrıntılı bilgileri elde etmek için kullanılmalıdır.

Alım-satım faaliyetlerinin müşteri hesabına uygulanmasından sonra, faaliyetler terminalin alım-satım faaliyetleri kuyruğuna kalıcı şekilde eklenirler. Buradan, terminale ulaşım sıralarına göre OnTradeTransaction girdi noktasına gönderilirler.

Alım-satım faaliyetleri bir Uzman Danışman aracılığı ile, OnTradeTransaction işleyicisi kullanılarak işlenirken, terminal yeni ulaşan alım-satım faaliyetlerini işlemeye devam eder. Bu şekilde, alım-satım hesabının durumu OnTradeTransaction işlemi sırasında sürekli değişebilir. Örneğin, bir MQL5 programı yeni bir emir ekleme olayını işlerken, bu emir uygulanmış, açık emirlerin listesinden silinmiş ve geçmişe eklenmiş olabilir. Uygulama daha sonra bu olaylar hakkında bilgilendirilir.

Faaliyetler kuyruğunun uzunluğu 1024 elemandır. OnTradeTransaction fonksiyonu uzun süredir yeni bir faaliyeti işliyorsa, kuyruktaki eski faaliyetlerin yerini daha yeni olanlar alabilir.

  • Genel olarak, OnTrade ve OnTradeTransaction çağrıları için kesin bir oran yoktur. Bir OnTrade çağrısı birkaç OnTradeTransaction çağrısına karşılık gelir.
  • OnTrade çağrısı, uygun OnTradeTransaction çağrılarından sonra gerçekleşir.

OnTester #

OnTester() fonksiyonu Tester olayının işleyicisidir. Bir Uzman Danışmanın seçilen tarih aralığında sınanmasının ardından otomatik olarak oluşturulur. Fonksiyon, double tipinde ve parametreler olmadan tanımlanmalıdır:

double OnTester();

Fonksiyon çağrısı, OnDeinit() çağrısının hemen öncesinde yapılır. Dönüş değeri ile aynı tipe sahiptir - double. OnTester() Uzman Danışmanların sınanmasında kullanılabilir. Fonksiyonun ana amacı, giriş parametrelerinin genetik optimizasyonunda Custom max kriteri olarak kullanılan kesin bir değeri hesaplamaktır.

Genetik optimizasyonda, bir jenerasyon içindeki sonuçlara azalan yapılı sıralama uygulanır. Yani optimizasyon kriteri açısından en iyi sonuçlar en yüksek değerlere sahip olanlardır (Custom max optimizasyon kriteri için OnTester fonksiyonunun dönüş değerleri alınır). Bu şekildeki bir sıralamada en kötü değerler sonda yer alır. Bu değerler daha sonra dışarı atılırlar ve yeni jenerasyonun oluşumuna katılmazlar.

OnTesterInit #

OnTesterInit() fonksiyonu, strateji sınayıcıdaki Uzman Danışman optimizasyonu başlamadan önce otomatik olarak oluşturulan TesterInit olayının işleyicisidir. Fonksiyon 'void' tipi ile tanımlanmalıdır. Parametreleri yoktur:

void OnTesterInit();

Optimizasyonun başlamasıyla, OnTesterDeinit() veya OnTesterPass() işleyicisine sahip bir Uzman Danışman; sınayıcı içinde belirlenen sembol ve zaman aralığı ile oluşturulan, ayrı bir terminal grafiğine otomatik olarak yüklenir ve TesterInit olayını teslim alır. Fonksiyon, optimizasyona geçilmeden önce, daha sonraki optimizasyon sonuçlarının işlenmesi aşaması için, Uzman Danışmanlarda kullanılır.

OnTesterPass #

OnTesterPass() fonksiyonu TesterPass olayının işleyicisidir. Bu olay, Uzman Danışman optimizasyonu sırasında bir çerçeve alındığında otomatik olarak oluşturulur. Fonksiyon 'void' tipi ile tanımlanmalıdır. Parametreleri yoktur:

void OnTesterPass();

OnTesterPass() işleyicili bir Uzman Danışman, sınama için belirlenen sembol/zaman aralığı değerleri ile otomatik olarak ayrı bir terminal grafiğine yüklenir ve optimizasyon sırasında bir çerçeve alındığında TesterPass olaylarını yakalar. Fonksiyon, optimizasyon sonuçlarının dinamik olarak tamamlanmasını beklemeksizin "anında" işlenmesi için kullanılır. Çerçeveler, OnTester() işleyicisindeki bir tekil geçişin bitmesinden sonra çağrılabilen FrameAdd() fonksiyonu kullanılarak eklenirler.

OnTesterDeinit #

OnTesterDeinit() fonksiyonu, Uzman Danışman optimizasyonunun sonrasında otomatik olarak oluşturulan TesterDeinit olayının işleyicisidir. Fonksiyon 'void' tipi ile tanımlanmalıdır. Parametreleri yoktur:

void OnTesterDeinit();

TesterDeinit() işleyicili bir Uzman Danışman, optimizasyonun başlangıcında otomatik olarak bir grafiğe yüklenir ve tamamlanmasının ardından TesterDeinit olayını teslim alır. Fonksiyon, tüm optimizasyon sonuçlarının son işlemleri için kullanılır.

OnBookEvent #

OnBookEvent() fonksiyonu BookEvent olayının işleyicisidir. BookEvent sadece Uzman Danışmanlar ve göstergeler içindir, Piyasa Derinliği değiştiğinde oluşturulur. Fonksiyon 'void' tipinde olmalıdır ve 'string' tipi bir parametre içermelidir:

void OnBookEvent (const stringsymbol);

Herhangi bir sembolün 'BookEvent' olayını alabilmek için, MarketBookAdd() fonksiyonunu kullanarak, önceden bu olaylara abone olmalısınız. Belirli bir semboldeki 'BookEvent' aboneliğini sonlandırmak için MarketBookRelease() fonksiyonunu çağırın.

Diğer olaylardan farklı olarak, BookEvent olayı bir yayındır. Yani bir Uzman Danışman, 'MarketBookAdd' fonksiyonunu kullanarak 'BookEvent' olaylarına abone olursa, OnBookEvent() işleyicisine sahip tüm diğer Uzman Danışmanlar da bu olayı alacaklardır. Bu yüzden, işleyiciye 'const string& symbol' parametresiyle geçirilen sembol ismi iyi incelenmelidir.

OnChartEvent #

OnChartEvent() fonksiyonu, ChartEvent olaylarından oluşan bir grubun işleyicisidir. Bu olaylar şöyle tarif edilebilir:

  • CHARTEVENT_KEYDOWN — çizelge penceresinin odaklanmasındaki tuş darbesi olayı ;
  • CHARTEVENT_MOUSE_MOVE — fare hareketi olayı ve fare tıklama olayı (eğer çizelge için CHART_EVENT_MOUSE_MOVE=true şeklinde ayar yapılmışsa);
  • CHARTEVENT_OBJECT_CREATE — grafiksel nesne oluşturma olayı (eğer çizelge için CHART_EVENT_OBJECT_CREATE=true şeklinde ayar yapılmışsa);
  • CHARTEVENT_OBJECT_CHANGE — özellikler iletişim kutusu ile bir nesnenin özelliğini değiştirme olayı;
  • CHARTEVENT_OBJECT_DELETE — grafiksel nesne silinme olayı (eğer çizelge için CHART_EVENT_OBJECT_DELETE=true şeklinde ayar yapılmışsa);
  • CHARTEVENT_CLICK — çizelge üzerinde fare tıklaması olayı;
  • CHARTEVENT_OBJECT_CLICK — çizelge üzerindeki grafiksel nesnenin fare ile tıklanması olayı;
  • CHARTEVENT_OBJECT_DRAG — fare kullanılarak grafiksel nesnenin taşınması olayı;
  • CHARTEVENT_OBJECT_ENDEDIT — LabelEdit grafiksel nesnesinin giriş kutusundaki metin düzenleme işleminin bitmesi olayı;
  • CHARTEVENT_CHART_CHANGE — çizelge değişimleri olayı;
  • CHARTEVENT_CUSTOM+n — kullanıcı olayı kimliği (n, 0 ile 65535 arası bir değer alır).
  • CHARTEVENT_CUSTOM_LAST — en son kabul edilebilir kullanıcı olayı kimliği (CHARTEVENT_CUSTOM +65535).

Funksiyon sadece Uzman Danışmanlar ve göstergeler tarafından çağrılabilir. Fonksiyon void tipinde ve 4 parametreli olmalıdır:

void OnChartEvent(const int id,         // Olay kimliği
                  const long& lparam,   // long tipi olay parametresi
                  const double& dparam, // double tipi olay parametresi
                  const string& sparam  // string tipi olay parametresi
  );

Her olay tipi için, OnChartEvent() fonksiyonunun giriş parametreleri, mevcut olayı işleyebilmek için kesin değerlere sahiptir. Bu parametreler aracılığıyla geçilen olay ve değerler aşağıdaki tabloda listelenmiştir.

Olay

id parametresinin değeri

lparam parametresinin değeri

dparam parametresinin değeri

sparam parametresinin değeri

Tuş darbesi olayı

CHARTEVENT_KEYDOWN

basılmış bir tuşun kodu

Tekrar sayısı (kullanıcının tuşa basılı tutması sonucu tekrarlanan tuş darbelerinin sayısı)

Klavye tuşlarının durumunu tarif eden bir bit maskesinin dizgi değeri

Fare olayları (Eğer çizelge için CHART_EVENT_MOUSE_MOVE=true şeklinde ayar yapılmışsa)

CHARTEVENT_MOUSE_MOVE

X koordinatı

Y koordinatı

Fare tuşlarının durumunu tarif eden bir bit maskesinin string tipli değeri

Grafiksel nesne oluşturma olayı (çizelge için CHART_EVENT_OBJECT_CREATE=true şeklinde ayar yapılmışsa)

CHARTEVENT_OBJECT_CREATE

Oluşturulan grafiksel nesnenin adı

Özellikler iletişim kutusu ile bir nesnenin özelliğinin değiştirilmesi olayı

CHARTEVENT_OBJECT_CHANGE

Değiştirilen grafiksel nesnenin adı

Grafiksel nesnenin silinmesi olayı (Eğer çizelge için CHART_EVENT_OBJECT_DELETE=true şeklinde ayar yapılmışsa)

CHARTEVENT_OBJECT_DELETE

Silinen grafiksel nesnenin ismi

Çizelge üzerinde fare tıklaması olayı

CHARTEVENT_CLICK

X koordinatı

Y koordinatı

Çizelge üzerindeki bir grafiksel nesnenin fare ile tıklanması olayı

CHARTEVENT_OBJECT_CLICK

X koordinatı

Y koordinatı

Olayın gerçekleştiği grafiksel nesnenin ismi

Grafiksel nesnenin fare ile sürüklenmesi olayı

CHARTEVENT_OBJECT_DRAG

Taşınan grafiksel nesnenin adı

LabelEdit grafiksel nesnesinin giriş kutusunda yapılan metin düzenleme işinin bitmesi olayı

CHARTEVENT_OBJECT_ENDEDIT

Metin düzenlemesi tamamlanan LabelEdit grafiksel nesnesinin adı

Çizelge değişimleri olayı

CHARTEVENT_CHART_CHANGE

N sayısının altındaki kullanıcı olayının kimliği

CHARTEVENT_CUSTOM+N

EventChartCustom() fonksiyonu tarafından ayarlanmış değer

EventChartCustom() fonksiyonu tarafından ayarlanmış değer

EventChartCustom() fonksiyonu tarafından ayarlanmış değer

OnCalculate #

OnCalculate() fonksiyonu sadece özel göstergeler içinde, gösterge değerlerinin Calculate olayı tarafından hesaplanması gerektiğinde çağrılır. Bu genellikle, göstergenin hesaplanacağı sembol için yeni bir tik alınmasıyla gerçekleşir. Göstergenin bu sembol için oluşturulmuş herhangi bir fiyat çizelgesine iliştirilmesi gerekmez.

OnCalculate() fonksiyonu 'int' tipli bir dönüş değerine sahip olmalıdır. Fonksiyonun tanımının iki türü mevcuttur. Gösterge içerisinde iki versiyon birlikte kullanılamaz.

İlk versiyon, tek bir veri tamponu üzerinde hesaplanabilecek göstergeler içindir. BU tip göstergeler için Custom Moving Average örnek verilebilir.

int OnCalculate (const int rates_total,      // price[] dizisinin büyüklüğü
                 const int prev_calculated,  // önceki çağrıda işlenmiş çubuklar
                 const int begin,            // anlamlı verilerin başladığı yer
                 const double& price[]       // hesaplanacak dizi
   );

Bir zaman serisi veya başka bir göstergenin hesaplanmış bir tamponu, price[] dizisi olarak kullanılabilir. 'price[]' dizisinin indisleme yönünü belirlemek için ArrayGetAsSeries() fonksiyonunu çağırın. Çalışılmak istenen dizilerde ön tanımlı değerlere bağlı kalmamak amacıyla, ArraySetAsSeries() fonksiyonunu koşulsuz olarak çağırmalısınız.

price[] dizisi olarak kullanılacak zaman serisi veya gösterge, kullanıcı tarafından göstergenin başlatımı sırasında parametreler sekmesinden seçilebilir. Bunun için, gerekli parçayı "Uygula" alanındaki çekme liste içinde belirtmelisiniz.

Göstergenin hesaplanması için zaman serisinin seçimi

Diğer MQL5 programlarından bir özel göstergenin değerlerini alabilmek için iCustom() fonksiyonu kullanılır. Bu fonksiyon sonraki işlemler için gösterge tanıtıcı değerine dönüş yapar. Uygun price[] dizisini veya başka bir göstergenin tanıtıcı değerini de ayrıca belirleyebilirsiniz. Bu parametre, özel göstergenin giriş değişkenleri listesi içinde son sırada olmalıdır.
Örnek:

void OnStart()
  {
//---
   string terminal_path=TerminalInfoString(STATUS_TERMINAL_PATH);
   int handle_customMA=iCustom(Symbol(),PERIOD_CURRENT"Custom Moving Average",13,0, MODE_EMA,PRICE_TYPICAL);
   if(handle_customMA>0)
      Print("handle_customMA = ",handle_customMA);
   else
      Print("Açılamıyor veya EX5 dosyası değil '"+terminal_path+"\\MQL5\\Indicators\\"+"Custom Moving Average.ex5'");
  }

Örnekte, geçirilmiş son parametre (ENUM_APPLIED_PRICE sayımından) PRICE_TYPICAL değeridir. Bu değer, özel göstergenin (High+Low+Çlose)/3 şeklinde elde edilen tipik fiyatlar üzerine inşa edileceğini belirtir. Parametre belirtilmemesi durumunda, gösterge PRICE_CLOSE değerlerinin, yani çubukların kapanış değerlerinin üzerine inşa edilir.

Gösterge tanıtıcı değerinin, price[] dizisini belirlemek amacıyla son parametre olarak geçirilmesine bir örnek de, iCustom() fonksiyonunun tarifinde verilmiştir.
 

İkinci versiyon, hesaplamalarda birden fazla zaman serisinin kullanıldığı diğer tüm göstergeler için düşünülmüştür.

int OnCalculate (const int rates_total,      // girdi zaman serilerinin büyüklüğü
                 const int prev_calculated,  // bir önceki çağrıda işlenmiş çubuklar
                 const datetime& time[],     // Zaman
                 const double& open[],       // Açılış
                 const double& high[],       // Yüksek
                 const double& low[],        // Düşük
                 const double& close[],      // Kapanış
                 const long& tick_volume[],  // Tik Hacmi
                 const long& volume[],       // Reel Hacim
                 const int& spread[]         // Makas (Alım-satım Farkı)
   );

open[], high[], low[] ve close[] parametreleri; açılış fiyatları, yüksek ve düşük fiyatlar ve kapanış fiyatları dizilerini içermektedir. time[] parametresi açılış zamanlarının olduğu bir diziyi içerir. spread[] parametresi (alım-satımı yapılan menkul değer için verilmişse) makas değerlerinin geçmişini içerir. volume[] ve tick_volume[] parametreleri ise, sırasıyla alım-satım ve tik hacimlerinin geçmişini içerir.

time[], open[], high[], low[], close[], tick_volume[], volume[] ve spread[] dizilerinin indisleme yönünü belirlemek için ArrayGetAsSeries() çağrısı yapabilirsiniz. Çalışılmak istenen dizilerde ön tanımlı değerlere bağlı kalmamak amacıyla ArraySetAsSeries() fonksiyonunu koşulsuz olarak çağırmalısınız.

İlk sıradaki 'rates_total' parametresi gösterge hesabı için kullanılabilecek mevcut çubukların sayısını içerir. Bu, çizelge içinde mevcut olan çubuk sayısına karşılık gelir.

OnCalculate() fonksiyonunun dönüş değeri ile ikinci giriş parametresi 'prev_calculated' arasındaki ilişki not edilmelidir. Fonksiyon çağrısı sırasında 'prev_calculated' parametresi önceki çağrıda OnCalculate() tarafından dönülmüş değeri içerir. Böylece, göstergenin hesaplanması sırasında, fonksiyonun önceki çalışmasından bu yana değişmemiş çubuklar için yapılan hesapların tekrarından kaçınılabilir.

Bu amaçla, mevcut fonksiyon çağrısındaki çubukların sayısını içeren 'rates_total' parametresinin, dönüş değeri olarak kullanılması, genellikle yeterli olacaktır. OnCalculate()'in son çağrısından bu yana, fiyat verisinde bir değişiklik gerçekleşmişse (daha derin bir geçmiş indirilmişse veya geçmiş boşlukları doldurulmuşsa), 'prev_calculated' parametresinin değeri terminal tarafından sıfırlanır.

Not: OnCalculate sıfıra dönüş yaparsa, gösterge verileri müşteri terminalinin Veri Penceresinde gözükmez.

Bunu daha iyi anlayabilmek için aşağıda verilen göstergenin çalıştırılması yararlı olacaktır.

Gösterge örneği:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot Line
#property indicator_label1  "Line"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDarkBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- gösterge tamponları
double         LineBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- gösterge tamponlarının eşlenmesi
   SetIndexBuffer(0,LineBuffer,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
//--- Mevcut sembol için mevcut zaman aralığındaki çubukların sayısını al
   int bars=Bars(Symbol(),0);
   Print("Bars = ",bars,", rates_total = ",rates_total,",  prev_calculated = ",prev_calculated);
   Print("time[0] = ",time[0]," time[rates_total-1] = ",time[rates_total-1]);
//--- bir sonraki çağrı için prev_calculated değerine dönüş yap
   return(rates_total);
  }
//+------------------------------------------------------------------+

Ayrıca Bakınız

Programların Çalıştırılması, Müşteri Terminali Olayları, Olaylarla Çalışma