English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
preview
MQL5에서 리소스 사용

MQL5에서 리소스 사용

MetaTrader 5 | 5 7월 2021, 10:47
72 0
MetaQuotes
MetaQuotes


현대 프로그램에서 인터페이스의 중요성

오래 전, 컴퓨터 프로그램의 주요 목적은 많은 수학적 계산을 수행하고 많은 양의 데이터를 처리하는 것이었습니다. 그러나 컴퓨터의 성능이 향상됨에 따라 우선 순위가 변경되었습니다. 이제 동일한 기능을 가진 두 프로그램 사이에서 사용자가 작업하기 더 쉬운 프로그램을 선택합니다.

요즘에는 필요한 계산 알고리즘에 따라 프로그램을 작성하는 것만으로는 충분하지 않으며 사용자 친화적인 그래픽 인터페이스도 제공해야 합니다. 기술적 분석조차도 시장의 현재 상태 (추세선, 지원 및 저항 수준, 다양한 채널 및 기술 지표)를 시각적으로 표현하려는 트레이더들의 욕구에서 비롯되었습니다.

새로운 MQL5 언어는 MetaTrader 5 클라이언트 터미널 이외의 다른 것을 필요로 하지 않아도 될 완전한 기능의 애플리케이션을 만들기 위한 훨씬 더 강력한 도구를 제공하기에 이르렀습니다. 이번 글에서는 사용자 친화적인 인터페이스로 실행 가능한 EX5 파일을 생성하기 위해 리소스를 사용하는 방법을 보여드릴 것이며, 이 파일에는 설치 또는 시작과 같은 일상적인 작업이 필요하지 않습니다.


MQL5의 가능성

무엇보다도 그래픽 작업의 가능성은 매우 중요입니다. 해당 글에서 그 예제를 찾을 수 있는데 그들 중 일부는 다음과 같습니다:

사용자의 관점에서 프로그램을 더 흥미롭고 쉽게 컨트롤 할 수 있도록 하는 그래픽 요소의 사용입니다. MetaTrader 5 터미널은 기술 분석을 위한 고전적인 도구 외에도 자신만의 그래픽 인터페이스를 구성하기 위한 브릭으로 사용할 수있는 광범위한 그래픽 개체를 제공합니다.


인터페이스 생성을 위한 이미지 파일 사용

특수 인터페이스를 만들기 위해 대부분 그래픽 파일의 이미지가 사용됩니다. 이를 통해 다양한 컨트롤 요소의 고유하고도 인식이 가능한 디자인을 얻을 수 있도록 해줍니다. MQL5 언어는 그래픽을 사용하는 두 개의 그래픽 개체를 제공합니다.

  • OBJ_BITMAP - 비트 맵 객체BMP 파일에서 이미지를 다운로드하여 차트에 표시 할 수 있도록 합니다.
  • OBJ_BITMAP_LABEL - 그래픽 레이블은 실제로 상태 (눌림/풀림)에 따라 이미지가 변경되는 버튼입니다.

이 두 개체를 사용하면 매우 다양한 컨트롤을 만들고 이벤트 처리기 "마우스 클릭(Mouse Click)"과 비교할 수 있습니다(CHARTEVENT_OBJECT_CLICK). OBJ_BITMAP 또는 OBJ_BITMAP_LABEL,에 대해 원하는 이미지를 설정하려면 OBJPROP_BMPFILE 속성에 원하는 BMP 파일을 지정합니다. 그래픽 개체의 "매개 변수"탭에서 수동으로 수행 할 수 있습니다.


MQL5 프로그래머의 두 번째이자 주요 방법은 ObjectSetString() 함수를 사용하여 OBJPROP_BMPFILE 속성에 대한 파일 이름을 지정하는 것입니다. 예를 들면 :

   //--- Load an image for the "Pressed" button state
   bool set=ObjectSetString(0,object_name,OBJPROP_BMPFILE,0,bmp_file_name);

