Kaynaklar

Grafik ve ses dosyalarını MQL5 programında kullanma

MQL5 dilinde yazılan programlar ses ve grafik dosyalarıyla çalışmaya olanak sağlar:

 

PlaySound()

PlaySound() fonksiyonunun çağrı örneği:

//+------------------------------------------------------------------+
//| Standart OrderSend() çağrısı yapar ve bir ses oynatır            |
//+------------------------------------------------------------------+
void OrderSendWithAudio(MqlTradeRequest  &request, MqlTradeResult &result)
  {
  //--- sunucuya bir istek gönder
   OrderSend(request,result);
   //--- eğer istek kabul edilirse, Ok.wav ses dosyasını yürüt
   if(result.retcode==TRADE_RETCODE_PLACEDPlaySound("Ok.wav");
   //--- başarısızlık durumunda timeout.wav dosyasından alarm sesi yürüt 
   else PlaySound("timeout.wav");
  }

Bu örnek standart terminal paketine eklenmiş olan 'Ok.wav' ve 'timeout.wav' ses dosyalarının nasıl oynatıldıklarını göstermektedir. Bu dosyalar terminal_dizini\Sounds klasörüne yerleştirilmiştir. Burada terminal_dizini, MetaTrader 5 Müşteri Terminalinin başlatıldığı klasördür. Terminal dizininin konumu bir mql5 programı içinde şu şekilde öğrenilebilir:

//--- Terminal verisinin depolandığı klasör
   string terminal_path=TerminalInfoString(TERMINAL_PATH);

Sadece terminal_dizini\Sounds, klasöründeki ses dosyalarını değil aynı zamanda alt klasörlerdeki dosyalarıda kullanabilirsiniz örn: terminal_veri_dizini\MQL5. Terminal veri dizininin konumunu, terminal menüsünden "Dosya" -> "Veri Klasörünü Aç" veya şu komutunu kullanarak öğrenebilirsiniz:

//--- Terminal verisinin depolandığı klasör
   string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);

Örneğin, Demo.wav ses dosyası terminal_veri_dizini\MQL5\Files konumunda ise, PlaySound() çağrısı şu şekilde yazılmalıdır:

//--- terminal_veri_dizini\MQL5\Files\Demo.wav konumundaki Demo.wav dosyasını oynat
   PlaySound("\\Files\\Demo.wav");

Yorum kısmında dosya adresinin "\" işaretiyle fonksiyon içinde ise "\\" şeklinde kullanıldığını lütfen not edin.

Dosya adresini belirtirken her zaman çift ters-bölü işareti kullanın. Tekli ters-bölü işareti, derleyicinin kaynak kodu içerisindeki sabit dizelerle ve karakter sabitleri ile çalışırken kullandığı bir kontrol elemanıdır.

Kayıttan yürütmeyi durdurmak için NULL parametresi ile PlaySound() fonksiyonunun çağrılması:

//--- PlaySound() fonksiyonunun NULL parametresi ile çağrılması kayıttan yürütmeyi durdurur
   PlaySound(NULL);

 

ObjectCreate()

ObjectCreate() fonksiyonunu kullanarak bir grafiksel etiket (OBJ_BITMAP_LABEL) oluşturan Uzman Danışman örneği.

