Scriptlerin MetaTrader 4'ten NetTradeX Advisors'a dönüştürülmesi | IFCM Türkiye
IFC Markets Online CFD Broker

Scrptlerin MetaTrader 4'ten NetTradeX Advisors'a dönüştürülmesi

Giriş

MetaTrader 4 işlem platformu için oluşturulmuş çok sayıda danışman ve script’ler vardır. NetTradeX platformunda bu script’lerden yararlanmak isteyen müşterilerin önceleri kaynak kodunu tamamen işlemeleri gerekiyordu ki bu çok zaman alıcıdır. Bu işi kolaylaştırmak için MQL4 ve NTL+ dillerinin uyumluluk kütüphanesi oluşturuldu. Bu kütüphane NetTradex Advisors terminalinde script’leri daha sonra çalıştırmak için onların NTL+ diline dönüştürme sürecini anlamlı olarak basitleştirmeye olanak sağlıyor. MetaTrader ve NetTradeX platformlarının arasındaki farklar nedeniyle (ve MQL4 ve NTL+ dillerinin) kural olarak dönüştürülen script’lerde bazı küçük değişiklikler yapmanız gerekir. Adaptasyonun büyük bölümü MQL4.ntl kütüphanesi ile gerçekleştirilir (NetTradeX Advisors terminalinde dahil), ama programcının yine de script’ini çalıştırmak için onu modifiye etmesi gerekebilir. Bu makalede kütüphanedeki fonksiyonların nasıl kullanılacağı ve ne gibi değişikliklerin daha yapılması gerektiği gösterilecektir.

MQL4.ntl kütüphanesi ile çalışmanın temel ilkeleri

Böylece esas çalışmaya başlamadan önce MQL4 dilinde tamamen hazır scriptiniz olmalıdır. Bu kodu çalışan bir NTL+ script’ine dönüştürmek için ne gibi adımlar atılmalı?

Birinci adım – NetTradeX Advisors terminalinde Navigator penceresinin Scripts ağacında yeni bir script oluşturmanız gerekir. Dosya amacına bağlı olarak Advisors veya Utilities klasöründe yer almalıdır. Sonra script’in tüm metnini MQL4 dilinde bu dosyaya kopyalamalısınız.

İkinci adım – MQL4 kütüphane bağlantısı. Bunu için #include "Libraries\MQL4.ntl" satırı dosyanızın başına ekleyin. MQL4.ntl kütüphaneyi kompile etmek ve kütüphane fonksiyonlarının çalışması için çalıştırılabilen bir dosyaya ihtiyaç olmadığını hemen belirtmek gerekir. Bu kütüphane bağımsız olarak çalıştırılmak için değil, yardım amaçlı olarak tasarlanmıştır.

Üçüncü adım - oluşturulan script’i kompile etme girişimi. Bunu yapmak için kod editöründe Compile düğmesine tıklayın veya F7 tuşuna basın. Büyük olasılıkla derleyici bizim adım adım ortadan kaldıracağımız hata ve uyarıların listesini görüntüleyecektir. Şu anda bizi iki önemli nokta ilgilendiriyor: derleyicinin kütüphaneyi tespit edip etmediği ve spcript’imizde tüm özel fonksiyonların olup olmadığı.

Eğer derleyici kütüphane dosyasını bulamazsa "Failed to open script file" mesajı görüntülenecektir. Bu durumda MQL4 dosyasının #include direktifinde belirtilen yolunda olduğu ve isminin doğru belirtildiğinden emin olmak gerekiyor.

MQL4 dilinde init(), start(), deinit() önceden tanımlanmış adları ile 3 özel fonksiyon vardır. NetTradex Advisors terminalinde çalıştırmak için tüm bu fonksiyonların tanımlanmış olmaları gerekiyor. Ancak bazı script’lerde init() ve deinit() fonksiyonlarından biri ya da her ikisi de eksik olabilir. Bu durumda "No matching signatures to 'init()'" veya "No matching signatures to 'deinit()'" mesajı görüntülenecektir. Bu durumda tek operatör return 0 ile init() ve deinit() fonksiyonlarını eklemeniz gerekir.

int init()
{
	return 0;
}
int deinit()
{
	return 0;
}

"Failed to open script file" ve "No matching signatures to 'init()'" / "No matching signatures to 'deinit()'" mesajları görünmedi ise ilk aşama başarıyla tamamlanmış olarak kabul edilir. Şimdi yerel sorunların giderilmesine geçebiliriz.

En yaygın derleyici mesajları, bunların nedenleri ve eliminasyonu

Bu bölümde script adaptasyon sürecinde oluşan en yaygın derleyici mesajları tarif edilecek ve kod uyuşmazlığını çözmek için pratik çözümler verilecektir.

No matching signatures to Print

