Ressourcen

Benutzung der Grafik und Sound in MQL5 Programme

Die MQL5 Programme ermöglichen es Ihnen, mit Sound und Grafik-Dateien arbeiten:

 

PlaySound()

Beispiel für Aufruf der Funktion PlaySound():

//+------------------------------------------------------------------+
//| Funktion ruft Standard-Funktion OrderSend() und spielt Sound     |
//+------------------------------------------------------------------+
void OrderSendWithAudio(MqlTradeRequest  &request, MqlTradeResult &result)
  {
  //--- Eine Anfrage an den Server senden
   OrderSend(request,result);
   //--- Wenn die Anfrage angenommen wird, Ok.wav spielen
   if(result.retcode==TRADE_RETCODE_PLACEDPlaySound("Ok.wav");
   //--- Wenn nicht, spielen Alarm aus Datei timeout.wav
   else PlaySound("timeout.wav");
  }

Das Beispiel zeigt, wie Sounds aus Dateien Ok.wav und timeout.wav, die in das Standard-Terminal-Paket enthalten sind, spielen. Diese Dateien liegen im Ordner Terminal_Verzeichnis\Sounds. Hier Terminal_Verzeichnis bedeutet den Verzeichnis aus dem MetaTrader 5 Client Terminal gestartet wird.  Der Standort des Terminals Verzeichnis kann direkt von einem MQL5 Programm in folgender Weise gefunden werden:

//--- Verzeichnis in dem Terminaldaten liegen
   string terminal_path=TerminalInfoString(TERMINAL_PATH);

Sie können die Audio-Dateien nicht nur aus dem Ordner Terminal_Verzeichnis\Sounds verwenden, sondern auch von jedem Unterordner im Ordner Terminaldaten_Verzeichnis\MQL5. Lage des Verzeichnisses den Terminaldaten auf einem Computer können Sie durch das Terminal-Menü "File - Open Directory-Daten", oder programmatisch  herausfinden:

//--- Verzeichnis in dem Terminaldaten liegen
   string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);

Zum Beispiel, wenn Demo.wav liegt in Terminaldaten_Verzeichnis\MQL5\Files, dann Aufruf von PlaySound() soll auf folgende Weise geschrieben werden:

//--- Demo.wav aus Terminaldaten_Verzeichnis\MQL5\Files\Demo.wav spielen
   PlaySound("\\Files\\Demo.wav");

Bitte beachten Sie, dass im Kommentar der Pfad zur Datei mit Backslash "\" geschrieben wird, und in der Funktion "\\" verwendet wird.

Bei der Angabe des Pfades, immer nur den doppelten Backslash als Trennzeichen benutzen, da ein einzelner Backslash ist ein Kontrolsymbol des Compilers beim Umgang mit konstanten Zeichenfolgen und Symbolkonstanten im Programm-Quellcode.

Um Wiedergabe der Datei zu stoppen, rufen Sie die Funktion PlaySound() mit Parameter NULL auf:

//--- Aufruf von Playsound() mit einem Parameter NULL stoppt Audiowiedergabe
   PlaySound(NULL);

 

ObjectCreate()

Ein Beispiel eines Expert Advisors, der mit Hilfe ObjectCreate() erzeugt ein Objekt "Grafischer Zeichen" (OBJ_BITMAP_LABEL).

