English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
preview
MQL5'te Kaynak Kullanımı

MQL5'te Kaynak Kullanımı

MetaTrader 5Örnekler | 9 Aralık 2021, 11:34
109 0
MetaQuotes
MetaQuotes


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:

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ı:

  1. ObjectCreate() fonksiyonunu kullanarak bir nesne oluşturun.
  2. 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.
  3. ObjectSetInteger(), içinde, X ve Y koordinatlarının değerlerini ayarlayın (OBJPROP_XDISTANCE ve OBJPROP_YDISTANCE).
  4. ObjectSetString() kullanarak grafik nesnesinde OBJPROP_BMPFILE özelliğinin değerini ayarlayın (biri BITMAP için veya ikisi OBJ_BITMAP_LABELiçin).
  5. 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;
PlaySound() fonksiyonu için bir ek bilgi daha vardır: dosya yukarıdaki iki yöntem kullanılarak bulunamadıysa, bu ses dosyası \Sounds\ terminal_directory’e 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.

Kaynakların kullanımı hepsini tek bir seferde elde etmenizi sağlar - yürütülebilir dosyanın kendisi ve kullandığı tüm kaynaklar bir kaynak kodunun derlenmesi sırasında bir EX5 dosyasında paketlenir.


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

Ekli dosyalar |
mysounds.zip (65.89 KB)
images.zip (214.29 KB)
wheremyfolders.mq5 (1.46 KB)
animals_ea.mq5 (18 KB)
animals_ea.ex5 (393.38 KB)
MQL5 Sihirbazı: Yeni Sürüm MQL5 Sihirbazı: Yeni Sürüm
Bu makale, güncellenmiş MQL5 Sihirbazı'nda bulunan yeni özelliklerin açıklamalarını içerir. Değiştirilmiş sinyal mimarisi, çeşitli piyasa modellerinin kombinasyonuna dayalı alım satım robotları oluşturmayı mümkün kılar. Makalede yer alan örnek, bir Uzman Danışmanın etkileşimli şekilde oluşturulma prosedürünü açıklamaktadır.
MetaTrader 5'de Sınamanın Temelleri MetaTrader 5'de Sınamanın Temelleri
MetaTrader 5'deki üç test modu arasındaki farklar nelerdir ve özellikle nelere dikkat edilmelidir? Birden fazla enstrüman üzerinde aynı anda işlem gören bir EA'nın testi nasıl yapılır? Test sırasında gösterge değerleri ne zaman ve nasıl hesaplanır ve olaylar nasıl ele alınır? Bir "yalnızca açılış fiyatı" modunda test yaparken farklı enstrümanlardan çubukları nasıl senkronize edebilirim? Bu makale, bunlara ve diğer birçok soruya cevap vermeyi amaçlamaktadır.
Özel Grafik Kontrolleri. Kısım 1: Basit Kontrol Oluşturma Özel Grafik Kontrolleri. Kısım 1: Basit Kontrol Oluşturma
Bu makalede grafik kontrollerinin geliştirilmesine ilişkin genel ilkeler ele alınacaktır. Grafik nesnelerle hızlı ve kullanışlı bir çalışma için araçlar hazırlayacağız, metin veya nümerik verilerin girilmesi için basit bir kontrol oluşturma örneğini ve bunu kullanma yollarını analiz edeceğiz.
MetaTrader 5 Alım Satım Olayları MetaTrader 5 Alım Satım Olayları
Bir alım satım hesabının mevcut durumunun izlenmesi, açık pozisyonların ve emirlerin kontrol edilmesini gerektirir. Bir alım satım sinyali bir yatırım haline gelmeden önce, müşteri terminalinden alım satım sunucusuna bir istek olarak gönderilmeli ve işlenmeyi bekleyen emir kuyruğuna yerleştirilmelidir. Alım satım sunucusundan gelen bir isteği kabul etmek, süresi dolduğunda silmek veya bir anlaşma yürütmek - tüm bu eylemlerin ardından alım satım etkinlikleri gelir ve alım satım sunucusu, terminali onlar hakkında bilgilendirir.