lập trình
Bạn đang đọc bây giờ
MQL Thực tế. Algo Trader pt. Tôi [khóa học lập trình]
0

MQL Thực tế. Algo Trader pt. Tôi [khóa học lập trình]

tạo Radek SzafronTháng Bảy 4 2019

Trong phần hôm nay, chúng ta sẽ bắt đầu làm việc trên phần mềm cho phép bạn tận dụng các cơ hội do giao dịch theo thuật toán mang lại trong khi vẫn duy trì khả năng kiểm soát tối đa đối với diễn biến của các sự kiện. Chúng tôi sẽ tập trung vào các ý tưởng cho phép bạn tham gia vào giao dịch thực tế bằng cách tối đa hóa tính trực quan của việc sử dụng và tính linh hoạt của các chức năng. Trong phần mềm, chúng tôi sẽ sử dụng một giao diện có hình thức được nhiều người coi là tiêu chuẩn trong ngành giao dịch trong ngày và thường được gọi là thang giá

thuật toán

Algo Trader - Giao diện

kế hoạch dự án

Chúng tôi sẽ chia công việc thành nhiều giai đoạn, bởi vì ngoài việc xử lý lệnh mở rộng, Algo Trader sẽ cho phép bạn chạy các thuật toán tự động quản lý vị thế theo các kết hợp khác nhau mà bạn có thể tạo tùy thuộc vào tình huống bạn gặp phải trên thị trường.

Trong phần hôm nay, chúng ta sẽ bước bước đầu tiên vào thế giới lập trình hướng đối tượng và khởi chạy phần cơ bản của dự án liên quan đến giao diện và hỗ trợ cho các hoạt động cơ bản.

Trong các tập tiếp theo, chúng ta sẽ bắt tay vào thực hiện những thuật toán đầu tiên. Khi bắt đầu, chúng tôi sẽ tạo một thuật toán GTP để đảm bảo rằng vị thế sẽ đóng với lợi nhuận dự kiến, bất kể vị thế đó bao gồm bao nhiêu đơn hàng. Tiếp theo, chúng tôi sẽ tạo một thuật toán OOO (Chính xác là cái này mở cái kia, chưa từng có cái nào trước đây) và cuối cùng là một thuật toán cho phép mở rộng quy mô trong khi trình bày dữ liệu vĩ mô quan trọng. Cùng với các thuật toán, ở đây và ở đó, chúng tôi sẽ thêm một số tiện ích hay.

nền kỹ thuật

Bạn có thể tìm thấy gói chứa các tệp cần thiết cho ngày hôm nay tại liên kết này:

Việc sử dụng phần mềm đồng nghĩa với việc chấp nhận giấy phép được đính kèm với bộ tệp.

Để phần mềm hoạt động bình thường, bạn cần phiên bản Microsoft NET Framework tối thiểu. 4.6.1 Thời gian chạy có thể tải xuống tại đây:

lập trình hướng đối tượng

Chúng tôi sẽ tạo phần mềm của chúng tôi bằng cách sử dụng lập trình hướng đối tượng, tức là một phương pháp lập trình cho phép sắp xếp logic các đoạn thuật toán trong cái gọi là các đối tượng có nhiệm vụ thực hiện các chức năng biệt lập và giao tiếp với các đối tượng khác để thực hiện toàn bộ nhiệm vụ của chương trình. Để đi xa hơn, chúng ta sẽ cần hiểu các đối tượng trong thực tế là gì và chúng được tạo ra như thế nào. Với mục đích này, hãy xem bài viết sau trong Wikibooks, sử dụng ví dụ về ngôn ngữ C ++ mà MQL4 dựa trên, cho phép bạn hiểu những điều cơ bản cần thiết.

ĐỌC BÀI VIẾT

Lớp học đầu tiên

Như bạn có thể thấy, mọi thứ xoay quanh từ khóa tốt nghiệp lớp XNUMX. Nó cho phép bạn xác định một đối tượng, sau đó chúng ta có thể tạo đối tượng này bằng cách sử dụng từ khóa mới. Mở tệp chứa định nghĩa của một trong các lớp chúng ta sẽ sử dụng hôm nay, tệp ChartOperations.mqhmà bạn sẽ tìm thấy trong danh mục MQL4\Bao gồm\AlgoTrader_v10.