Bu tür hata NTL+ dilinde değişken sayıda parametreler ile fonksiyonların kullanılamayacağı nedeniyle oluşur. Bu durumda fonksiyonu çağrı parametreleri sayısının tanım parametreleri sayısına eşleşecek şekilde değiştirmek gerekir. Print() fonksiyonunun sadece bir input özelliği olmalıdır. Böylece Print(parametre1, parametre 2, parametre 3) yerine Print(parametre 1+ parametre 2+ parametre 3) birleştirmesini oluşturmak gerekir.

Unexpected token 'unrecognized token'

Bu mesajın görüntülenme nedenlerinden biri MQL4 dili kütüphane dosyalarını #include direktifi aracılığıyla bağlama girişimidir. NTL+ dili böyle kütüphaneler ile çalışmıyor bu nedenle böyle dosyaların kullanımı mümkün değildir ve bu satırları programdan silmek gerekir.

'True'/'False' is not declared

NTL+ dilinde mantıksal değişkenlerin isimleri küçük harfle başlıyor bu yüzden sadece True’ u true ve Fals’u fals ile değiştirin.

No conversion from '_bars&' to 'int' available

MQL4 dilinde Bars değişkeni geçerli grafik için bar sayısını belirlemek üzere tasarlanmıştır. NTL+ dilinde aynı adı taşıyan Bars nesnesi vardır, bu yüzden de MQL4 kütüphanesinde geçerli grafik için bar sayısını geri getiren bars değişkeni (küçük b harfi ile) eklenmiştir. Script’inizde Bars yerine kullanılması gereken budur.

Must return a value

Bu mesaj, dönüş değeri olmayan «return» operatörünün çağrılırken görüntülenir. Bununla birlikte, bu operatörün kullanıldığı fonksiyon void’den farklı olan dönüş değeri ile ilan edildi. Bu mesaj ile, ya kendi fonksiyonu düzeltmeniz ya da return için bir değer belirtmeniz gerekecektir.

Sihirli sayının kullanımı (Magic number)

Sihirli numaraların kullanımı NTL+ dilinin geçerli sürümünde desteklenmemektedir. Tüm açık pozisyonlar için sıfır sihirli sayı değeri döndürülür. MQL4 dili script’inde koşullu operatörlerde sihirli sayıların kullanımına özel dikkat gösterilmesi tavsiye edilir. Eğer bu danışman tarafından oluşturulan pozisyonları tespit etmeniz gerekmiyorsa OrderMagicNumber() fonksiyonunu silmeniz ya da yorumlamanız yeterli olacaktır.

Statik değişkenlerin kullanımı

NTL+ dilinde anahtar kelime “static” kullanılmamaktadır. Fonksiyonların başlatılması arasındaki değişkenlerin değerini kaydetmek gerektiğinde onları fonksiyon dışında yerleştirerek böyle değişkenleri globalleştirmek gerekir (anahtar kelime statik olmadan). Uzmanın başlatılması veya çalışması sırasında kullanıcı tarafından bu ayarların değiştirilmesi için isteğe bağlı olarak extern değiştiricisi eklenebilir.

Lot hacminin belirlenmesi

Geçerli sürümde herhangi bir enstrüman için lot büyüklüğü 100 000 birimdir ve bu yüzden eğer farklı lot büyüklüğü olan bir enstrüman kullanıyorsanız ayrı olarak uyan değişkeni belirleyin ve ona gereken lot büyüklüğünü atayın (eğer 100000’den farklı ise).

DLL dosyaları ile çeşitli çalışma

NetTradeX Advisors ve MetaTrader4 terminallerinde DLL dosyaları ile çalışma farklı şekilde gerçekleşir. MQL4 dilinde DLL modülünden fonksiyonlarının tam açıklaması gerekir, NTL+ dilinde ise böyle bir açıklama gerekmez. Belirtme yerine

#import "fonksiyon veya modül adı" 
	function1 fonksiyon açıklaması;
	function2 fonksiyon açıklaması;
	functionN fonksiyon açıklaması; 
#import

sadece keyfi tanımlayıcı ("fonksiyon veya modül adı"); dll nesnesini oluşturmanız gerekir ve
tanımlayıcı.Call("fonskiyon adı", fonksiyon parametreleri virgülle ayrılır);
veya
tanımlayıcı.CallProc("fonskiyon adı", fonksiyon parametreleri virgülle ayrılır); aracılığıyla Size gerekli olan fonksiyonu çağırabilirsiniz.

Dilin anahtar kelimelerinin kontrolü

MQL4 ve NTL+ dillerinde anahtar kelimelerde farklılıklar vardır. MQL4 dili danışmanları NTL+ dilinde mevcut olmayan değişken ve fonksiyon isimleri kullanabilir ve tam tersi. Derleyici, örneğin, parantez kullanımının teklif edilmediği bir satırda Expected '(' mesajını görüntüleyebilir. Olası nedenlerden biri değişken adının dilin anahtar kelimelerinden biri ile eşleşmesi olabilir. Böyle bir eşleşme durumunda program kodunda tüm yerlerde değişken adının başka bir isimle değiştirilmesi gerekir. Replace pencerisinin hızlı çağrısı için Ctrl+H tuşları kullanılıyor.

