lập trình
Bạn đang đọc bây giờ
MQL Thực tế. Ace of Intelligence, tức là thông báo trên điện thoại [Khóa học lập trình]
0

MQL Thực tế. Ace of Intelligence, tức là thông báo trên điện thoại [Khóa học lập trình]

tạo Radek SzafronTháng Tư 12 2019

Chào mừng bạn quay trở lại với phần IV của khóa học lập trình thực hành của chúng tôi. Hôm nay chúng ta sẽ giải quyết những vấn đề có tầm quan trọng đáng kể, chúng ta sẽ tạo ra quân át chủ bài, trong trường hợp chúng tôi vắng mặt sẽ giải quyết các hoạt động tình báo tập trung vào những thay đổi về giá trên thị trường chứng khoán. Khi mọi thứ đi đúng hướng, chúng ta As sẽ ngay lập tức gửi một tin nhắn bí mật (không phải lắm) đến điện thoại di động của chúng tôi cho phép chúng tôi tự giải quyết vấn đề.


Hãy chắc chắn để đọc: MQL Thực tế. Nút Hoảng loạn Phần II


Ứng dụng của chúng tôi sẽ cho phép bạn chỉ định mức giá, sau đó chúng tôi sẽ nhận được thông báo đẩy trên điện thoại của chúng tôi. Chúng tôi sẽ đặt các mức bằng cách kéo các đường màu bằng chuột, các đường này sẽ được vẽ sau khi nhấp vào hình của chúng tôi quân át chủ bài. Vì vậy, hãy bắt đầu với thông báo là gì và cách định cấu hình thiết bị của chúng tôi để mọi thứ đều ổn.

Thông báo đẩy

Thông báo đẩy là một tính năng của nền tảng Meta Trader cho phép bạn gửi tin nhắn từ thiết bị đầu cuối đến thiết bị iOS hoặc Android có cài đặt ứng dụng di động Meta Trader. Nếu bạn chưa có ứng dụng trên điện thoại di động của mình, vui lòng tải xuống vì không có ứng dụng này, chúng tôi As sẽ không làm tốt lắm.

hình_1 hình_2

Cấu hình thiết bị rất nhanh. Bước đầu tiên là biết của bạn ID MetaQuote, tức là số mà chúng tôi sẽ gửi tin nhắn đến điện thoại thích hợp (hoặc tủ lạnh có hệ thống Android). Con số ID MetaQuote có trong ứng dụng di động trong menu Cài đặt/Trò chuyện và Tin nhắnnhư trong hình bên dưới.

fig_3 lập trình ngoại hối

Đọc số ID MetaQuote sau đó phải được nhập vào chương trình MetaTarder trên máy tính của chúng tôi trong menu Công cụ/Tùy chọn/Thông báo.

fig_4 lập trình ngoại hối

Sẵn sàng!

nền kỹ thuật

Trước tiên, hãy tải xuống gói bên dưới và cài đặt mã nguồn của ứng dụng ngày nay, tức là tệp Thông minh Ace.mq4 trong danh mục MQL4\Chuyên gia\ .

Chương trình của chúng tôi cũng sẽ có một giao diện đồ họa nhỏ, nằm trong thư viện graphics_elements.ex4mà bạn sao chép vào thư mục MQL4\Libraries\Ace of Intelligence\ .

TẢI TẬP TIN

Chúng tôi đang cất cánh

Sau khi mở tệp Thông minh Ace.mq4, ở trên cùng, bạn sẽ thấy đoạn mã bên dưới.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#bất động sản khắt khe
# nhập khẩu "Trí thông minh chủ\\graphic_elements.ex4"
làm mất hiệu lực AgentStartMissions(int x, int y);
làm mất hiệu lực Đặc vụByeBye();
chuỗi AgentIdentify();
# nhập khẩu
màu đầu vào màu = clrDodgerBlue;
màu đầu vào color_off = clrVàng;
đầu vào ENUM_LINE_STYLE Kiểu dáng = PHONG CÁCH_RẮN;
đầu vào int độ dày = 2;
chuỗi Instrument_name = "";
chuỗi dòng_id = "INTERNATIONAL_LINES";
mã MQL4

