Sở hữu ngay máy chủ VPS Robot Forex khi giao dịch tại HotForex

Nội dung

Trong bài viết trước, chúng ta đã bắt đầu tạo một thư viện đa nền tảng lớn đơn giản hóa việc phát triển các chương trình cho nền tảng MetaTrader 5 và MetaTrader 4. Chúng ta đã tạo ra đối tượng trừu tượng COrder, một đối tượng cơ sở để lưu trữ dữ liệu trên các đơn đặt hàng và giao dịch lịch sử, cũng như các lệnh và vị trí thị trường.

Trong phần này, chúng ta sẽ tiến hành phát triển tất cả các đối tượng cần thiết để lưu trữ dữ liệu lịch sử tài khoản trong các bộ sưu tập, chuẩn bị thu thập các đơn đặt hàng và giao dịch lịch sử, cũng như sửa đổi và cải thiện các đối tượng và bảng liệt kê đã tạo.

Đối tượng của các đơn đặt hàng và giao dịch lịch sử

Đối tượng cơ sở COrder chứa tất cả dữ liệu trên bất kỳ đối tượng tài khoản nào, có thể là lệnh thị trường (lệnh thực hiện hành động), lệnh chờ xử lý, giao dịch hoặc vị trí. Để chúng ta tự do vận hành tất cả các đối tượng này tách biệt với nhau, chúng ta sẽ phát triển một số lớp dựa trên COrder trừu tượng. Các lớp này sẽ chỉ ra chính xác sự liên kết của đối tượng với loại của nó.

Danh sách các đơn đặt hàng và giao dịch lịch sử có thể có một số loại đối tượng như vậy: đã xóa lệnh chờ xử lý, đặt lệnh thị trường và giao dịch (kết quả thực hiện lệnh thị trường). Ngoài ra còn có hai loại đối tượng nữa trong MQL4: số dư và hoạt động tín dụng (trong MQL5, những dữ liệu này được lưu trữ trong các thuộc tính giao dịch).

Tạo lớp CHistoryOrder mới trong thư mục Đối tượng của thư viện. 
Để thực hiện việc này, bấm chuột phải vào thư mục Đối tượng và chọn mục menu “Tệp mới” (Ctrl + N). Trong Trình hướng dẫn MQL5 mới mở, chọn “Lớp mới” và nhấp vào Tiếp theo. Nhập CHistoryOrder (1)trong trường tên lớp, chỉ định tên của lớp trừu tượng COrder (2) trong trường lớp cơ sở và nhấp vào Kết thúc.

Sau đó, tệp HistoryOrder.mqh (3) được tạo trong thư mục Đối tượng. Mở nó ra:

//+------------------------------------------------------------------+
//|                                                 HistoryOrder.mqh |
//|                                  Copyright 2019, Forex 365 Corp. |
//|                                              https://forex365.vn |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, Forex 365 Corp."
#property link      "https://forex365.vn"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CHistoryOrder : public COrder
  {
private:

public:
                     CHistoryOrder();
                    ~CHistoryOrder();
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CHistoryOrder::CHistoryOrder()
  {
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CHistoryOrder::~CHistoryOrder()
  {
  }
//+------------------------------------------------------------------+

Hiện tại, đây chỉ là một mẫu lớp. Nếu chúng ta cố gắng biên dịch nó, chúng ta sẽ thấy năm lỗi đã quen thuộc – lớp mới xuất phát từ COrder không biết gì về cha mẹ của nó. Thêm bao gồm tệp Order.mqh

//+------------------------------------------------------------------+
//|                                                 HistoryOrder.mqh |
//|                                  Copyright 2019, Forex 365 Corp. |
//|                                              https://forex365.vn |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, Forex 365 Corp."
#property link      "https://forex365.vn"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include files                                                    |
//+------------------------------------------------------------------+
#include "Order.mqh"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CHistoryOrder : public COrder
  {
private:

public:
                     CHistoryOrder();
                    ~CHistoryOrder();
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CHistoryOrder::CHistoryOrder()
  {
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CHistoryOrder::~CHistoryOrder()
  {
  }
//+------------------------------------------------------------------+

Bây giờ tất cả được biên dịch không có vấn đề.

Lớp học sẽ khá nhỏ. Chúng ta cần xác định lại các phương thức lớp cha mẹ COrder, trả về các cờ bảo trì thuộc tính đơn hàng, cũng như đặt việc chuyển vé đặt hàng cho lớp trong hàm tạo:

//+------------------------------------------------------------------+
//|                                                 HistoryOrder.mqh |
//|                                  Copyright 2019, Forex 365 Corp. |
//|                                              https://forex365.vn |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, Forex 365 Corp."
#property link      "https://forex365.vn"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include files                                                    |
//+------------------------------------------------------------------+
#include "Order.mqh"
//+------------------------------------------------------------------+
//| History market order                                             |
//+------------------------------------------------------------------+
class CHistoryOrder : public COrder
  {
public:
   //--- Constructor
                     CHistoryOrder(const ulong ticket) : COrder(ORDER_STATUS_HISTORY_ORDER,ticket) {}
   //--- Supported integer order properties
   virtual bool      SupportProperty(ENUM_ORDER_PROP_INTEGER property);
  };
//+------------------------------------------------------------------+
//| Return 'true' if the order supports the passed property,         |
//| otherwise, return 'false'                                        |
//+------------------------------------------------------------------+
bool CHistoryOrder::SupportProperty(ENUM_ORDER_PROP_INTEGER property)
  {
   if(property==ORDER_PROP_TIME_EXP       || 
      property==ORDER_PROP_DEAL_ENTRY     || 
      property==ORDER_PROP_TIME_UPDATE    || 
      property==ORDER_PROP_TIME_UPDATE_MSC
     ) return false;
   return true;
  }
//+------------------------------------------------------------------+

Do đó, một vé của một đơn đặt hàng đã chọn được chuyển đến hàm tạo của lớp, trong khi trạng thái đơn hàng (thứ tự lịch sử) và vé của nó được chuyển đến hàm tạo được bảo vệ của đối tượng cha COrder.

An toàn & bảo mật vốn đầu tư tại HotForex

Chúng ta cũng đã định nghĩa lại phương thức ảo của lớp cha hỗ trợ trả về các thuộc tính thứ tự số nguyên. Các phương thức trả về sự hỗ trợ cho các thuộc tính thực và chuỗi của đơn hàng đã được giữ nguyên – các phương thức lớp cha này luôn trả về ‘true’ và chúng ta sẽ giả sử rằng thứ tự lịch sử hỗ trợ tất cả các thuộc tính thực và chuỗi, vì vậy chúng ta sẽ không xác định lại chúng chưa.

Kiểm tra thuộc tính trong phương thức hỗ trợ các thuộc tính số nguyên. Nếu đây là thời gian hết hạn, hướng giao dịch hoặc thời gian thay đổi vị trí, hãy trả về ‘false’ . Các tính chất như vậy không được hỗ trợ bởi các đơn đặt hàng thị trường. Tất cả các thuộc tính còn lại được hỗ trợ và ‘true’ được trả về .

Theo cách tương tự, tạo lớp CHistoryPending của lệnh đang chờ xử lý (đã xóa) và lớp thỏa thuận lịch sử CHistoryDeal:

//+------------------------------------------------------------------+
//|                                               HistoryPending.mqh |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                             https://mql5.com/en/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://mql5.com/en/users/artmedia70"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include files                                                    |
//+------------------------------------------------------------------+
#include "Order.mqh"
//+------------------------------------------------------------------+
//| Removed pending order                                            |
//+------------------------------------------------------------------+
class CHistoryPending : public COrder
  {
public:
   //--- Constructor
                     CHistoryPending(const ulong ticket) : COrder(ORDER_STATUS_HISTORY_PENDING,ticket) {}
   //--- Supported order properties (1) real, (2) integer
   virtual bool      SupportProperty(ENUM_ORDER_PROP_DOUBLE property);
   virtual bool      SupportProperty(ENUM_ORDER_PROP_INTEGER property);
  };
//+------------------------------------------------------------------+
//| Return 'true' if the order supports the passed property,         |
//| otherwise, return 'false'                                        |
//+------------------------------------------------------------------+
bool CHistoryPending::SupportProperty(ENUM_ORDER_PROP_INTEGER property)
  {
   if(property==ORDER_PROP_PROFIT_PT         ||
      property==ORDER_PROP_DEAL_ORDER        ||
      property==ORDER_PROP_DEAL_ENTRY        ||
      property==ORDER_PROP_TIME_UPDATE       ||
      property==ORDER_PROP_TIME_UPDATE_MSC   ||
      property==ORDER_PROP_TICKET_FROM       ||
      property==ORDER_PROP_TICKET_TO         ||
      property==ORDER_PROP_CLOSE_BY_SL       ||
      property==ORDER_PROP_CLOSE_BY_TP
     ) return false;
   return true;
  }
//+------------------------------------------------------------------+
//| Return 'true' if the order supports the passed property,         |
//| otherwise, returns 'false'                                       |
//+------------------------------------------------------------------+
bool CHistoryPending::SupportProperty(ENUM_ORDER_PROP_DOUBLE property)
  {
   if(property==ORDER_PROP_COMMISSION  ||
      property==ORDER_PROP_SWAP        ||
      property==ORDER_PROP_PROFIT      ||
      property==ORDER_PROP_PROFIT_FULL ||
      property==ORDER_PROP_PRICE_CLOSE
     ) return false;
   return true;
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                                  HistoryDeal.mqh |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                             https://mql5.com/en/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://mql5.com/en/users/artmedia70"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include files                                                    |
//+------------------------------------------------------------------+
#include "Order.mqh"
//+------------------------------------------------------------------+
//| Historical deal                                                  |
//+------------------------------------------------------------------+
class CHistoryDeal : public COrder
  {
public:
   //--- Constructor
                     CHistoryDeal(const ulong ticket) : COrder(ORDER_STATUS_DEAL,ticket) {}
   //--- Supported deal properties (1) real, (2) integer
   virtual bool      SupportProperty(ENUM_ORDER_PROP_DOUBLE property);
   virtual bool      SupportProperty(ENUM_ORDER_PROP_INTEGER property);
  };
//+------------------------------------------------------------------+
//| Return 'true' if the order supports the passed property,         |
//| otherwise, return 'false'                                        |
//+------------------------------------------------------------------+
bool CHistoryDeal::SupportProperty(ENUM_ORDER_PROP_INTEGER property)
  {
   if(property==ORDER_PROP_TIME_EXP          || 
      property==ORDER_PROP_PROFIT_PT         ||
      property==ORDER_PROP_POSITION_BY_ID    ||
      property==ORDER_PROP_TIME_UPDATE       ||
      property==ORDER_PROP_TIME_UPDATE_MSC   ||
      property==ORDER_PROP_STATE             ||
      (
       this.OrderType()==DEAL_TYPE_BALANCE &&
       (
        property==ORDER_PROP_POSITION_ID     ||
        property==ORDER_PROP_POSITION_BY_ID  ||
        property==ORDER_PROP_TICKET_FROM     ||
        property==ORDER_PROP_TICKET_TO       ||
        property==ORDER_PROP_DEAL_ORDER      ||
        property==ORDER_PROP_MAGIC           ||
        property==ORDER_PROP_TIME_CLOSE      ||
        property==ORDER_PROP_TIME_CLOSE_MSC  ||
        property==ORDER_PROP_CLOSE_BY_SL     ||
        property==ORDER_PROP_CLOSE_BY_TP
       )
      )
     ) return false;
   return true;
  }
//+------------------------------------------------------------------+
bool CHistoryDeal::SupportProperty(ENUM_ORDER_PROP_DOUBLE property)
  {
   if(property==ORDER_PROP_TP                || 
      property==ORDER_PROP_SL                || 
      property==ORDER_PROP_PRICE_CLOSE       ||
      property==ORDER_PROP_VOLUME_CURRENT    ||
      property==ORDER_PROP_PRICE_STOP_LIMIT  ||
      (
       this.OrderType()==DEAL_TYPE_BALANCE &&
       (
        property==ORDER_PROP_PRICE_OPEN      ||
        property==ORDER_PROP_COMMISSION      ||
        property==ORDER_PROP_SWAP            ||
        property==ORDER_PROP_VOLUME
       )
      )
     ) return false;
   return true;
  }
//+------------------------------------------------------------------+

Chúng ta đã tạo ra ba đối tượng thứ tự bộ sưu tập các đơn đặt hàng lịch sử sẽ được dựa trên. Tất cả chúng được kế thừa từ lớp cơ sở thứ tự trừu tượng COrder. Chúng có các thuộc tính của nó nhưng chỉ cho phép trả về các thuộc tính được hỗ trợ bởi các loại đơn đặt hàng này. Tất cả chúng đều được đặt trong một danh sách bộ sưu tập (tập hợp các đơn đặt hàng lịch sử), từ đó chúng ta sẽ nhận được tất cả dữ liệu cần thiết về lịch sử tài khoản theo bất kỳ thành phần và thứ tự nào.

Không phải tất cả các thuộc tính được hỗ trợ hoặc không được hỗ trợ đều được tính đến trong các phương thức SupportProperty () để hiển thị các thuộc tính thứ tự trong tạp chí. Ví dụ: chỉ có ba loại được xem xét cho các giao dịch: mua, bán và cân bằng hoạt động.Các thuộc tính chưa được xem xét và chưa được chỉ định rõ ràng trong các phương thức trả lại hỗ trợ cho chúng sẽ luôn được in. Sau đó, bạn có thể thêm chúng vào phương thức để không in các thuộc tính luôn trả về giá trị 0 bất kể tình huống (không được hỗ trợ).


Bộ sưu tập các đơn đặt hàng và giao dịch lịch sử

Nó luôn hữu ích để có lịch sử tài khoản trong tầm tay. Thiết bị đầu cuối cung cấp nó và cung cấp cho các công cụ để có được nó trong các chương trình. Tuy nhiên, các tác vụ hiện tại của chúng ta yêu cầu một danh sách tùy chỉnh, chúng ta có thể sắp xếp và sắp xếp lại để trả lại dữ liệu cần thiết cho các chương trình của chúng ta. Điều này có nghĩa là phải thay đổi trạng thái lịch sử tài khoản trước đó tại mỗi lần đánh dấu. Nếu một thay đổi được phát hiện, danh sách các đơn đặt hàng và giao dịch lịch sử sẽ được tính toán lại. Nhưng sắp xếp toàn bộ lịch sử ở mỗi đánh dấu là quá tốn tài nguyên. Do đó, chúng ta sẽ chỉ bổ sung vào danh sách dữ liệu mới của chúng ta, trong khi dữ liệu trước đó đã được lưu trữ trong danh sách.

Hãy tạo lớp CHistoryCollection mới trong thư mục Bộ sưu tập :

Nhấp chuột phải vào thư mục Bộ sưu tập , chọn “Tệp mới”, chọn “Lớp mới” trong cửa sổ Trình hướng dẫn MQL và nhấp vào Tiếp theo. Nhập tên lớp CHistoryCollection , để trống trường lớp cơ sở và nhấp vào Kết thúc.

Lịch sử tệp mới HistoryCollection được tạo trong thư mục Bộ sưu tập:

//+------------------------------------------------------------------+
//|                                            HistoryCollection.mqh |
//|                                  Copyright 2019, Forex 365 Corp. |
//|                                              https://forex365.vn |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, Forex 365 Corp."
#property link      "https://forex365.vn"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CHistoryCollection
  {
private:

public:
                     CHistoryCollection();
                    ~CHistoryCollection();
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CHistoryCollection::CHistoryCollection()
  {
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CHistoryCollection::~CHistoryCollection()
  {
  }
//+------------------------------------------------------------------+

Hãy điền nó vào.

Chúng ta sẽ sử dụng danh sách động của các con trỏ tới các thể hiện đối tượng của thư viện chuẩn CArrayObj cho danh sách. Bao gồm nó vào tệp và xác định nó ngay lập tức (bạn có thể sử dụng menu ngữ cảnh nhấp chuột phải để làm điều đó):

Bao gồm CArrayObj và xác định danh sách các đơn đặt hàng và giao dịch lịch sử trong phần riêng tư của lớp:

//+------------------------------------------------------------------+
//|                                            HistoryCollection.mqh |
//|                                  Copyright 2019, Forex 365 Corp. |
//|                                              https://forex365.vn |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, Forex 365 Corp."
#property link      "https://forex365.vn"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include files                                                    |
//+------------------------------------------------------------------+
#include <Arrays\ArrayObj.mqh>
//+------------------------------------------------------------------+
//| Collection of historical orders and deals                        |
//+------------------------------------------------------------------+
class CHistoryCollection
  {
private:
   CArrayObj         m_list_all_orders;      // List of historical orders and deals

public:
                     CHistoryCollection();
                    ~CHistoryCollection();
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CHistoryCollection::CHistoryCollection()
  {
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CHistoryCollection::~CHistoryCollection()
  {
  }
//+------------------------------------------------------------------+

Chúng ta sẽ cần lưu các chỉ số của các đơn đặt hàng và giao dịch cuối cùng được thêm vào bộ sưu tập. Bên cạnh đó, chúng ta cần biết sự khác biệt giữa số lượng đơn đặt hàng và giao dịch trong quá khứ và hiện tại, do đó chúng ta sẽ tạo các thành viên lớp riêng để lưu trữ chúng :

//+------------------------------------------------------------------+
//|                                            HistoryCollection.mqh |
//|                                  Copyright 2019, Forex 365 Corp. |
//|                                              https://forex365.vn |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, Forex 365 Corp."
#property link      "https://forex365.vn"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include files                                                    |
//+------------------------------------------------------------------+
#include <Arrays\ArrayObj.mqh>
//+------------------------------------------------------------------+
//| Collection of historical orders and deals                        |
//+------------------------------------------------------------------+
class CHistoryCollection
  {
private:
   CArrayObj         m_list_all_orders;      // List of historical orders and deals
   int               m_index_order;          // Index of the last order added to the collection from the terminal history list (MQL4, MQL5)
   int               m_index_deal;           // Index of the last deal added to the collection from the terminal history list (MQL5)
   int               m_delta_order;          // Difference in the number of orders as compared to the past check
   int               m_delta_deal;           // Difference in the number of deals as compared to the past check
public:
                     CHistoryCollection();
                    ~CHistoryCollection();
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CHistoryCollection::CHistoryCollection()
  {
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CHistoryCollection::~CHistoryCollection()
  {
  }
//+------------------------------------------------------------------+

Trong lần khởi chạy đầu tiên, tất cả các thành viên lớp riêng được đặt lại và lịch sử được tính lại. Để làm điều này, chỉ cần thêm danh sách khởi tạo thành viên lớp trong hàm tạo của lớp và đặt tiêu chí mặc định mà danh sách bộ sưu tập sẽ được sắp xếp theo.

Hiện tại, chúng ta có các nhà xây dựng mặc định. Trước khi viết triển khai, chúng ta nên tạo một bảng liệt kê chứa tất cả các tiêu chí có thể để sắp xếp các đơn đặt hàng và giao dịch trong danh sách bộ sưu tập. 
Nhưng trước tiên, hãy sắp xếp các thuộc tính thứ tự số nguyên, thực và chuỗi để hiển thị logic hơn trong nhật ký. Mở tệp Defines.mqh từ thư mục gốc của thư viện và đặt các thành viên liệt kê theo thứ tự yêu cầu:

//+------------------------------------------------------------------+
//| Order, deal, position integer properties                         |
//+------------------------------------------------------------------+
enum ENUM_ORDER_PROP_INTEGER
  {
   ORDER_PROP_TICKET = 0,                                   // Order ticket
   ORDER_PROP_MAGIC,                                        // Order magic number
   ORDER_PROP_TIME_OPEN,                                    // Open time (MQL5 Deal time)
   ORDER_PROP_TIME_CLOSE,                                   // Close time (MQL5 Execution or removal time - ORDER_TIME_DONE)
   ORDER_PROP_TIME_OPEN_MSC,                                // Open time in milliseconds (MQL5 Deal time in msc)
   ORDER_PROP_TIME_CLOSE_MSC,                               // Close time in milliseconds (MQL5 Execution or removal time - ORDER_TIME_DONE_MSC)
   ORDER_PROP_TIME_EXP,                                     // Order expiration date (for pending orders)
   ORDER_PROP_STATUS,                                       // Order status (from the ENUM_ORDER_STATUS enumeration)
   ORDER_PROP_TYPE,                                         // Order type (MQL5 deal type)
   ORDER_PROP_DIRECTION,                                    // Direction (Buy, Sell)
   ORDER_PROP_REASON,                                       // Deal/order/position reason or source
   ORDER_PROP_POSITION_ID,                                  // Position ID
   ORDER_PROP_POSITION_BY_ID,                               // Opposite position ID
   ORDER_PROP_DEAL_ORDER,                                   // Order a deal is based on
   ORDER_PROP_DEAL_ENTRY,                                   // Deal direction – IN, OUT or IN/OUT
   ORDER_PROP_TIME_UPDATE,                                  // Position change time in seconds
   ORDER_PROP_TIME_UPDATE_MSC,                              // Position change time in milliseconds
   ORDER_PROP_TICKET_FROM,                                  // Parent order ticket
   ORDER_PROP_TICKET_TO,                                    // Derived order ticket
   ORDER_PROP_PROFIT_PT,                                    // Profit in points
   ORDER_PROP_CLOSE_BY_SL,                                  // Flag of closing by StopLoss
   ORDER_PROP_CLOSE_BY_TP,                                  // Flag of closing by TakeProfit
  }; 
#define ORDER_PROP_INTEGER_TOTAL    (22)                    // Total number of integer properties
//+------------------------------------------------------------------+
//| Order, deal, position real properties                            |
//+------------------------------------------------------------------+
enum ENUM_ORDER_PROP_DOUBLE
  {
   ORDER_PROP_PRICE_OPEN = ORDER_PROP_INTEGER_TOTAL,        // Open price (MQL5 deal price)
   ORDER_PROP_PRICE_CLOSE,                                  // Close price
   ORDER_PROP_SL,                                           // StopLoss price
   ORDER_PROP_TP,                                           // TakeProfit price
   ORDER_PROP_PROFIT,                                       // Profit
   ORDER_PROP_COMMISSION,                                   // Commission
   ORDER_PROP_SWAP,                                         // Swap
   ORDER_PROP_VOLUME,                                       // Volume
   ORDER_PROP_VOLUME_CURRENT,                               // Unexecuted volume
   ORDER_PROP_PROFIT_FULL,                                  // Profit+commission+swap
   ORDER_PROP_PRICE_STOP_LIMIT,                             // Limit order price when StopLimit order is activated
  };
#define ORDER_PROP_DOUBLE_TOTAL     (11)                    // Total number of real properties
//+------------------------------------------------------------------+
//| Order, deal, position string properties                          |
//+------------------------------------------------------------------+
enum ENUM_ORDER_PROP_STRING
  {
   ORDER_PROP_SYMBOL = (ORDER_PROP_INTEGER_TOTAL+ORDER_PROP_DOUBLE_TOTAL), // Order symbol
   ORDER_PROP_COMMENT,                                      // Order comment
   ORDER_PROP_EXT_ID                                        // Order ID in an external trading system
  };
#define ORDER_PROP_STRING_TOTAL     (3)                     // Total number of string properties
//+------------------------------------------------------------------+

Bây giờ, hãy thêm phép liệt kê với tất cả các loại thứ tự có thể và sắp xếp thỏa thuận vào cùng một tệp:

//+------------------------------------------------------------------+
//| Possible criteria of orders and deals sorting                    |
//+------------------------------------------------------------------+
enum ENUM_SORT_ORDERS_MODE
  {
   //--- Sort by integer properties
   SORT_BY_ORDER_TICKET          =  0,                      // Sort by order ticket
   SORT_BY_ORDER_MAGIC           =  1,                      // Sort by order magic number
   SORT_BY_ORDER_TIME_OPEN       =  2,                      // Sort by order open time
   SORT_BY_ORDER_TIME_CLOSE      =  3,                      // Sort by order close time
   SORT_BY_ORDER_TIME_OPEN_MSC   =  4,                      // Sort by order open time in milliseconds
   SORT_BY_ORDER_TIME_CLOSE_MSC  =  5,                      // Sort by order close time in milliseconds
   SORT_BY_ORDER_TIME_EXP        =  6,                      // Sort by order expiration date
   SORT_BY_ORDER_STATUS          =  7,                      // Sort by order status (market order/pending order/deal)
   SORT_BY_ORDER_TYPE            =  8,                      // Sort by order type
   SORT_BY_ORDER_REASON          =  10,                     // Sort by deal/order/position reason/source
   SORT_BY_ORDER_POSITION_ID     =  11,                     // Sort by position ID
   SORT_BY_ORDER_POSITION_BY_ID  =  12,                     // Sort by opposite position ID
   SORT_BY_ORDER_DEAL_ORDER      =  13,                     // Sort by order a deal is based on
   SORT_BY_ORDER_DEAL_ENTRY      =  14,                     // Sort by deal direction – IN, OUT or IN/OUT
   SORT_BY_ORDER_TIME_UPDATE     =  15,                     // Sort by position change time in seconds
   SORT_BY_ORDER_TIME_UPDATE_MSC =  16,                     // Sort by position change time in milliseconds
   SORT_BY_ORDER_TICKET_FROM     =  17,                     // Sort by parent order ticket
   SORT_BY_ORDER_TICKET_TO       =  18,                     // Sort by derived order ticket
   SORT_BY_ORDER_PROFIT_PT       =  19,                     // Sort by order profit in points
   SORT_BY_ORDER_CLOSE_BY_SL     =  20,                     // Sort by order closing by StopLoss flag
   SORT_BY_ORDER_CLOSE_BY_TP     =  21,                     // Sort by order closing by TakeProfit flag
   //--- Sort by real properties
   SORT_BY_ORDER_PRICE_OPEN      =  ORDER_PROP_INTEGER_TOTAL,// Sort by open price
   SORT_BY_ORDER_PRICE_CLOSE     =  23,                     // Sort by close price
   SORT_BY_ORDER_SL              =  24,                     // Sort by StopLoss price
   SORT_BY_ORDER_TP              =  25,                     // Sort by TakeProfit price
   SORT_BY_ORDER_PROFIT          =  26,                     // Sort by profit
   SORT_BY_ORDER_COMMISSION      =  27,                     // Sort by commission
   SORT_BY_ORDER_SWAP            =  28,                     // Sort by swap
   SORT_BY_ORDER_VOLUME          =  29,                     // Sort by volume
   SORT_BY_ORDER_VOLUME_CURRENT  =  30,                     // Sort by unexecuted volume
   SORT_BY_ORDER_PROFIT_FULL     =  31,                     // Sort by profit+commission+swap criterion
   SORT_BY_ORDER_PRICE_STOP_LIMIT=  32,                     // Sort by Limit order when StopLimit order is activated
   //--- Sort by string properties
   SORT_BY_ORDER_SYMBOL          =  ORDER_PROP_INTEGER_TOTAL+ORDER_PROP_DOUBLE_TOTAL,// Sort by symbol
   SORT_BY_ORDER_COMMENT         =  34,                     // Sort by comment
   SORT_BY_ORDER_EXT_ID          =  35                      // Sort by order ID in an external trading system
  };
//+------------------------------------------------------------------+

Lưu ý : Các chỉ số của các thành viên liệt kê sắp xếp phải trùng với các chỉ số của các thành viên liệt kê thuộc tính, vì danh sách phải được sắp xếp theo cùng một giá trị được sử dụng để tìm kiếm trong danh sách đó.

Như chúng ta có thể thấy, thuộc tính sắp xếp ORDER_PROP_DIRMENT đã bị bỏ qua trong danh sách đó vì đây là thuộc tính dịch vụ được sử dụng cho nhu cầu thư viện, giống như các thuộc tính tùy chỉnh khác mà chúng ta đã thêm trước đây. Tuy nhiên, họ có thể cần phân loại. Đây là lý do tại sao họ đã bị bỏ lại.

Bây giờ chúng ta có thể triển khai hàm tạo của lớp CHistoryCollection:

//+------------------------------------------------------------------+
//|                                            HistoryCollection.mqh |
//|                                  Copyright 2019, Forex 365 Corp. |
//|                                              https://forex365.vn |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, Forex 365 Corp."
#property link      "https://forex365.vn"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include files                                                    |
//+------------------------------------------------------------------+
#include <Arrays\ArrayObj.mqh>
#include "..\DELib.mqh"
//+------------------------------------------------------------------+
//| Collection of historical orders and deals                        |
//+------------------------------------------------------------------+
class CHistoryCollection
  {
private:
   CArrayObj         m_list_all_orders;      // List of historical orders and deals
   int               m_index_order;          // Index of the last order added to the collection from the terminal history list (MQL4, MQL5)
   int               m_index_deal;           // Index of the last deal added to the collection from the terminal history list (MQL5)
   int               m_delta_order;          // Difference in the number of orders as compared to the past check
   int               m_delta_deal;           // Difference in the number of deals as compared to the past check
public:
                     CHistoryCollection();
                    ~CHistoryCollection();
  };
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CHistoryCollection::CHistoryCollection(void) : m_index_deal(0), 
                                               m_delta_deal(0), 
                                               m_index_order(0),
                                               m_delta_order(0) 
  {
   m_list_all_orders.Sort(SORT_BY_ORDER_TIME_CLOSE);
  }
//+------------------------------------------------------------------+

Hãy phân tích danh sách. 
Vì hàm tạo của lớp chỉ sử dụng giá trị của một phép liệt kê mới được thêm vào, nên chúng ta nên đưa tệp Defines.mqh vào tệp lớp. Khi chế tạo lớp cơ sở của trật tự trừu tượng trong bài viết đầu tiên, chúng ta đã phát triển DELib.mqh thư viện các chức năng dịch vụ và bao gồm các tập tin Defines.mqh với tất cả các kiểu liệt kê cần thiết và thay thế vĩ mô với nó. Do đó, chúng ta sẽ bao gồm thư viện các chức năng dịch vụ . 
bên trongDanh sách khởi tạo của hàm tạo, tất cả các chỉ số và giá trị của sự khác biệt giữa các số hiện tại và trước đó được đặt lại và sắp xếp mặc định theo thời gian đóng được chỉ định trong phần thân của hàm tạo.

Bây giờ là lúc để bắt đầu thu thập thông tin từ tài khoản và lưu nó trong danh sách thu thập. Để làm điều này, đi qua lịch sử tài khoản trong các vòng lặp và chỉ định từng đơn hàng trong danh sách. Nếu số lượng đơn đặt hàng hoặc giao dịch đã thay đổi so với kiểm tra trước đó, thì hãy đặt cờ của sự kiện giao dịch xảy ra. Cần gửi tin nhắn về sự kiện mới xảy ra trong lịch sử tài khoản tới một chương trình bên ngoài. 
Khai báo cờ sự kiện giao dịch trong phần lớp riêng và phương thức Làm mới () để cập nhật bộ sưu tập lịch sử trong công khai:

//+------------------------------------------------------------------+
//| Collection of historical orders and deals                        |
//+------------------------------------------------------------------+
class CHistoryCollection
  {
private:
   CArrayObj         m_list_all_orders;      // List of all historical orders and deals
   bool              m_is_trade_event;       // Trading event flag
   int               m_index_order;          // Index of the last order added to the collection from the terminal history list (MQL4, MQL5)
   int               m_index_deal;           // Index of the last deal added to the collection from the terminal history list (MQL5)
   int               m_delta_order;          // Difference in the number of orders as compared to the past check
   int               m_delta_deal;           // Difference in the number of deals as compared to the past check
public:
                     CHistoryCollection();
   //--- Update the list of orders, fill data on the number of new ones and set the trading event flag
   void              Refresh(void);
  };
//+------------------------------------------------------------------+

Để thực hiện cập nhật danh sách các đơn đặt hàng bộ sưu tập, chúng ta cần thêm một thay thế macro để yêu cầu dữ liệu lịch sử đầy đủ. Hàm HistorySelect () được sử dụng cho điều đó. Ngày bắt đầu và kết thúc của dữ liệu cần thiết được truyền vào các tham số của nó. Để có được danh sách đầy đủ về lịch sử tài khoản, ngày đầu tiên phải được thông qua là 0, trong khi ngày kết thúc phải được thông qua là TimeCản () . Tuy nhiên, trong trường hợp đó, dữ liệu lịch sử trả về đôi khi có thể không đầy đủ. Để tránh điều đó, hãy nhập một ngàyvượt quá thời gian máy chủ hiện tại thay vì TimeCản (). Tôi sẽ nhập ngày tối đa có thể: 31.12.3000 23:59:59. Một lợi thế khác ở đây là các biểu tượng tùy chỉnh có thể chứa một ngày như vậy và việc lấy lịch sử vẫn sẽ hoạt động.

Hãy chèn một thay thế macro mới vào tệp Defines.mqh:

//+------------------------------------------------------------------+
//|                                                      Defines.mqh |
//|                                  Copyright 2019, Forex 365 Corp. |
//|                                              https://forex365.vn |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, Forex 365 Corp."
#property link      "https://forex365.vn"
//+------------------------------------------------------------------+
//| Macro substitutions                                              |
//+------------------------------------------------------------------+
#define COUNTRY_LANG   ("Russian")              // Country language
#define DFUN           (__FUNCTION__+": ")      // "Function description"
#define END_TIME       (D'31.12.3000 23:59:59') // End time to request account history data
//+------------------------------------------------------------------+

Bây giờ, thay vì nhập TimeCản () làm thời gian kết thúc, chúng ta sẽ nhập macro END_TIME.

Thực hiện cập nhật danh sách thứ tự bộ sưu tập:

//+------------------------------------------------------------------+
//| Update the order list                                            |
//+------------------------------------------------------------------+
void CHistoryCollection::Refresh(void)
  {
#ifdef __MQL4__
   int total=::OrdersHistoryTotal(),i=m_index_order;
   for(; i<total; i++)
     {
      if(!::OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
      ENUM_ORDER_TYPE order_type=(ENUM_ORDER_TYPE)::OrderType();
      //--- Closed positions and balance/credit operations
      if(order_type<ORDER_TYPE_BUY_LIMIT || order_type>ORDER_TYPE_SELL_STOP)
        {
         CHistoryOrder *order=new CHistoryOrder(::OrderTicket());
         if(order==NULL) continue;
         m_list_all_orders.InsertSort(order);
        }
      else
        {
         //--- Removed pending orders
         CHistoryPending *order=new CHistoryPending(::OrderTicket());
         if(order==NULL) continue;
         m_list_all_orders.InsertSort(order);
        }
     }
//---
   int delta_order=i-m_index_order;
   this.m_index_order=i;
   this.m_delta_order=delta_order;
   this.m_is_trade_event=(this.m_delta_order!=0 ? true : false);
//--- __MQL5__
#else 
   if(!::HistorySelect(0,END_TIME)) return;
//--- Orders
   int total_orders=::HistoryOrdersTotal(),i=m_index_order;
   for(; i<total_orders; i++)
     {
      ulong order_ticket=::HistoryOrderGetTicket(i);
      if(order_ticket==0) continue;
      ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)::HistoryOrderGetInteger(order_ticket,ORDER_TYPE);
      if(type==ORDER_TYPE_BUY || type==ORDER_TYPE_SELL)
        {
         CHistoryOrder *order=new CHistoryOrder(order_ticket);
         if(order==NULL) continue;
         m_list_all_orders.InsertSort(order);
        }
      else
        {
         CHistoryPending *order=new CHistoryPending(order_ticket);
         if(order==NULL) continue;
         m_list_all_orders.InsertSort(order);
        }
     }
//--- save the index of the last added order and the difference as compared to the previous check
   int delta_order=i-this.m_index_order;
   this.m_index_order=i;
   this.m_delta_order=delta_order;
   
//--- Deals
   int total_deals=::HistoryDealsTotal(),j=m_index_deal;
   for(; j<total_deals; j++)
     {
      ulong deal_ticket=::HistoryDealGetTicket(j);
      if(deal_ticket==0) continue;
      CHistoryDeal *deal=new CHistoryDeal(deal_ticket);
      if(deal==NULL) continue;
      m_list_all_orders.InsertSort(deal);
     }
//--- save the index of the last added deal and the difference as compared to the previous check
   int delta_deal=j-this.m_index_deal;
   this.m_index_deal=j;
   this.m_delta_deal=delta_deal;
//--- Set the new event flag in history
   this.m_is_trade_event=(this.m_delta_order+this.m_delta_deal);
#endif 
  }
//+------------------------------------------------------------------+

Kiểm tra liên kết với MQL4 hoặc MQL5 . Hãy phân tích mã bằng MQL5 làm ví dụ vì nó phức tạp hơn một chút.

Đầu tiên, yêu cầu lịch sử tài khoản đầy đủ . Nếu thất bại, thoát cho đến khi đánh dấu tiếp theo. Sau khi yêu cầu lịch sử thành công, hai danh sách được tạo – danh sách các đơn đặt hàng và giao dịch.

Đầu tiên, di chuyển dọc theo danh sách tất cả các đơn đặt hàng trong một vòng lặp. Chỉ mục ban đầu mà vòng lặp di chuyển từ là kết quả của hoạt động vòng lặp trước đó (ở lần bắt đầu đầu tiên = 0). Điều này cho phép chúng ta chỉ di chuyển thông qua các đơn đặt hàng mới đã xuất hiện trong lịch sử kể từ lần kiểm tra cuối cùng thay vì di chuyển vòng lặp thâm dụng tài nguyên dọc theo toàn bộ lịch sử.

Tiếp theo, nhận vé đặt hàng và loại của nó . Tạo một đối tượng mới theo kết quả của kiểm tra loại đơn đặt hàng (hoặc lệnh thị trường lịch sử hoặc lệnh chờ xử lý đã xóa ) và đặt nó vào danh sách bộ sưu tập ở dạng đã sắp xếp ngay lập tức (chúng ta đã thiết lập sắp xếp theo thời gian đóng trước đó).

Sau khi hoàn thành thao tác vòng lặp, hãy lưu chỉ mục mới để một vòng lặp mới bắt đầu từ nó. Sự khác biệt giữa các kết quả hoạt động của vòng lặp trước và hiện tại là một số đơn đặt hàng mới được thêm vào.
Vòng lặp để làm việc với các giao dịch là như nhau ngoại trừ việc không cần chia các giao dịch theo loại. Thay vào đó, bạn có thể thêm một đối tượng thỏa thuận vào danh sách bộ sưu tập ngay lập tức.

Vòng lặp trong mã MQL4 gần như giống nhau ngoại trừ vòng lặp được lấy từ toàn bộ lịch sử có thể có cho tài khoản. Độ dài lịch sử được chỉ định bởi người dùng trong tab Lịch sử của thiết bị đầu cuối, điều đó có nghĩa là tùy thuộc vào người dùng để đảm bảo toàn bộ lịch sử có sẵn nếu chương trình yêu cầu. Một tùy chọn khác là sử dụng WinAPI để lấy toàn bộ lịch sử, nằm ngoài phạm vi của các bài viết.

Sau khi hoàn thành các vòng lặp, số lượng đơn đặt hàng và giao dịch mới được kiểm tra. Nếu số lớn hơn 0, cờ của sự kiện giao dịch xảy ra được đặt .

Chúng ta đã triển khai thu thập dữ liệu trong lớp bộ sưu tập lịch sử tương tự như dữ liệu được triển khai trong EA thử nghiệm trong phần đầu tiên , ngoại trừ trong trường hợp hiện tại, các đối tượng khác nhau của các đơn đặt hàng lịch sử được tạo ra cách nhau bởi trạng thái của chúng. Để kiểm tra xem tất cả hoạt động như thế nào, chúng ta cần lấy danh sách bộ sưu tập các đơn hàng lịch sử đã tạo từ bên ngoài (từ chương trình sử dụng thư viện này; trong trường hợp của chúng ta, đây là EA thử nghiệm).Để làm điều này, hãy thêm phương thức GetList () không có tham số vào phần chung của lớp CHistoryCollection (trong bài viết tiếp theo, tôi sẽ thêm các phương thức để nhận danh sách có tham số):

//+------------------------------------------------------------------+
//| Collection of historical orders and deals                        |
//+------------------------------------------------------------------+
class CHistoryCollection
  {
private:
   CArrayObj         m_list_all_orders;      // List of all historical orders and deals
   bool              m_is_trade_event;       // Trading event flag
   int               m_index_order;          // Index of the last order added to the collection from the terminal history list (MQL4, MQL5)
   int               m_index_deal;           // Index of the last deal added to the collection from the terminal history list (MQL5)
   int               m_delta_order;          // Difference in the number of orders as compared to the past check
   int               m_delta_deal;           // Difference in the number of deals as compared to the past check
public:
   //--- Return the full collection list 'as is'
   CArrayObj*        GetList(void)           { return &m_list_all_orders;  }
//--- Constructor
                     CHistoryCollection();
   //--- Update the list of orders, fill data on the number of new ones and set the trading event flag
   void              Refresh(void);
  };
//+------------------------------------------------------------------+

Như có thể thấy từ danh sách, con trỏ đến danh sách (không phải chính đối tượng) được trả về. Điều này là đủ để sử dụng danh sách trong các chương trình. Tuy nhiên, điều này là không đủ để sử dụng thư viện nhanh chóng và dễ dàng. Trong bài viết tiếp theo dành cho thư viện, tôi sẽ thực hiện truy cập dễ dàng vào dữ liệu cần thiết theo yêu cầu. Trong các bài viết sắp tới, tôi sẽ đơn giản hóa việc truy cập hơn nữa bằng cách tạo các chức năng đặc biệt để làm việc với thư viện trong các chương trình tùy chỉnh.

Hãy xem cách danh sách được điền. Để làm điều này, tạo một EA nhỏ. Trong thư mục TestDo EAS (mà chúng ta đã tạo trong phần đầu tiên), tạo thư mục con Part02 . Nó sẽ chứa tệp của EA thử nghiệm thứ hai có tên TestDo EASPart02và kết nối bộ sưu tập đã tạo với nó:

//+------------------------------------------------------------------+
//|                                             TestDoEasyPart02.mq5 |
//|                                  Copyright 2019, Forex 365 Corp. |
//|                                              https://forex365.vn |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, Forex 365 Corp."
#property link      "https://forex365.vn"
#property version   "1.00"
//--- includes
#include <DoEasy\Collections\HistoryCollection.mqh>
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

Vì danh sách hiện lưu trữ các đối tượng thuộc nhiều loại khác nhau được kế thừa từ một cha mẹ COrder duy nhất, chúng ta hãy thực hiện hiển thị các mô tả của các đối tượng thứ tự được chọn trong tạp chí. Để thực hiện việc này, hãy tạo bảng liệt kê với lựa chọn các loại đơn hàng được hiển thị trong các đầu vào, cũng như một đối tượng thu thập để đọc dữ liệu tài khoản từ:

//+------------------------------------------------------------------+
//|                                             TestDoEasyPart02.mq5 |
//|                                  Copyright 2019, Forex 365 Corp. |
//|                                              https://forex365.vn |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, Forex 365 Corp."
#property link      "https://forex365.vn"
#property version   "1.00"
//--- includes
#include <DoEasy\Collections\HistoryCollection.mqh>
//--- enums
enum ENUM_TYPE_ORDERS
  {
   TYPE_ORDER_MARKET,   // Market orders
   TYPE_ORDER_PENDING,  // Pending orders
   TYPE_ORDER_DEAL      // Deals
  };
//--- input parameters
input ENUM_TYPE_ORDERS  InpOrderType   =  TYPE_ORDER_DEAL;  // Show type:
//--- global variables
CHistoryCollection history;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

Giống như trong EA thử nghiệm trước từ phần đầu tiên của mô tả thư viện, hãy đọc lịch sử tài khoản trong trình xử lý OnInit () và hiển thị thông tin về các đơn đặt hàng cho tạp chí theo vòng lặp:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- update history
   history.Refresh();
//--- get the pointer to the full collection list
   CArrayObj* list=history.GetList();
   if(list==NULL)
     {
      Print("Could not get collection list");
      return INIT_FAILED;
     }
   int total=list.Total();
   for(int i=0;i<total;i++)
     {
      //--- get order from the list
      COrder* order=list.At(i);
      if(order==NULL) continue;
      //--- if this is a deal
      if(order.Status()==ORDER_STATUS_DEAL && InpOrderType==TYPE_ORDER_DEAL)
         order.Print();
      //--- if this is a historical market order
      if(order.Status()==ORDER_STATUS_HISTORY_ORDER && InpOrderType==TYPE_ORDER_MARKET)
         order.Print();
      //--- if this is a removed pending order
      if(order.Status()==ORDER_STATUS_HISTORY_PENDING && InpOrderType==TYPE_ORDER_PENDING)
         order.Print();
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+

Tại đây, tạo một con trỏ tới danh sách bộ sưu tập và nhận nó từ CHistoryCollection bằng phương thức GetList () được tạo ở đó.

Tiếp theo, trong một vòng lặp, lấy đối tượng thứ tự từ danh sách, kiểm tra trạng thái và quyền của nó để hiển thị dữ liệu trong tạp chí trong cài đặt EA.

Tùy thuộc vào kết quả, hiển thị dữ liệu trong tạp chí hay không.

Mặc dù, chúng ta nhận được đối tượng cơ sở COrder từ danh sách, chỉ có dữ liệu vốn có của hậu duệ của lệnh cơ sở được hiển thị trong nhật ký thị trường, lệnh chờ và xử lý các phương thức ảo được xác định lại trả về cờ cho biết lệnh hỗ trợ vốn có của nó Chỉ tính chất.

Biên dịch và khởi chạy EA. Tạp chí hiển thị dữ liệu về các loại đơn đặt hàng và thỏa thuận đã chọn:

Nếu bạn nhìn kỹ vào các loại tài sản được hiển thị, chúng ta sẽ thấy các thuộc tính không điển hình cho các đơn đặt hàng MQL5: lợi nhuận, trao đổi, hoa hồng và lợi nhuận theo điểm.

Hãy thực hiện một số cải tiến và bổ sung trong các đối tượng đã được tạo.
Thêm lợi nhuận MQL5 của thuộc tính không được hỗ trợ vào các điểm vào phương thức SupportProperty (ENUM_ORDER_PROP_INTEGER) của lớp CHistoryOrder:

//+------------------------------------------------------------------+
//| Return 'true' if an order supports the passed property,          |
//| otherwise, return 'false'                                        |
//+------------------------------------------------------------------+
bool CHistoryOrder::SupportProperty(ENUM_ORDER_PROP_INTEGER property)
  {
   if(property==ORDER_PROP_TIME_EXP       || 
      property==ORDER_PROP_DEAL_ENTRY     || 
      property==ORDER_PROP_TIME_UPDATE    || 
      property==ORDER_PROP_TIME_UPDATE_MSC
      #ifdef __MQL5__                     ||
      property==ORDER_PROP_PROFIT_PT
      #endif                        
     ) return false;
   return true;
  }
//+------------------------------------------------------------------+

Và thêm một phương thức ảo khác trả lại sự hỗ trợ của các thuộc tính thực theo đơn đặt hàng:

//+------------------------------------------------------------------+
//| Historical market order                                          |
//+------------------------------------------------------------------+
class CHistoryOrder : public COrder
  {
public:
   //--- Constructor
                     CHistoryOrder(const ulong ticket) : COrder(ORDER_STATUS_HISTORY_ORDER,ticket) {}
   //--- Supported integer properties of an order
   virtual bool      SupportProperty(ENUM_ORDER_PROP_INTEGER property);
   //--- Supported real properties of an order
   virtual bool      SupportProperty(ENUM_ORDER_PROP_DOUBLE property);
  };
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Return 'true' if an order supports the passed property,          |
//| otherwise, return 'false'                                        |
//+------------------------------------------------------------------+
bool CHistoryOrder::SupportProperty(ENUM_ORDER_PROP_DOUBLE property)
  {
#ifdef __MQL5__
   if(property==ORDER_PROP_PROFIT      || 
      property==ORDER_PROP_PROFIT_FULL || 
      property==ORDER_PROP_SWAP        || 
      property==ORDER_PROP_COMMISSION  ||
      property==ORDER_PROP_PRICE_STOP_LIMIT
     ) return false;
#endif 
   return true;
  }
//+------------------------------------------------------------------+

Nếu đây là MQL5, lợi nhuận, trao đổi, hoa hồng, lợi nhuận đầy đủ và giá đặt hàng StopLimit không được hỗ trợ. Đối với MQL4 và các thuộc tính đơn hàng thực khác trong MQL5, hãy trả lại cờ hỗ trợ của đơn hàng cho các thuộc tính thực.

Các đơn đặt hàng MQL5 cũng có thuộc tính ORDER_STATE. Đây là trạng thái đơn hàng được đặt trong bảng liệt kê ENUM_ORDER_STATE.

Thêm nó vào danh sách các thuộc tính thứ tự số nguyên (bảng liệt kê ENUM_ORDER_PROP_INTEGER trong các tệp Defines.mqh):

//+------------------------------------------------------------------+
//| Order, deal, position integer properties                         |
//+------------------------------------------------------------------+
enum ENUM_ORDER_PROP_INTEGER
  {
   ORDER_PROP_TICKET = 0,                                   // Order ticket
   ORDER_PROP_MAGIC,                                        // Order magic number
   ORDER_PROP_TIME_OPEN,                                    // Open time (MQL5 Deal time)
   ORDER_PROP_TIME_CLOSE,                                   // Close time (MQL5 Execution or removal time - ORDER_TIME_DONE)
   ORDER_PROP_TIME_OPEN_MSC,                                // Open time in milliseconds (MQL5 Deal time in msc)
   ORDER_PROP_TIME_CLOSE_MSC,                               // Close time in milliseconds (MQL5 Execution or removal time - ORDER_TIME_DONE_MSC)
   ORDER_PROP_TIME_EXP,                                     // Order expiration date (for pending orders)
   ORDER_PROP_STATUS,                                       // Order status (from the ENUM_ORDER_STATUS enumeration)
   ORDER_PROP_TYPE,                                         // Order type (MQL5 deal type)
   ORDER_PROP_DIRECTION,                                    // Direction (Buy, Sell)
   ORDER_PROP_REASON,                                       // Deal/order/position reason or source
   ORDER_PROP_STATE,                                        // Order status (from the ENUM_ORDER_STATE enumeration)
   ORDER_PROP_POSITION_ID,                                  // Position ID
   ORDER_PROP_POSITION_BY_ID,                               // Opposite position ID
   ORDER_PROP_DEAL_ORDER,                                   // Order a deal is based on
   ORDER_PROP_DEAL_ENTRY,                                   // Deal direction – IN, OUT or IN/OUT
   ORDER_PROP_TIME_UPDATE,                                  // Position change time in seconds
   ORDER_PROP_TIME_UPDATE_MSC,                              // Position change time in milliseconds
   ORDER_PROP_TICKET_FROM,                                  // Parent order ticket
   ORDER_PROP_TICKET_TO,                                    // Derived order ticket
   ORDER_PROP_PROFIT_PT,                                    // Profit in points
   ORDER_PROP_CLOSE_BY_SL,                                  // Flag of closing by StopLoss
   ORDER_PROP_CLOSE_BY_TP,                                  // Flag of closing by TakeProfit
  }; 
#define ORDER_PROP_INTEGER_TOTAL    (23)                    // Total number of integer properties
//+------------------------------------------------------------------+

Và đảm bảo thay đổi số lượng thuộc tính số nguyên của đơn hàng từ 22 thành 23 trong thay thế macro ORDER_PROP_INTEGER_TOTAL cho biết số lượng thuộc tính thứ tự số nguyên và được sử dụng để tính ‘địa chỉ’ chính xác của thuộc tính đơn hàng cần thiết.
Trong cùng một tệp, thêm thuộc tính mới vào tiêu chí sắp xếp thứ tự có thể để chúng ta có thể sắp xếp đơn hàng theo thuộc tính mới này và thực hiện tính toán các chỉ số thuận tiện hơn trong trường hợp thay đổi bảng liệt kê sau:

//+------------------------------------------------------------------+
//| Possible criteria of orders and deals sorting                    |
//+------------------------------------------------------------------+
#define FIRST_DBL_PROP              (ORDER_PROP_INTEGER_TOTAL)
#define FIRST_STR_PROP              (ORDER_PROP_INTEGER_TOTAL+ORDER_PROP_DOUBLE_TOTAL)
enum ENUM_SORT_ORDERS_MODE
  {
   //--- Sort by integer properties
   SORT_BY_ORDER_TICKET          =  0,                      // Sort by order ticket
   SORT_BY_ORDER_MAGIC           =  1,                      // Sort by order magic number
   SORT_BY_ORDER_TIME_OPEN       =  2,                      // Sort by order open time
   SORT_BY_ORDER_TIME_CLOSE      =  3,                      // Sort by order close time
   SORT_BY_ORDER_TIME_OPEN_MSC   =  4,                      // Sort by order open time in milliseconds
   SORT_BY_ORDER_TIME_CLOSE_MSC  =  5,                      // Sort by order close time in milliseconds
   SORT_BY_ORDER_TIME_EXP        =  6,                      // Sort by order expiration date
   SORT_BY_ORDER_STATUS          =  7,                      // Sort by order status (market order/pending order/deal)
   SORT_BY_ORDER_TYPE            =  8,                      // Sort by order type
   SORT_BY_ORDER_REASON          =  10,                     // Sort by deal/order/position reason/source
   SORT_BY_ORDER_STATE           =  11,                     // Sort by order status
   SORT_BY_ORDER_POSITION_ID     =  12,                     // Sort by position ID
   SORT_BY_ORDER_POSITION_BY_ID  =  13,                     // Sort by opposite position ID
   SORT_BY_ORDER_DEAL_ORDER      =  14,                     // Sort by order a deal is based on
   SORT_BY_ORDER_DEAL_ENTRY      =  15,                     // Sort by deal direction – IN, OUT or IN/OUT
   SORT_BY_ORDER_TIME_UPDATE     =  16,                     // Sort by position change time in seconds
   SORT_BY_ORDER_TIME_UPDATE_MSC =  17,                     // Sort by position change time in milliseconds
   SORT_BY_ORDER_TICKET_FROM     =  18,                     // Sort by parent order ticket
   SORT_BY_ORDER_TICKET_TO       =  19,                     // Sort by derived order ticket
   SORT_BY_ORDER_PROFIT_PT       =  20,                     // Sort by order profit in points
   SORT_BY_ORDER_CLOSE_BY_SL     =  21,                     // Sort by order closing by StopLoss flag
   SORT_BY_ORDER_CLOSE_BY_TP     =  22,                     // Sort by order closing by TakeProfit flag
   //--- Sort by real properties
   SORT_BY_ORDER_PRICE_OPEN      =  FIRST_DBL_PROP,         // Sort by open price
   SORT_BY_ORDER_PRICE_CLOSE     =  FIRST_DBL_PROP+1,       // Sort by close price
   SORT_BY_ORDER_SL              =  FIRST_DBL_PROP+2,       // Sort by StopLoss price
   SORT_BY_ORDER_TP              =  FIRST_DBL_PROP+3,       // Sort by TakeProfit price
   SORT_BY_ORDER_PROFIT          =  FIRST_DBL_PROP+4,       // Sort by profit
   SORT_BY_ORDER_COMMISSION      =  FIRST_DBL_PROP+5,       // Sort by commission
   SORT_BY_ORDER_SWAP            =  FIRST_DBL_PROP+6,       // Sort by swap
   SORT_BY_ORDER_VOLUME          =  FIRST_DBL_PROP+7,       // Sort by volume
   SORT_BY_ORDER_VOLUME_CURRENT  =  FIRST_DBL_PROP+8,       // Sort by unexecuted volume
   SORT_BY_ORDER_PROFIT_FULL     =  FIRST_DBL_PROP+9,       // Sort by profit+commission+swap criterion
   SORT_BY_ORDER_PRICE_STOP_LIMIT=  FIRST_DBL_PROP+10,      // Sort by Limit order when StopLimit order is activated
   //--- Sort by string properties
   SORT_BY_ORDER_SYMBOL          =  FIRST_STR_PROP,         // Sort by symbol
   SORT_BY_ORDER_COMMENT         =  FIRST_STR_PROP+1,       // Sort by comment
   SORT_BY_ORDER_EXT_ID          =  FIRST_STR_PROP+2        // Sort by order ID in an external trading system
  };
//+------------------------------------------------------------------+

Trong phần được bảo vệ của lớp thứ tự trừu tượng COrder của tệp Order.mqh, hãy khai báo phương thức OrderState () ghi trạng thái của nó từ bảng liệt kê ENUM_ORDER_STATE cho các thuộc tính thứ tự:

protected:
   //--- Protected parametric constructor
                     COrder(ENUM_ORDER_STATUS order_status,const ulong ticket);

   //--- Get and return integer properties of a selected order from its parameters
   long              OrderMagicNumber(void)        const;
   long              OrderTicket(void)             const;
   long              OrderTicketFrom(void)         const;
   long              OrderTicketTo(void)           const;
   long              OrderPositionID(void)         const;
   long              OrderPositionByID(void)       const;
   long              OrderOpenTimeMSC(void)        const;
   long              OrderCloseTimeMSC(void)       const;
   long              OrderType(void)               const;
   long              OrderState(void)              const;
   long              OrderTypeByDirection(void)    const;
   long              OrderTypeFilling(void)        const;
   long              OrderTypeTime(void)           const;
   long              OrderReason(void)             const;
   long              DealOrder(void)               const;
   long              DealEntry(void)               const;
   bool              OrderCloseByStopLoss(void)    const;
   bool              OrderCloseByTakeProfit(void)  const;
   datetime          OrderOpenTime(void)           const;
   datetime          OrderCloseTime(void)          const;
   datetime          OrderExpiration(void)         const;
   datetime          PositionTimeUpdate(void)      const;
   datetime          PositionTimeUpdateMSC(void)   const;
//+------------------------------------------------------------------+
//| Return the order status                                          |
//+------------------------------------------------------------------+
long COrder::OrderState(void) const
  {
#ifdef __MQL4__              
   return ORDER_STATE_FILLED;
#else
   long res=0;
   switch((ENUM_ORDER_STATUS)this.GetProperty(ORDER_PROP_STATUS))
     {
      case ORDER_STATUS_HISTORY_PENDING   :
      case ORDER_STATUS_HISTORY_ORDER     : res=::HistoryOrderGetInteger(m_ticket,ORDER_STATE); break;
      case ORDER_STATUS_MARKET_PENDING    : res=::OrderGetInteger(ORDER_STATE);                 break;
      case ORDER_STATUS_MARKET_ACTIVE     : 
      case ORDER_STATUS_DEAL              : 
      default                             : res=0;                                              break;
     }
   return res;
#endif
  }
//+------------------------------------------------------------------+

Trong trường hợp MQL4, bây giờ chúng ta hãy trả lại lệnh thực thi đầy đủ. Trong trường hợp MQL5, trả về 0 (nếu đây là thỏa thuận hoặc vị thế) hoặc trạng thái đơn hàng (nếu đây là thị trường hoặc lệnh chờ) tùy thuộc vào trạng thái đơn hàng.

Trong phần công khai của lớp COrder, khai báo phương thức trả về mô tả trạng thái đơn hàng:

//+------------------------------------------------------------------+
//| Descriptions of order object properties                          |
//+------------------------------------------------------------------+
   //--- Get description of an order's (1) integer, (2) real and (3) string property
   string            GetPropertyDescription(ENUM_ORDER_PROP_INTEGER property);
   string            GetPropertyDescription(ENUM_ORDER_PROP_DOUBLE property);
   string            GetPropertyDescription(ENUM_ORDER_PROP_STRING property);
   //--- Return order status name
   string            StatusDescription(void)    const;
   //---  Return order or position name
   string            TypeDescription(void)      const;
   //--- Return order status description
   string            StateDescription(void)     const;
   //--- Return deal direction name
   string            DealEntryDescription(void) const;
   //--- Return order/position direction type
   string            DirectionDescription(void) const;
   //--- Send description of order properties to the journal (full_prop=true - all properties, false - only supported ones)
   void              Print(const bool full_prop=false);
//+------------------------------------------------------------------+
//| Return order status description                                  |
//+------------------------------------------------------------------+
string COrder::StateDescription(void) const
  {
   if(this.Status()==ORDER_STATUS_DEAL || this.Status()==ORDER_STATUS_MARKET_ACTIVE)
      return "";                       
   else switch(this.StateOrder())
     {
      case ORDER_STATE_STARTED         :  return TextByLanguage("Ордер проверен на корректность, но еще не принят брокером","Order checked for correctness, but not yet accepted by broker");
      case ORDER_STATE_PLACED          :  return TextByLanguage("Ордер принят","Order accepted");
      case ORDER_STATE_CANCELED        :  return TextByLanguage("Ордер снят клиентом","Order withdrawn by client");
      case ORDER_STATE_PARTIAL         :  return TextByLanguage("Ордер выполнен частично","Order filled partially");
      case ORDER_STATE_FILLED          :  return TextByLanguage("Ордер выполнен полностью","Order filled");
      case ORDER_STATE_REJECTED        :  return TextByLanguage("Ордер отклонен","Order rejected");
      case ORDER_STATE_EXPIRED         :  return TextByLanguage("Ордер снят по истечении срока его действия","Order withdrawn upon expiration");
      case ORDER_STATE_REQUEST_ADD     :  return TextByLanguage("Ордер в состоянии регистрации (выставление в торговую систему)","Order in state of registration (placing in trading system)");
      case ORDER_STATE_REQUEST_MODIFY  :  return TextByLanguage("Ордер в состоянии модификации","Order in state of modification.");
      case ORDER_STATE_REQUEST_CANCEL  :  return TextByLanguage("Ордер в состоянии удаления","Order in deletion state");
      default                          :  return TextByLanguage("Неизвестное состояние","Unknown state");
     }
  }
//+------------------------------------------------------------------+

Nếu đây là một thỏa thuận hoặc một vị trí, hãy trả về một chuỗi trống, nếu không, hãy kiểm tra trạng thái đơn hàng và trả về mô tả của nó.
Thêm trả về mô tả trạng thái đơn hàng vào thực hiện phương thức GetPropertyDes mô tả (thuộc tính ENUM_ORDER_PROP_INTEGER):

//+------------------------------------------------------------------+
//| Return description of an order's integer property                |
//+------------------------------------------------------------------+
string COrder::GetPropertyDescription(ENUM_ORDER_PROP_INTEGER property)
  {
   return
     (
   //--- General properties
      property==ORDER_PROP_MAGIC             ?  TextByLanguage("Магик","Magic number")+
         (!this.SupportProperty(property)    ?  TextByLanguage(": Свойство не поддерживается",": Property not supported") :
          ": "+(string)this.GetProperty(property)
         )  :
      property==ORDER_PROP_TICKET            ?  TextByLanguage("Тикет","Ticket")+
         (!this.SupportProperty(property)    ?  TextByLanguage(": Свойство не поддерживается",": Property not supported") :
          " #"+(string)this.GetProperty(property)
         )  :
      property==ORDER_PROP_TICKET_FROM       ?  TextByLanguage("Тикет родительского ордера","Ticket of parent order")+
         (!this.SupportProperty(property)    ?  TextByLanguage(": Свойство не поддерживается",": Property not supported") :
          " #"+(string)this.GetProperty(property)
         )  :
      property==ORDER_PROP_TICKET_TO         ?  TextByLanguage("Тикет наследуемого ордера","Inherited order ticket")+
         (!this.SupportProperty(property)    ?  TextByLanguage(": Свойство не поддерживается",": Property not supported") :
          " #"+(string)this.GetProperty(property)
         )  :
      property==ORDER_PROP_TIME_OPEN         ?  TextByLanguage("Время открытия","Open time")+
         (!this.SupportProperty(property)    ?  TextByLanguage(": Свойство не поддерживается",": Property not supported") :
          ": "+::TimeToString(this.GetProperty(property),TIME_DATE|TIME_MINUTES|TIME_SECONDS)
         )  :
      property==ORDER_PROP_TIME_CLOSE        ?  TextByLanguage("Время закрытия","Close time")+
         (!this.SupportProperty(property)    ?  TextByLanguage(": Свойство не поддерживается",": Property not supported") :
          ": "+::TimeToString(this.GetProperty(property),TIME_DATE|TIME_MINUTES|TIME_SECONDS)
         )  :
      property==ORDER_PROP_TIME_EXP          ?  TextByLanguage("Дата экспирации","Expiration date")+
         (!this.SupportProperty(property)    ?  TextByLanguage(": Свойство не поддерживается",": Property not supported") :
          (this.GetProperty(property)==0     ?  TextByLanguage(": Не задана",": Not set") :
          ": "+::TimeToString(this.GetProperty(property),TIME_DATE|TIME_MINUTES|TIME_SECONDS))
         )  :
      property==ORDER_PROP_TYPE              ?  TextByLanguage("Тип","Type")+": "+this.TypeDescription()                   :
      property==ORDER_PROP_DIRECTION         ?  TextByLanguage("Тип по направлению","Type by direction")+": "+this.DirectionDescription() :
      
      property==ORDER_PROP_REASON            ?  TextByLanguage("Причина","Reason")+
         (!this.SupportProperty(property)    ?  TextByLanguage(": Свойство не поддерживается",": Property not supported") :
          ": "+this.GetReasonDescription(this.GetProperty(property))
         )  :
      property==ORDER_PROP_POSITION_ID       ?  TextByLanguage("Идентификатор позиции","Position ID")+
         (!this.SupportProperty(property)    ?  TextByLanguage(": Свойство не поддерживается",": Property not supported") :
          ": #"+(string)this.GetProperty(property)
         )  :
      property==ORDER_PROP_DEAL_ORDER        ?  TextByLanguage("Сделка на основании ордера","Deal by order")+
         (!this.SupportProperty(property)    ?  TextByLanguage(": Свойство не поддерживается",": Property not supported") :
          ": #"+(string)this.GetProperty(property)
         )  :
      property==ORDER_PROP_DEAL_ENTRY        ?  TextByLanguage("Направление сделки","Deal direction")+
         (!this.SupportProperty(property)    ?  TextByLanguage(": Свойство не поддерживается",": Property not supported") :
          ": "+this.GetEntryDescription(this.GetProperty(property))
         )  :
      property==ORDER_PROP_POSITION_BY_ID    ?  TextByLanguage("Идентификатор встречной позиции","Opposite position ID")+
         (!this.SupportProperty(property)    ?  TextByLanguage(": Свойство не поддерживается",": Property not supported") :
          ": "+(string)this.GetProperty(property)
         )  :
      property==ORDER_PROP_TIME_OPEN_MSC     ?  TextByLanguage("Время открытия в милисекундах","Open time in milliseconds")+
         (!this.SupportProperty(property)    ?  TextByLanguage(": Свойство не поддерживается",": Property not supported") :
          ": "+(string)this.GetProperty(property)+" > "+TimeMSCtoString(this.GetProperty(property))
         )  :
      property==ORDER_PROP_TIME_CLOSE_MSC    ?  TextByLanguage("Время закрытия в милисекундах","Close time in milliseconds")+
         (!this.SupportProperty(property)    ?  TextByLanguage(": Свойство не поддерживается",": Property not supported") :
          ": "+(string)this.GetProperty(property)+" > "+TimeMSCtoString(this.GetProperty(property))
         )  :
      property==ORDER_PROP_TIME_UPDATE       ?  TextByLanguage("Время изменения позиции","Position change time")+
         (!this.SupportProperty(property)    ?  TextByLanguage(": Свойство не поддерживается",": Property not supported") :
          ": "+(this.GetProperty(property)!=0 ? ::TimeToString(this.GetProperty(property),TIME_DATE|TIME_MINUTES|TIME_SECONDS) : "0")
         )  :
      property==ORDER_PROP_TIME_UPDATE_MSC   ?  TextByLanguage("Время изменения позиции в милисекундах","Position change time in milliseconds")+
         (!this.SupportProperty(property)    ?  TextByLanguage(": Свойство не поддерживается",": Property not supported") :
          ": "+(this.GetProperty(property)!=0 ? (string)this.GetProperty(property)+" > "+TimeMSCtoString(this.GetProperty(property)) : "0")
         )  :
      property==ORDER_PROP_STATE             ?  TextByLanguage("Состояние","Statе")+
         (!this.SupportProperty(property)    ?  TextByLanguage(": Свойство не поддерживается",": Property not supported") :
          ": \""+this.StateDescription()+"\""
         )  :
   //--- Additional property
      property==ORDER_PROP_STATUS            ?  TextByLanguage("Статус","Status")+
         (!this.SupportProperty(property)    ?  TextByLanguage(": Свойство не поддерживается",": Property not supported") :
          ": \""+this.StatusDescription()+"\""
         )  :
      property==ORDER_PROP_PROFIT_PT         ?  TextByLanguage("Прибыль в пунктах","Profit in points")+
         (!this.SupportProperty(property)    ?  TextByLanguage(": Свойство не поддерживается",": Property not supported") :
          ": "+(string)this.GetProperty(property)
         )  :
      property==ORDER_PROP_CLOSE_BY_SL       ?  TextByLanguage("Закрытие по StopLoss","Close by StopLoss")+
         (!this.SupportProperty(property)    ?  TextByLanguage(": Свойство не поддерживается",": Property not supported") :
          ": "+(this.GetProperty(property) ? TextByLanguage("Да","Yes") : TextByLanguage("Нет","No"))
         )  :
      property==ORDER_PROP_CLOSE_BY_TP       ?  TextByLanguage("Закрытие по TakeProfit","Close by TakeProfit")+
         (!this.SupportProperty(property)    ?  TextByLanguage(": Свойство не поддерживается",": Property not supported") :
          ": "+(this.GetProperty(property) ? TextByLanguage("Да","Yes") : TextByLanguage("Нет","No"))
         )  :
      ""
     );
  }
//+------------------------------------------------------------------+

Chúng ta đã hoàn thành tất cả các cải tiến.

Cần lưu ý rằng thư viện đang được phát triển “trực tiếp” và là phiên bản beta, do đó có thể thực hiện các sửa đổi, thay đổi và bổ sung khác nhau sau này.

Phần tiếp theo có gì?

Trong bài viết tiếp theo, chúng ta sẽ phát triển một lớp để lựa chọn và sắp xếp các đơn hàng, giao dịch và vị trí thuận tiện theo bất kỳ tiêu chí được hỗ trợ nào và tạo ra một bộ sưu tập các lệnh và vị trí thị trường.

Tất cả các tệp của phiên bản hiện tại của thư viện được đính kèm bên dưới cùng với các tệp EA thử nghiệm để bạn kiểm tra và tải xuống.
Bạn hãy để lại câu hỏi, ý kiến ​​và đề xuất của bạn trong các bình luận hoặc live chat.

HotForex tặng thưởng 100% và miễn phí nạp rút tiền

BÌNH LUẬN

Vui lòng nhập bình luận của bạn
Vui lòng nhập tên của bạn ở đây

Website này sử dụng Akismet để hạn chế spam. Tìm hiểu bình luận của bạn được duyệt như thế nào.