lập trình
Bạn đang đọc bây giờ
MQL Thực tế. Panic Button Phần II [Khóa học lập trình]
0

MQL Thực tế. Panic Button Phần II [Khóa học lập trình]

tạo Radek SzafronTháng 29 2019

Chào mừng đến với phần thứ hai của Panic Button! Tuần này, chúng tôi sẽ xem xét lại mã cho nút báo động của chúng tôi. Nhiệm vụ của chúng tôi hôm nay sẽ là bổ sung những gì quan trọng nhất, tức là chức năng giải phóng chúng tôi khỏi gánh nặng của các vị trí mở và giải phóng chúng tôi khỏi sự ràng buộc của việc liên tục nhìn chằm chằm vào màn hình.

Chúng tôi sẽ mở rộng chức năng cơ bản bằng một thứ khác. Chúng tôi sẽ đảm bảo rằng công cụ mà chúng tôi thiết kế là an toàn và chấp nhận các nhấp chuột tình cờ một cách nghiêm túc và thản nhiên. Giống như mọi nút nghiêm trọng trên hành tinh của chúng ta, nút của chúng ta sẽ có một loại cầu chì cho phép bạn chỉ đóng vị thế khi nhấp chuột kèm theo nhấn phím [ sự thay đổi ] trên bàn phím.


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


Chúng tôi đang mở một nhà máy thuật toán

Vì vậy, chúng tôi bật MetaEditor.

Hãy chuyển sang chỉnh sửa mã của ứng dụng của chúng tôi từ tuần trước. Hãy mở tập tin Nút hoảng loạn.mq4 từ danh mục Các Chuyên gia và chúng ta hãy xem chức năng onInit(). Chức năng của bạn sẽ trông gần giống với chức năng bên dưới với một chút khác biệt. Hôm nay có một yếu tố mã mới được đánh dấu // bình luận .

int onInit()
{
if(isDemo() == sai)
{
 
trở lại INIT_FAILED;
 
}
bool màu xanh = sai;
if(Only_this_instrument == đúng)
{
 
màu xanh = đúng;
 
}
nút_tạo (5, 15, màu xanh da trời);
// <– [ Đây là cách chúng tôi bình luận ] Bộ sự kiệnMilli giâyTimer(250); // Hết tin tức
trở lại INIT_SUCCEEDED;
}
mã MQL4

Hãy thêm đoạn mã còn thiếu vào hàm onInit().

Chúng tôi khởi động đồng hồ

Chức năng API MQL được thêm vào mã ở trên bool Bộ sự kiệnMilli giâyTimer(int mili giây)cho phép bạn định cấu hình bộ hẹn giờ. Hẹn giờ là một phương thức cho phép bạn gọi một hàm API khác - Trả lời () mỗi số mili giây được chỉ định. Giải pháp này cho phép chúng tôi chạy định kỳ các phần cụ thể của mã bằng cách đặt chúng bên trong một hàm Trả lời (). Trong trường hợp của chúng tôi, 4 lần mỗi giây, đó là những gì 250 mili giây.

Đồng hồ đang kêu tích tắc, vì vậy hãy viết một chức năng mới.

làm mất hiệu lực Hẹn giờ bật()
{
 
Be_alert_button();
 
}
mã MQL4

Làm tốt lắm. Bạn vừa tạo một thuật toán chịu trách nhiệm bảo vệ nút của chúng tôi khỏi việc vô tình nhấp chuột. Đó là phần khó khăn. Từ bây giờ, bạn sẽ cần giữ phím để nhấp vào nút [ sự thay đổi ] trên bàn phím. Các spin trên các electron không bị xáo trộn trong chức năng nút the_be_alert()mà chúng tôi đã nhập từ thư viện thư viện_panic_button.ex4 tuần trước.

Nền tảng yêu cầu tắt bộ đếm thời gian đang chạy khi chúng tôi không còn cần đến nó nữa. Chúng ta có thể làm điều này bằng cách thêm một hàm API eventKillTimer() đến chức năng onDeinit()mà chúng tôi đã tạo trong phần trước và như một lời nhắc nhở, nền tảng sẽ gọi khi ứng dụng của chúng tôi đóng. Hãy sửa đổi chức năng onDeinit()để làm cho nó trông giống như chức năng dưới đây.