Chúng tôi bắt đầu mã bằng cách nhập thư viện, sau đó sử dụng các từ khóa đầu vào, chúng tôi tạo các tham số sẽ được định cấu hình trong cửa sổ cài đặt. Cài đặt sẽ cho phép chúng tôi xác định giao diện của các dòng mà chúng tôi sẽ đặt giá cho các thông báo của mình.

biến toàn cầu

Theo định nghĩa loại đầu vào chúng tôi thấy một cái gì đó mới, khai báo biến instrument_name oraz số dòngnằm ngoài nội dung của bất kỳ hàm nào. Nó có nghĩa là gì? Đây là cách chúng tôi xác định biến toàn cầu, sẽ có sẵn ở bất kỳ đâu trong mã của chúng tôi, tức là mỗi chức năng của thuật toán sẽ có thể đọc chúng và gán cho chúng một giá trị. Từ các biến được khai báo là đầu vào chúng chỉ khác ở chỗ người dùng không có quyền truy cập vào chúng trong cửa sổ cài đặt.

Những cái bàn

Khi viết phần mềm, thông thường phải xử lý một lượng dữ liệu lớn đến mức việc tạo một biến riêng cho từng biến sẽ rất rắc rối. Mảng đến để giải cứu, cho phép bạn tạo một tập hợp dữ liệu theo thứ tự của một loại nhất định, ví dụ: loại tăng gấp đôi, có thể truy cập thông qua một tên duy nhất mà chúng tôi đặt. Đối với mỗi mảng, chúng ta có thể (không nhất thiết phải) xác định kích thước của nó, tức là có bao nhiêu phần dữ liệu của một loại nhất định sẽ có trong đó. Chúng ta hãy xem đoạn mã dưới đây.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
chuỗi dòng_tên_mảng[];
tăng gấp đôi mảng_dòng_dữ_liệu[][]4];
#định nghĩa ACTIVATION_TIME 0
#định nghĩa SIGNAL_TYPE 1
#định nghĩa LINE_STATUS 2
#định nghĩa LINE_PRICE 3
#định nghĩa SIGNAL_LONG 0
#định nghĩa SIGNAL_SHORT 1
#định nghĩa ĐƯỜNG DÂY TẮT 0
#định nghĩa LINE_MODIFIED 1
#định nghĩa LINE_ACTIVE 2
#định nghĩa LINE_DELETED 3
mã MQL4

mảng một chiều

Trong đoạn mã trên, ở dòng 1 và 2, chúng ta đã tạo hai mảng. dòng_tên_mảng sẽ được sử dụng để lưu trữ tên của các đối tượng mà chúng ta sẽ vẽ trên biểu đồ. Mỗi dòng sẽ đại diện cho một thông báo do người dùng đặt và vì ứng dụng của chúng tôi sẽ cho phép bạn đặt bất kỳ số lượng thông báo nào nên cần phải sử dụng bảng.

dòng_tên_mảng là một mảng một chiều, mà chúng ta có thể nói bằng một cặp dấu ngoặc vuông []. Trong ngoặc vuông ta có thể nhập số lượng đoạn dữ liệu muốn cho vào bảng, tuy nhiên trong trường hợp của ta ta không biết biểu đồ sẽ có bao nhiêu dòng, vì tùy người dùng nên ta để trong ngoặc. trống, có nghĩa là chúng tôi sẽ tự động, liên tục, xác định và thay đổi kích thước mảng nếu cần. Chúng ta hãy xem hình bên dưới mô tả cách hoạt động của mảng một chiều.

fig_5 lập trình ngoại hối

Lập trình ngoại hối - Biểu đồ

Mảng đa chiều