string label_name="currency_label";        // Objektname OBJ_BITMAP_LABEL 
string euro      ="\\Images\\euro.bmp";    // Pfad zu Terminaldaten_Verzeichnis\MQL5\Images\euro.bmp
string dollar    ="\\Images\\dollar.bmp";  // Pfad zu Terminaldaten_Verzeichnis\MQL5\Images\dollar.bmp
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Schaltfläche OBJ_BITMAP_LABEL erstellen, wenn es noch nicht erstellt worden
   if(ObjectFind(0,label_name)<0)
     {
      //--- Versuchen wir OBJ_BITMAP_LABEL zu erstellen
      bool created=ObjectCreate(0,label_name,OBJ_BITMAP_LABEL,0,0,0);
      if(created)
        {
         //--- Binden wir die Schaltfläche zur linken oberen Ecke des Charts
         ObjectSetInteger(0,label_name,OBJPROP_CORNER,CORNER_RIGHT_UPPER);
         //--- Konfigurieren wir nun die Eigenschaften des Objekts
         ObjectSetInteger(0,label_name,OBJPROP_XDISTANCE,100);
         ObjectSetInteger(0,label_name,OBJPROP_YDISTANCE,50);
         //--- Wird der letzte Fehlercode auf 0 fallen 
         ResetLastError();
         //--- Laden wir das Bild für den Zustand der Schaltflächen "gedrückt" 
         bool set=ObjectSetString(0,label_name,OBJPROP_BMPFILE,0,euro);
         //--- Ergebnis prüfen
         if(!set)
           {
            PrintFormat("Bild konnte nicht aus der Datei %s geladen werden. Fehlercode %d",euro,GetLastError());
           }
         ResetLastError();
         //--- Laden wir das Bild für den Zustand der Schaltflächen "nicht gedrückt"
         set=ObjectSetString(0,label_name,OBJPROP_BMPFILE,1,dollar);
         
         if(!set)
           {
            PrintFormat("Bild konnte nicht aus der Datei %s geladen werden. Fehlercode %d",dollar,GetLastError());
           }
         //---Geben wir dem Chart einen Befehl zu aktualisieren, so dass die Schaltfläche erscheint sofort ohne Tick
         ChartRedraw(0);
       ;}
      else
        {
         //--- Objekt konnte nicht erstellt werden, melden 
         PrintFormat("Objekt OBJ_BITMAP_LABEL konnte nicht erstellt werden. Fehlercode %d",GetLastError());
        }
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Objekt aus dem Chart löschen 
   ObjectDelete(0,label_name);
  }

Erstellen und Konfigurieren eines grafischen Objekts namens currency_label sind in der Funktion OnInit() durchgeführt. Pfade zum grafischen Dateien werden in der globalen Variablen euro und dollar gegeben, doppelter Backslash für ein Separator verwendet ist:

string euro      ="\\Images\\euro.bmp";    // Pfad zu Terminaldaten_Verzeichnis\MQL5\Images\euro.bmp
string dollar    ="\\Images\\dollar.bmp";  // Pfad zu Terminaldaten_Verzeichnis\MQL5\Images\dollar.bmp

Die Dateien legen im Ordner Terminaldaten_Verzeichnis\MQL5\Images.

Objekt OBJ_BITMAP_LABEL ist eigentlich eine Schaltfläche, die eine der beiden Bilder zeigt, je nach Status der Schaltfläche (gedrückt oder nicht gedrückt): euro.bmp oder dollar.bmp.

Eigenschaften des Objekts OBJ_BITMAP_LABEL

Die Größe der Schaltfläche mit einer grafischen Oberfläche wird automatisch an die Größe des Bildes angepasst. Das Bild wird durch einen linken Mausklick auf das Objekt OBJ_BITMAP_LABEL geändert (im Eigenschaften soll "Disable selection" gesetzt werden). Objekt OBJ_BITMAP wird die gleiche Weise erstellt - es ist für die Erstellung der Hintergrund mit einem notwendigen Bild verwendet.

Der Wert der OBJPROP_BMPFILE Eigenschaft, die verantwortlich für das Erscheinungsbild der Objekte OBJ_BITMAP und OBJ_BITMAP_LABEL ist, kann dynamisch geändert werden. Dies ermöglicht das Erstellen verschiedener interaktiver Benutzeroberflächen für MQL5 Programme.

 

Die Einschließung von Ressourcen in ausführbaren Dateien beim Kompilation der MQL5-Programme #

Ein MQL5 Programm kann viele verschiedene herunterladbare Ressourcen in Form von Bild-und Audio-Dateien brauchen. Um die Notwendigkeit alle diese Dateien ins anderen MQL5-Programm zu übertragen zu beseitigen, verwenden Sie die Compiler-Direktive #resource:

 #resource Pfad_zu_Ressource-Datei

Befehl #resource sagt dem Compiler, dass die Ressource an dem angegebenen Pfad Pfad_zu_Ressourcedatei in die ausführbare Datei EX5 eingeschlossen werden sollten. Damit sind alle notwendigen Bilder und Sounds direkt in einer Datei EX5 gelegt, so dass es keine Notwendigkeit gibt, die Dateine zu übertragen, wenn Sie das Programm auf einem anderen Terminal ausführen möchten. Jede EX5 Datei kann Ressource haben, und jedes EX5 Programm kann Ressourcen aus einer anderen EX5 Programm verwenden.