string label_name="currency_label";        // OBJ_BITMAP_LABEL nesnesinin ismi
string euro      ="\\Images\\euro.bmp";    // dosya adresi terminal_veri_dizini\MQL5\Images\euro.bmp
string dollar    ="\\Images\\dollar.bmp";  // dosya adresi terminal_veri_dizini\MQL5\Images\dollar.bmp
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- hala oluşturulmamışsa bir OBJ_BITMAP_LABEL düğmesi oluştur
   if(ObjectFind(0,label_name)<0)
     {
      //--- OBJ_BITMAP_LABEL nesnesini oluluştur
      bool created=ObjectCreate(0,label_name,OBJ_BITMAP_LABEL,0,0,0);
      if(created)
        {
         //--- düğmeyi çizelgenin sol üst köşesine yerleştir
         ObjectSetInteger(0,label_name,OBJPROP_CORNER,CORNER_RIGHT_UPPER);
         //--- şimdi nesne özelliklerini ayarla
         ObjectSetInteger(0,label_name,OBJPROP_XDISTANCE,100);
         ObjectSetInteger(0,label_name,OBJPROP_YDISTANCE,50);
         //--- son hata kodunu sıfırla
         ResetLastError();
         //--- düğmenin "basılı" durumunu göstermek için bir resim indir
         bool set=ObjectSetString(0,label_name,OBJPROP_BMPFILE,0,euro);
         //--- sonucu test et
         if(!set)
           {
            PrintFormat("Resim %s dosyasından indirilemedi. Hata kodu %d",euro,GetLastError());
           }
         ResetLastError();
         //--- düğmenin "serbest" durumunu göstermek için bir resim indir
         set=ObjectSetString(0,label_name,OBJPROP_BMPFILE,1,dollar);
         
         if(!set)
           {
            PrintFormat("Resim %s dosyasından indirilemedi. Hata kodu %d",dollar,GetLastError());
           }
         //--- düğmenin hemen gözükmesi için çizelgenin yenilenmesi komutunu gönder
         ChartRedraw(0);
        }
      else
        {
         //--- nesne oluşturulmadı, uyar
         PrintFormat("OBJ_BITMAP_LABEL nesnesi oluşturulamadı. Hata kodu %d",GetLastError());
        }
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- nesneyi çizelgeden sil
   ObjectDelete(0,label_name);
  }

currency_label nesnesinin oluşturulup başlatılması OnInit() fonksiyonu içinde gerçekleşir. Grafiksel dosyaların adresleri global değişkenler euro ve dollar içinde ayarlanır, bunun için çift ters bölü işareti kullanılır:

string euro      ="\\Images\\euro.bmp";    // dosyanın adresi terminal_veri_dizini\MQL5\Images\euro.bmp
string dollar    ="\\Images\\dollar.bmp";  // dosyanın adresi terminal_veri_dizini\MQL5\Images\dollar.bmp

Dosyalar, terminal_veri_dizini\MQL5\Images klasörü içinde yer alırlar.

OBJ_BITMAP_LABEL nesnesi duruma (basılı veya serbest) bağlı olarak iki resimden birini gösteren bir düğmedir: euro.bmp veya dollar.bmp.

OBJ_BITMAP_LABEL nesnesinin özellikleri

Grafiksel arayüze sahip nesnelerin boyutları, otomatik olarak resim boyutuna göre ayarlanır. OBJ_BITMAP_LABEL nesnesinin üzerine sol fare tuşu ile tıklandığında resim değiştirilir ("Seçimi devre dışı bırak" özelliği belirtilmiş olmalıdır). OBJ_BITMAP nesnesi de aynı şekilde oluşturulur - gereken resim ile birlikte arka-planı oluşturmak için kullanılır.

OBJ_BITMAP and OBJ_BITMAP_LABEL nesnelerinin görünümünden sorumlu olan OBJPROP_BMPFILE özelliği, dinamik olarak değiştirilebilir. Bu mql5 programları için çeşitli interaktif arayüzler oluşturulmasına imkan verir.

 

Mql5 programlarının derlenmesi sırasında kaynakların çalıştırılabilir dosyalara eklenmesi #

Bir mql5 programı görüntü ve ses dosyaları şeklinde bir çok farklı yüklenebilir kaynağa ihtiyaç duyabilir. Çalıştırılabilir bir dosyanın MQL5 içine aktarılırken bu ihtiyacın giderilebilmesi için, #resource derleyici direktifi kullanılmalıdır:

 #resource kaynak_dosyasının_adresi

#resource komutu, derleyiciye, kaynak_dosya_adresi ile belirtilen kaynağın çalıştırılabilir EX5 dosyasına eklenmesi gerektiğini söyler. Bu şekilde, gereken tüm ses ve görüntüler doğrudan EX5 dosyasına yerleştirilebilir ve programı farklı bir terminal üzerinde çalıştırmak istediğinizde söz konusu dosyaların ayrı ayrı aktarılmaları gerekmez. Her EX5 programı kaynak dosyalarını içerebilir ve yine her EX5 programı başka bir EX5 programındaki kaynakları kullanabilir.