Bảng thứ hai, được đặt tên dòng_dữ_liệu_mảng sẽ được chúng tôi sử dụng để lưu trữ dữ liệu bổ sung cho từng thông báo do người dùng đặt. Chúng tôi không thể đặt thông tin bổ sung trong cùng một mảng với tên đối tượng vì tên được nhập chuỗivà gõ dữ liệu tăng gấp đôivà một mảng chỉ có thể chứa một kiểu dữ liệu.

dòng_dữ_liệu_mảng là một mảng có hai chiều, được biểu thị bằng hai dấu ngoặc vuông [][4]. Kích thước đầu tiên sẽ được sử dụng để nhận dạng, như trong mảng dòng_tên_mảngchúng tôi muốn nói đến dòng nào và thứ nguyên thứ hai để chứa 4 dữ liệu bổ sung cho mỗi thông báo bạn đã đặt.

Để giúp chúng ta điều hướng qua các phần tử của mảng hai chiều dễ dàng hơn, hãy sử dụng các từ khóa #định nghĩa chúng tôi đã tạo một danh sách các giá trị được xác định trước với các tên tương đối dễ nhớ. Dưới mỗi tên được liệt kê sau từ khóa #định nghĩa là một số mà chúng tôi chắc chắn sẽ không đổi.

Trong phần sau đây, chúng ta sẽ sử dụng mảng trong thực tế, nhưng trong thời gian chờ đợi, chúng ta hãy xem hình bên dưới, nó giải thích cách thức hoạt động của mảng hai chiều.

hình_6

cấu trúc ứng dụng

Ứng dụng của chúng ta sẽ sử dụng năm hàm MQL API, hầu hết chúng ta đều biết, để xử lý các sự kiện.

OnInit() – chuẩn bị thuật toán

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int onInit()
{
if(LàDemo() == sai) trở lại INIT_FAILED;
//Write !Explore the Terrain() là phiên bản ngắn
// Khám phá khu vực() == false
if(!Khám phá Địa hình()) TraceTracks();
Bộ sự kiệnMilli giâyTimer(250);
AgentStartMissions(0, 0);
trở lại INIT_SUCCEEDED;
}
mã MQL4

trong chức năng onInit() chúng tôi bắt đầu bằng cách kiểm tra xem chúng tôi có đang chơi đúng chỗ hay không và sau đó liệu dữ liệu mà ứng dụng có có chính xác hay không. Làm thế nào là có thể kể từ khi onInit() là chức năng đầu tiên được gọi bởi chương trình để thuật toán có dữ liệu không chính xác? Ví dụ, điều này có thể xảy ra khi chúng ta chạy thuật toán trên biểu đồ của một công cụ và sau đó thay đổi ký hiệu. Trong tình huống như vậy, các đường đã vẽ trước đó sẽ phải bị xóa và tất cả các thông báo sẽ bị hủy. Đây là những gì chức năng làm Vết đóng băng().

Trong bước tiếp theo, chúng ta bắt đầu bộ đếm thời gian và gọi hàm từ thư viện AgentStartMissions(…)có nhiệm vụ là vẽ của chúng ta Asa trên đồ thị.

Trong mã nguồn, bạn sẽ tìm thấy một số chức năng thú vị khác. Đối với những người bạn muốn xem xét của chúng tôi Asa từ A đến Z, việc giải thích các tài liệu bổ sung phải là một khóa đào tạo tốt trong việc điều hướng tài liệu ngôn ngữ MQL. Tôi đã cố gắng giữ toàn bộ mã của ứng dụng ngày nay trong khuôn khổ của các vấn đề được đặt ra, để việc giải thích nó dễ dàng nhất có thể. Tôi chúc bạn học tập hiệu quả và vì bạn đã biết rất nhiều yếu tố ngôn ngữ nên hãy vui vẻ tạo ra các giải pháp độc lập đầu tiên của mình!

OnChartEvent(…) – giám sát sự kiện