다음 사용의 표준 알고리즘: OBJ_BITMAP 또는 OBJ_BITMAP_LABEL:

  1. ObjectCreate() 함수를 사용하여 개체를 만듭니다.
  2. 필요한 경우 ObjectSetInteger() 함수를 사용하여 개체를 원하는 차트 모서리에 고정합니다. 앵커 포인트의 X 및 Y 좌표 (픽셀 단위)는 이 모서리를 기준으로 설정됩니다.
  3. ObjectSetInteger()에서 X 및 Y 좌표 값 (OBJPROP_XDISTANCE 및 OBJPROP_YDISTANCE)을 설정합니다.
  4. ObjectSetInteger()에서 X 및 Y 좌표 값 (OBJPROP_XDISTANCE 및 OBJPROP_YDISTANCE)을 설정합니다.
  5. OBJ_BITMAP_LABEL 개체의 경우ObjectSetInteger() 를 사용하여 버튼의 초기 상태를 설정할 수 있습니다 (누름 또는 풀림) (OBJPROP_STATE는 참 또는 거짓입니다).

개체를 만들고 구성한 후 MQL5 프로그램이 실행되는 동안 그래픽 개체의 위치와 조건을 동적으로 변경할 수 있을 뿐만 아니라 OBJ_BITMAP_LABEL 속성 값을 변경하여 이미지를 표시 할 수도 있습니다. 따라서 인터페이스는 매우 유연하고 재구성이 가능합니다.


소리 재생

프로그램에서 추가로 요구되는 편의는 특정 상황에서 사용자에게 작업에 대해 물어볼 수 있는 기능입니다. 이러한 역방향 상호 작용을 구현하기 위해 종종 이벤트에 따라 다른 소리의 재생이 사용됩니다. 이는 필요한 경우에만 주의를 끌기 때문에 가격 차트를 지속적으로 관찰하는 상인의 업무를 덜어줍니다. 오디오 파일 재생을 위해 MQL5에서는 PlaySound() 함수를 사용합니다.

PlaySound() 는 사용하기 매우 쉽고 사운드 파일에 대한 경로 지정만 필요로 합니다.

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


사운드 및 이미지 파일이 있는 곳

ObjectSetString()PlaySound() 함수에는 파일 경로 지정이 필요합니다. 보안상의 이유로 MQL5 프로그램에서 사용되는 모든 파일은 파일 샌드 박스 내에 있습니다. 즉, 파일은 특정 디렉토리에만 저장할 수 있으며 다른 디렉토리의 파일 작업은 허용되지 않습니다. 먼저 파일 작업 및 기능에 사용할 수 있는 디렉토리와 이름을 알아야 합니다.

세 가지 디렉토리가 있습니다.

  • 터미널 디렉토리-클라이언트 터미널 설치 디렉토리입니다. MetaTrader 5는 이 디렉토리에서 시작됩니다. 폴더를 보려면 터미널 메뉴에서 "파일"- "터미널 데이터 열기"를 선택하십시오.
  • 터미널 데이터 디렉토리 - 특정 Windows 사용자의 데이터를 저장하는 폴더입니다. 운영 체제의 기본 제공 보호 메커니즘은 사용자 액세스를 구분하므로 각 사용자의 데이터를 다른 사용자의 데이터와 별도로 저장할 수 있습니다. 따라서이 디렉토리의 MQL5 하위 폴더에는 네비게이터 (Navigator) 창에 표시된 모든 지표, Expert Advisors 및 스크립트가 저장됩니다.
  • 모든 터미널의 공유 폴더(컴퓨터에 설치된 모든 MetaTrader 5 클라이언트 터미널) - FILE_COMMON플래그를 사용하여 파일 실행을 수행하기 위한 폴더.

이러한 디렉토리의 위치를 ​​확인하려면 WhereMyFolders.mq5 스크립트를 사용할 수 있습니다.

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

중요: 경우에 따라 terminal_directory terminal_data_directory의 위치가 일치 할 수 있지만, 여기에 의존하지 않는 것이 좋습니다. 따라서 개념을 혼동하지 않는 것이 좋습니다.

이미지 및 사운드 파일은 터미널 런타임 시스템에서 다음 순서로 검색됩니다.

  • 백 슬래시 "\"구분 기호 ( "\\"로 작성) 가 경로의 시작 부분에 있으면 디렉토리인 terminal_data_directory \MQL5\;에 상대적인 리소스를 검색하게 됩니다
  • 만약백 슬래시가경로 시작 부분에 없으면, EX5 파일의 위치를 ​​기준으로 파일을 검색합니다. 이는 ObjectSetString(... , OBJPROP_BMPFILE, ...) 또는 PlaySound()가 호출된 어떤 함수에서 이뤄집니다.
