Tài nguyên
Sử dụng đồ họa và âm thanh trong chương trình MQL5
Các chương trình trong MQL5 cho phép làm việc với tệp âm thanh và đồ họa:
- PlaySound() phát một tệp âm thanh.
- ObjectCreate() cho phép tạo giao diện người dùng bằng đối tượng đồ họa
OBJ_BITMAP
vàOBJ_BITMAP_LABEL
.
PlaySound()
Ví dụ về cách gọi hàm PlaySound():
//+------------------------------------------------------------------+
//| Gọi OrderSend() tiêu chuẩn và phát âm thanh |
//+------------------------------------------------------------------+
void OrderSendWithAudio(MqlTradeRequest &request, MqlTradeResult &result)
{
//--- gửi yêu cầu đến máy chủ
OrderSend(request,result);
//--- nếu yêu cầu được chấp nhận, phát âm thanh Ok.wav
if(result.retcode==TRADE_RETCODE_PLACED) PlaySound("Ok.wav");
//--- nếu thất bại, phát âm báo động từ tệp timeout.wav
else PlaySound("timeout.wav");
}
2
3
4
5
6
7
8
9
10
11
12
Ví dụ cho thấy cách phát âm thanh từ các tệp Ok.wav
và timeout.wav
, được bao gồm trong gói terminal tiêu chuẩn. Các tệp này nằm trong thư mục terminal_directory\Sounds
. Ở đây terminal_directory
là thư mục mà MetaTrader 5 Client Terminal được khởi động. Vị trí của thư mục terminal có thể được tìm ra từ chương trình MQL5 như sau:
//--- Thư mục nơi lưu trữ dữ liệu terminal
string terminal_path=TerminalInfoString(TERMINAL_PATH);
2
Bạn có thể sử dụng tệp âm thanh không chỉ từ thư mục terminal_directory\Sounds
, mà còn từ bất kỳ thư mục con nào nằm trong terminal_data_directory\MQL5
. Bạn có thể tìm ra vị trí của thư mục dữ liệu terminal từ menu terminal "Tệp" -> "Mở Thư mục Dữ liệu" hoặc bằng cách sử dụng phương thức chương trình:
//--- Thư mục nơi lưu trữ dữ liệu terminal
string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);
2
Ví dụ, nếu tệp âm thanh Demo.wav nằm trong terminal_data_directory\MQL5\Files
, thì lệnh gọi PlaySound()
nên được viết như sau:
//--- phát Demo.wav từ thư mục terminal_directory_data\MQL5\Files\
PlaySound("\\Files\\Demo.wav");
2
Lưu ý rằng trong chú thích, đường dẫn đến tệp được viết bằng dấu gạch chéo ngược "", còn trong hàm thì sử dụng "\".
Khi chỉ định đường dẫn, luôn sử dụng dấu gạch chéo ngược kép làm dấu phân cách, vì dấu gạch chéo ngược đơn là ký hiệu điều khiển cho trình biên dịch khi xử lý chuỗi hằng và hằng ký tự trong mã nguồn chương trình.
Gọi hàm PlaySound() với tham số NULL
để dừng phát lại:
//--- gọi PlaySound() với tham số NULL để dừng phát lại
PlaySound(NULL);
2
ObjectCreate()
Ví dụ về Expert Advisor tạo nhãn đồ họa (OBJ_BITMAP_LABEL
) bằng hàm ObjectCreate()
.
string label_name="currency_label"; // tên của đối tượng OBJ_BITMAP_LABEL
string euro ="\\Images\\euro.bmp"; // đường dẫn đến tệp terminal_data_directory\MQL5\Images\euro.bmp
string dollar ="\\Images\\dollar.bmp"; // đường dẫn đến tệp terminal_data_directory\MQL5\Images\dollar.bmp
//+------------------------------------------------------------------+
//| Hàm khởi tạo Expert |
//+------------------------------------------------------------------+
int OnInit()
{
//--- tạo một nút OBJ_BITMAP_LABEL, nếu nó chưa được tạo
if(ObjectFind(0,label_name)<0)
{
//--- cố gắng tạo đối tượng OBJ_BITMAP_LABEL
bool created=ObjectCreate(0,label_name,OBJ_BITMAP_LABEL,0,0,0);
if(created)
{
//--- liên kết nút với góc trên bên phải của biểu đồ
ObjectSetInteger(0,label_name,OBJPROP_CORNER,CORNER_RIGHT_UPPER);
//--- bây giờ thiết lập thuộc tính đối tượng
ObjectSetInteger(0,label_name,OBJPROP_XDISTANCE,100);
ObjectSetInteger(0,label_name,OBJPROP_YDISTANCE,50);
//--- đặt lại mã lỗi cuối cùng về 0
ResetLastError();
//--- tải hình ảnh để biểu thị trạng thái "Đã nhấn" của nút
bool set=ObjectSetString(0,label_name,OBJPROP_BMPFILE,0,euro);
//--- kiểm tra kết quả
if(!set)
{
PrintFormat("Không thể tải hình ảnh từ tệp %s. Mã lỗi %d",euro,GetLastError());
}
ResetLastError();
//--- tải hình ảnh để biểu thị trạng thái "Chưa nhấn" của nút
set=ObjectSetString(0,label_name,OBJPROP_BMPFILE,1,dollar);
if(!set)
{
PrintFormat("Không thể tải hình ảnh từ tệp %s. Mã lỗi %d",dollar,GetLastError());
}
//--- gửi lệnh để làm mới biểu đồ để nút xuất hiện ngay lập tức mà không cần tick
ChartRedraw(0);
}
else
{
//--- không thể tạo đối tượng, thông báo
PrintFormat("Không thể tạo đối tượng OBJ_BITMAP_LABEL. Mã lỗi %d",GetLastError());
}
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Hàm hủy khởi tạo Expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- xóa đối tượng khỏi biểu đồ
ObjectDelete(0,label_name);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Việc tạo và thiết lập đối tượng đồ họa có tên currency_label
được thực hiện trong hàm OnInit()
. Đường dẫn đến các tệp đồ họa được đặt trong biến toàn cục euro
và dollar
, sử dụng dấu gạch chéo ngược kép làm dấu phân cách:
string euro ="\\Images\\euro.bmp"; // đường dẫn đến tệp terminal_dara_directory\MQL5\Images\euro.bmp
string dollar ="\\Images\\dollar.bmp"; // đường dẫn đến tệp terminal_dara_directory\MQL5\Images\dollar.bmp
2
Các tệp nằm trong thư mục terminal_data_directory\MQL5\Images
.
Đối tượng OBJ_BITMAP_LABEL
thực chất là một nút, hiển thị một trong hai hình ảnh tùy thuộc vào trạng thái của nút (đã nhấn hoặc chưa nhấn): euro.bmp
hoặc dollar.bmp
.
Kích thước của nút với giao diện đồ họa được tự động điều chỉnh theo kích thước của hình ảnh. Hình ảnh được thay đổi bằng cách nhấp chuột trái vào đối tượng OBJ_BITMAP_LABEL
(tùy chọn Tắt chọn
phải được đánh dấu trong thuộc tính). Đối tượng OBJ_BITMAP
được tạo theo cách tương tự - nó được sử dụng để tạo nền với hình ảnh cần thiết.
Giá trị của thuộc tính OBJPROP_BMPFILE, chịu trách nhiệm cho giao diện của các đối tượng OBJ_BITMAP
và OBJ_BITMAP_LABEL
, có thể được thay đổi động. Điều này cho phép tạo ra các giao diện người dùng tương tác khác nhau cho chương trình MQL5.
Bao gồm tài nguyên vào tệp thực thi trong quá trình biên dịch chương trình MQL5
Một chương trình MQL5 có thể cần nhiều tài nguyên tải xuống khác nhau dưới dạng tệp hình ảnh và âm thanh. Để loại bỏ nhu cầu chuyển tất cả các tệp này khi di chuyển tệp thực thi trong MQL5, nên sử dụng chỉ thị của trình biên dịch #resource
:
#resource path_to_resource_file
Lệnh #resource
thông báo cho trình biên dịch rằng tài nguyên tại đường dẫn được chỉ định path_to_resource_file
nên được bao gồm vào tệp thực thi EX5. Do đó, tất cả các hình ảnh và âm thanh cần thiết có thể được đặt trực tiếp trong tệp EX5, để không cần chuyển riêng các tệp được sử dụng trong đó nếu bạn muốn chạy chương trình trên terminal khác. Bất kỳ tệp EX5 nào cũng có thể chứa tài nguyên, và bất kỳ chương trình EX5 nào cũng có thể sử dụng tài nguyên từ chương trình EX5 khác.
Các tệp định dạng BMP và WAV được tự động nén trước khi đưa vào tệp EX5. Điều này có nghĩa là ngoài việc tạo các chương trình hoàn chỉnh trong MQL5, việc sử dụng tài nguyên cũng cho phép giảm tổng kích thước của các tệp cần thiết khi sử dụng đồ họa và âm thanh, so với cách viết chương trình MQL5 thông thường.
Kích thước tệp tài nguyên không được vượt quá 128 Mb.
Tìm kiếm tài nguyên được chỉ định bởi trình biên dịch
Tài nguyên được chèn bằng lệnh #resource "<đường dẫn đến tệp tài nguyên>"
#resource "<path_to_resource_file>"
Độ dài của chuỗi hằng path_to_resource_file
không được vượt quá 63 ký tự.
Trình biên dịch tìm kiếm tài nguyên tại đường dẫn được chỉ định theo thứ tự sau:
- Nếu dấu phân cách gạch chéo ngược "" (viết là "\") được đặt ở đầu đường dẫn, nó tìm kiếm tài nguyên tương ứng với thư mục
terminal_data_directory
\MQL5\ - Nếu không có dấu gạch chéo ngược, nó tìm kiếm tài nguyên tương ứng với vị trí của tệp nguồn, nơi tài nguyên được viết.
Đường dẫn tài nguyên không được chứa các chuỗi con "..\" và ":\".
Ví dụ về việc bao gồm tài nguyên:
//--- chỉ định tài nguyên đúng
#resource "\\Images\\euro.bmp" // euro.bmp nằm trong terminal_data_directory\MQL5\Images\
#resource "picture.bmp" // picture.bmp nằm trong cùng thư mục với tệp nguồn
#resource "Resource\\map.bmp" // tài nguyên nằm trong source_file_directory\Resource\map.bmp
//--- chỉ định tài nguyên sai
#resource ":picture_2.bmp" // không được chứa ":"
#resource "..\\picture_3.bmp" // không được chứa ".."
#resource "\\Files\\Images\\Folder_First\\My_panel\\Labels\\too_long_path.bmp" // hơn 63 ký tự
2
3
4
5
6
7
8
9
Sử dụng Tài nguyên
Tên tài nguyên
Sau khi tài nguyên được khai báo bằng chỉ thị #resource
, nó có thể được sử dụng ở bất kỳ phần nào của chương trình. Tên của tài nguyên là đường dẫn của nó không có dấu gạch chéo ngược ở đầu dòng, dùng để đặt đường dẫn đến tài nguyên. Để sử dụng tài nguyên của riêng bạn trong mã, cần thêm ký hiệu đặc biệt "::" trước tên tài nguyên.
Ví dụ:
//--- ví dụ về chỉ định tài nguyên và tên của chúng trong chú thích
#resource "\\Images\\euro.bmp" // tên tài nguyên - Images\euro.bmp
#resource "picture.bmp" // tên tài nguyên - picture.bmp
#resource "Resource\\map.bmp" // tên tài nguyên - Resource\map.bmp
#resource "\\Files\\Pictures\\good.bmp" // tên tài nguyên - Files\Pictures\good.bmp
#resource "\\Files\\Demo.wav"; // tên tài nguyên - Files\Demo.wav"
#resource "\\Sounds\\thrill.wav"; // tên tài nguyên - Sounds\thrill.wav"
...
//--- sử dụng tài nguyên
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");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Cần lưu ý rằng khi đặt hình ảnh từ tài nguyên vào các đối tượng OBJ_BITMAP
và OBJ_BITMAP_LABEL
, giá trị của thuộc tính OBJPROP_BMPFILE
không thể được sửa đổi thủ công. Ví dụ, để tạo OBJ_BITMAP_LABEL
, chúng ta sử dụng tài nguyên euro.bmp
và dollar.bmp
.
#resource "\\Images\\euro.bmp"; // euro.bmp nằm trong terminal_data_directory\MQL5\Images\
#resource "\\Images\\dollar.bmp"; // dollar.bmp nằm trong terminal_data_directory\MQL5\Images\
2
Khi xem thuộc tính của đối tượng này, chúng ta sẽ thấy rằng các thuộc tính BitMap File (On)
và BitMap File (Off)
bị mờ đi và không thể thay đổi thủ công:
Sử dụng tài nguyên của các chương trình MQL5 khác
Một lợi thế khác của việc sử dụng tài nguyên là trong bất kỳ chương trình MQL5 nào, tài nguyên của tệp EX5 khác có thể được sử dụng. Do đó, tài nguyên từ một tệp EX5 có thể được dùng trong nhiều chương trình MQL5 khác.
Để sử dụng tên tài nguyên từ một tệp khác, nó cần được chỉ định dưới dạng <path_EX5_file_name>::<resource_name>
. Ví dụ, giả sử script Draw_Triangles_Script.mq5
chứa một tài nguyên đến hình ảnh trong tệp triangle.bmp
:
#resource "\\Files\\triangle.bmp"
Sau đó, tên của nó, để sử dụng trong chính script, sẽ trông như Files\triangle.bmp
, và để sử dụng nó, cần thêm ::
vào tên tài nguyên.
//--- sử dụng tài nguyên trong script
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"::Files\\triangle.bmp");
2
Để sử dụng cùng tài nguyên đó từ một chương trình khác, ví dụ từ Expert Advisor, chúng ta cần thêm vào tên tài nguyên đường dẫn đến tệp EX5 tương ứng với terminal_data_directory\MQL5\
và tên của tệp EX5 của script - Draw_Triangles_Script.ex5
. Giả sử script nằm trong thư mục tiêu chuẩn terminal_data_directory\MQL5\Scripts\
, thì lệnh gọi nên được viết như sau:
//--- sử dụng tài nguyên từ script trong EA
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"\\Scripts\\Draw_Triangles_Script.ex5::Files\\triangle.bmp");
2
Nếu đường dẫn đến tệp thực thi không được chỉ định khi gọi tài nguyên từ EX5 khác, tệp thực thi sẽ được tìm kiếm trong cùng thư mục chứa chương trình gọi tài nguyên. Điều này có nghĩa là nếu Expert Advisor gọi tài nguyên từ Draw_Triangles_Script.ex5
mà không chỉ định đường dẫn, như sau:
//--- gọi tài nguyên script trong EA mà không chỉ định đường dẫn
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"Draw_Triangles_Script.ex5::Files\\triangle.bmp");
2
thì tệp sẽ được tìm kiếm trong thư mục terminal_data_directory\MQL5\Experts\
, nếu Expert Advisor nằm trong terminal_data_directory\MQL5\Experts\
.
Làm việc với các chỉ báo tùy chỉnh được bao gồm dưới dạng tài nguyên
Một hoặc nhiều chỉ báo tùy chỉnh có thể cần thiết cho hoạt động của các ứng dụng MQL5. Tất cả chúng có thể được bao gồm vào mã của chương trình MQL5 thực thi. Việc bao gồm các chỉ báo dưới dạng tài nguyên đơn giản hóa việc phân phối ứng dụng.
Dưới đây là ví dụ về việc bao gồm và sử dụng chỉ báo tùy chỉnh SampleIndicator.ex5
nằm trong thư mục terminal_data_folder\MQL5\Indicators\
:
//+------------------------------------------------------------------+
//| SampleEA.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#resource "\\Indicators\\SampleIndicator.ex5"
int handle_ind;
//+------------------------------------------------------------------+
//| Hàm khởi tạo Expert |
//+------------------------------------------------------------------+
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);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Trường hợp khi một chỉ báo tùy chỉnh trong hàm OnInit() tạo ra một hoặc nhiều bản sao của chính nó cần được xem xét đặc biệt. Vui lòng lưu ý rằng tài nguyên nên được chỉ định theo cách sau: <path_EX5_file_name>::<resource_name>
.
Ví dụ, nếu chỉ báo SampleIndicator.ex5
được bao gồm vào Expert Advisor SampleEA.ex5
dưới dạng tài nguyên, đường dẫn đến chính nó được chỉ định khi gọi iCustom() trong hàm khởi tạo của chỉ báo tùy chỉnh sẽ trông như sau: \\Experts\\SampleEA.ex5::Indicators\\SampleIndicator.ex5
. Khi đường dẫn này được đặt rõ ràng, chỉ báo tùy chỉnh SampleIndicator.ex5
được liên kết chặt chẽ với Expert Advisor SampleEA.ex5
, mất khả năng hoạt động độc lập.
Đường dẫn đến chính nó có thể được lấy bằng hàm GetRelativeProgramPath()
. Ví dụ về cách sử dụng được cung cấp dưới đây:
//+------------------------------------------------------------------+
//| SampleIndicator.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_plots 0
int handle;
//+------------------------------------------------------------------+
//| Hàm khởi tạo chỉ báo tùy chỉnh |
//+------------------------------------------------------------------+
int OnInit()
{
//--- cách sai để cung cấp liên kết đến chính nó
//--- string path="\\Experts\\SampleEA.ex5::Indicators\\SampleIndicator.ex5";
//--- cách đúng để nhận liên kết đến chính nó
string path=GetRelativeProgramPath();
//--- ánh xạ bộ đệm chỉ báo
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;
//--- lấy đường dẫn tuyệt đối đến ứng dụng
string path=MQLInfoString(MQL_PROGRAM_PATH);
//--- tìm vị trí của chuỗi con "\MQL5\"
int pos =StringFind(path,"\\MQL5\\");
//--- không tìm thấy chuỗi con - lỗi
if(pos<0)
return(NULL);
//--- bỏ qua thư mục "\MQL5"
pos+=5;
//--- bỏ qua các ký hiệu '\' thừa
while(StringGetCharacter(path,pos+1)=='\\')
pos++;
//--- nếu đây là tài nguyên, trả về đường dẫn tương đối với thư mục MQL5
if(StringFind(path,"::",pos)>=0)
return(StringSubstr(path,pos));
//--- tìm dấu phân cách cho thư mục con MQL5 đầu tiên (ví dụ, MQL5\Indicators)
//--- nếu không tìm thấy, trả về đường dẫn tương đối với thư mục MQL5
if((pos2=StringFind(path,"\\",pos+1))<0)
return(StringSubstr(path,pos));
//--- trả về đường dẫn tương đối với thư mục con (ví dụ, MQL5\Indicators)
return(StringSubstr(path,pos2+1));
}
//+------------------------------------------------------------------+
//| Hàm lặp chỉ báo tùy chỉnh |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const int begin,
const double& price[])
{
//--- trả về giá trị của prev_calculated cho lần gọi tiếp theo
return(rates_total);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
Biến tài nguyên
Tài nguyên có thể được khai báo bằng các biến tài nguyên và được xử lý như thể chúng là biến của loại thích hợp. Định dạng khai báo:
#resource path_to_the_resource_file as resource_variable_type resource_variable_name
Ví dụ khai báo:
#resource "data.bin" as int ExtData[] // khai báo mảng số chứa dữ liệu từ tệp data.bin
#resource "data.bin" as MqlRates ExtData[] // khai báo mảng [cấu trúc đơn giản](../basis/types/classes#simple_structure) chứa dữ liệu từ tệp data.bin
//--- chuỗi
#resource "data.txt" as string ExtCode // khai báo chuỗi chứa dữ liệu tệp data.txt (hỗ trợ mã hóa ANSI, UTF-8 và UTF-16)
//--- tài nguyên đồ họa
#resource "image.bmp" as bitmap ExtBitmap[] // khai báo mảng một chiều chứa bitmap từ tệp BMP, kích thước mảng = chiều cao * chiều rộng
#resource "image.bmp" as bitmap ExtBitmap2[][] // khai báo mảng hai chiều chứa bitmap từ tệp BMP, kích thước mảng [chiều cao][chiều rộng]
2
3
4
5
6
7
Trong trường hợp khai báo như vậy, dữ liệu tài nguyên chỉ có thể được truy cập qua biến, định địa chỉ tự động
qua ::<rsource name>
không hoạt động
.
#resource "\\Images\\euro.bmp" as bitmap euro[][]
#resource "\\Images\\dollar.bmp"
//+------------------------------------------------------------------+
//| Hàm tạo đối tượng OBJ_BITMAP_LABEL sử dụng tài nguyên |
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
//| Hàm khởi động chương trình Script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- xuất kích thước hình ảnh [chiều rộng, chiều cao] được lưu trong biến tài nguyên euro
Print(ArrayRange(euro,1),", ",ArrayRange(euro,0));
//--- thay đổi hình ảnh trong euro - vẽ sọc ngang đỏ ở giữa
for(int x=0;x<ArrayRange(euro,1);x++)
euro[ArrayRange(euro,1)/2][x]=0xFFFF0000;
//--- tạo tài nguyên đồ họa bằng biến tài nguyên
ResourceCreate("euro_icon",euro,ArrayRange(euro,1),ArrayRange(euro,0),0,0,ArrayRange(euro,1),COLOR_FORMAT_ARGB_NORMALIZE);
//--- tạo đối tượng nhãn đồ họa Euro, hình ảnh từ tài nguyên euro_icon sẽ được đặt vào
Image("Euro","::euro_icon",10,40);
//--- phương pháp khác để áp dụng tài nguyên, chúng ta không thể vẽ lên nó
Image("USD","::Images\\dollar.bmp",15+ArrayRange(euro,1),40);
//--- phương pháp định địa chỉ trực tiếp tài nguyên euro.bmp không khả dụng vì nó đã được khai báo qua biến tài nguyên euro
Image("E2","::Images\\euro.bmp",20+ArrayRange(euro,1)*2,40); // lỗi thời gian thực thi sẽ xảy ra
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Kết quả thực thi script – chỉ hai trong ba đối tượng OBJ_BITMAP_LABEL được tạo. Hình ảnh của đối tượng đầu tiên có sọc đỏ ở giữa.
Một lợi thế quan trọng của việc áp dụng tài nguyên là các tệp tài nguyên được tự động nén trước khi được bao gồm vào tệp thực thi EX5 trước khi biên dịch. Do đó, sử dụng biến tài nguyên cho phép bạn đặt tất cả dữ liệu cần thiết trực tiếp vào tệp thực thi EX5 cũng như giảm số lượng và tổng kích thước của các tệp so với cách viết chương trình MQL5 thông thường.
Việc sử dụng biến tài nguyên đặc biệt tiện lợi cho việc xuất bản sản phẩm trên Market.
Tính năng
- Loại biến tài nguyên đặc biệt
bitmap
thông báo cho trình biên dịch rằng tài nguyên là hình ảnh. Các biến như vậy nhận loạiuint
. - Biến tài nguyên mảng loại
bitmap
có thể có hai chiều. Trong trường hợp này, kích thước mảng được xác định là [chiều cao hình ảnh][chiều rộng hình ảnh]. Nếu mảng một chiều được chỉ định, số phần tử bằng chiều cao hình ảnh * chiều rộng hình ảnh. - Khi tải hình ảnh 24-bit, thành phần kênh alpha được đặt thành 255 cho tất cả các pixel của hình ảnh.
- Khi tải hình ảnh 32-bit không có kênh alpha, thành phần kênh alpha cũng được đặt thành 255 cho tất cả các pixel của hình ảnh.
- Khi tải hình ảnh 32-bit có kênh alpha, các pixel không được xử lý theo bất kỳ cách nào.
- Kích thước tệp tài nguyên không được vượt quá 128 Mb.
- Phát hiện mã hóa tự động bằng sự hiện diện của BOM (tiêu đề) được thực hiện cho các tệp chuỗi. Nếu BOM vắng mặt, mã hóa được xác định bởi nội dung tệp. Các tệp trong mã hóa ANSI, UTF-8 và UTF-16 được hỗ trợ. Tất cả chuỗi được chuyển đổi sang Unicode khi đọc dữ liệu từ tệp.
Chương trình OpenCL
Việc sử dụng biến tài nguyên chuỗi có thể đơn giản hóa đáng kể việc phát triển một số chương trình. Ví dụ, bạn có thể viết mã của một chương trình OpenCL trong một tệp CL riêng biệt và sau đó bao gồm nó dưới dạng chuỗi vào tài nguyên chương trình MQL5 của bạn.
#resource "seascape.cl" as string cl_program
...
int context;
if((cl_program=CLProgramCreate(context,cl_program)!=INVALID_HANDLE)
{
//--- thực hiện các hành động tiếp theo với chương trình OpenCL
}
2
3
4
5
6
7
Trong ví dụ này, bạn sẽ phải viết toàn bộ mã dưới dạng một chuỗi lớn duy nhất nếu không sử dụng biến tài nguyên cl_program
.
Xem thêm
ResourceCreate(), ResourceSave(), PlaySound(), ObjectSetInteger(), ChartApplyTemplate(), Hàm Tệp