Float value truncated in implicit convertion to integer

Bu uyarı “float” veya “double” değişkenin değerini “int” değişkene atamaya çalışırken görüntülenir. Bu uyumsuzluğun düzeltilmesi script’i çalıştırmak için zorunlu bir koşul değildir ama yapılması tercih edilir. “Double”’dan “int”’e ve “float”’tan “int”’e dönüşüm açıkça yapılmalıdır. Örneğin,double türü değişkeni d int (d) şekilde görünecektir.

bool’dan int’e ve tam tersi otomatik dönüşümün olmaması

NTL+ dilinde int i; bool b = true; i=b; şeklin otomatik dönüşümü mümkün değildir. Bu durumda “Can't implicitly convert from 'bool' to 'int'” mesajı görüntülenir. Bu yüzden bu tür dönüşüme ihtiyacınız olduğunda aşağıdaki yapıyı kullanabilirsiniz:

int Run()
{
	// convertion from bool to int;
	bool a=false;
	int b = a?1:0;
	
	// convertion from int to bool
	int c=1;
	bool d = c==0?false:true;
}
Can't implicitly convert from 'datetime' to 'int'

NTL+ dilinde datetime nesnelerinin int değişkenine dönüşümünü açıkça yapmak gerekir. Bu şöyle yapılabilir int i; datetime d; i=int(d);

Renk sabitleri

MQL4 dilinde temel grafik öğelerinin nesne renkleri ile çalışmak için çok sayıda sabitler kullanılabilir. Bu tür sabitler kodda sadece örneğin White veya Black belirterek 16 temel renkten herhangisine değiştirilebilir. Tek istisna grafik göstergelerindeki renk kullanımıdır. Eğer NTL+ dilinin tanımadığı bir renk kullanılıyor ise rengi RGB bileşenleri ile belirlemek gerekir. Örneğin Tomato rengi için tanım şu şekilde olacaktır: color Tomato = 0xFF6347

Veri dizisi ile çalışma

MQL4 ve NTL+ dillerinde veri dizileri ile çalışma farklı yollarla gerçekleşir. NTL+ dilinde tür isim[] şeklindeki ilanı sadece gösterge dizileri için kullanılır. Başka verilerin kaydedilmesi için gereken tüm diziler array "tür" isim; ya da array "tür" isim (boyut) şeklinde ilan edilir. Böylece string symb[3] = {"EURUSD", "GBPUSD", "AUDCAD"}; yerine array "string" symb= {"EURUSD", "GBPUSD", "AUDCAD"}; kullanmak gerekir.

Desteklenmeyen fonksiyonlar

Bazı fonksiyonlar NTL+ dilinde desteklenmemekteler. Bu fonksiyonları ya silmek ya da script'in çalışma mantığını NTL+ dili yapılarının kullanılacağı şekilde değiştirmek gerekir. Böyle fonksiyonlar kullanıldığında bültende 'The function is not supported' veya 'No matching signatures to function_name' mesajı görüntülenecektir.

Bazı desteklenmeyen fonksiyonların listesi:

  • SendMail()
  • onArray fonksiyon grubu
  • FileOpenHistory, FileIsLineEnding fonksiyonları
  • objects fonksiyon grubu ve и nesne özellikleri
  • aşağıdaki modlar için MarketInfo fonksiyonu sıfır değeri döndürür:
    • MODE_SWAPLONG
    • MODE_SWAPSHORT
    • MODE_STARTING
    • MODE_EXPIRATION
    • MODE_MINLOT
    • MODE_LOTSTEP
    • MODE_SWAPTYPE
    • MODE_PROFITCALCMODE
    • MODE_MARGINCALCMODE
    • MODE_MARGININIT
    • MODE_MARGINHEDGED
    • MODE_FREEZELEVEL
  • goto operatörü
  • özel göstergesi hesaplanması için fonksiyon
  • pencereler ile çalışmak için fonksiyon grubu (Window functions), MessageBox
  • TerminalCompany(), TerminalName(), TerminalPath()
  • #property parametreleri

Özet

Bu yazıda MetaTrader platformundan NetTradeX'e script'ler dönüştürme sırasında ortaya gelen tipik zorlukları anlattık. Bu süreci terminal ile birlikte sağlanan MQL4.ntl kütüphanesi oldukça kolayşaltırıyor. Bu kütüphanenin avantajı programcının kendi takdirine bağlı olarak değiştirebileceği veya ekleyebileceği tamamen açık kodudur. Biz ise dönüşüm sürecini kolaylaştırmak için kütüphaneye yeni fonksiyonlar eklemeye olanları ise düzeltmeye devam edeceğiz.

Close support
Call to Skype Call to messenger Call to telegram Call to WhatsApp Call Back