PlaySound() 함수의 경우 한 가지 추가 사항이 있습니다. 위의 두 가지 방법을 사용하여 파일을 찾지 못한 경우이 사운드 파일은 terminal_directory\Sounds\를 기준으로 검색됩니다.


사운드 파일의 예 :

  • one.wav 파일은 terminal_data_directory\MQL5\에서 검색됩니다.
    PlaySound("\\one.wav");
  • two.wav 파일은 terminal_data_directory\MQL5\Files\에서 검색됩니다.
    PlaySound("\\Files\\two.wav");
  • three.wav 파일은 terminal_data_directory\MQL5\MySounds\에서 검색됩니다.
    PlaySound("\\MySounds\\three.wav");
  • 파일 four.wav는 실행 가능한 EX5가 실행중인 폴더에서 검색됩니다. 이 파일이 해당 폴더에 없으면 terminal_directory\Sounds\ 폴더에서 파일을 찾으려고 시도합니다.
    PlaySound("four.wav");


이미지 파일의 예 :

  • bird.bmp 파일은 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
  • swan.bmp는 terminal_data_directory\MQL5\Files\에서 검색됩니다.
    //--- Setting an image for the OBJ_BITMAP object
    bool set=ObjectSetString(0,object_name,OBJPROP_BMPFILE,"\\Files\\swan.bmp");// No modifier
  • dog.bmp는 terminal_data_directory\MQL5\MyPictures\에서 검색됩니다.
    //--- Setting an image for OBJ_BITMAP
    bool done=ObjectSetString(0,object_name,OBJPROP_BMPFILE,"\\MyPictures\\dog.bmp");// No modifier
  • cat.bmp는 실행 가능한 EX5 파일이 실행되는 폴더에서 검색됩니다.
    //--- Setting an image for OBJ_BITMAP
    bool result=ObjectSetString(0,object_name,OBJPROP_BMPFILE,"cat.bmp");// No modifier

이중 백 슬래시 "\\"는 경로를 쓸 때 구분 기호로 사용됩니다.

중요: 경로를 지정할 때 항상 이중 백 슬래시를 구분 기호로 사용하십시오. 프로그램의 소스 코드에서 상수 행과 문자 상수를 구문 분석 할 때 단일 백 슬래시가 컴파일러에 대한 컨트롤 문자로 사용되기 때문입니다.


새로운 가능성 - 리소스

MQL5 프로그램에서 이미지와 사운드를 사용하려면 사용하는 모든 미디어 파일이 적절한 폴더에 있는지 확인하십시오. 이로 인해 컴파일된 EX5 파일을 한 터미널에서 다른 터미널로 전송할 때 확실한 단점이 있습니다. 그러나 코드 작성 단계에서 이 문제는 해결이 가능합니다. 이 경우 리소스를 사용하십시오.

프로그램에서 리소스를 사용하려면 컴파일러 지시문 #resource을 사용하여 선언해야 합니다.

 #resource path_to_resource_file

이제 이 리소스은 파일 경로 대신 사용이 가능합니다. #resource 명령은 지정된 경로인 path_to_resource_file에 있는 리소스가 실행 가능한 EX5 파일에 포함되어야 함을 컴파일러에 알리게 됩니다. 따라서 필요한 모든 이미지와 사운드를 EX5 파일에 직접 저장할 수 있습니다. 이제 다른 터미널에서 MQL5 프로그램을 시작하기 위해 사용된 모든 파일을 전송할 필요가 없어졌습니다.

모든 EX5 파일에는 리소스가 포함될 수 있으며 모든 EX5 프로그램은 다른 EX5 프로그램의 리소스를 사용할 수 있습니다. 즉, Expert Advisor는 지표 또는 EX5 라이브러리에 있는 리소스를 사용할 수 있습니다. 이것은 리소스 사용의 또 다른 편익입니다.

리소스를 사용하면 한 번에 모든 걸 획득하는 것이 가능해집니다 - 소스 코드를 컴파일하는 동안 실행 파일 자체와 여기에서 사용하는 모든 리소스가 EX5 파일로 패키징됩니다.


컴파일러에 의한 리소스 검색

자원은 지시문을 사용하여 지정됩니다 #resource "<리소스 파일 경로>"

 #resource "<path_to_resource_file>"