BMP ve WAV dosyaları EX5 içine aktarılmadan önce otomatik olarak sıkıştırılırlar. Yani, MQL5 içinde programlar oluştururken ses ve görüntü kaynaklarının bu şekildeki kullanımı, MQL5 programının normal yolla yazılmasına nazaran, gerekli dosyaların toplam boyutunun daha iyi azaltılmasına olanak tanır.

Kaynak dosyasının boyutu 16 Mb'tan fazla olmamalıdır.

 

Belirtilen kaynağın derleyici ile aranması

Kaynaklar #resource "<kaynak dosyasının adresi>" komutu kullanılarak eklenirler

 #resource "<kaynak_dosya_adresi>"

<kaynak_dosya_adresi> sabit dizesinin 63 karakteri geçmemesi gerekir.

Derleyici belli bir adresteki kaynağı şu sırayla arar:

  • eğer, "\" ayracı ("\\" şeklinde yazılır) adresin başına yazılmışsa, arama terminal_veri_dizini\MQL5\, konumuna göre yapılır
  • eğer ters-bölü işareti yoksa, kaynağı kaynak dosyasının yazıldığı konumda arar.

Kaynak adresi alt-dizeler "..\\" ve ":\\" içeremez

Kaynak ekleme örnekleri:

//--- kaynakların doğru şekilde belirtilmesi
#resource "\\Images\\euro.bmp" // euro.bmp, terminal_veri_dizini\MQL5\Images\ klasöründe yer alıyor
#resource "picture.bmp"        // picture.bmp kaynak dosyasıyla aynı konumda
#resource "Resource\\map.bmp"  // kaynak, kaynak_dosa_dizini\Resource\map.bmp şeklinde konumlandırılır
 
//--- kaynakların yanlış belirtilmesi
#resource ":picture_2.bmp"     // ":"işaretini içermemeli
#resource "..\\picture_3.bmp"  // ".." içermemeli
#resource "\\Files\\Images\\Folder_First\\My_panel\\Labels\\too_long_path.bmp" // 63 karakterden fazla

 

Kaynakların Kullanımı

Kaynak ismi

Kaynağın bildirimi #resource direktifi ile yapıldıktan sonra programın her yerinde kullanılabilir. Kaynağın ismi konumunu belirleyen adrestir ve başında ters-bölü olmadan yazılır. Kod içerisinde kendi kaynağınızı kullanmak istiyorsanız "::" özel ismini kaynak isminden önce belirtmeniz gerekir.

Örnekler:

//--- kaynakların belirlenmesi ve isimlerinin yorum olarak verilmesi örneği
#resource "\\Images\\euro.bmp"          // kaynak ismi - Images\euro.bmp
#resource "picture.bmp"                 // kaynak ismi - picture.bmp
#resource "Resource\\map.bmp"           // kaynak ismi - Resource\map.bmp
#resource "\\Files\\Pictures\\good.bmp" // kaynak ismi - Files\Pictures\good.bmp
#resource "\\Files\\Demo.wav";          // kanak ismi - Files\Demo.wav"
#resource "\\Sounds\\thrill.wav";       // kaynak ismi - Sounds\thrill.wav"
...                                  
 
//--- kaynakların kullanımı
ObjectSetString(0,bitmap_name,OBJPROP_BMPFILE,0,"::Images\\euro.bmp");
... 
ObjectSetString(0,my_bitmap,OBJPROP_BMPFILE,0,"::picture.bmp");
... 
set=ObjectSetString(0,bitmap_label,OBJPROP_BMPFILE,1,"::Files\\Pictures\\good.bmp");
... 
PlaySound("::Files\\Demo.wav");
... 
PlaySound("::Sounds\\thrill.wav");

Bir kaynak ile OBJ_BITMAP ve OBJ_BITMAP_LABEL nesnelerine görüntü (resim) ayarlarken, OBJPROP_BMPFILE özelliğinin değerinin el yordamıyla değiştirilmesinin mümkün olmadığı not edilmelidir. Örneğin, OBJ_BITMAP_LABEL nesnesini oluşturmak için euro.bmp ve dollar.bmp kaynaklarını kullanırız.

#resource "\\Images\\euro.bmp";    // euro.bmp, terminal_veri_dizini\MQL5\Images\ konumunda bulunmaktadır
#resource "\\Images\\dollar.bmp";  // dollar.bmp, terminal_veri_dizini\MQL5\Images\ konumunda bulunmaktadır