tốt nghiệp lớp XNUMX cChartHoạt động { công khai: cChartHoạt động(int chiều rộng, int cao) { // } làm mất hiệu lực Trong một cái nhấp chuột(int x, int y) { // } làm mất hiệu lực OnChartThay đổi() { // } riêng tư: int chart_width; int chiều_cao của biểu_đồ; uẩn khúc lần nhấp cuối cùng; int last_click_x, last_click_y; bool LàDoubleClick(int x, int y) { // } };

 

 

Mỗi lớp có một hàm tạo, trong thực tế, hàm này được gọi tự động khi đối tượng được tạo. Hàm tạo có cùng tên với đối tượng và có thể nhận các tham số. Trong đoạn mã của chúng tôi ở trên, chúng tôi tạo hàm tạo như sau:

cChartHoạt động(int chiều rộng, int cao) { }

 

Sau khi tạo hàm tạo, chúng ta có thể định nghĩa các thành viên của lớp, tức là hàm và biến. Chúng được định nghĩa chính xác như trong trường hợp các hàm và biến thông thường, ngoại trừ việc chúng được định nghĩa trong phần thân của lớp. Chú ý đến các từ khóa công khai: oraz riêng tư:. Tất cả các hàm và biến xuất hiện sau từ công khai: sẽ có sẵn cho các chức năng trong các phần khác của phần mềm, ví dụ: chức năng API onTick() hoặc các đối tượng khác. Riêng thay vào đó, nó thông báo cho trình biên dịch rằng các phần tử được xác định trong phần này là hoàn toàn bí mật và không ai, ngoại trừ đối tượng đã cho, một cách tự nhiên, có thể truy cập vào chúng.

Ứng dụng của đồ vật

Điều gì làm cho các đối tượng rất hữu ích? Trong số những thứ khác, thực tế là một đối tượng sau khi được xác định có thể được tạo với số lượng bản sao bất kỳ và tùy thuộc vào các tham số được truyền cho chúng, chúng sẽ hoạt động khác nhau, nhưng theo cách mà chúng tôi có thể phân tích và kiểm soát. Ngoài ra, các đối tượng cho phép tổ chức mã rõ ràng bằng cách chia nhỏ các thành phần của thuật toán thành các phần tử riêng biệt và đối tượng được thiết kế phù hợp có thể được sử dụng trong phần mềm hoàn toàn khác, cho phép bạn tạo các ứng dụng phức tạp hiệu quả hơn.


chuyên gia tư vấn


Chúng tôi chạy đối tượng đầu tiên

Hãy chuyển đến tệp chính của phần mềm của chúng tôi, tệp AlgoTrader_v10.mq4mà bạn sẽ tìm thấy trong danh mục MQL4\Chuyên gia\.

Hãy cùng xem qua định nghĩa hàm API bên dưới onInit():

cChartHoạt động* Biểu đồHoạt động = vô giá trị; int onInit() { //(…) int biểu đồ_width = (int)Biểu đồGetInteger(0, CHART_WIDTH_IN_PIXELS); int biểu đồ_height = (int)Biểu đồGetInteger(0, CHART_HEIGHT_IN_PIXELS); Biểu đồHoạt động = mới cChartHoạt động(biểu đồ_width, biểu đồ_height); trở lại(INIT_SUCCEEDED); }

Pointer

Trong phần của tệp chịu trách nhiệm xác định các biến toàn cục bằng đoạn mã ...

cChartHoạt động* Biểu đồHoạt động = vô giá trị;

 

... chúng tôi tạo ra cái gọi là con trỏ nghĩa là, một con trỏ sẽ chứa địa chỉ đến vị trí trong bộ nhớ của máy tính, nơi đối tượng của chúng ta sẽ được tạo sau này. Sử dụng một con trỏ, chúng ta sẽ có thể tham chiếu đến một đối tượng và gọi các chức năng của nó. con trỏ ta định nghĩa tương tự đối với biến, phần tử đầu tiên của ký hiệu là kiểu đối tượng, sau đó ta đặt dấu hoa thị * , sau đó chúng tôi đặt một tên duy nhất cho đối tượng, mà sau này chúng tôi sẽ sử dụng để tham khảo. Để chúng tôi con trỏ chúng tôi chỉ định một biến NULLnói rằng ở giai đoạn này, nó chưa trỏ đến bất kỳ đối tượng nào.

người xây dựng

Sau đó trong mã, trong phần thân của hàm onInit() chúng tôi tạo đúng đối tượng bằng cách sử dụng từ khóa mới.

Biểu đồHoạt động = mới cChartHoạt động(biểu đồ_width, biểu đồ_height);

 

Po mới chúng tôi gọi hàm tạo của đối tượng, trong trường hợp của chúng tôi chấp nhận hai biến thông báo cho đối tượng về kích thước của biểu đồ của chúng tôi, vì chúng tôi cần nó để định vị đúng giao diện của chúng tôi. Hàm tạo được gọi chuyển địa chỉ của đối tượng mới được tạo trong bộ nhớ của máy tính cho chúng ta con trỏ đặt tên Biểu đồHoạt động.

Kẻ hủy diệt

Các đối tượng là một loại dữ liệu đặc biệt mà nếu chúng ta tạo ra chúng, chúng ta phải đảm bảo rằng chúng cuối cùng sẽ bị xóa khỏi bộ nhớ của máy tính. Tất cả điều này để bạn không phải đứng cạnh máy tính xách tay của mình, một máy chủ khổng lồ đang thu thập dữ liệu được tạo trước đó mà không ai cần nữa.

Chúng tôi sử dụng một từ khóa để xóa các đối tượng xóatheo sau là tên của chúng tôi con trỏ cho biết chúng ta muốn nói đến đối tượng nào. Chúng tôi chỉ xóa đối tượng của mình trong hàm API OnDeinit(…)bởi vì chúng tôi cần nó trong suốt vòng đời của ứng dụng cho đến khi tắt phần mềm.

làm mất hiệu lực onDeinit(const int lý do) { //(…) xóa Biểu đồHoạt động; }

Làm việc với các đối tượng

Bây giờ hãy xem cách chúng ta có thể sử dụng đối tượng đã tạo cho ứng dụng của mình. Với mục đích này trong phần thân của lớp cChartHoạt động chúng tôi đã xác định một số chức năng. Hãy xem xét một trong số họ:

làm mất hiệu lực Trong một cái nhấp chuột(int x, int y) { if(LàDoubleClick(x, y)) Đi tới giá(x, y); }

 

hàm số Trong một cái nhấp chuột(…) chúng tôi cần nó để giao tiếp với giao diện của chúng tôi mức giá nào hiện đang hấp dẫn đối với chúng tôi. Bằng cách nhấp đúp vào biểu đồ, thuật toán sẽ đặt thang giá của chúng tôi ở vị trí được chỉ định. Để chức năng của chúng tôi hoạt động, chúng tôi cần phát hiện thời điểm khi chúng tôi nhấp vào biểu đồ và đây là lúc chức năng API có ích OnChartEvent(…)

làm mất hiệu lực OnChartSự kiện(const int Tôi, const Dài &lparam, const tăng gấp đôi &dparam, const chuỗi &Thư rác) { //(…) if(id == CHARTEVENT_CLICK) ChartOperations.OnClick((int)tôi, (int)dparam); }

 

Đoạn mã trên ghi nhận thời điểm khi người dùng nhấp vào biểu đồ, sau đó gọi hàm bên trong đối tượng đã tạo trước đó của chúng ta. Gọi hàm bao gồm đặt một dấu chấm sau tên của chúng tôi con trỏ cho đối tượng, sau đó chuyển tên của hàm mà chúng ta quan tâm cùng với các tham số mà nó cần, trong trường hợp của chúng ta có nghĩa là tọa độ x và y của vị trí trên biểu đồ mà bạn đã nhấp vào.

hiệu ứng đầu tiên

Các quy trình chúng tôi tạo đã khởi chạy chức năng đầu tiên của phần mềm, chúng tôi có thể kiểm tra chức năng này bằng cách biên dịch chương trình của mình và nhấp vào các vị trí khác nhau trên biểu đồ. Dưới đây, bạn sẽ tìm thấy một đồ họa trình bày một số chức năng cho phép bạn thao tác các mức giá được hiển thị trong giao diện đồ họa của chúng tôi.

lập trình mql

Algo Trader - Chuột và mức giá

Lớp thứ hai

Vì bạn đã được thăng hạng thứ hai và để việc nhấp chuột của chúng tôi không trở nên vô ích, chúng tôi sẽ thiết kế một cơ sở thứ hai cho phép bạn đặt hàng từ thang của chúng tôi. Vì mục đích này, chúng tôi đã chuẩn bị một lớp thích hợp mà bạn sẽ tìm thấy trong tệp MQL4\Bao gồm\AlgoTrader_v10\OrderOperations.mqh

tốt nghiệp lớp XNUMX cHoạt động đặt hàng { công khai: cHoạt động đặt hàng(int vị trí_id) { vị trí_id = vị trí_id; } làm mất hiệu lực OnTimer200ms() { Quá TrìnhĐặt HàngYêu Cầu(); } riêng tư: int vị trí_id; làm mất hiệu lực Quá TrìnhĐặt HàngYêu Cầu() { yêu cầu cũ hơn yêu cầu = ĐọcĐặt hàngYêu cầu(); if(yêu cầu.Request_id <= 0) trở về; if(yêu cầu.Order_symbol != () || yêu cầu.Position_id != vị trí_id) { yêu cầu.Request_status = ORDER_REQUEST_STATUS_FAILED; yêu cầu.Request_error = ORDER_REQUEST_ERROR_WRONG_POSITION; trở về; } if(Đặt hàngGửi(yêu cầu.Order_symbol, yêu cầu.Order_type, yêu cầu.Order_volume, yêu cầu.Order_price, 0, 0, 0, yêu cầu.Order_comment, yêu cầu.Position_id) > 0) { yêu cầu.Request_status = ORDER_REQUEST_STATUS_COMPLETED; } khác { yêu cầu.Request_status = ORDER_REQUEST_STATUS_FAILED; yêu cầu.Request_error = _Lỗi cuối cùng; } Cập nhật yêu cầu đặt hàng(yêu cầu); } };

Trong đoạn mã trên, bạn có thể thấy định nghĩa đầy đủ của đối tượng cHoạt động đặt hàng, sẽ được sử dụng để xử lý các đơn đặt hàng mà chúng tôi sẽ đặt trên thang giá của chúng tôi. Chú ý đến chức năng ProcessOrderRequests()nơi chương trình của chúng tôi giao tiếp với thư viện dll sử dụng chức năng ĐọcOrderRequest().

cấu trúc

hàm số ĐọcOrderRequest() là kết quả của hoạt động của nó, nó trả về một cấu trúc kiểu yêu cầu cũ hơnlà một tập hợp dữ liệu do chúng tôi xác định về đơn hàng được gửi qua giao diện.

làm mất hiệu lực Quá TrìnhĐặt HàngYêu Cầu() { yêu cầu cũ hơn yêu cầu = ĐọcĐặt hàngYêu cầu(); //(…) }

Cấu trúc là em gái của các lớp cho phép bạn tạo một khối dữ liệu chứa nhiều biến. Điều này cho phép sắp xếp hợp lý các thông tin liên quan đến một vấn đề nhất định. Trong trường hợp của chúng tôi, cấu trúc thu thập dữ liệu về đơn đặt hàng được gửi qua giao diện đồ họa của chúng tôi, chẳng hạn như giá hoặc khối lượng mở cửa. Chúng tôi xác định một cấu trúc bằng cách đặt trước tên của nó bằng một từ khóa cấu trúc, sau đó chúng tôi lập danh sách dữ liệu chúng tôi cần.

cấu trúc yêu cầu cũ hơn { int Yêu cầu ID; int vị trí_id; int kiểu đơn hàng; tăng gấp đôi đơn_hàng; tăng gấp đôi giá đặt hàng; tăng gấp đôi trật_tự; chuỗi thứ_tự; chuỗi đặt_hàng; int request_status; int Yêu cầu lỗi; };

 

Định nghĩa trên có thể được tìm thấy trong tập tin MQL4\Bao gồm\AlgoTrader_v10\Definitions.mqh.

Chúng ta sử dụng các cấu trúc tương tự như các biến, tức là ở bước đầu tiên chúng ta phải tạo nó bằng cách chỉ định loại cấu trúc, sau đó đặt cho nó một tên duy nhất để chúng ta có thể tham khảo sau này. Trong ví dụ sau, chúng ta đang tạo một cấu trúc kiểu yêu cầu cũ hơn và đặt cho nó một cái tên độc đáo yêu cầu, sau đó chúng tôi gán dữ liệu từ giao diện của mình bằng các hàm ĐọcOrderRequest().

làm mất hiệu lực Quá TrìnhĐặt HàngYêu Cầu() { yêu cầu cũ hơn yêu cầu = ĐọcĐặt hàngYêu cầu(); //(…) }

 

Truy cập vào dữ liệu được lưu trữ trong cấu trúc tương tự như việc sử dụng các biến, bởi vì trong thực tế, cấu trúc chỉ là một tập hợp các biến được ẩn dưới một mã định danh chung. Để đọc hoặc ghi dữ liệu trong cấu trúc, chỉ cần đặt một dấu chấm sau tên mà chúng tôi đã đặt cho nó, sau đó cho biết tên của biến mà chúng tôi quan tâm. Trong đoạn mã bên dưới, chúng tôi đọc dữ liệu được lưu trữ trong cấu trúc để gửi đơn đặt hàng và sau đó chúng tôi lưu thông tin về kết quả của hoạt động.

if(Đặt hàngGửi(yêu cầu.Order_symbol, yêu cầu.Order_type, yêu cầu.Order_volume, yêu cầu.Order_price, 0, 0, 0, yêu cầu.Order_comment, yêu cầu.Position_id) > 0) { yêu cầu.Request_status = ORDER_REQUEST_STATUS_COMPLETED; }

Thực hiện các đơn đặt hàng

Để phần mềm của chúng tôi có thể đặt hàng, chúng tôi cần triển khai đối tượng được tạo trên cơ sở lớp cHoạt động đặt hàng. Vì chúng tôi sẽ cần đối tượng từ khi bắt đầu chương trình, nên chúng tôi tạo nó trong hàm API onInit().

đầu vào int vị trí_id = 8821; // Định danh duy nhất của mục cHoạt động đặt hàng* Hoạt động đặt hàng = vô giá trị; int onInit() { Bộ sự kiệnMilli giâyTimer(200); //(…) Hoạt động đặt hàng = mới cHoạt động đặt hàng(vị trí_id); trở lại(INIT_SUCCEEDED); }

 

Trong hàm tạo cHoạt động đặt hàng chúng tôi đặt biến vị trí_idlà một phần của cài đặt ứng dụng của chúng tôi có sẵn trong cửa sổ mặc định của nền tảng MetaTrader. Mã định danh cho phép phần mềm của chúng tôi nhận ra các đơn đặt hàng của chính nó để chúng không bị nhầm lẫn với các đơn đặt hàng từ các nguồn khác.

Trong đoạn mã trên, chúng tôi cũng đã chạy Hẹn giờ với khoảng thời gian 200 ms, vì đối tượng của chúng ta nên kiểm tra định kỳ xem giao diện có đang gửi thông tin về một đơn đặt hàng đến hay không.

làm mất hiệu lực Hẹn giờ bật() { //(…) OrderOperations.OnTimer200ms(); }

 

hàm đối tượng OnTimer200ms() sẽ gọi hàm ProcessOrderRequests()sẽ đặt hàng khi nhận được dữ liệu thích hợp từ giao diện.

tốt nghiệp lớp XNUMX cHoạt động đặt hàng { công khai: cHoạt động đặt hàng(int vị trí_id) { vị trí_id = vị trí_id; } làm mất hiệu lực OnTimer200ms() { Quá TrìnhĐặt HàngYêu Cầu(); } //(…) };

tác

Phần mềm của chúng tôi đã có thể giao tiếp với giao diện đồ họa và chúng tôi có thể làm những gì chúng tôi thích làm nhất, tức là biên dịch thuật toán và đặt hàng mới. Để làm cho các bước đầu tiên của bạn dễ dàng hơn, dưới đây bạn sẽ tìm thấy một số mẹo minh họa những chức năng bị ẩn dưới các phím khác nhau.

Kiểm soát âm lượng

khối lượng ngoại hối

Algo Trader - Hỗ trợ khối lượng

Các loại đơn đặt hàng

giao dịch algo

Algo Trader - Xử lý đơn hàng

phép cộng

Đó là tất cả cho ngày hôm nay, nhưng đó mới chỉ là khởi đầu của cuộc phiêu lưu với thuật toán giao dịch. Trong phần tiếp theo, chúng ta sẽ đi đến việc thực hiện các chức năng nâng cao liên quan đến việc hỗ trợ các thuật toán. Algo Trader sẽ được phát triển cùng với bạn và chúng tôi sẽ biết ơn bất kỳ ý tưởng và nhận xét nào có thể giúp bạn cải thiện Algo Trader. Chúng tôi rất muốn nghe từ bạn tại địa chỉ biuro@expertadvisors.pl .

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