상수 문자열 ><path_to_resource_file> 의 길이는 63자를 초과 할 수 없습니다. 컴파일러는 다음 순서로 지정된 경로에서 리소스를 검색합니다.1
  • 백 슬래시 "\"가 경로 시작 위치에 있으면 리소스는 terminal_data_directory\MQL5\ 폴더를 기준으로 검색됩니다.
  • 백 슬래시가 없으면 이 리소스가 기록된 소스파일의 위치를 ​​기준으로 리소스를 검색하게 됩니다.

중요: 리소스 경로에서 하위 문자열 "..\\" 및 ":\\"를 사용하는 것은 허용되지 않습니다.

도움말 항목을 포함한 리소스의 예 리소스 (Resources):

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


리소스 명

#resource 지시문을 사용하여 리소스를 선언한 후 프로그램의 모든 부분에서 사용할 수 있습니다. 리소스 이름의 경우 리소스 경로를 정의하는 문자열 시작 부분에 슬래시가 없는 경로가 사용됩니다.

예:

//---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"

리소스 명은 대소 문자를 구분하지 않습니다. 컴파일러의 경우 dog.bmp 및 DOG.bmp 이름은 같은 의미입니다.


자체 및 타사 리소스 사용

리소스를 사용하려면 이름을 지정해야 합니다. 리소스 명은 줄 시작 부분에 백 슬래시가 없는 경로입니다. 자체 리소스를 사용하는 경우 특수 속성 "::"필수적으로이 리소스 이름 앞에 추가 되어야 합니다.

//--- 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");

자체 리소스 (EX5 파일)뿐만 아니라 모든 EX5 라이브러리 및 모듈에서도 사용할 수 있습니다. 따라서 리소스 저장소를 만들어 다른 많은 mql5 프로그램에서 사용할 수 있습니다.

다른 EX5 파일의 리소스를 사용하려면 리소스 이름을 <EX5_file_name_path>::<resource_name> 형식으로 지정해야 합니다. Draw_Triangles_Script.mq5 cript에 triangle.bmp 파일의 이미지에 대한 리소스가 포함되어 있다고 가정합니다.

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

그런 다음 스크립트 자체에서 사용하기 위한 이름은 "Files\triangle.bmp"와 같이 표시되며이를 사용하려면 리소스 이름에 "::"를 추가해야 합니다-":: Files\triangle.bmp". 다른 프로그램에서 동일한 리소스를 사용하려면 Expert Advisor에서 terminal_data_directory\MQL5\ 에 상대적인 EX5 파일 경로를 리소스 이름에 추가해야 합니다. 스크립트의 EX5 파일 이름 - Draw_Triangles_Script.ex5. 스크립트가 표준 폴더 terminal_data_directory\MQL5\Scripts\, 에 있다고 가정하면 다음과 같은 방식으로 호출을 작성해야 합니다.

//--- 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");

다른 EX5에서 리소스를 호출 할 때 실행 파일 경로를 지정하지 않으면 해당 리소스를 호출하는 프로그램이 포함된 동일한 폴더에서 실행 파일이 검색됩니다. 이는 다음을 의미합니다. 만약 Expert Advisor terminal_data_directory\MQL5\에 위치하는 경우Experts\ 및 파일의 리소스인 Draw_Triangles_Script.ex5의 경로 지정없이 요청한 다음 파일리 terminal_data_directory\MQL5\Expers\.에서 검색됩니다.

//--- 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 파일의 리소스 압축 - 작동 방식

BMP 및 WAV의 파일은 실행 가능한 EX5 파일에 포함되기 전에 자동으로 압축됩니다. 즉, 리소스를 사용하면 모든 기능을 갖춘 MQL5 프로그램을 만들 수 있을 뿐만 아니라 기존의 MQL5 프로그램 작성 방법에 비해 이미지와 사운드를 사용할 때 터미널에 필요한 파일의 전체 크기가 줄어 듭니다.

리소스 파일 크기는 16MB를 초과 할 수 없습니다.

중요: 리소스 사용의 또 다른 이점은 실행 가능한 EX5 파일로 압축할 때 WAV 및 BMP 파일을 자동으로 압축한다는 것입니다. 이렇게 하면 프로그램에서 사용하는 파일의 양 뿐만 아니라 크기도 줄어들게 됩니다.

예를 들어, 작은 프로그램 Animals_EA.mq5를 생각해보세요. 리소스 사용을 위한 작은 코드 블록은 다음과 같습니다.

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