1
2
3
4
5
6
7
8
9
10
11
12
làm mất hiệu lực OnChartSự kiện(const int Tôi, const dài& tôi, const double& dparam,
chuỗi const& thư rác)
{
if(tôi == CHARTEVENT_OBJECT_DRAG || id == CHARTEVENT_OBJECT_CHANGE)
{
if(ChuỗiFind(thư rác, line_id) >= 0) Cập nhật dữ liệu (thư rác);
}
khác nếu(tôi == CHARTEVENT_OBJECT_CLICK)
{
if(sparam == AgentsIdentify()) CreateLines();
}
}
mã MQL4

Nhờ tính năng OnChartSự kiện(...) chúng tôi theo dõi sự tương tác của người dùng với ứng dụng. Trong trường hợp đầu tiên, chúng tôi kiểm tra xem người dùng có kéo dòng thông báo của chúng tôi trên biểu đồ hay không (hoặc thay đổi thông số của nó trong cửa sổ cài đặt) và nếu điều đó xảy ra, chúng tôi sẽ cập nhật dữ liệu liên quan đến thông báo của mình trong hàm Cập nhật dữ liệu(…), lấy tên của dòng được người dùng sửa đổi làm tham số. Sử dụng tên dòng nhận được, hàm định vị hàng thích hợp trong bảng và cập nhật dữ liệu thích hợp, ví dụ: thông tin về giá đặt cho thông báo.

Trong phần thứ hai của chức năng, chúng tôi theo dõi các sự kiện nhấp vào các đối tượng trong biểu đồ thuật toán của chúng tôi. Mỗi lần nhấp vào hình chúng tôi đã vẽ quân át chủ bài tạo một dòng mới trong biểu đồ. Các dòng đã tạo khi di chuyển sẽ gọi hàm Cập nhật dữ liệu(…), sẽ lên lịch thông báo cụ thể tùy thuộc vào vị trí của dòng so với giá tại thời điểm tương tác với người dùng.


chuyên gia tư vấn


OnTimer() – các hoạt động định kỳ

1
2
3
4
làm mất hiệu lực Trả lời ()
{
Đồng bộ dữ liệu();
}
mã MQL4

Bộ hẹn giờ được gọi 4 lần mỗi giây như được định nghĩa trong hàm onInit(), đồng bộ hóa dữ liệu trong thuật toán của chúng tôi. Đối với nhiệm vụ chức năng Đồng bộ dữ liệu() thuộc, kiểm tra dòng nào đã bị xóa và tô màu cho phù hợp tùy thuộc vào việc thông báo có được bật hay không.

OnTick() – quan sát giá

Tất cả các chức năng API MQL được liệt kê cho đến nay đều quen thuộc với chúng tôi. Thời gian cho một cái gì đó mới. Chức năng onTick() nó được gọi bởi nền tảng bất cứ khi nào giá của công cụ mà thuật toán hoạt động thay đổi. Đây là một tính năng cơ bản cho nhiều chiến lược tự động. Hãy xem đoạn mã dưới đây.

1
2
3
4
làm mất hiệu lực onTick()
{
StartInterview();
}
mã MQL4

trong chức năng onTick() của chúng ta As bắt đầu làm việc và kiểm tra xem giá của công cụ đã đạt đến giá trị do người dùng chỉ định hay chưa. Hãy chuyển sang các chức năng Bắt đầuPhỏng vấn() xa hơn một chút, và bây giờ hãy phân tích một chức năng cuối cùng mà chúng ta cần để xử lý các sự kiện, onDeinit(...).

OnDeinit(…) – kết thúc thuật toán

1
2
3
4
5
6
7
8
9
làm mất hiệu lực onDeinit(const int lý do)
{
sự kiệnKillTimer();
Đặc vụByeBye();
if(lý do!= REASON_CHARTCANGE && lý do != REASON_PARAMETER)
Dấu vết dừng ();
}
mã MQL4