Bu nesnenin özeliklerini görüntülerken, BitMap Dosyası (On) ve BitMap Dosyası (Off) özelliklerinin soluklaştırıldığını ve el yordamıyla değiştirilemediğini görürüz:

using_resource

 

Diğer mql5 programlarının kaynaklarının kullanılması

Kaynak kullanımının bir diğer avantajı daha vardır – her mql5 programında, diğer EX5 dosyalarının kaynakları kullanılabilir. Diğer bir deyişle, bir EX5 dosyasının kaynakları diğer bir çok mql5 programı içinde kullanılabilir.

Başka bir dosyadaki kaynağın ismini kullanmak için bunu <adres_EX5_dosya_ismi>::<kaynak_ismi> şeklinde belirtmelisiniz. Ö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 eklenmelidir.

//--- kaynağın betik içinde kullanımı
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"::Files\\triangle.bmp");

Aynı kaynağı başka bir programdan kullanmak istediğimizde (örneğin bir Uzman Danışmandan), EX5 dosyasının adresini terminal_veri_dizini\MQL5\ dizinine ve betiğin EX5 dosyasına göre (Draw_Triangles_Script.ex5) kaynak ismine eklememiz gerekir. Betiğin standart klasör (terminal_veri_dizini\MQL5\Scripts\) içine yerleştirildiğini düşünelim, bu durumda çağrı şu şekilde yapılır:

//--- Bir betikteki kaynağın Uzman Danışman için kullanımı
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"\\Scripts\\Draw_Triangles_Script.ex5::Files\\triangle.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. Yani, bir Uzman Danışman, Draw_Triangles_Script.ex5 betiğindeki bir kaynağı adres belirtmeden şu şekilde çağırıyorsa:

//--- Betik kaynağını Uzman Danışman içinde adres belirtmeden çağır
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"Draw_Triangles_Script.ex5::Files\\triangle.bmp");

Bu durumda, dosya terminal_veri_dizini\MQL5\Experts\ klasöründe aranacaktır (eğer Uzman Danışman terminal_veri_dizini\MQL5\Experts\ dizininde bulunuyorsa)

 

Kaynak şeklinde eklenen özel göstergelerle çalışma

MQL5 uygulamalarının çalışması için bir veya birkaç özel gösterge gerekebilir. Bunların kodları bir harici MQL5 programına eklenebilir. Göstergelerin kaynaklar şeklinde eklenmesi uygulamaların dağılımını basitleştirir.

Aşağıda, terminal_veri_klasörü\MQL5\Indicators\ dizinine yerleştirilmiş SampleIndicator.ex5 göstergesinin kaynak şeklinde eklenmesi örnek gösterilmiş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("Uzman: iCustom çağrısı: Hata kodu=",GetLastError());
      return(INIT_FAILED);
     }
//--- ...
   return(INIT_SUCCEEDED);
  }

OnInit() fonksiyonunun içerisinde kendisinin kopyalarını oluşturan göstergeler özel ilgi gerektirir. Kaynağın şu şekilde belirtilmesi gerektiğini lütfen aklınızda tutun: <veri_yolu_EX5_dosya_ismi>::<resource_name>.

Örneğin, SampleIndicator.ex5 göstergesi SampleEA.ex5 uzmanına kaynak olarak eklenmişse, başlatma fonksiyonunun içinde iCustom() çağrısı yapılırken kullanılacak veri yolu şu şekilde olur: "\\Experts\\SampleEA.ex5::Indicators\\SampleIndicator.ex5". Veri yolu açıkca belirtildiğinde SampleIndicator.ex5 göstergesi SampleEA.ex5 uzmanına sıkı şekilde bağlanır ve Uzman Danışman ayrı çalışma yeteneğini yitirir.

Göstergenin veya uzmanın kendisine ait veri yolu GetRelativeProgramPath() fnksiyonu ile alınabilir. Aşağıdaki örnekte bu foksiyonun kullanımı gösterilmiş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()
  {
//--- kendi veri yolunu almanın yanlış yolu
//--- string path="\\Experts\\SampleEA.ex5::Indicators\\SampleIndicator.ex5";  
//--- kendi veri yolunu almanın doğru yolu
  string path=GetRelativeProgramPath();
//--- gösterge tamponlarının eşlenmesi
   handle=iCustom(_Symbol,_Period,path,0,0);
   if(handle==INVALID_HANDLE)
     {
      Print("Gösterge: iCustom çağrısı: Hata kodu=",GetLastError());
      return(INIT_FAILED);
     }
   else Print("Gösterge işleyicisi=",handle);
//---
   return(INIT_SUCCEEDED);
  }