프로그램의 임무는 파란색 배경 (기판), 마우스 클릭으로 모양이 변경되는 두 개의 그래픽 버튼에 그리는 것입니다. 기판을 클릭하면 색상이 파란색에서 베이지 색으로 변경되고 그 반대의 경우도 마찬가지입니다. 변경할 때마다 사운드가 재생되고 마우스 클릭 이벤트는 OnChartEvent() 함수에서 처리됩니다. Adviser Animals_EA.mq5가 시작된 직후의 차트가 그림에 표시됩니다.



OBJ_BITMAP_LABEL 개체의 속성(예 : cat_dog)을 살펴보십시오. 이제 대화 상자를 통해 비트 맵 파일 (켜기) 및 비트 맵 파일 (끄기)의 속성을 변경할 수 없습니다. 이러한 필드는 사용할 수 없으며 흐리게 표시됩니다.


중요: 그래픽 개체에서 리소스에서 로드된 이미지는 프로그래밍 방식으로만 변경할 수 있습니다. 개체의 속성 창을 통해 이러한 속성을 수동으로 변경할 수 없게 됩니다.

Expert Advisor Animals_EA.mq5가 사용하는 총 이미지 볼륨은 430 kb입니다.


그러나 이러한 모든 그림을 포함하는 결과 실행 파일 Animals_EA.ex5의 크기는 339 kb입니다. 따라서 9 개의 파일 (MQ5 파일 1 개, BMP 파일 4 개 및 WAV 파일 4 개) 대신 프로그램에 필요한 모든 리소스를 포함하는 EX5 파일 1 개가 있습니다.

24 비트 또는 32 비트 BMP의 이미지만 리소스에서 사용할 수 있습니다. 32 비트 BMP는 알파 합성을 포함할 수 있습니다. 이 경우 투명도가 있는 차트에 적용됩니다.

Expert Advisor Animals_EA.mq5의 파일, 이미지 및 사운드가 이 글에 첨부됩니다.

  • 이미지는 архива images.zip에서 terminal_data_directory\MQL5\Images\로 압축 해제되어야 합니다.
  • MySounds.zip의 사운드는 terminal_data_directory\MQL5\Files\MySounds\에 압축을 풀어야 합니다.

터미널에서 이 프로그램을 테스트하려면 필요한 모든 리소스가 포함된 첨부된 Expert Advisor Animals_EA.ex5를 다운로드하기만 하면 됩니다. 이 경우 이미지 및 사운드 파일을 다운로드하여 설치할 필요가 없습니다.


리소스로 포함된 맞춤 인디케이터 작업

MQL5 애플리케이션의 작동을 위해 하나 또는 여러 개의 맞춤 인디케이터가 필요할 수 있습니다. 이들 모두는 실행 가능한 MQL5 프로그램의 코드에 포함될 수 있습니다. 지표를 리소스로 포함하면 애플리케이션 배포가 단순화됩니다.

다음은 terminal_data_folder\MQL5\Indicators\ 디렉토리에 있는 SampleIndicator.ex5 맞춤 인디케이터를 포함하고 사용하는 예입니다.

//+------------------------------------------------------------------+
//|                                                     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() 함수의 맞춤 인디케이터가 하나 이상의 자체 복사본을 만드는 경우 특별한 고려가 필요합니다. 리소스는 <path_EX5_file_name>::<resource_name>방식으로 지정해야 합니다.

예를 들어 SampleIndicator.ex5 인디케이터가 SampleEA.ex5 Expert Advisor에 리소스로 포함된 경우 맞춤 인디케이터의 초기화 함수에서 iCustom()을 호출 할 때 지정되는 자체 경로는 다음과 같습니다."\\Experts\\SampleEA.ex5::Indicators\\ SampleIndicator.ex5". 이 경로를 명시적으로 설정하면 SampleIndicator.ex5 맞춤 인디케이터가 SampleEA.ex5 Expert Advisor에 단단히 연결되어 독립적으로 작업 할 수 없게 됩니다.

GetRelativeProgramPath() 함수를 사용하여 자체 경로를 받을 수 있습니다. 사용 예는 다음과 같습니다.

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


터미널의 메모리 저장