làm mất hiệu lực onDeinit(const int lý do)
{
 
button_bye_bye();
 
eventKillTimer();
}
mã MQL4

Bạn có thể chạy ứng dụng tại đây và xem thuật toán phản ứng như thế nào khi nhấn một phím [ sự thay đổi ].

Chúng tôi theo dõi mọi di chuyển

Đã đến lúc bắt đầu nghĩ về hàm đóng. Với mục đích này, chúng ta cần nhận ra thời điểm nhấp vào nút. Chức năng API hỗ trợ chúng tôi 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).

hàm số OnChartEvent(…) nó được gọi bởi nền tảng bất cứ khi nào một sự kiện xảy ra trên biểu đồ có thể quan trọng đối với hoạt động của chương trình, ví dụ, người dùng nhấp vào một đối tượng hoặc di chuyển chuột. Vì vậy, hãy viết một chức năng thích hợp.

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)
{
 
}
mã MQL4

nền tảng bằng cách gọi hàm OnChartEvent(…) nó chuyển thông tin bổ sung cho nó bằng cách sử dụng các tham số id, lparam, dparamoraz spar. Điều này cho phép chúng tôi xác định sự kiện nào đã diễn ra và loại sự kiện được lưu trữ trong một biến idđó là loại intđó là một số nguyên. Từ const bên cạnh loại biến có nghĩa là biến đã cho không thể sửa đổi và chỉ được sử dụng để đọc thông tin.

Hãy mở rộng hàm của chúng ta với một phần tử khác.

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_CLICK)
{
 
}
 
}
mã MQL4

Sử dụng toán tử if ở trên chúng tôi kiểm tra xem biến id bằng nhau == giá trị được xác định trong biến được tạo tự động có tên CHARTEVENT_OBJECT_CLICK. Nếu vậy, chúng tôi chắc chắn rằng người dùng đã nhấp vào một đối tượng không xác định trên biểu đồ mà thuật toán của chúng tôi hoạt động.

Chúng ta đã biết rằng khi biểu thức điều kiện của toán tử if hóa ra là đúng về mặt logic, mã giữa các dấu ngoặc nhọn sẽ được thực thi {} thuộc về nhà điều hành này. Vì vậy, hãy thêm vào mã của chúng ta điều gì sẽ xảy ra khi bất kỳ đối tượng nào được nhấp vào biểu đồ.

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_CLICK)
{
 
if(Button_are_you_clicked(spam) == đúng)
{
 
}
 
}
 
}
mã MQL4

Đoạn mã trên kiểm tra xem nút của chúng ta có được nhấp hay không bằng cách sử dụng chức năng bool Button_are_are_clicked(chuỗi tên của môn học)đến từ thư viện đã nhập. Hàm nhận một biến kiểu dữ liệu làm tham số chuỗi, là một biến văn bản chứa tên của đối tượng đã được người dùng nhấp vào. Hàm sẽ so sánh giá trị nhận được với tên của phần tử đồ họa của nút và sẽ trả lời câu hỏi liệu nút của chúng tôi có được nhấp với giá trị loại hay không booltức là giá trị đúng lub sai.

Làm cách nào để chúng tôi biết tên của đối tượng đã được nhấp? Chức năng OnChartEvent(…) nhận tên của đối tượng được nhấp lần cuối từ nền tảng thông qua một tham số chuỗi đặt tên sparmà chúng ta có thể chuyển trực tiếp dưới dạng tham số cho hàm của mình, như thế này Button_are_you_clicked(thư rác).

Chúng tôi thực hiện nhiệm vụ được giao phó [Thông số kỹ thuật]

Khi chức năngButton_are_are_clicked(…) sẽ trả về một giá trị đúng chúng ta sẽ biết rằng không có trò đùa nào cả, chúng ta cần phải cứu vãn tình hình.