///....
//+------------------------------------------------------------------+
//| Programın Göreli Veri Yolunu Al                                  |
//+------------------------------------------------------------------+
string GetRelativeProgramPath()
  {
   int pos2;
//--- uygulamanın kesin veri yolunu al
   string path=MQLInfoString(MQL_PROGRAM_PATH);
//--- "\MQL5\" alt dizgisinin pozzisyonunu bul
   int    pos =StringFind(path,"\\MQL5\\");
//--- altdizgi bulunamadı - hata
   if(pos<0)
      return(NULL);
//--- "\MQL5" konumunu atla
   pos+=5;
//--- fazlalık '\' sembollerini atla
   while(StringGetCharacter(path,pos+1)=='\\')
      pos++;
//--- bu bir kaynaksa veri yolunu MQL5 dizinine göre al
   if(StringFind(path,"::",pos)>=0)
      return(StringSubstr(path,pos));
//--- ilk MQL5 alt-dizini için bir ayraç bul (örneğin, MQL5\Indicators)
//--- bulunamazsa MQL5 dizinine göre veri yolun dönüş yap
   if((pos2=StringFind(path,"\\",pos+1))<0)
      return(StringSubstr(path,pos));
//--- alt-dizine göre veri yoluna dönüş yap (örneğin, 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[])
  {
//--- bir sonraki çağrı için prev_calculated değerine dönüş yap
   return(rates_total);
  }

Kaynak değişkenleri #

Kaynaklar, kaynak değişkenleri ile bildirilebilir ve uygun tipte bir değişkenmiş gibi kullanılabilir. Bildirim biçimi:

#resource kaynak_dosyasının_adresi as kaynak_değişkeninin_tipi kaynak_değişkeninin_ismi

Bildirim örnekleri:

#resource "data.bin" as int ExtData[]             // data.bin dosyasındaki veriyi içeren nümerik dizinin bildirimini yap
#resource "data.bin" as MqlRates ExtData[]        // data.bin dosyasının verilerini içeren ve basit yapılardan oluşan dizinin bildirimini yap
//--- dizgiler
#resource "data.txt" as string ExtCode            // data.bin dosyasının verilerini içeren (ANSI, UTF-8 ve UTF-16 kodlamaları desteklenir) dizginin bildirimini yap
//--- grafiksel kaynaklar
#resource "image.bmp" as bitmap ExtBitmap[]       // BMP dosyasının biteşlem verisini içeren tek boyutlu (dizi büyüklüğü=genişlik*yükseklik) dizinin bildirimini yap 
#resource "image.bmp" as bitmap ExtBitmap2[][]    // BMP dosyasının biteşlem verisini içeren iki boyutlu ([yükseklik][genişlik]) dizinin bildirimini yap

Bu gibi bildirimlerde, kaynak verisi sadece otomatik adresleme değişkeni ile adreslenebilir ve "::<kaynak ismi>"  çalışmaz.

#resource "\\Images\\euro.bmp" as bitmap euro[][]
#resource "\\Images\\dollar.bmp"
//+------------------------------------------------------------------+
//|  Kaynak kullanımıyla OBJ_BITMAP_LABEL nesnesinin oluşturulması  |
//+------------------------------------------------------------------+
void Image(string name,string rc,int x,int y)
  {
   ObjectCreate(0,name,OBJ_BITMAP_LABEL,0,0,0);
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
   ObjectSetString(0,name,OBJPROP_BMPFILE,rc);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- görselin çıktı boyutu [genislik, yükseklik] euro kaynağında depolanır
   Print(ArrayRange(euro,1),", ",ArrayRange(euro,0));
//--- euro kaynağındaki görseli değiştir - ortasına yatay kırmızı şerit çiz
   for(int x=0;x<ArrayRange(euro,1);x++)
      euro[ArrayRange(euro,1)/2][x]=0xFFFF0000;
//--- kaynak değişkenini kullanarak grafiksel kaynak oluştur
   ResourceCreate("euro_icon",euro,ArrayRange(euro,1),ArrayRange(euro,0),0,0,ArrayRange(euro,1),COLOR_FORMAT_ARGB_NORMALIZE);
//--- Euro grafiksel etiket nesnesini oluştur, euro_icon kaynağındaki görsel bu nesneye ayarlanacak
   Image("Euro","::euro_icon",10,40);
//--- kaynağı uygulamak için başka bir yöntem, bunun üstüne çizemiyoruz
   Image("USD","::Images\\dollar.bmp",15+ArrayRange(euro,1),40);
//--- daha önce euro kaynak değişkeni ile bildirimi yapıldığı için euro.bmp kaynağını doğrudan adresleyemiyoruz
   Image("E2","::Images\\euro.bmp",20+ArrayRange(euro,1)*2,40); // çalıştırma zamanı hatası
  }

Betik çalıştırma sonucu – üç nesnedan sadece ikisi (OBJ_BITMAP_LABEL nesneleri) oluşturulabildi. İlk nesnenin görselinde, ortada kırmızı bir şerit var.

res_variables

Kaynakların kullanılmasının bir diğer avantajı da, kaynağın EX5 dosyasına eklenmeden (derleme işleminden önce) otomatik olarak sıkıştırılmasıdır. Yani, kaynak değişkenleri kullanarak tüm gerekli verileri doğrudan EX5 dosyasına ekleyebilirsiniz. Bu sayede geleneksel yazım tekniğiyle yazdığınız MQL5 programlarına göre çok daha küçük boyutlu dosyalar oluşturabilirsiniz.

Kaynak değişkenlerin kullanımı özellikle Mağaza bölümünde yayınlanacak ürünler için uygundur.

Özellikler

  • TÖzel bitmap kaynak değişkeni tipi, kaynağın bir görsel olduğu bilgisini derleyiciye verir. Bu gibi değişkenler uint tipini alırlar.
  • bitmap tipli kaynak değişkeni dizisi iki boyutlu olmalıdır. Bu durumda dizi boyutları şu şekilde tanımlanır [görsel_yüksekliği ][ görsel_genişliği ]. Dizi tek boyutlu olarak belirtilmişse, dizinin elemansayısı görsel_yüksekliği*görsel_genişliği şeklinde hesaplanır.
  • 24-bit'lik bir görsel indirilirken, alfa kanalı bileşeni görselin tüm pikselleri için 255 olarak ayarlanır.
  • Alfa kanalı olmayan 32-bit'lik bir görsel indirilirken, alfa bileşeni görselin tüm pikselleri için 255 olarak ayarlanır.
  • Alfa kanalı olan 32-bit'lik bir görsel indirilirken, pikseller herhangi bir şekilde değiştirilmez.
  • Kaynak dosya boyutu 128 Mb 'tan daha büyük olamaz.
  • BOM (başlık) varlığında, dizgi dosyaları için otomatik kodlama tespiti gerçekleştirilir. BOM yoksa, kodlama dosya içerikleri ile tanımlanır. sadec ANSI, UTF-8 ve UTF-16 dosya kodlamaları desteklenir. Dosyadan veri okunurken tüm dizgiler Unicode'a dönüştüülür.

OpenCL programları

Bazı programların geliştirilmesi dizgi kaynak değişkenlerin kullanım imkanını artırabilir. Örneğin, ayrı bir CL dosyasında bir OpenCL programı yazabilir ve bunu MQL5 program kaynağına bir dizgi olarak ekleyebilirsiniz.

#resource "seascape.cl" as string cl_program
... 
int context;
if((cl_program=CLProgramCreate(context,cl_program)!=INVALID_HANDLE)
  {
   //--- sonraki eylemleri bir OpenCL programıyla gerçekleştir
  }

Bu örnek, herhangi bir cl_programı kaynak değişkeni olarak kullanılmadan da yazılabilirdi ama bütün kodu büyük bir dizgi şeklinde yazmanız gerekirdi.

Ayrıca bakınız

ResourceCreate(), ResourceSave(), PlaySound(), ObjectSetInteger(), ChartApplyTemplate(), Dosya Fonksiyonları