각 리소스는 터미널 메모리에 한 번만 로드됩니다. 정상적으로 사용하는 동안 파일에 액세스 할 때마다 메모리에 파일이 추가로 로드됩니다. 예를 들어 50 개의 OBJ_BITMAP 객체가 있다고 가정해보겠습니다. 각 객체에는 100 kb 크기의 동일한 이미지가 포함되어 있습니다. 그런 다음 정상적인 사용 중에 이러한 50 개 개체에는 메모리 50*100kb=5Mb가 필요합니다.

업로드된 이미지에 대한 리소스를 선언하면이 사진은 사용되는 개체 수에 관계없이 한 번만 메모리에 로드됩니다.

중요: 리소스는 메모리에 한 번만 로드되며 여러 번 사용하면 메모리를 절약 할 수 있습니다.


결론

리소스 사용은 MQL5 프로그램의 사용 및 배포를 용이하게 해줍니다. 편안하고 현대적인 거래 도구를 만들려면 멀티미디어 기반 이미지 및 사운드 파일을 사용해야 합니다. MQL5의 리소스 개념은 간단하고 이해하기 쉽기 때문에 시도해봐도 좋을 것입니다.

32 비트 BMP 형식의 이미지는 알파 합성을 포함 할 수 있습니다. 이 경우 투명도가 있는 차트에 적용됩니다.

리소스는 다음과 같은 이점을 제공합니다.

  • 압축성 - 모든 파일이 실행 가능한 단일 EX5 파일에 패키지되어 있으므로 프로그램을 쉽게 전송하고 실행할 수 있습니다.
  • 메모리 절약 - 터미널 메모리는 프로그램에서의 사용 빈도에 관계없이 항상 각 리소스의 인스턴스를 하나만 포함합니다.
  • 편리한 저장 - 모든 리소스가 포함된 하나의 EX5 파일은 원본 이미지와 사운드 파일을 합한 것보다 적습니다.

MetaQuotes 소프트웨어 사를 통해 러시아어가 번역됨.
원본 기고글: https://www.mql5.com/ru/articles/261

파일 첨부됨 |
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 마법사 : 새 버전 MQL5 마법사 : 새 버전
이 문서에는 업데이트된 MQL5 마법사에서 사용할 수있는 새로운 기능에 대한 설명이 포함되어 있습니다. 수정된 신호 아키텍처를 통해 다양한 시장 패턴의 조합을 기반으로 거래 로봇을 만들 수 있습니다. 이 글에 포함된 예제는 Expert Advisor의 대화 형 생성 절차를 설명합니다.
MetaTrader 5 테스트의 기초 MetaTrader 5 테스트의 기초
MetaTrader 5의 세 가지 테스트 모드의 차이점은 무엇이며 특히 무엇을 찾아야 합니까? 여러 상품에서 동시에 거래되는 EA 테스트는 어떻게 이루어 집니까? 테스트 중 지표 ​​값은 언제 어떻게 계산되며 이벤트는 어떻게 처리됩니까? "오픈 프라이스 전용" 모드에서 테스트하는 동안 다른 기기의 바를 동기화하는 방법은 무엇입니까? 이 글에서 저희는 이러한 질문과 다른 많은 질문에 대한 답변을 제공하는 것을 목표로 합니다.
사용자 정의 그래픽 컨트롤. 1 부: 간단한 컨트롤 만들기 사용자 정의 그래픽 컨트롤. 1 부: 간단한 컨트롤 만들기
이 글에서는 그래픽 컨트롤 개발의 일반 원칙을 다룹니다. 그래픽 개체로 빠르고 편리한 작업을 위한 도구를 준비하고 텍스트 또는 숫자 데이터를 입력하기위한 간단한 컨트롤 생성의 예와 사용 방법을 분석 할 것입니다.
MetaTrader 5에서의 거래 이벤트 MetaTrader 5에서의 거래 이벤트
거래 계정의 현재 상태를 모니터링한다는 것은 오픈 포지션과 주문을 통제한다는 것을 의미합니다. 거래 신호가 진정한 거래가 되기 전, 이는 거래 서버로의 요청으로써 클라이언트 터미널에서 전송되어야 하며, 이 때 거래 서버는 처리 대기 중인 주문 대기열에 배치될 것입니다. 거래 서버에 의한 수락하거나, 만료 시 삭제하거나, 거래 기준으로 거래를 수행하는 등과 관련된 이러한 모든 조치에는 거래 이벤트가 뒤따르게 되고, 이 때 거래 서버는 터미널에 이런 사항에 대해 알려주게 됩니다.