Hãy thêm một chức năng vào mã của chúng tôi để thực hiện nhiệm vụ chính của thuật toán của chúng tôi, tức là đóng các vị trí trên tài khoản. Hàm có khai báo như sau:

bool close_positions_and_orders(bool only_this_instrument),

Trong thực tế, chúng tôi đặt nó trong mã như trong khung bên dưới.

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_CLICK)
{
 
if(Button_are_you_clicked(spam) == đúng)
{
 
close_positions_and_orders(Only_this_instrument);
 
}
 
}
 
}
mã MQL4

hàm số Đóng_vị_trí_và_đơn_hàng(…) lấy một biến kiểu làm đối số boolcái nào nên mang thông tin đúng lub sailiệu chúng ta có nên đóng các vị trí của chỉ công cụ mà thuật toán hoạt động hay không. Bạn nhớ tham số Only_this_instrument từ cửa sổ cài đặt trong phần đầu tiên? Nó chỉ có ích cho chúng tôi. Tùy thuộc vào lựa chọn của chúng tôi trong cài đặt, chương trình sẽ đóng các vị trí phù hợp với biểu đồ đã chọn hoặc tất cả các vị trí trong tài khoản.


chuyên gia tư vấn


Chúng tôi tạo chức năng chính

Chúng tôi bắt đầu chỉnh sửa tập tin "Useful_functions.mqh" từ thư mục MQL4\Include\Panic Button\

Cho đến nay, chúng tôi chỉ sử dụng các chức năng đến từ API MQL hoặc được nhập từ thư viện thư viện_panic_button.ex4. Tuy nhiên, trong thế giới thực, lập trình yêu cầu chúng ta tự tạo hầu hết các chức năng, đồng thời hỗ trợ toàn bộ các giải pháp có sẵn. Chức năng Đóng_vị_trí_và_đơn_hàng(…) , mà chúng tôi sử dụng ở trên, có thể được tìm thấy trong tệp Useful_functions.mqh, mà ở phần trước chúng tôi đưa vào danh mục MQL4\Bao gồm\Nút hoảng loạn\ và chúng tôi đã tham gia mã với từ khóa #include. Hãy mở tệp được đề cập trong MetaEditor, bởi vì, thật bất ngờ, chức năng đóng vị trí đã có trong tệp, nhưng chúng tôi vẫn cần cung cấp nội dung cho nó.

định nghĩa hàm

Sau khi mở tệp Useful_functions.mqh bạn sẽ thấy rằng nó ở trong đó Định nghĩa chức năng đóng vị thế. Nó trông tương tự như các chức năng mà chúng tôi đã sử dụng cho đến nay, với sự khác biệt là nó là của riêng chúng tôi và chúng tôi có thể đặt cho nó bất kỳ tên, loại và bộ tham số nào chúng tôi muốn. Chức năng của bạn sẽ trông giống như chức năng bên dưới:

bool close_positions_and_orders(bool only_this_instrument)
{
trở lại đúng;
}
mã MQL4

Do đó trong tiêu đề , chúng ta đã định nghĩa một hàm gọi là Đóng_vị_trí_và_đơn_hàng trả về một kiểu dữ liệu bool và lấy một tham số được đặt tên only_this_instrument còn về kiểu dữ liệu bool.

nội dung chức năng

Mọi thứ chúng tôi đặt giữa các dấu ngoặc nhọn {} sau tiêu đề chức năng, nó bao gồm nội dung của nó. Vì vậy, hãy làm phong phú thêm nội dung của chúng ta bằng đoạn mã đầu tiên.

bool close_positions_and_orders(bool only_this_instrument)
{
if(Đã kết nối() == sai) trở lại sai;
int tôi = 0; int number_of_items_and_orders = Tổng số đơn đặt hàng();
if(số_mặt_hàng_và_đơn_hàng == 0) trở lại đúng;
bool kết quả = đúng;
trở lại kết quả;
}
mã MQL4