BMP- und WAV-Dateien werden automatisch komprimiert, bevor sie in eine ausführbare Datei EX5 eingeschlossen sind. Dies bedeutet, dass die Verwendung der Ressourcen nicht nur erlaubt Ihnen MQL5 Programmen zu schaffen, sondern reduziert auch die Gesamtgröße der Dateien, die ein Chart für Grafiken und Sounds bracuht.

Die Dateigröße der Ressource konnte nicht mehr als 16 MB sein.

 

Suche nach bestimmten Ressourcen von einem Compiler

Eine Ressource ist mit dem Befehl #resource "<Pfad zu Ressource Datei>" eingefügt.

 #resource "<Pfad_zu_Ressourcedatei>"

Die Länge des konstanten String <Pfad_zu_Ressourcedatei> sollte nicht mehr als 63 Zeichen.

Der Compiler sucht nach einer Ressource auf dem angegebenen Pfad in folgender Reihenfolge:

  • wenn der Backslash "\" Separator (geschrieben "\\") wird am Anfang des Pfads platziert, sucht es für die Ressource relativ zum Verzeichnis Terminaldaten_Verzeichnis\MQL5,
  • wenn es kein Backslash gibt, wird die Ressource auf den Speicherort der Quelldatei, in der diese Ressource ist vorgeschrieben, gesucht.

Die Ressource-Pfad kann man nicht die Teilstrings "..\\" und "\\" verwenden.

Beispiele:

//--- Korrekte Angabe von Ressourcen
#resource "\\Images\\euro.bmp" // euro.bmp befindet sich in Terminaldaten_Verzeichnis\MQL5\Images\
#resource "picture.bmp"        // picture.bmp befindet sich in dasselbe Verzeichnis, wo Quelldatei ist
#resource "Resource\\map.bmp"  // Ressource liegt in Quelldatei_Verzeichnis\Resource\map.bmp
 
//--- Falsche Angabe von Ressourcen
#resource ":picture_2.bmp"     // ":" kann nicht verwendet werden
#resource "..\\picture_3.bmp"  // ".." kann nicht verwendet werden
#resource "\\Files\\Images\\Folder_First\\My_panel\\Labels\\too_long_path.bmp" //mehr als 63 Zeichen

 

Die Verwendung der Ressourcen

Ressource-Name

Nachdem die Ressource mit der Direktive #resource deklariert ist, kann es in jedem Teil des Programms verwendet werden. Ressource-Name wird seinen Pfad ohne einen Backslash am Anfang des Strings, die den Pfad zu der Ressource definiert. Um eine eigene Ressource zu verwenden, spezielles Attribut "::" soll vor dem Ressource-Namen hinzufügt werden.

Beispiele:

//--- Beispiele der Ressourcen und ihre Namen in den Kommentaren
#resource "\\Images\\euro.bmp"          // Ressource-Name - Images\euro.bmp
#resource "picture.bmp"                 // Ressource-Name - picture.bmp
#resource "Resource\\map.bmp"           // Ressource-Name - Resource\map.bmp
#resource "\\Files\\Pictures\\good.bmp" // Ressource-Name - Files\Pictures\good.bmp
#resource "\\Files\\Demo.wav";          // Ressource-Name - Files\Demo.wav"
#resource "\\Sounds\\thrill.wav";       // Ressource-Name - Sounds\thrill.wav"
...                                  
 
//--- Verwendung der Ressourcen
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");

Anzumerken ist, dass bei der Einstellung von Bildern aus einer Ressource an den OBJ_BITMAP und OBJ_BITMAP_LABEL Objekten, der Wert der Eigenschaft OBJPROP_BMPFILE kann nicht manuell geändert werden. Zum Beispiel für das Erstellen OBJ_BITMAP_LABEL, verwenden wir unserer Ressourcen euro.bmp und dollar.bmp.

#resource "\\Images\\euro.bmp";    // euro.bmp liegt in Terminaldaten_Verzeichnis\MQL5\Images\
#resource "\\Images\\dollar.bmp";  // dollar.bmp liegt in Terminaldaten_Verzeichnis\MQL5\Images\

