
MQL5'te Kaynak Kullanımı
Modern Programlarda Arayüzün Önemi
Uzun zaman önce bilgisayar programlarının temel amacı ağır matematiksel hesaplamalar yapmak ve büyük miktarda veri işlemekti. Ancak bilgisayarların gücünün artmasıyla öncelikler değişti. Artık ise kullanıcılar aynı işlevselliğe sahip iki program arasında çalışması daha kolay olanı seçerler.
Günümüzde gerekli hesaplama algoritmasına uygun bir program yazmak yeterli değildir, ancak kullanıcı dostu bir grafik arayüz de sağlamanız gerekir. Teknik analiz bile yatırımcıların piyasanın mevcut durumunu görsel bir şekilde temsil etme arzusundan ortaya çıktı: trend çizgileri, destek ve direnç seviyeleri, çeşitli kanallar ve teknik göstergelerin neler olduğuna ilişkin objektif bir resim göstermek için geliştirilmiştir.
Yeni MQL5 dili, MetaTrader 5 Müşteri Terminalititlehttps://www.metatrader5.com/en/trading-platformtitlebaşka bir şey gerektirmeyen tamamen fonksiyonel uygulamalar oluşturmak için daha da güçlü araçlar sağladı. Bu makalede, kullanıcı dostu bir arayüze sahip çalıştırılabilir bir EX5 dosyası oluşturmak için Kaynakların nasıl kullanılacağını göstereceğiz. Bu, dosya yükleme veya başlatma gibi herhangi bir rutin işlem gerektirmeyecektir.
MQL5'in Olanakları
Her şeyden önce, elbette, görüntü ile çalışma olasılığı çok önemlidir. Makalelerde de bulabileceğiniz örneklerin bazıları aşağıda verilmiştir:
- MQL5'te Çizim Göstergesi’nin Emisyonları
- Grafik Kontrol Seçenekleriyle Gösterge Oluşturma
- MQL5'te "Yılan" Oyunu Oluşturma
- MQL5'te Alım Satım için Aktif Kontrol Panelleri Oluşturma
- MQL5'te Uzman Danışman’ın ICQ ile Bağlantısı
- Konum merkezli MT5 ortamında emirleri izlemek için sanal emir yöneticisi
- Standart Kütüphane Sınıflarını ve Google Grafik API (Uygulama Programlama Arayüzü) kullanarak Bilgi Panosu oluşturmak
- Spektrum Analizörü Oluşturma
- Önceden tanımlanmış risk ve R/R oranına dayalı etkileşimli yarı otomatik sürükle ve bırak Uzman Danışman oluşturma
Bir programı daha ilginç yapan ve kullanıcının perspektifinden kontrol etmeyi kolaylaştıran grafik öğelerinin kullanılmasıdır. Teknik Analiz için klasik araçlara ek olarak, MetaTrader 5, terminali, kendi grafik arayüzünüzü oluşturmak için yapı taşı olarak kullanılabilecek çok çeşitli grafik nesneler sağlar.
Arayüz Oluşturmak için Resim Dosyalarının Kullanımı
Özel bir arayüz oluşturmak için, çoğu zaman grafik dosyalarından görüntüler kullanılır. Bu, çeşitli kontrol elemanları için benzersiz ve tanınabilir bir tasarıma ulaşmanızı sağlar. MQL5 dili, grafik kullanan iki grafik nesnesi sunar:
- OBJ_BITMAP - Bitmap bir BMP dosyasından görüntü indirmeye ve bir grafikte görüntülemeye izin verir;
- OBJ_BITMAP_LABEL - Grafik Etiketi görüntüsü durumuna bağlı olarak değişen (basılmış/basılmamış) bir düğmedir.
Bu iki nesne, çeşitli kontroller oluşturmanıza ve bunları Olay işleyicileri "Fare tıklaması" (CHARTEVENT_OBJECT_CLICK) ile karşılaştırmanıza olanak sağlar. OBJ_BITMAP veya OBJ_BITMAP_LABEL için istediğiniz görüntüyü ayarlamak için OBJPROP_BMPFILE özelliğinde istediğiniz BMP dosyasını belirtin. Bu, grafik nesnesinin "Parametreler" sekmesinde manuel olarak yapılabilir.
Bir MQL5 programcısı için ikinci ve ana yol, ObjectSetString() fonksiyonunu kullanarak OBJPROP_BMPFILE özelliği için bir dosya adı belirtmektir. Örneğin:
//--- Load an image for the "Pressed" button state bool set=ObjectSetString(0,object_name,OBJPROP_BMPFILE,0,bmp_file_name);
Standart bir OBJ_BITMAP veya OBJ_BITMAP_LABEL kullanım algoritması:
- ObjectCreate() fonksiyonunu kullanarak bir nesne oluşturun.
- ObjectSetInteger() fonksiyonunu kullanarak, gerekirse nesneyi bir grafiğin istediğiniz köşesine tutturun. Bağlantı noktasının piksel cinsinden X ve Y koordinatları bu köşeye göre ayarlanır.
- ObjectSetInteger(), içinde, X ve Y koordinatlarının değerlerini ayarlayın (OBJPROP_XDISTANCE ve OBJPROP_YDISTANCE).
- ObjectSetString() kullanarak grafik nesnesinde OBJPROP_BMPFILE özelliğinin değerini ayarlayın (biri BITMAP için veya ikisi OBJ_BITMAP_LABELiçin).
- OBJ_BITMAP_LABEL nesnesi için ObjectSetInteger() kullanarak düğmenin başlangıç durumunu ayarlayabilirsiniz - basılı veya basılmamış (OBJPROP_STATE doğru veya yanlış).
Nesneyi oluşturduktan ve yapılandırdıktan sonra, MQL5 programı çalışırken, yalnızca grafik nesnenin konumunu ve durumunu dinamik olarak değiştirebilir, aynı zamanda resimleri görüntülemek için OBJ_BITMAP_LABEL özelliğinin değerini de değiştirebilirsiniz. Arayüz böylelikle son derece esnek ve yeniden yapılandırılabilir olabilir.
Ses Yürütme
Programlarda talep edilen ek bir kolaylık, belirli bir durumda kullanıcıya bir eylem ile ilgili soru sorabilme özelliğidir. Bu ters etkileşimi uygulamak için genellikle olayabağlı olarak farklı sesler kullanılır. Bu, yatırımcının dikkatini sadece gerekli durumlarda çekerek fiyat çizelgelerini sürekli gözlemlemeyi rahat hale getirecektir. Ses dosyalarını yürütmek için, MQL5'te PlaySound() fonksiyonu kullanılır.
PlaySound() fonksiyonunun kullanımı çok kolaydır ve yalnızca bir ses dosyasının konumunun belirtilmesini gerektirir:
//--- The path to a sound file string wav_file_name="Ok.wav"; ... //--- Play a sound from the file terminal_directory\Sounds\Ok.wav bool played=PlaySound(wav_file_name); if(!played) //--- Failed to play the sound, notify of this { PrintFormat("Failed to play file %s. Error code=%d", wav_file_name, GetLastError()); }
Ses ve Görüntü Dosyalarının Konumunu Bulmak
ObjectSetString() ve PlaySound() fonksiyonları dosya konumunun belirtilmesini gerektirir. Güvenlik sebebiyle MQL5 programlarında kullanılan tüm dosyalar dosya güvenlik ortamında bulunur. Bu, dosyaların yalnızca belirli dizinlerde depolanabileceği ve diğer dizinlerdeki dosyalarla çalıştırılamayacağı anlamına gelir. İlk olarak, dosya işlem ve fonksiyonları için hangi dizinlerin kullanılabilir olduğunu ve bunların nasıl adlandırıldıklarını öğrenmeniz gerekir.
Üç farklı dizin vardır:
- Terminal dizini - müşteri terminali yükleme dizini. MetaTrader 5 bu dizinden başlatılır. Klasörü görüntülemek için "Dosya"-" seçeneğini, ardından terminal menüsünden “Terminal verileriniaç" seçeneğini seçin.
- Terminal veri dizini - belirli bir Windows kullanıcısının verilerini depolayan klasör. İşletim sisteminin yerleşik koruyucu mekanizmaları kullanıcı erişimini farklılaştırmaktadır, böylece her kullanıcının verileri diğer kullanıcıların verilerinden ayrı olarak depolanabilir. Bu dizinde, MQL5 alt klasöründe, Gezgin penceresinde görüntülenen tüm göstergeler, Uzman Danışmanlar ve komut dosyası depolanır.
- Tüm terminallerin paylaşılan klasörü (bilgisayarda yüklü olan tüm MetaTrader 5 Müşteri Terminallerinin paylaşılan klasörü) - FILE_COMMON bayrağını kullanarak dosya işlemlerini gerçekleştirmek için kullanılan bir klasör.
Bu dizinlerin konumunu belirlemek için WhereMyFolders.mq5 betik dosyasını kullanabilirsiniz:
//+------------------------------------------------------------------+ //| WhereMyFolders.mq5 | //| Copyright 2011, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2011, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- The folder from which the terminal is started - terminal_directory string terminal_path=TerminalInfoString(TERMINAL_PATH); //--- The folder that stores the terminal data - terminal_data_directory string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH); //--- The shared folder of all client terminals - common_terminal_folder string common_data_path=TerminalInfoString(TERMINAL_COMMONDATA_PATH); //--- Show all the paths Print("TERMINAL_PATH(terminal_directory) = ",TerminalInfoString(TERMINAL_PATH)); Print("TERMINAL_DATA_PATH(terminal_data_directory) = ",TerminalInfoString(TERMINAL_DATA_PATH)); Print("TERMINAL_COMMONDATA_PATH(comon_terminal_folder) = ",TerminalInfoString(TERMINAL_COMMONDATA_PATH)); }
Önemli: Bazı durumlarda, terminal_directory ve terminal_data_directory konumları çakışabilir, ancak buna asla güvenmemek ve bu kavramları karıştırmamak en iyi seçenektir.
Resim ve ses dosyaları terminal çalışma zamanı sistemi tarafından aşağıdaki sırayla aranabilir:
- eğer ters-bölü "\" ayracı ("\\" şeklinde yazılır) adresin başına yazılmışsa, arama terminal_data_directory\MQL5\, konumuna göre yapılır;
- eğer konumun başında ters-bölü yoksa, dosya ObjectSetString(... , OBJPROP_BMPFILE, ...) veya PlaySound() fonksiyonunun çağrıldığı EX5 dosyasının konumuna göre aranır;
Ses dosyaları için örnekler:
- one.wav dosyası terminal_data_directory\MQL5\
PlaySound("\\one.wav");
içinde aranacak. - two.wav dosyası terminal_data_directory\MQL5\Files\
PlaySound("\\Files\\two.wav");
içinde aranacak. - three.wav dosyası
PlaySound("\\MySounds\\three.wav");
\MQL5\MySounds\terminal_data_directoryiçinde aranacak. - four.wav dosyası ise çalıştırılabilir EX5 dosyasının çalıştığı klasörde aranacak. Dosya bu klasörde bulunamazsa, dosyayı terminal_directory\Sounds\ klasöründe bulmaya çalışacaktır.
PlaySound("four.wav");
Resim dosyası örnekleri:
- bird.bmp dosyası terminal_data_directory\MQL5\
//--- Setting an image for the OBJ_BITMAP_LABEL object bool res=ObjectSetString(0,object_name,OBJPROP_BMPFILE,0,"bird.bmp");// Modifier 0 is specified
içinde aranacak - swan.bmp dosyası terminal_data_directory
//--- Setting an image for the OBJ_BITMAP object bool set=ObjectSetString(0,object_name,OBJPROP_BMPFILE,"\\Files\\swan.bmp");// No modifier
\MQL5\Files\ içinde aranacak - dog.bmp dosyası terminal_data_directory\MQL5\MyPictures\
//--- Setting an image for OBJ_BITMAP bool done=ObjectSetString(0,object_name,OBJPROP_BMPFILE,"\\MyPictures\\dog.bmp");// No modifier
içinde aranacak - cat.bmp yürütülebilir EX5 dosyasının çalıştığı klasörde aranacak
//--- Setting an image for OBJ_BITMAP bool result=ObjectSetString(0,object_name,OBJPROP_BMPFILE,"cat.bmp");// No modifier
Konumu yazarken ayraç olarak çift ters-bölü "\\" kullanılması gerektiğini unutmayın.
Önemli: Dosya konumunu belirtirken her zaman çift ters-bölü işareti kullanın; tekli ters-bölü işareti, derleyicinin kaynak kodu içerisindeki sabit dizgiler ve karakter sabitleriyle çalışırken kullandığı bir kontrol elemanıdır.
Yeni Olanaklar - Kaynaklar
MQL5 programınızdaki resim ve sesleri kullanmak için, kullandığı tüm medya dosyalarının doğru klasörlerde bulunduğundan emin olun. Bu, derlenmiş bir EX5 dosyasını bir terminalden diğerine aktarırken kesin bir dezavantaja yol açar. Ancak bu sorunu kod yazma aşamasında çözmek mümkündür. Bu gibi durumlarda kaynaklarıkullanın.
Bir programda kaynak kullanmak için #resource derleyici yönergesi kullanılarak bildirilmelidir
#resource path_to_resource_file
Şimdi, bu kaynak bir dosya konumu yerine kullanılabilir. Söz konusu #resource komutu, derleyiciye, path_to_resource_file adresi ile belirtilen konumdaki kaynağın, çalıştırılabilir EX5 dosyasına eklenmesi gerektiğini söyler. Böylece gerekli tüm resim ve sesler doğrudan bir EX5 dosyasında bulunabilir. Artık başka bir terminalde bir MQL5 programı başlatmak için, içinde kullanılan tüm dosyaları iletmeniz gerekmeyecektir.
Her EX5 programı, kaynak dosyalarını içerebilir ve yine her EX5 programı, başka bir EX5 programındaki kaynakları kullanabilir. Diğer bir deyimle, Bir Uzman Danışman bir gösterge veya EX5 kitaplığında bulunan kaynakları kullanabilir. Bu, kaynak kullanımının sunduğu bir diğer kolaylıktır.
Derleyici tarafından Kaynak Araması
Kaynak belirtmek için #resource “<kaynak dosya konumu>” yönergesi kullanılır
#resource "<path_to_resource_file>"
<kaynak_dosya_konumu> sabit dizgisinin 63 karakteri geçmemesi gerekir. Derleyici, belirli bir adresteki bir kaynağı şu sırayla arar:1 - Ters-bölü "\" konumun başına yerleştirilirse, kaynak terminal_data_directory\MQL5\ klasörüne göre aranır,
- Eğer ters-bölü işareti yoksa, kaynak dosyasının yazıldığı konuma göre aranır.
Önemli: Kaynak konumunda, ".. \\" ve ":\\" alt dizeleri kullanılamaz.
Yardım konusu olanKaynaklar da dahil olmak üzere kaynakörnekleri:
//--- Correct specification of a resource #resource "\\Images\\euro.bmp" // euro.bmp is located in terminal_data_directory\MQL5\Images\ #resource "picture.bmp" // picture.bmp is locate in the same directory with the source file #resource "Resource\\map.bmp" // The resource is located in the folder source_file_directory\Resource\map.bmp //--- incorrect specification of resources #resource ":picture_2.bmp" // Use of ":" is not allowed #resource "..\\picture_3.bmp" // Use of ".." is not allowed #resource "\\Files\\Images\\Folder_First\\My_panel\\Labels\\too_long_path.bmp" //More than 63 characters
Kaynak İsimleri
#resource direktifi ile kaynağın bildirimi yapıldıktan sonra bu kaynak programın her yerinde kullanılabilir. Kaynak adı için, kaynağın konumunu tanımlayan dizenin başında eğik çizgi olmayan konum adı kullanılır.
Örnekler:
//---Examples of specifying resources and their names in the comments #resource "\\Images\\cat.bmp" // Resource name - Images\cat.bmp #resource "dog.bmp" // Resource name - dog.bmp #resource "Resource\\map.bmp" // Resource name - Resource\map.bmp #resource "\\Files\\Pictures\\bird.bmp" // Resource name - Files\Pictures\bird.bmp #resource "\\Files\\good.wav" // Resource name - Files\good.wav" #resource "\\Sounds\\thrill.wav" // Resource name - Sounds\thrill.wav"
Kaynak adları büyük/küçük harf duyarlı değildir - derleyici için, dog.bmp ve DOG.bmp adları aynı anlama gelecektir.
Kendi Kaynaklarınız ve Üçüncü Taraf Kaynaklarının Kullanılması
Bir kaynağı kullanmak için adını belirtmelisiniz. Kaynak adı, satırın başında ters-bölü olmayan konumudur. Kendi kaynağınızı kullandığınızda, kaynak adından önce "::" özel özniteliğieklenmelidir.
//--- Use of resources ObjectSetString(0,bitmap_name,OBJPROP_BMPFILE,0,"::Images\\cat.bmp"); ... ObjectSetString(0,my_bitmap,OBJPROP_BMPFILE,0,"::dog.bmp"); ... set=ObjectSetString(0,bitmap_label,OBJPROP_BMPFILE,1,"::Files\\Pictures\\bird.bmp"); ... PlaySound("::Files\\good.wav"); ... PlaySound("::Sounds\\thrill.wav");
Yalnızca kendi kaynaklarınızı (EX5 dosyanızdan) değil, aynı zamanda herhangi bir EX5 Kitaplığı ve modülünden de kaynak kullanabilirsiniz. Böylece, bir kaynak deposu oluşturabilir ve bunları diğer birçok MQL5 programında kullanabilirsiniz.
Başka bir EX5 dosyasındaki kaynakları kullanmak için, kaynağın adı <EX5_dosya_adı_konumu>::<kaynak_adı>şeklinde belirtilmelidir. Örnek olarak, Draw_Triangles_Script.mq5 betik dosyasının triangle.bmp dosyasındaki bir kaynağı içerdiğini düşünelim:
#resource "\\Files\\triangle.bmp"
Yani betik içinde kullanılacak isim "Files\triangle.bmp" şeklinde gözükecektir ve bunu kullanmak için "::" ifadesi kaynak ismine eklenmeli, “::Files.\triangle.bmp” şeklinde gözükmelidir. Aynı kaynağı başka bir programdan kullanmak istediğimizde (örneğin bir Uzman Danışman’dan), EX5 dosyasının adresini terminal_data_directory\MQL5\ dizinine ve betiğin EX5 dosyasına göre (Draw_Triangles_Script.ex5) kaynak ismine eklememiz gerekir. Betiğin standart klasör terminal_data_directory\MQL5\Scripts\ içine yerleştirildiğini düşünelim, bu durumda çağrı şu şekilde yapılır:
//--- Use of a script resource in an Expert Advisor ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"\\Scripts\\Draw_Triangles_Script.ex5::Files\\triangle_1.bmp");
Kaynak başka bir EX5 dosyasından alındığında, çalıştırılabilir dosyanın adresi belirtilmezse; çalıştırılabilir dosya, kaynağın çağrıldığı dosya ile aynı konumda aranır. Bu, aşağıdaki anlamına gelir: Uzman Danışman eğer terminal_data_directory\MQL5\Experts\ içinde bulunuyorsa ve Draw_Triangles_Script.ex5 dosyasından bir kaynak yol belirtimi olmadan istendiyse, dosya terminal_data_directory\MQL5\ Experts\içinde aranır.
//--- Request for a resource from a script in an Expert Advisor without path specification ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"Draw_Triangles_Script.ex5::Files\\triangle_1.bmp");
EX5 Dosyalarındaki Kaynakların Sıkıştırılması - Nasıl Çalışır?
BMP ve WAV dosyaları yürütülebilir bir EX5 dosyasına dahil edilmeden önce otomatik olarak sıkıştırılır. Bu, kaynakları kullanarak yalnızca tam özellikli MQL5 programları oluşturmanızı mümkün kılmakla kalmayıp, aynı zamanda MQL5 programlarını yazmanın geleneksel yöntemlerine kıyasla, resim ve sesleri kullanırken terminalin gerektirdiği dosyaların genel boyutunu da azaltmanız anlamına gelir.
Kaynak dosyasının boyutu 16 Mb'tan fazla olmamalıdır.
Önemli: Kaynak kullanmanın diğer bir avantajı, yürütülebilir bir EX5 dosyasına paketlendiğinde WAV ve BMP dosyalarının otomatik olarak sıkıştırılmasıdır. Bu, yalnızca program tarafından kullanılan dosyaların miktarını değil, aynı zamanda boyutunu da azaltır.
Örneğin, Animals_EA.mq5 gibi küçük bir program düşünün. Kaynak kullanımı için küçük bir kod bloğu aşağıda verilmiştir:
//+------------------------------------------------------------------+ //| Animals_EA.mq5 | //| Copyright 2011, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2011, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" //--- Declare image resources #resource "\\Images\\cat.bmp" #resource "\\Images\\dog.bmp" #resource "\\Images\\cow.bmp" #resource "\\Images\\bird.bmp" //--- Declare sound resources #resource "\\Files\\MySounds\\cat.wav" #resource "\\Files\\MySounds\\dog.wav" #resource "\\Files\\MySounds\\cow.wav" #resource "\\Files\\MySounds\\bird.wav" //--- Object names string cat_dog="cat_dog"; string cow_bird="cow_bird"; string canvas="canvas"; string text="text"; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- Create a substrate CreateCanvas(canvas,50,50,500,500); //--- Create buttons CreateObjectBITMAP_LABEL(cat_dog,110,120,"::Images\\cat.bmp","::Images\\dog.bmp"); CreateObjectBITMAP_LABEL(cow_bird,110,330,"::Images\\cow.bmp","::Images\\bird.bmp"); CreateText(text,"Click on any graphical object",200,90,clrTan); //--- Give a command for an immediate refresh to see the object ChartRedraw(); //--- return(0); } //+------------------------------------------------------------------+ //| Creating OBJ_BITMAP_LABEL with the specified images | //+------------------------------------------------------------------+ bool CreateObjectBITMAP_LABEL(string obj_name,int X,int Y,string res_name1,string res_name2) { //--- If there is no such an object on the chart if(ObjectFind(0,obj_name)==-1) { //--- Create it bool res=ObjectCreate(0,obj_name,OBJ_BITMAP_LABEL,0,0,0); //--- Check the result if(!res) { PrintFormat("%s: Failed to create OBJ_BITMAP_LABEL with the name %s. Error code=%d", __FUNCTION__, GetLastError()); return false; } } //--- Set the coordinates ObjectSetInteger(0,obj_name,OBJPROP_XDISTANCE,X); ObjectSetInteger(0,obj_name,OBJPROP_YDISTANCE,Y); //--- Disable display on the background ObjectSetInteger(0,obj_name,OBJPROP_BACK,false); //--- Reset the error code ResetLastError(); //--- Set an image for the pressed condition bool res=ObjectSetString(0,obj_name,OBJPROP_BMPFILE,0,res_name1); //--- Check the operation result if(!res) { PrintFormat("%s: Failed to upload an image from the resource %s. Error code=%d", __FUNCTION__, res_name1, GetLastError()); return false; } //--- Set an image for the depressed state res=ObjectSetString(0,obj_name,OBJPROP_BMPFILE,1,res_name2); //--- Check the operation result if(!res) { PrintFormat("%s: Failed to upload an image from the resource %s. Error code=%d", __FUNCTION__, res_name2, GetLastError()); return false; } //--- Set the button pressed ObjectSetInteger(0,obj_name,OBJPROP_STATE,true); return true; } //+------------------------------------------------------------------+
Programın görevi, görünümlerini fare tıklaması ile değiştiren iki grafik düğmesi olan mavi bir arka plan (alt tabaka) çizmektir. Alt tabakaya tıkladığınızda, rengini maviden bej rengine değiştirir ve yine tıkladığınızda bunun tersi olur. Her değişiklikte bir ses yürütülür, fare tıklatma olayı OnChartEvent() fonksiyonunda işlenir. Danışman Animals_EA.mq5'in başlamasından hemen sonra gösterilen bir grafik şekilde verilmiştir.
OBJ_BITMAP_LABEL nesnesinin özelliklerine, örneğin, cat_dog’a bir göz atın. Bitmap Dosyası (Açık) ve BitMap Dosyası (Kapalı) özelliklerini bir iletişim kutusu aracılığıyla değiştirmek artık imkansızdır, bu alanlar kullanılamaz ve soluk görünür.
Önemli: Grafik nesnelerde, kaynaklardan yüklenen resimler yalnızca program aracılığıyla değiştirilebilir. Bu özelliklerin, nesnenin Özellikler penceresinden el ile değiştirilmesi imkansız hale gelir.
Uzman Danışman Animals_EA.mq5 tarafından kullanılan toplam resim hacmi 430 kb'tır.
Ancak, tüm bu resimleri içeren Animals_EA.ex5 yürütülebilir dosyasının boyutu 339 kb'tır. Bu nedenle, 9 dosya (bir MQ5 dosyası, dört BMP dosyası ve dört WAV dosyası) yerine, artık program için gerekli tüm kaynakları içeren tek bir EX5 dosyamız var.
Kaynaklarda yalnızca 24 veya 32 bit BMP'deki görüntüler kullanılabilir. 32 bit BMP alfa birleştirme içerebilir - bu durumda saydamlık içeren bir grafiğe uygulanacaklardır.
Uzman Danışman Animals_EA.mq5 dosyası, resim ve sesler makaleye eklenir:
- Resimler арφива images.zip dosyasından terminal_data_directory\MQL5\Images\ dizinine çıkartılmalıdır.
- MySounds.zip dosyasındaki sesler terminal_data_directory\MQL5\Files\MySounds\ .zipdizinine çıkartılmalıdır.
Bu programı terminalinizde sınamak istiyorsanız, gerekli tüm kaynakları içeren ekli derlenmiş Uzman Danışman Animals_EA.ex5'i indirmeniz yeterlidir. Bu durumda, görüntü ve ses dosyalarını indirip yüklemeniz gerekmez.
Kaynak olarak dahil edilen özel göstergelerle çalışma
MQL5 uygulamalarının çalışması için bir veya birkaç özel gösterge gerekebilir. Hepsi yürütülebilir bir MQL5 programının koduna dahil edilebilir. Göstergelerin kaynak olarak dahil edilmesi, uygulamaların dağıtımını kolaylaştırır.
Aşağıda, terminal_data_folder\MQL5\Indicators\ dizininde bulunan SampleIndicator.ex5 özel göstergesini dahil ederek kullanmaya dair bir örnek verilmiştir:
//+------------------------------------------------------------------+ //| SampleEA.mq5 | //| Copyright 2013, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #resource "\\Indicators\\SampleIndicator.ex5" int handle_ind; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- handle_ind=iCustom(_Symbol,_Period,"::Indicators\\SampleIndicator.ex5"); if(handle_ind==INVALID_HANDLE) { Print("Expert: iCustom call: Error code=",GetLastError()); return(INIT_FAILED); } //--- ... return(INIT_SUCCEEDED); }
OnInit() fonksiyonunda özel bir göstergenin kendisinin bir veya daha fazla kopyasını oluşturması durumu özel bir değerlendirme gerektirir. Lütfen kaynağın aşağıdaki şekilde belirtilmesi gerektiğini unutmayın: <konum_EX5_dosya_adı>::<kaynak_adı>.
Örneğin, SampleIndicator.ex5 göstergesi SampleEA.ex5 Uzman Danışman'a kaynak olarak eklenirse, özel göstergenin başlatma fonksiyonunda iCustom() çağrıldığında belirtilen yol aşağıdaki şekilde görünür: "\\Experts\\SampleEA.ex5::Indicators\\SampleIndicator.ex5". Bu yol açık şekilde ayarlandığında SampleIndicator.ex5 özel göstergesi, bağımsız çalışma özelliğini kaybeden SampleEA.ex5 Uzman Danışman’a sabit bir şekilde bağlanır.
Kendi konumu ise GetRelativeProgramPath() fonksiyonu kullanılarak alınabilir. Kullanım örneği aşağıda verilmiştir:
//+------------------------------------------------------------------+ //| SampleIndicator.mq5 | //| Copyright 2013, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property indicator_separate_window #property indicator_plots 0 int handle; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- the wrong way to provide a link to itself //--- string path="\\Experts\\SampleEA.ex5::Indicators\\SampleIndicator.ex5"; //--- the right way to receive a link to itself string path=GetRelativeProgramPath(); //--- indicator buffers mapping handle=iCustom(_Symbol,_Period,path,0,0); if(handle==INVALID_HANDLE) { Print("Indicator: iCustom call: Error code=",GetLastError()); return(INIT_FAILED); } else Print("Indicator handle=",handle); //--- return(INIT_SUCCEEDED); } ///.... //+------------------------------------------------------------------+ //| GetRelativeProgramPath | //+------------------------------------------------------------------+ string GetRelativeProgramPath() { int pos2; //--- get the absolute path to the application string path=MQLInfoString(MQL_PROGRAM_PATH); //--- find the position of "\MQL5\" substring int pos =StringFind(path,"\\MQL5\\"); //--- substring not found - error if(pos<0) return(NULL); //--- skip "\MQL5" directory pos+=5; //--- skip extra '\' symbols while(StringGetCharacter(path,pos+1)=='\\') pos++; //--- if this is a resource, return the path relative to MQL5 directory if(StringFind(path,"::",pos)>=0) return(StringSubstr(path,pos)); //--- find a separator for the first MQL5 subdirectory (for example, MQL5\Indicators) //--- if not found, return the path relative to MQL5 directory if((pos2=StringFind(path,"\\",pos+1))<0) return(StringSubstr(path,pos)); //--- return the path relative to the subdirectory (for example, MQL5\Indicators) return(StringSubstr(path,pos2+1)); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double& price[]) { //--- return value of prev_calculated for next call return(rates_total); }
Terminalin Belleğini Kaydetme
Her kaynak, terminal belleğine yalnızca bir kez yüklenir. Normal kullanımdayken, dosyaya yapılan her erişim, dosyanın belleğe ek bir kez daha yüklenmesine neden olur. Örneğin, her biri 100 kb boyutunda aynı görüntüyü içeren 50 OBJ_BITMAP nesnemiz olduğunu varsayalım. Normal kullanım esnasında, bu 50 nesne 50 * 100kb = 5Mb bellek gerektirecektir.
Karşıya yüklenen resim için bir kaynak bildirirsek, bu resim kullanıldığı nesne sayısına bakılmaksızın belleğe yalnızca bir kez yüklenir.
Önemli: Kaynaklar belleğe yalnızca bir kez yüklenir ve birkaç kez kullanılırsa bellekten tasarruf edilebilir.
Sonuç
Kaynak kullanımı MQL5 programlarının kullanımını ve dağıtımını kolaylaştırır. Alım satım için rahat, modern araçlar oluşturmak için multimedya tabanlı resim ve ses dosyalarının kullanılması gerekmektedir. MQL5'teki kaynak kavramı basit ve anlaması kolaydır, bu yüzden bir göz atmanızı öneririz.
32 bit BMP formatındaki görüntüler alfa birleştirme içerebilir - bu durumda saydamlığı olan bir grafiğe uygulanırlar.
Kaynaklar aşağıdaki avantajları sağlar:
- Kompaktlık - tüm dosyalar tek bir yürütülebilir EX5 dosyasında paketlenir, böylelikle programın iletilmesi ve başlatılması kolay olur;
- Bellek tasarrufu- terminal belleği, kullanım sıklığına bakılmaksızın bir programda her kaynağın her zaman yalnızca bir örneğini içerir;
- Uygun depolama - tüm kaynaklara sahip olan bir EX5 dosyası, asıl resim ve ses dosyalarının toplamından daha azdır.
MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/261





- Ü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