Chúng tôi dừng lại trước bộ đếm thời gian và xóa hình ảnh đã vẽ của đại lý của chúng tôi, sau đó, sử dụng toán tử if chúng tôi kiểm tra lý do chấm dứt ứng dụng. Trong một số trường hợp, sau khi gọi một hàm onDeinit(...) chương trình sẽ khởi động lại và bắt đầu thuật toán của nó lại từ đầu, tức là từ hàm onInit(). Ví dụ, điều này xảy ra khi người dùng thay đổi khoảng thời gian của biểu đồ. Trong tình huống như vậy, nếu công cụ không thay đổi, chúng tôi không muốn xóa các thông báo do chúng tôi đặt. Kiểm tra lý do gọi hàm onDeinit(...), đó là một tham số lý do, chúng ta có thể quyết định xóa các đối tượng và dữ liệu hay giữ nguyên các thông báo đã đặt.

Bảng trong thực tế

Hãy xem ứng dụng của chúng ta sử dụng các mảng đã tạo trước đó như thế nào trên ví dụ về một hàm Lưu dữ liệu(…)có nhiệm vụ tạo một hàng mới trong bảng để lấy dữ liệu cho một thông báo mới.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool Lưu dữ liệu(chuỗi tên_dòng, tăng gấp đôi dòng_giá)
{
int số_dòng = Kích thước mảng(dòng_tên_mảng);
Thay đổi kích thước mảng(dòng_tên_mảng, số_dòng + 1);
Thay đổi kích thước mảng(dòng_dữ_liệu_mảng, số_dòng + 1);
//Number_of_lines++ là phiên bản rút gọn của num_of_lines = num_of_lines + 1
số_dòng++;
dòng_tên_mảng[số_dòng - 1] = tên_đường;
mảng_dòng_dữ_liệu[số_dòng - 1[ACTIVATION_TIME] = 0;
mảng_dòng_dữ_liệu[số_dòng - 1][SIGNAL_TYPE] = SIGNAL_LONG;
mảng_dòng_dữ_liệu[số_dòng - 1][LINE_STATUS] = LINE_OFF;
mảng_dòng_dữ_liệu[số_dòng - 1][LINE_PRICE] = line_price;
trở lại đúng;
}
mã MQL4

Trong dòng 3, chúng tôi kiểm tra xem nó chứa bao nhiêu phần tử dòng_tên_mảngvà bởi vì dòng_tên_mảng là mảng một chiều, số phần tử phải bằng số hàng của cả hai mảng. Sau đó, ở dòng 5 và 6, chúng tôi tăng số lượng hàng của mảng lên 1 bằng cách sử dụng hàm API Thay đổi kích thước mảng(...). Một hàng mới sẽ được thêm vào cuối mỗi mảng.

Chúng tôi tăng biến số_dòng o 1, bởi vì chúng tôi đã thêm một hàng vào các bảng và sau đó chúng tôi hoàn thành dữ liệu trên thông báo mới bắt đầu từ dòng 11, nơi chúng tôi gán tên dòng cho hàng thích hợp trong bảng dòng_tên_mảng. Hãy nhớ rằng các hàng (và cột) trong các bảng được đánh số từ 4, vì vậy, chẳng hạn như khi chúng ta muốn lưu thông tin cho thông báo thứ năm, chúng ta phải sử dụng hàng XNUMX, do đó trong ngoặc vuông, sau tên của bảng chúng ta xem số_dòng - 1 như số dòng.

Để đánh số thứ tự các cột trong bảng dòng_tên_mảng chúng tôi sử dụng các giá trị được xác định trước khi bắt đầu thuật toán của mình bằng cách sử dụng từ khóa #định nghĩa. Tên của các giá trị là các số từ 0 đến 3, vì bảng có 4 cột. Nhờ sử dụng bảng hai chiều, chúng tôi có thể lưu 4 thông tin bổ sung cho mỗi thông báo, ví dụ: giá cả và loại tín hiệu trong chức năng Lưu dữ liệu(…) chúng tôi gán giá trị ban đầu.

Ace trong hành động

Một hàm khác sử dụng mảng trong thuật toán của chúng ta là hàm Bắt đầuPhỏng vấn()nơi chúng tôi đọc dữ liệu được chuẩn bị trong các bảng và giải thích chúng để quyết định có gửi thông báo cho người dùng hay không. Hãy xem mã chức năng Bắt đầuPhỏng vấn().

1
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
làm mất hiệu lực Bắt đầuPhỏng vấn()
{
int tôi = 0;
int số_dòng = Kích thước mảng(dòng_tên_mảng);
cho(và = 0; i < số_dòng; tôi ++)
{
if(dòng_dữ_liệu_mảng[i][LINE_STATUS] == LINE_ACTIVE)
{
if(dòng_dữ_liệu_mảng[i][SIGNAL_TYPE] == SIGNAL_LONG)
{
if(Bid >= line_data_array[i][LINE_PRICE])
{
Gửi (các) Tin nhắn;
line_data_array[i][LINE_STATUS] = LINE_OFF;
}
}
khác
{
if(Bid <= line_data_array[i][LINE_PRICE])
{
Gửi (các) Tin nhắn;
line_data_array[i][LINE_STATUS] = LINE_OFF;
}
}
}
}
}

Trong chức năng trên, sử dụng một vòng lặp cho chúng tôi truy cập từng hàng trong mảng dòng_dữ_liệu_mảng. Điều này cho phép chúng tôi kiểm tra trạng thái của thông báo và loại tín hiệu, đồng thời dựa trên dữ liệu nhận được để xác minh xem giá Bid đáp ứng điều kiện mong đợi của chúng tôi. khi chúng ta As quyết định rằng sẽ là thiếu thận trọng nếu giữ chúng tôi trong bóng tối, anh ấy vội vàng gửi thông báo cho chúng tôi bằng chức năng Gửi tin nhắn(…), khéo léo đưa ra số dòng lưu trữ dữ liệu về thông báo bạn cần. Sau khi gửi tin nhắn, thông báo bị tắt, một Askiên định tiếp tục.

Hãy xem mã trên máy tính của bạn để biết chức năng Gửi tin nhắn(…)để xem thuật toán của chúng tôi sử dụng tính năng API MQL như thế nào Gửi thông báo(…) khi gửi thông báo đẩy.

phép cộng

Nếu nền tảng chưa làm điều đó cho bạn, hãy biên dịch tệp Thông minh Ace.mq4 và kiểm tra ứng dụng mới của bạn! Để vẽ một đường mới, chỉ cần nhấp vào hình ảnh đẹp trên biểu đồ.

Trong mã nguồn, bạn sẽ tìm thấy một số chức năng thú vị khác. Đối với những người bạn muốn xem xét của chúng tôi Asa từ A đến Z, việc giải thích các tài liệu bổ sung phải là một khóa đào tạo tốt trong việc điều hướng tài liệu ngôn ngữ MQL. Tôi đã cố gắng giữ toàn bộ mã của ứng dụng ngày nay trong khuôn khổ của các vấn đề được đặt ra, để việc giải thích nó dễ dàng nhất có thể. Tôi chúc bạn học tập hiệu quả và vì bạn đã biết rất nhiều yếu tố ngôn ngữ nên hãy vui vẻ tạo ra các giải pháp độc lập đầu tiên của mình!

Bạn nghĩ sao?
tôi thích
33%
Thú vị
67%
Heh ...
0%
Sốc!
0%
Tôi không thích
0%
Thương xót
0%
Thông tin về các Tác giả
Radek Szafron
Tác giả của ấn phẩm là Radek Szafron, chủ sở hữu của Expert Advisors, công ty đã hỗ trợ các nhà đầu tư trong nhiều năm bằng cách cung cấp các công nghệ dành riêng cho thị trường FOREX. Tác giả tốt nghiệp ngành tài chính tại Trường Kinh tế Warsaw với chuyên ngành "Thị trường tài chính" và là một lập trình viên với gần 20 năm kinh nghiệm. Công ty thực hiện các dự án về thuật toán và ứng dụng được viết bằng tất cả các ngôn ngữ thuộc họ "C", bao gồm nền tảng phổ biến Meta Trader 4 và 5. Bạn có thể tìm thấy Expert Advisors tại www.expertadvisors.pl.