Dann, in der Eigenschaften dieses Objekts sehen wir, dass die Eigenschaften BitMap File (On) und BitMap File (Off) sind grau und können nicht manuell geändert werden:

using_resource

 

Verwendung der Ressourcen anderer mql5-Programmen

Die Verwendung der Mittel hat einen weiteren Vorteil - in jedem MQL5-Programm kann Ressource aus einer beliebigen Datei EX5 verwendet werden. So können Ressourcen aus einer Datei EX5 in vielen anderen MQL5-Programmen verwendet werden.

Um eine Ressource-Name aus einer anderen Datei zu verwenden, soll sie als <Pfad_EX5_Dateiname> angegeben werden. Zum Beispiel, in Skript Draw_Triangles_Script.mq5 wird eine Ressource zum Bild in der Datei triangle.bmp angegeben:

 #resource "\\Files\\triangle.bmp"

Dann ist ihr Name "Files\triangle.bmp" für das Skript. Um es zu verwenden, soll Attribut "::" zum Ressource-Namen hinzufügt werden.

//--- Verwendung der Ressource in dem Skript
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"::Files\\triangle.bmp");

Um die gleiche Ressource aus einem anderen Programm zu verwenden, z. B. aus einem Expert Advisor, müssen wir auf die Ressource Name fügen den Pfad zu der EX5-Datei relativ zu Terminaldaten_Verzeichnis\MQL5\ und den Namen der EX5-Datei des Skripts - Draw_Triangles_Script.ex5 hinzufügen. Nehmen wir an, dass das Skript liegt in der Standard-Ordner Terminaldaten_Verzeichnis\MQL5\Scripts\, dann soll der Anruf wie folgt geschrieben werden:

//--- Verwendung der Ressource aus dem Skript im Expert Advisor
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"\\Scripts\\Draw_Triangles_Script.ex5::Files\\triangle.bmp");

Wenn beim Zugriff auf Ressourcen in einer anderen EX5-Datei gibt es kein Pfad zur ausführbaren Datei, dann ist die ausführbare Datei im selben Ordner, wo das Program das ruft die Ressource liegt, gesucht. Das heißt, wenn der Expert Advisor fordert eine Ressource aus Datei Draw_Triangles_Script.ex5 ohne Angabe des Pfades, etwa so:

//--- Aufruf der Ressource des Skripts im Expert Advisor ohne Pfad
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"Draw_Triangles_Script.ex5::Files\\triangle.bmp");

dann wird die Datei in Terminaldaten_Verzeichnis\MQL5\Experts\ durchgesucht, wenn der Expert Advisor sich in Terminaldaten_Verzeichnis\MQL5\Experts\ befindet.

 

Arbeiten mit als Ressourcen verbundenen benutzerdefinierten Indikatoren

MQL5-Programme können eine oder mehrere benutzerdefinierte Indikatoren brauchen, können sie alle in den Code der ausführbaren MQL5-Programm aufgenommen werden. Aufnahme von Indikatoren als Ressourcen vereinfacht die Verteilung von Programmen.

Beispiel für den Anschluss und Verwendung eines benutzerdefinierten Indikators SampleIndicator.ex5 im Verzeichnis: terminal_data_folder\MQL5\Indicators\:

//+------------------------------------------------------------------+
//|                                                     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);
  }

Der Fall, wo der benutzerdefinierte Indikator in der Funktion OnInit() erzeugt eine oder mehrere Kopien von sich selbst, erfordert gesonderte Betrachtung. Für die Nutzung der Ressource aus einer MQL5-Programm ist es notwendig, die Ressource in der folgenden Form anzugeben:<Pfad_Dateiname_EX5>::<Ressourcenname>.

Zum Beispiel, wenn der Indikator SampleIndicator.ex5 ist in Expert Advisor SampleEA.ex5 als Ressource aufgenommen ist, wird der Pfad zu sich selbst, der bei der Aufruf von iCustom() in der Funktion der Initialisierung der benutzerdefinierten Indikator angegeben war, wird wie folgt sein: "\\Experts\\SampleEA.ex5::Indikators\\SampleIndicator.ex5". Wenn Sie diesen Pfad explizit angeben, ist der benutzerdefinierte Indikator SampleIndicator.ex5 fest mit dem Expert Advisor SampleEA.ex5 gebunden und verliert die Fähigkeit selbst zu arbeiten.

