İçe Aktarılmış Fonksiyonların Çağrılması

Bir MQL5 programının çalıştırılması sırasında fonksiyonları içe aktarmak amacıyla, müşteri terminali erken bağlama yöntemini kullanır. Yani bir program, içe aktarılan bir fonksiyonu çağırmışsa, karşılık gelen modül (ex5 veya dll) programla birlikte yüklenir. MQL5 ve DLL kütüphaneleri, çağıran modülün iş parçacığında çalıştırılır.

Modülün tam isminin (Drive:\Directory\FileName.Ext) kullanılması tavsiye edilmez. MQL5 kütüphaneleri terminal_dizini\MQL5\Libraries klasöründen yüklenirler. Kütüphane bulunamamışsa, terminal bunu terminal_dir\experts klasöründen yüklemek için girişimde bulunur.

Sistem kütüphaneleri (DLL), işletim sisteminin kurallarına göre yüklenirler. Kütüphane önceden yüklenmişse (örneğin, başka bir uzman danışmandan veya paralel çalışan başka bir müşteri terminalinden bile yüklenmişse), çağrılar daha önceden yüklenmiş olan kütüphaneye gider. Aksi durumda şu sıra kullanılarak arama gerçekleştirilir:

  1. Modülün çalıştığı ve dll dosyasını içe aktardığı dizin. Buradaki modül bir Uzman Danışman, bir script veya bir EX5 kütüphanesi olabilir;
  2. terminal_veri_dizini\MQL5\Libraries dizini (TERMINAL_DATA_PATH\MQL5\Libraries);
  3. MetaTrader 5 müşteri terminalinin başlatıldığı konum;
  4. Sistem dizini;
  5. Windows dizini;
  6. Mevcut dizin;
  7. Konumlar PATH sistem değişkeninde listelenir.

DLL dosyası içinde başka bir DLL kullanılıyorsa, ikinci DLL dosyasının olmaması durumunda birincisi de yüklenemez.

Bir Uzman Danışman (script veya gösterge) yüklenmeden önce, EX5 kütüphanelerinin genel listesi yeniden şekillendirilir. Bu liste Uzman Danışmandan (scriptten veya göstergeden) ve listedeki kütüphanelerden yüklenebilir olacaktır. Böylece, çok defa kullanılacak bir EX5 kütüphane modülünün bir defa yüklenmesi yeterli olacaktır. Kütüphaneler çağrıldıkları Uzman Danışmanlarda (scriptlerde ve göstergelerde) yer alan ön-tanımlı değişkenleri kullanırlar.

İçe aktarılan bir EX5 kütüphanesi, şu sıra ile aranır:

  1. EX5 dosyasını içe aktaran Uzman Danışmanın (betiğin veya göstergenin) konumuna göre ayarlanan dizin;
  2. terminal_dizini\MQL5\Libraries konumu;
  3. Tüm MetaTrader 5 müşteri terminallerinin genel klasöründeki MQL5\Libraries konumu (Common\MQL5\Libraries).

Bir MQL5 programında DLL dosyasından içe aktarılan fonksiyonlar Windows API çağrı koşullarını teyit etmelidir. İşlemi teyit etmek amacıyla, C veya C++ ile yazılmış programların kaynak kodları içinde, Microsoft(r) derleyicilerine özel __stdcall anahtar sözcüğünü kullanın. İşlem koşulları şunlarla karakterizedir:

  • çağrıyı yapan (bizim durumumuzda bu bir mq5-programı), parametreleri uygun bir şekilde kullanabilmek için, çağrılan (DLL'den içe aktarılan) fonksiyonun prototipini görmelidir;
  • çağrıyı yapan (bizim durumumuzda bu bir mq5-programı), parametreleri ters sıra ile girmelidir, sağdan sola - içe aktarılan fonksiyon, geçirilen parametreleri bu sıra ile okur;
  • Açık şekilde referansla geçirilmesi gerekenler (bizim durumumuzda dizgiler) haricindeki parametreler değer ile geçirilir,
  • içe aktarılan fonksiyon, geçirilen parametreleri okuyarak yığını temizler.

İçe aktarılan fonksiyonun prototipi tarif edilirken, varsayılan parametreler kullanılabilir.

Eğer söz konusu kütüphane yüklenemiyorsa veya DLL kullanımına izin verilmiyorsa veya içe aktarılan fonksiyon bulunamamışsa, Uzman Danışman Günlükte verilecek uygun bir mesaj ile çalışmasını durduracaktır - "Uzman Danışman durduruldu". Bu durumda Uzman Danışman sonlandırılıncaya kadar çalışmayacaktır. Bununla birlikte, yeni bir derleme sonucunda veya özellikler penceresi açılıp "Tamam" tuşuna basıldığında yeniden başlatılabilir.

Parametrelerin Geçirilmesi

Açık bir şekilde referans ile geçirilmeleri belirtilmedikçe tüm basit tipler değer ile geçirilir. Bir dizgi DLL den aktarılan bir fonksiyona geçirildiğinde, kopyalanan dizginin önbellek adresi geçirilir; eğer dizgi referans ile geçirilmişse, dizginin önbellek adresi kopyalanmadan geçirilir.

Dinamik dizileri, dizgileri, sınıfları, diğer karmaşık yapıları ve numaralandırılmış nesnelerin statik veya dinamik dizilerini içeren yapılar, içe aktarılan bir fonksiyona parametre olarak geçirilemez

Bir diziyi DLL fonksiyonuna geçirirken, her zaman veri tamponunun başlangıç adresi geçirilir (AS_SERIES bayrağına bakılmaksızın). DLL içerisindeki fonksiyonlar AS_SERIES bayrağı ile kullanılamazlar, geçirilen diziler statiktir ve büyüklükleri tanımlanmamıştır; dizi büyüklüğünü tanımlamak için fazladan bir parametre kullanılmalıdır.