Trên, đầu tiên if, chúng tôi kiểm tra xem chúng tôi có kết nối với máy chủ hay không bằng chức năng API Đã kết nối() và trong trường hợp có vấn đề, chúng tôi để lại hàm với toán tử trở lại trong khi trả về một giá trị saiđể cho bạn biết một cái gì đó là sai. Đúng vậy, sau if không có dấu ngoặc nhọn, bởi vì chúng tôi sử dụng ký hiệu viết tắt có thể có trong các tình huống mà chúng tôi chỉ muốn thực hiện một thao tác sau biểu thức điều kiện.

Khi chúng tôi trực tuyến, thuật toán tiến xa hơn và tạo ra hai biến int về tên i oraz số_của_mặt_hàng_và_đơn_hàng gán giá trị cho cái đầu tiên 0và đến giá trị thứ hai đến từ hàm API Tổng số đơn đặt hàng()trong đó thông báo về số lượng vị trí mở và đơn đặt hàng trong tài khoản.

một toán tử khác if kiểm tra xem đôi khi tất cả các vị trí chưa được đóng chưa và người dùng nhấp vào nút chỉ để giải trí hoặc ảnh hưởng, điều này dẫn đến việc rời khỏi chức năng với giá trị được truyền đúngbởi vì mọi thứ đều ổn.

Khi chức năng vẫn còn việc phải làm, nó sẽ tạo một biến bool đặt tên kết quả, sẽ được sử dụng sau này để cung cấp thông tin liệu tất cả các vị trí đã được đóng chính xác hay chưa bằng cách sử dụng toán tử cuối cùng trở lại, chúng tôi đã sửa đổi một chút trong bước này.

cho vòng lặp

Nhà điều hành cho, có lẽ chỉ đứng sau toán tử về mức độ phổ biến của nó if, được sử dụng để thực hiện một tập hợp các hoạt động nhất định với một số lần lặp lại nhất định. Đó là lý tưởng cho các tình huống như của chúng tôi, bởi vì chúng tôi cần thực hiện thao tác đóng cho từng đơn đặt hàng riêng biệt. Hãy thêm một vòng lặp vào chức năng của chúng tôi cho.

bool close_positions_and_orders(bool only_this_instrument)
{
if(Đã kết nối() == sai) trở lại sai;
int tôi = 0; int number_of_items_and_orders = Tổng số đơn đặt hàng();
if(số_mặt_hàng_và_đơn_hàng == 0) trở lại đúng;
bool kết quả = đúng;
cho(i = number_of_items_and_orders − 1; i >= 0; tôi--)
{
 
}
trở lại kết quả;
}
mã MQL4

W tiêu đềsau nhà điều hành cho chúng tôi thấy một bản ghi bí ẩn: (i = số_mặt_hàng_và_đơn_hàng - 1; i >= 0; tôi--) .

Bản ghi có nghĩa là vòng lặp bắt đầu với biến chúng ta đã tạo trước đó i bằng với biến số_của_mặt_hàng_và_đơn_hàng trừ một và lặp lại thao tác giữa các dấu ngoặc nhọn {} miễn là biến i lớn hơn hoặc bằng XNUMX [tôi> = 0] và sau mỗi chu kỳ, nó sẽ giảm biến i bởi một [và--] để vòng lặp có cơ hội kết thúc vào một lúc nào đó. Đơn giản, không phức tạp và dễ đọc.

Vòng lặp nói bằng ngôn ngữ của con người cho sẽ thực hiện thao tác trong ngoặc đơn {} nhiều lần như chúng tôi có vị trí mở.

Hãy thêm nội dung vào vòng lặp của chúng ta.