Ein Pfad zu sich selbst kann mit der Funktion GetRelativeProgramPath() erhalten werden. Hier ist ein Beispiel davon:

//+------------------------------------------------------------------+
//|                                              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()
  {
//--- Der falsche Pfad der Angabe einer Referenz auf sich selbst
//--- string path="\\Experts\\SampleEA.ex5::Indicators\\SampleIndicator.ex5";   
//--- Der richtige Pfad vom Erhalten einer Referenz auf sich selbst
  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;
//--- erhalten wir den absoluten Pfad zum Programm
   string path=MQLInfoString(MQL_PROGRAM_PATH);
//--- Finden Sie die Position eines Teilstrings "\MQL5\"
   int    pos =StringFind(path,"\\MQL5\\");
//--- Teilstring ist nicht gefunden - Fehler
   if(pos<0)
      return(NULL);
//--- Verzeichnis "\MQL5" auslassen
   pos+=5;
//--- extra '\' auslassen
   while(StringGetCharacter(path,pos+1)=='\\')
      pos++;
//--- Wenn es eine Ressource ist, geben wir den Pfad relativ zu MQL5-Verzeichnis zurück
   if(StringFind(path,"::",pos)>=0)
      return(StringSubstr(path,pos));
//--- Finden wir ein Trennzeichen für die erste Unterverzeichnis in MQL5 (zB MQL5\Indicators)
//--- Wenn es gibt es nicht, geben wir den Pfad relativ zu MQL5-Verzeichnis zurück
   if((pos2=StringFind(path,"\\",pos+1))<0)
      return(StringSubstr(path,pos));
//--- geben wir den Pfad relativ zu Verzeichnis zurück (zB 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);
  }

 

Ressourcenvariablen #

Man kann Ressourcen mithilfe von Ressourcenvariablen deklarieren und mit ihnen so umgehen, als ob sie eine Variable des entsprechenden Typs wären. Format der Deklaration:

#resource Pfad_zur_Ressourcendatei as Typ_der_Ressourcenvariablen Name_der_Ressourcenvariablen

Deklarationsbeispiel:

#resource "data.bin" as int ExtData[]             // Deklaration des Arrays vom nummerischen Typ, das Daten aus der Datei data.bin enthält
#resource "data.bin" as MqlRates ExtData[]        // Deklaration des Arrays einfacher Strukturen, das Daten aus der Datei data.bin enthält
//--- Strings
#resource "data.txt" as string ExtCode            // Deklaration des Strings, der die Daten der Datei data.txt enthält (es werden die Kodierungen ANSI, UTF-8 und UTF-16 unterstützt)
//--- grafische Ressourcen
#resource "image.bmp" as bitmap ExtBitmap[]       // Deklaration des eindimensionalen Arrays, das Bitmap aus der BMP Datei enthält, Arraygröße = height * width 
#resource "image.bmp" as bitmap ExtBitmap2[][]    // Deklaration des zweidimensionalen Arrays, das die Bitmap aus der BMP Datei enthält, Arraygröße [height][width]

Bei solcher Deklaration können die Daten der Ressourcen nur über eine Variable adressiert werden, die automatische Adressierung über "::<rsource name>" funktioniert nicht.

#resource "\\Images\\euro.bmp" as bitmap euro[][]
#resource "\\Images\\dollar.bmp"
//+------------------------------------------------------------------+
//|  Funktion für die Erstellung des Objekts OBJ_BITMAP_LABEL mithilfe der Ressource     |
//+------------------------------------------------------------------+
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()
  {
//--- geben wir die Bildgröße [width, height] aus, das in der Ressourcenvariablen euro gespeichert ist
   Print(ArrayRange(euro,1),", ",ArrayRange(euro,0));
//--- ändern wir das Bild in euro - zeichnen wir eine rote waagerechte Streife in der Mitte
   for(int x=0;x<ArrayRange(euro,1);x++)
      euro[ArrayRange(euro,1)/2][x]=0xFFFF0000;
//--- erstellen wir eine grafische Ressource mithilfe der Ressourcenvariablen
   ResourceCreate("euro_icon",euro,ArrayRange(euro,1),ArrayRange(euro,0),0,0,ArrayRange(euro,1),COLOR_FORMAT_ARGB_NORMALIZE);
//--- erstellen wir das Objekt grafische Beschriftung Euro und setzen wir ihm das Bild aus der Ressource euro_icon
   Image("Euro","::euro_icon",10,40);
//--- eine andere Methode der Verwendung der Ressource, wir können in ihr nicht zeichnen
   Image("USD","::Images\\dollar.bmp",15+ArrayRange(euro,1),40);
//--- die direkte Methode der Adressierung von euro.bmp ist nicht zugänglich, denn es wurde bereits über die euro Variable deklariert
   Image("E2","::Images\\euro.bmp",20+ArrayRange(euro,1)*2,40); // Fehler der Ausführungszeit
  }

Das Ergebnis der Ausführung des Skripts: es sind nur zwei Objekte OBJ_BITMAP_LABEL aus drei erstellt. Dabei sehen wir auf der Abbildung des ersten Objekt eine rote Streife in der Mitte.

res_variables

Ein wichtiger Vorteil der Verwendung von Ressourcen besteht darin, dass Ressourcendateien, bevor sie in eine ausführbare EX5-Datei vor der Kompilation hinzugefügt werden, automatisch komprimiert werden. Die Verwendung von Ressourcenvariablen erlaubt notwendige Daten der ausführbaren EX5-Datei direkt hinzuzufügen und verringert die Anzahl sowie die Gesamtgröße der Dateien im Vergleich zur konventionellen Methode des Schreibens eines mql5-Programms.

Die Verwendung von Ressourcenvariablen ist besonders hilfreich bei der Veröffentlichung von Produkten im Market.

Eigenschaften

  • Der spezielle Typ der Ressourcenvariablen bitmap zeigt dem Compiler, dass die Ressource eine grafische Abbildung darstellt. Solche Ressourcenvariablen bekommen den Typ uint.
  • Die Array-Ressourcenvariable vom Typ bitmap kann zwei Dimensionen haben, in diesem Fall wird die Arraygröße als [Bildhöhe][ Bildbreite ] definiert. Wenn das Arrays eindimensional ist, wird die Anzahl der Elemente als Bildhöhe*Bildbreite definiert.
  • Beim Herunterladen einer 24-Bit-Abbildung wird die Komponente des Alpha-Kanals für alle seine Pixel auf 255 gesetzt.
  • Beim Herunterladen einer 32-Bit-Abbildung ohne Alpha-Kanal wird die Komponente des Alpha-Kanals für alle seine Pixel auch auf 255 gesetzt.
  • Beim Herunterladen einer 32-Bit-Abbildung ohne Alpha-Kanal mit dem Alpha-Kanal werden die Pixel nicht verarbeitet.
  • Die Datei der Ressource darf nicht größer als 128 Mb sein.
  • Für String-Dateien wird die Kodierung automatisch nach BOM (Überschrift) bestimmt. Wenn BOM fehlt, wird die Kodierung nach dem Inhalt ermittelt. Es werden die Kodierungen ANSI, UTF-8 und UTF-16 unterstützt. Beim Lesen von Daten aus den Dateien werden alle Strings in Unicode umgewandelt.

OpenCL Programme

Die Verwendung von Ressourcenvariablen kann die Entwicklung einiger Programme wesentlich vereinfachen. Sie können, zum Beispiel, den Code eines OpenCL-Programms in einer separaten CL-Datei schreiben und dann diese Datei als einen String den Ressourcen ihres MQL5-Programms hinzufügen.

#resource "seascape.cl" as string cl_program
...
int context;
if((cl_program=CLProgramCreate(context,cl_program)!=INVALID_HANDLE)
  {
   //--- weitere Operationen mit dem OpenCL Programm
  }

Ohne Ressourcenvariablen cl_program hätten Sie den ganzen Code als eine große String-Variablen beschreiben müssen.

Sehen Sie auch

ResourceCreate(), ResourceSave(), PlaySound(), ObjectSetInteger(), ChartApplyTemplate(), Dateioperationen