bool close_positions_and_orders(bool only_this_instrument)
{
if(Đã kết nối() == sai) trở lại sai;
int tôi = 0; int number_of_items_and_orders = Tổng số đơn đặt hàng();
if(số_mặt_hàng_và_đơn_hàng == 0) trở lại đúng;
bool kết quả = đúng;
cho(i = number_of_items_and_orders − 1; i >= 0; tôi--)
{
if(Đặt hàngChọn(tôi, SELECT_BY_POS) == sai)
{
kết quả = sai; tiếp tục;
}
if(chỉ_this_instrument == đúng && Đặt HàngBiểu Tượng() != ()) tiếp tục;
if(Kiểu đơn hàng() == OP_MUA || Kiểu đơn hàng() == OP_BÁN)
{
if(Đặt hàngĐóng(Đặt vé(), Đặt hàngRất nhiều(), Đặt hàngĐóng giá(), 0) == sai)
{
kết quả = sai; tiếp tục;
}
}
khác nếu(Đặt hàngXóa(Đặt vé()) == sai) kết quả = sai;
}
trở lại kết quả;
}
mã MQL4

vật lý tên lửa

Hãy phân tích từng bước những gì xảy ra bên trong vòng lặp của chúng ta chomà chúng tôi đã dũng cảm viết trong giai đoạn trước.

Bước đầu sử dụng hàm API Đặt hàngChọn(...) chọn đơn đặt hàng từ thiết bị đầu cuối bằng cách sử dụng số vị trí của nó trên danh sách đơn đặt hàng (thứ tự đầu tiên trong danh sách có số không). Chúng tôi sử dụng một biến cho việc này i, thay đổi giá trị với mỗi vòng lặp. Khi thất bại, chúng tôi lưu trữ lỗi trong một biến kết quả và thông báo cho vòng lặp cho sử dụng toán tử tiếp tụcrằng nó sẽ phá vỡ tại thời điểm đó và bắt đầu một chu kỳ mới với biến i trừ đi một [và--].

Khi mọi thứ suôn sẻ, một nhà điều hành khác if sẽ sử dụng, tính mới, một hoạt động hợp lý "và" &&mà trả về một giá trị đúng chỉ khi cả hai biểu thức ở mỗi bên của nó trả về một giá trị đúng. Do đó, khi công cụ của lệnh đã chọn [Đặt HàngBiểu Tượng()] không tương ứng với [!=] công cụ biểu đồ [()] và biến only_this_instrument có giá trị đúng, chúng tôi bỏ qua thứ tự đã cho và sử dụng toán tử tiếp tục chúng ta đi đến chu kỳ tiếp theo của vòng lặp cho. Trong tất cả các trường hợp khác, thuật toán sẽ thấp hơn.

Sau đó, chương trình của chúng tôi sẽ kiểm tra thứ tự mà chúng tôi hài lòng và nó sẽ thực hiện nó bằng hàm API Kiểu đơn hàng() và hoạt động logic"hoặc" ||mà trả về một giá trị đúngkhi ít nhất một trong các biểu thức ở mỗi bên của nó trả về một giá trị đúng. Mặt khác, khi biểu thức logic của toán tử if , nói chung, sẽ trả về một giá trị sai toán tử sẽ được thực thi khác nếucái đó hoạt động với cái đầu tiên nếu họ và phục vụ như một kế hoạch B cho anh ta khi anh ta không thể chấp nhận cách diễn đạt logic của chính mình.

Tùy thuộc vào loại đơn đặt hàng, lần đầu tiên if khi giao dịch với một lệnh mua thị trường [OP_MUA] hoặc thị trường bán [OP_BÁN] sẽ đóng vị thế bằng các hàm API Đặt hàngĐóng(...)và điều khác ifthực ra khác nếu hủy các lệnh đang chờ xử lý bằng chức năng Đặt hàngXóa(...).

Đồng ý, chương trình đã sẵn sàng!

Chúng tôi lưu các thay đổi vào tệp Useful_functions.mqh, chúng tôi quay lại mã ứng dụng chính Nút hoảng loạn.mq4 và nhiệt tình, tràn đầy năng lượng và sự tò mò xuất phát từ mong muốn thử nghiệm một tác phẩm mới, chúng tôi nhấn ... biên dịch! Sau đó, chúng tôi sửa chữa những sai lầm và gặp lại bạn vào tuần tới! 🙂

TẢI XUỐNG BỘ TỆP MQL

Bạn nghĩ sao?
tôi thích
95%
Thú vị
8%
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.

Để lại phản hồi