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

Đặt vấn đề!

Mục tiêu cuối cùng của một nhà giao dịch là trích lợi nhuận thông qua các phương tiện hoạt động giao dịch trên thị trường tài chính. Bài viết này mô tả các điều khoản và quy trình của nền tảng giao dịch MetaTrader 5, kiến ​​thức cần thiết để hiểu đúng về công việc của các chức năng giao dịch của ngôn ngữ MQL5.

Orders là các yêu cầu hoạt động trong giao dịch, được nhận bởi máy chủ giao dịch, được xây dựng tuân thủ các yêu cầu nền tảng MetaTrader 5. Nếu yêu cầu không chính xác, nó sẽ không xuất hiện trên sàn giao dịch dưới dạng một đơn đặt hàng. Đơn đặt hàng có thể được thực hiện ngay lập tức, chẳng hạn như để mua hoặc bán một khối lượng nhất định, với giá thị trường hiện tại trên một công cụ tài chính được chỉ định. Một loại đơn đặt hàng khác – là các đơn đặt hàng đang chờ xử lý, trong đó có một đơn đặt hàng để thực hiện một hoạt động giao dịch dưới sự hiện diện của điều kiện nhất định. Các đơn đặt hàng đang chờ xử lý cũng có thể chứa một hạn chế về thời gian đối với hành động của họ – ngày hết hạn đơn hàng.

Các lệnh đã đặt(đang chờ xử lý), đang chờ các điều kiện thực hiện hoặc hủy bỏ của chúng, được hiển thị trên tab ‘Giao dịch’ trong thiết bị đầu cuối. Các đơn đặt hàng có thể được sửa đổi hoặc hủy bỏ. Việc đặt, hủy và sửa đổi các đơn đặt hàng được thực hiện bằng hàm OrderSend(). Nếu đơn hàng bị hủy hoặc đạt đến thời gian hết hạn đơn hàng hoặc nếu đơn hàng được thực thi, nó sẽ chuyển sang lịch sử đơn hàng. Các đơn hàng đã thực hiện và bị hủy được hiển thị trong tab ‘Lịch sử’ của thiết bị đầu cuối khách hàng. Đơn đặt hàng từ lịch sử không cho phép sửa đổi.

Deal là kết quả của việc thực hiện một đơn đặt hàng(một lệnh để thực hiện thỏa thuận). Mỗi giao dịch dựa trên một đơn hàng cụ thể, nhưng một đơn hàng có thể tạo ra một tập hợp các giao dịch. Ví dụ, một đơn đặt hàng để mua 10 lô có thể được thực hiện bằng một số giao dịch liên tiếp với việc điền một phần. Các giao dịch luôn được lưu trữ trong lịch sử giao dịch và không thể sửa đổi. Trong thiết bị đầu cuối, các giao dịch được hiển thị trong tab ‘Lịch sử’.

Positions là các hợp đồng, được mua hoặc bán trên một công cụ tài chính. Một vị thế dài(BUY) được hình thành do kết quả của việc mua với dự đoán tăng giá, một vị trí ngắn(SELL) là kết quả của việc bán tài sản, với dự đoán giảm giá trong tương lai. Đối với mỗi tài khoản, đối với mỗi công cụ tài chính, chỉ có thể có một vị trí. Đối với mỗi biểu tượng, tại bất kỳ thời điểm nào, chỉ có thể có một vị trí mở – dài hoặc ngắn.

Khối lượng vị trí có thể tăng do kết quả của một hoạt động giao dịch mới theo cùng một hướng. Có nghĩa là khối lượng của các vị trí dài sẽ được tăng sau khi mua mới(Thỏa thuận mua) và sẽ bị giảm sau khi bán(Thỏa thuận bán). Vị thế được đóng lại, nếu khối lượng cam kết bằng 0 do hoạt động giao dịch. Hoạt động như vậy được gọi là đóng vị trí.

Lưu ý: Các đơn hàng và vị trí hoạt động luôn được hiển thị trên tab ‘Giao dịch’ còn các giao dịch và đơn hàng từ lịch sử luôn được phản ánh trong tab ‘Lịch sử’. Không nên nhầm lẫn thứ tự hoạt động từ tab ‘Giao dịch’ với các lệnh lịch sử từ tab ‘Lịch sử’.

Cách thiết bị đầu cuối nhận và lưu trữ thông tin giao dịch từ máy chủ

Thiết bị đầu cuối lưu trữ lịch sử giao dịch trong một cơ sở đặc biệt và chỉ nhận được lịch sử giao dịch còn thiếu và các đơn đặt hàng đã hoàn thành trên tài khoản giao dịch, tại mỗi kết nối đến máy chủ giao dịch. Điều này được thực hiện để tiết kiệm lưu lượng. Khi đóng thiết bị đầu cuối máy khách MetaTrader 5 hoặc thay đổi tài khoản đang hoạt động hiện tại, toàn bộ lịch sử được ghi lại trên đĩa cứng và đọc từ thời điểm khởi động tiếp theo của thiết bị đầu cuối.

Tất cả các cơ sở dữ liệu được ghi vào đĩa ở dạng mã hóa và khóa mã hóa phụ thuộc vào máy tính mà thiết bị đầu cuối được cài đặt. Điều này bảo vệ người dùng của thiết bị đầu cuối chống lại truy cập trái phép vào dữ liệu của mình, trong trường hợp sao chép.

Trong quá trình kết nối với tài khoản, thiết bị đầu cuối tải tài khoản cơ sở đã lưu, với lịch sử của tài khoản và gửi cho máy chủ giao dịch yêu cầu đồng bộ hóa cơ sở dữ liệu lịch sử của chính nó với lịch sử của tài khoản trên máy chủ giao dịch. Hơn nữa, sau khi kết nối thành công với tài khoản, máy chủ giao dịch sẽ gửi cho thiết bị đầu cuối một báo cáo về các sự kiện giao dịch đang diễn ra, liên quan đến tài khoản này.

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

Sự kiện giao dịch là những thay đổi sau trong tài khoản:

  • Hoạt động rút tiền và số dư.
  • Phí hoa hồng, hoán đổi và thuế.
  • Đặt, xóa và sửa đổi các đơn đặt hàng.
  • Việc thực hiện các giao dịch dựa trên đơn đặt hàng.
  • Mở và đóng các vị trí.
  • Thay đổi về khối lượng và hướng của các vị trí.

Trong trường hợp chấm dứt kết nối với máy chủ giao dịch, thiết bị đầu cuối định kỳ cố gắng kết nối lại. Sau khi kết nối lại với máy chủ, thiết bị đầu cuối yêu cầu tất cả các thay đổi gần đây trong lịch sử giao dịch để duy trì tính toàn vẹn của dữ liệu trong cơ sở dữ liệu lịch sử của chính nó.

Về lịch sử giao dịch, được hiển thị trong tab ‘Lịch sử’ của thiết bị đầu cuối, được lấy từ cơ sở của lịch sử thiết bị đầu cuối và các thay đổi của thời gian, được hiển thị trong thiết bị đầu cuối của lịch sử chỉ có thể tăng phạm vi của lịch sử, được lưu trữ trong này Cơ sở dữ liệu. Giảm thời gian của lịch sử được hiển thị không dẫn đến việc loại bỏ vật lý của lịch sử khỏi cơ sở của thiết bị đầu cuối.

Điều này có nghĩa là việc cài đặt một khoảng thời gian ngắn hơn của lịch sử được hiển thị, không làm mất đi lịch sử giao dịch được lưu trữ. Nhưng nếu chúng ta chỉ định phạm vi khoảng rộng hơn, cho màn hình trong tab ‘Lịch sử’, thì một hành động như vậy có thể dẫn đến một yêu cầu, từ máy chủ giao dịch, về lịch sử chi tiết hơn, nếu cơ sở dữ liệu của thiết bị đầu cuối chưa có Dữ liệu yêu cầu cho giai đoạn đó.

Sơ đồ tương tác chung giữa thiết bị đầu cuối và máy chủ giao dịch MetaTrader 5 được trình bày ở hình sau:

Thiết bị đầu cuối của khách hàng gửi yêu cầu đồng bộ hóa đến cơ sở lịch sử giao dịch của chính nó, trong khi bắt đầu thiết bị đầu cuối, trong khi kết nối lại với máy chủ sau khi kết nối bị lỗi, trong khi chuyển từ tài khoản này sang tài khoản khác và trong khi yêu cầu trực tiếp cho giao dịch bị thiếu Lịch sử.

Đến lượt mình, máy chủ giao dịch độc lập, không có bất kỳ yêu cầu nào từ thiết bị đầu cuối, sẽ gửi một thông điệp của khách hàng về các sự kiện giao dịch, diễn ra trên tài khoản: các thay đổi về trạng thái của lệnh và vị trí, thực hiện giao dịch dựa trên đơn đặt hàng, Tính phí hoa hồng, số dư và rút tiền, v.v.

Truy cập vào lịch sử giao dịch từ chương trình MQL5

Thiết bị đầu cuối có thể hoạt động đồng thời với một số chỉ số, tập lệnh và EA và tất cả các chương trình này có thể yêu cầu thông tin họ cần về giao dịch: đơn đặt hàng, giao dịch và vị trí. Việc truy cập trực tiếp của chương trình mql5 với cơ sở dữ liệu của thiết bị đầu cuối là bất khả thị, do các cân nhắc về tính ổn định, bảo mật và hiệu suất tổng thể.

Mỗi chương trình mql5 theo yêu cầu nhận cho công việc của nó một ‘mô hình’ môi trường giao dịch trong bộ đệm của nó. Bộ nhớ cache là vùng nhớ đặc biệt để truy cập nhanh vào dữ liệu. Ví dụ, trước khi bắt đầu xử lý đơn hàng, thứ tự cần thiết phải được lấy trong bộ đệm của chương trình mql5. Tất cả các công việc tiếp theo, khi đề cập đến đơn đặt hàng, sẽ được thực hiện với bản sao được lưu trong bộ nhớ cache của đơn đặt hàng đó.

Công việc với các vị trí, giao dịch và đơn đặt hàng từ lịch sử được thực hiện theo cách tương tự. Sơ đồ tổng quát để có được thông tin giao dịch từ chương trình MQL5 được hiển thị trong hình:

Trước khi dữ liệu về lịch sử giao dịch có sẵn để xử lý chương trình mql5, chúng phải được yêu cầu từ cơ sở dữ liệu đầu cuối. Sau khi yêu cầu, dữ liệu thu được sẽ được đặt trong bộ đệm riêng của chương trình mql5.

Lưu ý: dữ liệu trong bộ đệm không được tự động đồng bộ hóa với cơ sở dữ liệu đầu cuối và do đó nó phải được cập nhật liên tục để duy trì trạng thái thích hợp của dữ liệu trong bộ đệm.

Có khả năng xảy ra hậu quả nếu bộ đệm được sử dụng không đúng cách? Đúng vậy:

  • Nếu không thể lấy được dữ liệu yêu cầu, bộ đệm sẽ trống và sẽ không chứa dữ liệu cần thiết.
  • Nếu dữ liệu trong bộ đệm yêu cầu cập nhật, nhưng cập nhật không được yêu cầu, thì làm việc với dữ liệu đó có thể dẫn đến kết quả không thể đoán trước. Ví dụ: dữ liệu về vị trí hiện tại chưa được cập nhật và chương trình không biết gì về vị trí mở cho biểu tượng đã cho và về sự mất mát ngày càng tăng đối với vị trí đó.

Chức năng làm việc với bộ đệm

Lịch sử giao dịch có thể chứa hàng ngàn đơn đặt hàng được thực hiện và giao dịch không cần thiết cho công việc hiện tại của chương trình mql5. Do đó, công việc với bộ đệm được xây dựng theo nguyên tắc yêu cầu bộ đệm luôn chứa thông tin được tải lên ở kết nối cuối cùng với cơ sở dữ liệu của thiết bị đầu cuối. Nếu bạn cần có được toàn bộ lịch sử của các đơn đặt hàng và giao dịch, bạn cần yêu cầu rõ ràng bằng cách chỉ định khoảng thời gian mong muốn.

Đối với mỗi loại thông tin, một bộ đệm độc lập được hình thành. Dữ liệu về các đơn đặt hàng được lưu trữ trong bộ đệm của đơn hàng, thông tin về các vị trí được lưu trữ trong bộ đệm của vị trí, dữ liệu về giao dịch và đơn hàng được lưu trữ trong các trường hợp tương ứng của lịch sử của bộ đệm.

Trước khi yêu cầu thông tin từ bộ đệm, nó cần được fill.

Lưu ý: Bất kỳ yêu cầu điền vào bộ đệm thì dữ liệu trước đó sẽ bị xóa, bất kể kết quả thực hiện của yêu cầu.

Các chức năng giao dịch có thể được tách thành hai loại: các chức năng để điền vào bộ đệm và các chức năng để đọc thông tin từ bộ đệm.

Chức năng điền vào bộ đệm:

Để xử lý lịch sử giao dịch, trước tiên nó phải được lấy và nằm trong bộ đệm thích hợp. Các chức năng hình thành bộ đệm có thể được chia thành hai nhóm nhỏ.

Chức năng điền vào bộ đệm giao dịch(lệnh và vị trí hoạt động):

  • OrderSelect(ticket) – bản sao thứ tự hoạt động bằng vé của nó (từ các cơ sở thiết bị đầu cuối) vào bộ nhớ cache của trật tự hiện hành đối với các yêu cầu thêm các thuộc tính của nó bằng cách sử dụng OrderGetDouble(), OrderGetInteger() và OrderGetString().
  • OrderGetTicket(index) – bản sao từ các cơ sở thiết bị đầu cuối của trật tự hoạt động, bởi chỉ số của nó trong đơn đặt hàng danh sách các lệnh cơ sở thiết bị đầu cuối vào bộ nhớ cache của các đơn đặt hàng hiện tại cho yêu cầu hơn nữa để các thuộc tính bằng cách sử dụng OrderGetDouble(), OrderGetInteger() và các hàm OrderGetString(). Tổng số đơn đặt hàng trong cơ sở của thiết bị đầu cuối có thể được lấy bằng cách sử dụng hàm OrderTotal() .
  • PositionSelect(Symbol) – Bản sao các vị trí mở bằng tên biểu tượng (từ các cơ sở của nhà ga) vào bộ nhớ cache cho yêu cầu thêm các thuộc tính của nó bằng cách sử dụng PositionGetDouble(), PositionGetInteger() và PositionGetString() chức năng.
  • PositionGetSymbol(index) – Bản sao các vị trí mở bởi chỉ số của nó trong danh sách vị trí (từ các cơ sở của nhà ga) của các cơ sở thiết bị đầu cuối vào bộ nhớ cache cho yêu cầu thêm các thuộc tính của nó bằng cách sử dụng PositionGetDouble(), PositionGetInteger() và PositionGetString() chức năng. Tổng số vị trí trong đế của thiết bị đầu cuối có thể được lấy bằng hàm PositionsTotal() .

Chức năng điền vào bộ đệm lịch sử:

  • HistoryOrderSelect(ticket) – bản sao thứ tự lịch sử bằng vé của nó vào bộ nhớ cache của các đơn đặt hàng lịch sử(từ các cơ sở của nhà ga) cho các cuộc gọi hơn nữa để thuộc tính của nó bởi các chức năng HistoryOrderGetDouble(), HistoryOrderGetInteger() và HistoryOrderGetString().
  • Các HistoryDealSelect(ticket) – bản sao thỏa thuận bằng vé của nó vào bộ nhớ cache giao dịch(từ các cơ sở của nhà ga) cho các cuộc gọi hơn nữa để thuộc tính của nó bởi các chức năng HistoryDealGetDouble(), HistoryDealGetInteger() và HistoryDealGetString().

Chúng ta cần xem xét riêng hai chức năng, ảnh hưởng đến tính khả dụng, trong bộ đệm, lịch sử giao dịch nói chung :

  • HistorySelect(bắt đầu, kết thúc) – lấp đầy bộ nhớ cache lịch sử với những giao dịch và đơn đặt hàng cho khoảng thời gian nhất định của máy chủ. Từ kết quả thực hiện chức năng này, phụ thuộc vào các giá trị, được trả về từ HistoryDealsTotal() và HistoryOrdersTotal().
  • HistorySelectByPosition(position_ID) – lấp đầy bộ nhớ cache lịch sử với những giao dịch và đơn đặt hàng, có vị trí nhận dạng xác định. Kết quả của việc thực thi chức năng này, cũng ảnh hưởng đến HistoryDealsTotal() và HistoryOrderTotal().

OrderSelect và OrderGetTicket

Các hàm chung OrderSelect(vé) và OrderGetTicket() hoạt động theo cùng một cách – chúng lấp đầy bộ đệm của các đơn đặt hàng đang hoạt động với một đơn hàng. OrderSelect(vé) được dành cho trường hợp đặt hàng trước được biết trước. OrderGetTicket(), kết hợp với OrderTotal() cho phép kiểm tra tất cả các đơn đặt hàng có sẵn trong thiết bị đầu cuối cơ sở của đơn hàng.

Sau khi gọi đến bất kỳ chức năng nào trong số này, bộ đệm của các đơn đặt hàng đang hoạt động chỉ chứa thông tin của một đơn hàng, nếu đơn hàng được chọn thành công. Nếu không, không có gì trong bộ nhớ cache của các đơn đặt hàng đang hoạt động. Kết quả của việc thực thi chức năng OrderTotal() không thay đổi – nó luôn trả về số lượng đơn đặt hàng hoạt động thực tế trong cơ sở của thiết bị đầu cuối, bất kể bộ đệm có đầy hay không.

PositionSelect và PositionGetSymbol

Giống như đối với các đơn đặt hàng, hai chức năng này cũng hoạt động theo cùng một cách cho các vị trí – chúng lấp đầy bộ đệm của các vị trí bằng một vị trí. PositionGetSymbol(index) yêu cầu số trong danh sách cơ sở vị trí, làm tham số và PositionSelect(Symbol) sẽ điền vào bộ đệm dựa trên tên biểu tượng, trên đó vị trí được mở. Tên của biểu tượng, lần lượt, có thể được lấy bằng hàm PositionGetSymbol(index).

Sau khi thực hiện bất kỳ chức năng nào trong số này, bộ đệm của các vị trí chỉ chứa dữ liệu trên một vị trí, nếu chức năng được thực thi thành công. Nếu không, không có gì trong bộ nhớ cache của các vị trí. Kết quả của việc thực thi hàm PositionsTotal() không phụ thuộc vào việc bộ đệm có được lấp đầy hay không – nó luôn trả về số lượng vị trí mở thực tế trong thiết bị đầu cuối cơ sở cho tất cả các ký hiệu.

HistoryOrderSelect

HistoryOrderSelect(vé) chọn vào bộ đệm theo thứ tự lịch sử từ cơ sở của thiết bị đầu cuối bằng vé của nó. Các chức năng được dự định để được sử dụng khi vé trước của yêu cầu được biết trước.

Nếu thực hiện thành công, bộ đệm sẽ chứa một đơn hàng và hàm HistoryOrderTotal() trả về một đơn vị. Nếu không, bộ đệm của các đơn đặt hàng trong lịch sử sẽ trống và hàm HistoryOrderTotal() sẽ trả về số không.

Chức năng lấy thông tin từ bộ đệm

Trước khi yêu cầu thông tin về các thuộc tính của vị trí, thỏa thuận hoặc đặt hàng, cần phải cập nhật bộ đệm tương ứng của chương trình mql5. Điều này là do thực tế là thông tin được yêu cầu có thể đã được cập nhật và điều này có nghĩa là bản sao, được lưu trữ trong bộ đệm, đã lỗi thời.

  • Đơn đặt hàng: Để có được thông tin về các đơn đặt hàng đang hoạt động, trước tiên, nó phải được sao chép vào bộ đệm của các đơn hàng đang hoạt động của một trong hai chức năng: OrderGetTicket() hoặc OrderSelect(). Đó là cho thứ tự, được lưu trữ trong bộ đệm, các giá trị thuộc tính sẽ được đưa ra, khi các hàm tương ứng được gọi:
    1. OrderGetDouble(type_property)
    2. OrderGetInteger(type_property)
    3. OrderGetString(type_property)

Các hàm này có được tất cả dữ liệu từ bộ đệm, do đó để đảm bảo có được dữ liệu chính xác cho đơn hàng, nên gọi hàm điền vào bộ đệm.

  • Vị trí: Để có được thông tin về một vị trí, nó phải được chọn và sao chép trước đó vào bộ đệm, sử dụng một trong hai chức năng: PositionGetSymbol hoặc PositionSelect. Chính từ bộ đệm này, các giá trị thuộc tính của vị trí sẽ được đưa ra, khi các hàm tương ứng được gọi:
    1. PositionGetDouble(type_property)
    2. PositionGetInteger(type_property)
    3. PositionGetString(type_property)

Vì các hàm này nhận tất cả dữ liệu của chúng từ bộ đệm, do đó để đảm bảo có được dữ liệu chính xác cho vị trí, nên gọi hàm này lấp đầy bộ đệm của các vị trí.

  • Đơn hàng lịch sử: Để có được thông tin về một đơn đặt hàng từ lịch sử, trước tiên, cần phải tạo bộ đệm của các đơn hàng lịch sử, sử dụng một trong ba chức năng: HistorySelect(bắt đầu, kết thúc), HistorySelectByP vị trí() hoặc HistoryOrderSelect(vé). Nếu việc triển khai thành công, bộ đệm sẽ lưu trữ số lượng đơn đặt hàng, được trả về bởi hàm HistoryOrderTotal() . Việc truy cập vào các thuộc tính của các đơn đặt hàng này được thực hiện bởi từng yếu tố trên vé, sử dụng chức năng phù hợp:
    1. HistoryOrderGetDouble(Ticket_order, type_property)
    2. HistoryOrderGetInteger(Ticket_order, type_property)
    3. HistoryOrderGetString(Ticket_order, type_property)

Có thể tìm thấy vé của đơn hàng lịch sử bằng cách sử dụng chức năng HistoryOrderGetTicket(index) , theo chỉ mục của nó trong bộ đệm của các đơn hàng lịch sử. Để có được sự đảm bảo nhận được dữ liệu chính xác về đơn hàng, bạn nên gọi chức năng lấp đầy bộ đệm của các đơn hàng lịch sử.

  • Deals: Để có được thông tin về một thỏa thuận cụ thể trong lịch sử, trước tiên cần tạo bộ đệm giao dịch, sử dụng một trong ba chức năng: HistorySelect(bắt đầu, kết thúc), HistorySelectByPosition() hoặc HistoryDealSelect(vé). Nếu thực hiện chức năng thành công, bộ đệm sẽ lưu trữ thỏa thuận với số deals được trả về bởi hàm HistoryDealsTotal() . Truy cập vào các thuộc tính của các giao dịch này được thực hiện, dựa trên vé, sử dụng các chức năng phù hợp:
    1. HistoryDealGetDouble(Ticket_deals, type_property)
    2. HistoryDealGetInteger(Ticket_deals, type_property)
    3. HistoryDealGetString(Ticket_deals, type_property)

Có thể lấy được vé của các giao dịch, sử dụng hàm HistoryDealGetTicket(index), theo chỉ mục của nó trong bộ đệm của các giao dịch. Để có được sự đảm bảo về dữ liệu chính xác về thỏa thuận, bạn nên gọi chức năng lấp đầy bộ đệm giao dịch.

Chức năng lấy vé từ lịch sử bộ đệm

Các HistoryOrderGetTicket(index) trả lại vé của trật tự lịch sử, bởi chỉ số của nó từ bộ nhớ cache của các đơn đặt hàng lịch sử(không phải từ các cơ sở thiết bị đầu cuối!). Vé thu được có thể được sử dụng trong chức năng HistoryOrderSelect(vé), giúp xóa bộ nhớ cache và điền lại chỉ với một đơn hàng, trong trường hợp thành công. Hãy nhớ lại rằng giá trị, được trả về từ HistoryOrderTotal() phụ thuộc vào số lượng đơn đặt hàng trong bộ đệm.

Các HistoryDealGetTicket(index) trả về vé của thỏa thuận này bởi chỉ số của nó từ bộ nhớ cache của giao dịch. Vé của thỏa thuận có thể được sử dụng bởi hàm HistoryDealSelect(vé), giúp xóa bộ nhớ cache và điền lại bộ đệm chỉ với một giao dịch, trong trường hợp thành công. Giá trị được trả về bởi hàm HistoryDealsTotal() phụ thuộc vào số lượng giao dịch trong bộ đệm.

Lưu ý: Trước khi gọi các hàm HistoryOrderGetTicket(chỉ mục) và HistoryDealGetTicket(chỉ mục), bạn cần điền vào bộ đệm lịch sử với các đơn đặt hàng lịch sử và giao dịch trong một khối lượng đủ . Để thực hiện việc này, hãy sử dụng một trong các chức năng: HistorySelect(bắt đầu, kết thúc), HistorySelectByPosition (vị trí_ID), HistoryOrderSelect(vé) và HistoryDealSelect(vé).

Lấy thông tin bằng cách sử dụng các đơn đặt hàng hoạt động

Kiểm tra các đơn đặt hàng hoạt động hiện tại là một thủ tục tiêu chuẩn. Nếu cần thiết để có được thông tin về một số đơn đặt hàng cụ thể, thì khi biết vé của nó, điều này có thể được thực hiện bằng cách sử dụng chức năng OrderSelect(vé).

bool selected=OrderSelect(ticket);
if(selected)
  {
   double price_open=OrderGetDouble(ORDER_PRICE_OPEN);
   datetime time_setup=OrderGetInteger(ORDER_TIME_SETUP);
   string symbol=OrderGetString(ORDER_SYMBOL);
   PrintFormat("Ордер #%d for %s was set at %s",ticket,symbol,TimeToString(time_setup));
  }
else
  {
   PrintFormat("Error selecting order with ticket %d. Error %d",ticket, GetLastError());
  }

Trong ví dụ trên, người ta cho rằng vé của đơn đặt hàng đã được biết trước, ví dụ, nó được lấy từ biến toàn cục. Tuy nhiên, trong các trường hợp chung, thông tin vé không có, và do đó chúng ta cần chuyển sang trợ giúp của hàm OrderGetTicket(chỉ mục), cũng chọn một đơn hàng và đặt nó vào bộ đệm, nhưng chỉ có số thứ tự, trong danh sách Của các đơn đặt hàng hiện tại, cần phải được chỉ định làm tham số.

Thuật toán tổng thể để làm việc với các đơn đặt hàng(tương tự với các giao dịch và vị trí) như sau:

  1. Lấy tổng số đơn đặt hàng, sử dụng hàm OrderTotal().
  2. Tổ chức vòng lặp thông qua tìm kiếm tất cả các đơn đặt hàng, theo chỉ mục của chúng trong danh sách.
  3. Sao chép, từng cái một, từng thứ tự vào bộ đệm, sử dụng hàm OrderGetTicket().
  4. Lấy dữ liệu thứ tự chính xác từ bộ đệm, sử dụng các hàm OrderGetDouble(), OrderGetInteger() và OrderGetString(). Nếu cần, phân tích dữ liệu thu được và thực hiện các hành động thích hợp.

Dưới đây là một ví dụ ngắn gọn về một thuật toán như vậy:

input long my_magic=555;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- obtain the total number of orders
   int orders=OrdersTotal();
//--- scan the list of orders
   for(int i=0;i<orders;i++)
     {
      ResetLastError();
      //--- copy into the cache, the order by its number in the list
      ulong ticket=OrderGetTicket(i);
      if(ticket!=0)// if the order was successfully copied into the cache, work with it
        {
         double price_open  =OrderGetDouble(ORDER_PRICE_OPEN);
         datetime time_setup=OrderGetInteger(ORDER_TIME_SETUP);
         string symbol      =OrderGetString(ORDER_SYMBOL);
         long magic_number  =OrderGetInteger(ORDER_MAGIC);
         if(magic_number==my_magic)
           {
            //  process the order with the specified ORDER_MAGIC
           }
         PrintFormat("Order #%d for %s was set out %s, ORDER_MAGIC=%d",ticket,symbol,TimeToString(time_setup),magic_number);
        }
      else         // call OrderGetTicket() was completed unsuccessfully
        {
         PrintFormat("Error when obtaining an order from the list to the cache. Error code: %d",GetLastError());
        }
     }
  }

Lấy thông tin về các vị trí mở

Việc giám sát liên tục các vị trí mở không chỉ là một quy trình chuẩn, mà chắc chắn nó phải được thực hiện trong từng trường hợp. Để có được thông tin về các vị trí cụ thể, đủ để biết tên của nhạc cụ mà nó được mở. Để làm điều này, sử dụng chức năng PositionSelect(ký hiệu). Đối với những trường hợp trong đó EA chỉ làm việc với một ký hiệu(trên biểu tượng của biểu đồ được đính kèm), tên của biểu tượng có thể được lấy bởi hàm Symbol() hoặc từ một biến _Symbol được xác định trước.

//--- we will look for the position by the symbol of the chart, on which the EA is working
   string symbol=Symbol();
//--- attempt to get the position
   bool selected=PositionSelect(symbol);
   if(selected) // if the position is selected
     {
      long pos_id            =PositionGetInteger(POSITION_IDENTIFIER);
      double price           =PositionGetDouble(POSITION_PRICE_OPEN);
      ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
      long pos_magic         =PositionGetInteger(POSITION_MAGIC);
      string comment         =PositionGetString(POSITION_COMMENT);
      PrintFormat("Position #%d by %s: POSITION_MAGIC=%d, price=%G, type=%s, commentary=%s",
                 pos_id, symbol, pos_magic, price,EnumToString(type), comment);
     }

   else        // if selecting the position was unsuccessful
     {
      PrintFormat("Unsuccessful selection of the position by the symbol %s. Error",symbol,GetLastError());
     }
  }

Trong trường hợp chung, có thể lấy thông tin trên biểu tượng, bằng cách sử dụng chức năng PositionGetSymbol(chỉ mục), chọn một vị trí và đặt nó vào bộ đệm. Là một tham số, cần chỉ định chỉ mục vị trí trong danh sách các vị trí mở. Điều này được thực hiện tốt nhất thông qua việc tìm kiếm tất cả các vị trí trong vòng lặp.

Thuật toán tổng thể để làm việc với các vị trí:

  1. Lấy tổng số vị trí, sử dụng hàm PositionsTotal().
  2. Tổ chức vòng lặp thông qua tìm kiếm tất cả các vị trí theo chỉ mục của chúng trong danh sách.
  3. Sao chép, từng cái một, từng vị trí vào bộ đệm, sử dụng hàm PositionGetSymbol().
  4. Lấy dữ liệu vị trí cần thiết từ bộ đệm bằng các hàm PositionGetDouble(), PositionGetInteger() và PositionGetString(). Nếu cần, phân tích dữ liệu thu được và thực hiện các hành động thích hợp.

Dưới đây là 1 ví dụ:

#property script_show_inputs

input long my_magic=555;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- obtain the total number of positions
   int positions=PositionsTotal();
//--- scan the list of orders
   for(int i=0;i<positions;i++)
     {
      ResetLastError();
      //--- copy into the cache, the position by its number in the list
      string symbol=PositionGetSymbol(i); //  obtain the name of the symbol by which the position was opened
      if(symbol!="") // the position was copied into the cache, work with it
        {
         long pos_id            =PositionGetInteger(POSITION_IDENTIFIER);
         double price           =PositionGetDouble(POSITION_PRICE_OPEN);
         ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
         long pos_magic         =PositionGetInteger(POSITION_MAGIC);
         string comment         =PositionGetString(POSITION_COMMENT);
         if(pos_magic==my_magic)
           {
           //  process the position with a specified POSITION_MAGIC
           }
         PrintFormat("Position #%d by %s: POSITION_MAGIC=%d, price=%G, type=%s, commentary=%s",
                     pos_id,symbol,pos_magic,price,EnumToString(type),comment);
        }
      else           // call to PositionGetSymbol() was unsuccessful
        {
         PrintFormat("Error when receiving into the cache the position with index %d."+
                     " Error code: %d", i, GetLastError());
        }
     }
  }

Quy tắc làm việc với bộ đệm lịch sử

Thông thường, mã để làm việc với bộ đệm lịch sử được lập trình viên viết theo cách như vậy, nó chỉ hoạt động trơn tru nếu lịch sử chứa 5-10 giao dịch và đơn đặt hàng. Một ví dụ điển hình về cách tiếp cận sai – tải toàn bộ lịch sử giao dịch vào bộ đệm và xử lý nó trong một vòng lặp, tìm kiếm tất cả các lệnh và giao dịch:

//---
   datetime start=0;           // initial time set to 1970 year
   datetime end=TimeCurrent();  // the ending time set to the current server time
//--- request into the cache of the program the entire trading history
   HistorySelect(start,end);
//--- obtain the number of all of the orders in the history
   int history_orders=HistoryOrdersTotal();
//--- now scan through all of the orders
   for(int i=0;i<history_orders;i++)
     {
     //  processing each order in the history
     }   

    ...
       
//--- obtain the number of all deals in the history
   int deals=HistoryDealsTotal();
//--- now scan through all of the deals
   for(int i=0;i<deals;i++)
     {
     //  process each deal in the history
     }

Nỗ lực xử lý tất cả lịch sử giao dịch, trong phần lớn các trường hợp, là sai. Khi số lượng giao dịch / đơn đặt hàng được xử lý trở thành khoảng hàng ngàn và hàng chục ngàn, công việc của chương trình chậm lại đáng kể.

Lưu ý: luôn luôn thận trọng tham khảo tất cả các trường hợp gọi hàm HistorySelect()! Tải quá mức và quá mức tất cả lịch sử giao dịch có sẵn vào bộ đệm của chương trình mql5, làm giảm hiệu suất của nó.

Điều này chủ yếu quan trọng để thử nghiệm – người dùng phát hiện ra rằng người thử nghiệm đột nhiên trở nên chu đáo và bắt đầu tìm kiếm lý do cho việc này trong thiết bị đầu cuối của khách hàng. Do đó, trước hết luôn nghĩ về việc tối ưu hóa mã của chương trình MQL5(EA và các chỉ số, được gọi từ EA). Đừng dựa vào thực tế là máy tính được làm bằng sắt và có nhiều CPU, RAM.

Đối với công việc phù hợp của EA và chỉ báo trực tuyến, điều này cũng quan trọng như vậy. Một mã không tối ưu của chương trình có thể làm tê liệt công việc của ngay cả máy tính mạnh nhất.

Thuật toán chính xác để làm việc với lịch sử giao dịch:

  1. Xác định nhu cầu yêu cầu lịch sử giao dịch vào bộ đệm. Nếu điều này là không cần thiết, thì không thực hiện các hành động sau.
  2. Xác định ngày cuối cùng của lịch sử giao dịch(có lẽ lịch sử cho đến thời điểm này là không cần thiết).
  3. Tính ngày đầu tiên của lịch sử giao dịch, bắt đầu từ ngày kết thúc. Thông thường, các EA yêu cầu lịch sử giao dịch, không sâu hơn một ngày hoặc một tuần.
  4. Có được vé của các giao dịch và đơn đặt hàng lịch sử để có được các tài sản, bằng các vé đã biết:
    • HistoryOrderGetDouble()
    • HistoryOrderGetInteger()
    • HistoryOrderGetString()
    • HistoryDealGetDouble()
    • HistoryDealGetInteger()
    • HistoryDealGetString()
  5. Nếu vé không được biết và nếu cần thiết, hãy tổ chức một chu kỳ thông qua việc sắp xếp.
  6. Trong vòng lặp, hãy lấy vé cho mỗi giao dịch/đơn hàng từ bộ đệm của lịch sử giao dịch, theo chỉ mục( HistoryOrderGetTicket(Index) và HistoryDealGetTicket(Index)).
  7. Có được các tính chất cần thiết của đơn đặt hàng và giao dịch bằng vé đã biết(xem điểm 4).

Một ví dụ về mã cho thuật toán này:

//--- the variable, which is set in true only during the change in the trading history
   bool TradeHistoryChanged=false;
//--- here we check for the changes in the history and put out the TradeHistoryChanged=true if needed
//... the needed code

//--- check  if there are changes in the trading history or not
   if(!TradeHistoryChanged) return;

//--- if the history has changed, then it makes sense to load it into the cache 
//--- the ending time set for the current server time
   datetime end=TimeCurrent();
//--- the beginning time is set to 3 days ago
   datetime start=end-3*PeriodSeconds(PERIOD_D1);
//--- request in the cache of the program, the trading history for the last 3 days
   HistorySelect(start,end);
//--- obtain the number of orders in the cache of the history
   int history_orders=HistoryOrdersTotal();
//--- now scan through the orders
   for(int i=0;i<history_orders;i++)
     {
      //--- obtain the ticket of the historical order
      ulong ticket=HistoryOrderGetTicket(i);
      //--- work with this order - receive its problems
      long order_magic=HistoryOrderGetInteger(ticket,ORDER_MAGIC);
      // obtain the rest of the properties for the order by the ticket
      // ...
     }

Ý tưởng cơ bản được trình bày trong ví dụ này, trước tiên bạn phải xác minh thực tế về những thay đổi diễn ra trong lịch sử giao dịch. Một trong các tùy chọn bên trong hàm OnTrade(), được đặt cho biến toàn cầu TradeHistoryChanged, giá trị là true, vì sự kiện Trade luôn trả về với bất kỳ loại sự kiện giao dịch nào.

Nếu lịch sử giao dịch không thay đổi, thì không cần phải tải lại lịch sử giao dịch vào bộ đệm và lãng phí tài nguyên của CPU. Điều này là hợp lý và không yêu cầu bất kỳ lời giải thích. Nếu lịch sử giao dịch đã thay đổi, thì chúng ta chỉ tải lên phần cần thiết của nó và chỉ thực hiện mỗi giao dịch / đơn hàng một lần. Tránh các chu kỳ lặp lại không cần thiết.

Lưu ý: Nếu lịch sử giao dịch chưa được tải vào bộ đệm của chương trình mql5 bởi một trong các hàm HistorySelect(), HistorySelectByPosition() hoặc HistoryOrderSelect(), thì không thể làm việc với các đơn đặt hàng và giao dịch lịch sử. Hãy chắc chắn yêu cầu lịch sử giao dịch và đơn đặt hàng cần thiết trước khi nhận dữ liệu về lịch sử giao dịch.

Ví dụ: chúng ta cung cấp một tập lệnh tìm kiếm order cuối cùng của ngày cuối cùng và hiển thị thông tin cho nó.

// --- determining the time intervals of the required trading history
   datetime end=TimeCurrent();                // current server time
   datetime start=end-PeriodSeconds(PERIOD_D1);// set the beginning for 24 hours ago
//--- request in the cache of the program the trading history for a day
   HistorySelect(start,end);
//--- receive the number of orders in the history
   int history_orders=HistoryOrdersTotal();
//--- obtain the ticket of the order, which has the last index in the list, from the history
   ulong order_ticket=HistoryOrderGetTicket(history_orders-1);
   if(order_ticket>0) // obtain in the cache the historical order, work with it
     {
      //--- order status
      ENUM_ORDER_STATE state=(ENUM_ORDER_STATE)HistoryOrderGetInteger(order_ticket,ORDER_STATE);
      long order_magic      =HistoryOrderGetInteger(order_ticket,ORDER_MAGIC);
      long pos_ID           =HistoryOrderGetInteger(order_ticket,ORDER_POSITION_ID);
      PrintFormat("Order #%d: ORDER_MAGIC=#%d, ORDER_STATE=%d, ORDER_POSITION_ID=%d",
                  order_ticket,order_magic,EnumToString(state),pos_ID);
     }
   else              // unsuccessful attempt to obtain the order
     {
      PrintFormat("In total, in the history of %d orders, we couldn't select the order"+
                  " with the index %d. Error %d",history_orders,history_orders-1,GetLastError());
     }

Trong các trường hợp tổng quát hơn, cần phải sắp xếp các thứ tự trong vòng lặp từ bộ đệm và phân tích chúng. Thuật toán chung sẽ như sau:

  1. Xác định phạm vi thời gian của lịch sử đủ, nếu lịch sử được tải bởi hàm HistorySelect() – không nên tải toàn bộ lịch sử giao dịch vào bộ đệm.
  2. Tải vào bộ đệm của chương trình, các chức năng lịch sử giao dịch HistorySelect(), HistorySelectByPosition() hoặc HistoryOrderSelect(vé).
  3. Có được tổng số đơn đặt hàng trong bộ đệm, sử dụng HistoryOrderTotal().
  4. Tổ chức chu trình bằng cách tìm kiếm thông qua tất cả các đơn đặt hàng theo chỉ mục của chúng trong danh sách.
  5. Có được một vé của các đơn đặt hàng trong bộ đệm, sử dụng hàm HistoryOrderGetTicket().
  6. Lấy dữ liệu của đơn hàng từ bộ đệm, bằng cách sử dụng các hàm HistoryOrderGetDouble(), HistoryOrderGetInteger() và HistoryOrderGetString(). Nếu cần, phân tích dữ liệu thu được và thực hiện các hành động thích hợp.

Một ví dụ về thuật toán như vậy:

#property script_show_inputs

input long my_magic=999;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
// --- setting the time intervals of the required trading history
   datetime end=TimeCurrent();                // the current server time
   datetime start=end-PeriodSeconds(PERIOD_D1);// set the beginning for 24 hours ago
//--- request into the cache of the program the needed interval of the trading history
   HistorySelect(start,end);
//--- obtain the number of orders in history
   int history_orders=HistoryOrdersTotal();
//--- now scroll through all of the orders
   for(int i=0;i<history_orders;i++)
     {
      //--- obtain the ticket of the order by its number in the list
      ulong order_ticket=HistoryOrderGetTicket(i);
      if(order_ticket>0) //  obtain in the cache, the historical order, and work with it
        {
         //--- time of execution
         datetime time_done=HistoryOrderGetInteger(order_ticket,ORDER_TIME_DONE);
         long order_magic  =HistoryOrderGetInteger(order_ticket,ORDER_MAGIC);
         long pos_ID       =HistoryOrderGetInteger(order_ticket,ORDER_POSITION_ID);
         if(order_magic==my_magic)
           {
           //  process the position with the set ORDER_MAGIC
           }
         PrintFormat("Order #%d: ORDER_MAGIC=#%d, time_done %s, ORDER_POSITION_ID=%d",
                     order_ticket,order_magic,TimeToString(time_done),pos_ID);
        }
      else               // unsuccessful attempt to obtain the order from the history
        {
         PrintFormat("we were not able to select the order with the index %d. Error %d",
                     i,GetLastError());
        }
     }
  }

Lưu ý: luôn luôn thận trọng tham khảo tất cả các trường hợp gọi hàm HistorySelect()! Tải quá mức và quá mức tất cả lịch sử giao dịch có sẵn vào bộ đệm của chương trình mql5, làm giảm hiệu suất của nó.

Lấy thông tin về các giao dịch từ lịch sử

Xử lý các giao dịch có các tính năng tương tự như xử lý các đơn đặt hàng lịch sử. Số lượng giao dịch trong lịch sử giao dịch và kết quả của việc thực hiện HistoryDealsTotal(), tùy thuộc vào số lượng lịch sử giao dịch đã được tải vào bộ đệm bởi hàm HistorySelect(bắt đầu, kết thúc) hoặc HistorySelectByP vị trí().

Để lấp đầy bộ đệm chỉ với một giao dịch bằng vé của nó, hãy sử dụng chức năng HistoryDealSelect(vé).

// --- determining the time intervals of the required trading history
   datetime end=TimeCurrent();                // current sever time
   datetime start=end-PeriodSeconds(PERIOD_D1);// set the beginning for 24 hours ago
//--- request in the cache of the program the needed interval of the trading history
   HistorySelect(start,end);
//--- obtain the number of deals in history
   int deals=HistoryDealsTotal();
//--- obtain the ticket for the deal, which has the last index in the list
   ulong deal_ticket=HistoryDealGetTicket(deals-1);
   if(deal_ticket>0) // we obtained in the cache of the deal, and work with it
     {
      //--- the ticket order, based on which the deal was made
      ulong order     =HistoryDealGetInteger(deal_ticket,DEAL_ORDER);
      long order_magic=HistoryDealGetInteger(deal_ticket,DEAL_MAGIC);
      long pos_ID     =HistoryDealGetInteger(deal_ticket,DEAL_POSITION_ID);
      PrintFormat("Deal #%d for the order #%d with the ORDER_MAGIC=%d  that participated in the position",
                  deals-1,order,order_magic,pos_ID);
     }
   else              // unsuccessful attempt of obtaining a deal
     {
      PrintFormat("In total, in the history %d of deals, we couldn't select a deal"+
                  " with the index %d. Error %d",deals,deals-1,GetLastError());
     }

Trong các trường hợp tổng quát hơn, cần tìm kiếm trong vòng lặp thỏa thuận từ bộ đệm và phân tích chúng. Thuật toán chung sẽ như sau:

  1. Chấm dứt ranh giới của lịch sử đầy đủ, nếu lịch sử tải bằng chức năng HistorySelect(bắt đầu, kết thúc) – thì không nên tải toàn bộ lịch sử giao dịch vào bộ đệm.
  2. Tải vào bộ đệm của chương trình, lịch sử giao dịch của các hàm HistorySelect() hoặc HistorySelectByPosition().
  3. Có được tổng số giao dịch trong lịch sử, sử dụng hàm HistoryDealsTotal().
  4. Tổ chức chu trình bằng cách tìm kiếm thông qua tất cả các giao dịch, theo số của họ trong danh sách.
  5. Xác định vé của giao dịch tiếp theo trong bộ đệm, bằng cách sử dụng HistoryDealGetTicket().
  6. Có được thông tin về thỏa thuận từ bộ đệm, bằng cách sử dụng các hàm HistoryDealGetDouble(), HistoryDealGetInteger() và HistoryDealGetString(). Nếu cần, phân tích dữ liệu thu được và thực hiện các hành động thích hợp.

Một ví dụ về thuật toán như vậy để tính toán lãi và lỗ:

input long my_magic=111;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
// --- determine the time intervals of the required trading history
   datetime end=TimeCurrent();                 // current server time
   datetime start=end-PeriodSeconds(PERIOD_D1);// set the beginning time to 24 hours ago

//--- request in the cache of the program the needed interval of the trading history
   HistorySelect(start,end);
//--- obtain the number of deals in the history
   int deals=HistoryDealsTotal();

   int returns=0;
   double profit=0;
   double loss=0;
//--- scan through all of the deals in the history
   for(int i=0;i<deals;i++)
     {
      //--- obtain the ticket of the deals by its index in the list
      ulong deal_ticket=HistoryDealGetTicket(i);
      if(deal_ticket>0) // obtain into the cache the deal, and work with it
        {
         string symbol             =HistoryDealGetString(deal_ticket,DEAL_SYMBOL);
         datetime time             =HistoryDealGetInteger(deal_ticket,DEAL_TIME);
         ulong order               =HistoryDealGetInteger(deal_ticket,DEAL_ORDER);
         long order_magic          =HistoryDealGetInteger(deal_ticket,DEAL_MAGIC);
         long pos_ID               =HistoryDealGetInteger(deal_ticket,DEAL_POSITION_ID);
         ENUM_DEAL_ENTRY entry_type=(ENUM_DEAL_ENTRY)HistoryDealGetInteger(deal_ticket,DEAL_ENTRY);

         //--- process the deals with the indicated DEAL_MAGIC
         if(order_magic==my_magic)
           {
            //... necessary actions
           }

         //--- calculate the losses and profits with a fixed results
         if(entry_type==DEAL_ENTRY_OUT)
          {
            //--- increase the number of deals 
            returns++;
            //--- result of fixation
            double result=HistoryDealGetDouble(deal_ticket,DEAL_PROFIT);
            //--- input the positive results into the summarized profit
            if(result>0) profit+=result;
            //--- input the negative results into the summarized losses
            if(result<0) loss+=result;
           }
        }
      else // unsuccessful attempt to obtain a deal
        {
         PrintFormat("We couldn't select a deal, with the index %d. Error %d",
                     i,GetLastError());
        }
     }
   //--- output the results of the calculations
   PrintFormat("The total number of %d deals with a financial result. Profit=%.2f , Loss= %.2f",
               returns,profit,loss);
  }

Lấy trong bộ nhớ cache của lịch sử bằng mã định danh của vị trí(POSITION_IDENTIFIER)

Hàm HistorySelectByPosition(vị trí_ID) giống như hàm HistorySelect(bắt đầu, kết thúc) lấp đầy bộ đệm với các giao dịch và đơn đặt hàng từ lịch sử, nhưng chỉ trong một điều kiện – chúng phải có định danh được chỉ định của vị trí( POSITION_IDENTIFIER ). Mã định danh của vị trí – là một số duy nhất, được gán tự động cho từng vị trí được mở lại và không thay đổi trong suốt vòng đời của nó. Trong khi đó. phải ghi nhớ rằng việc thay đổi vị trí(thay đổi loại vị trí từ POSITION_TYPE_BUY sang POSITION_TYPE_SELL) không thay đổi định danh của vị trí.

Mỗi vị trí mở là kết quả của một hoặc nhiều giao dịch trên công cụ đó. Do đó, để phân tích sự thay đổi vị trí, trong suốt thời gian tồn tại, mỗi giao dịch và đơn hàng, dựa trên đó thỏa thuận được thực hiện, được chỉ định một định danh cho vị trí, trong đó thỏa thuận này tham gia. Do đó, biết được định danh của các vị trí mở hiện tại, chúng ta có thể xây dựng lại toàn bộ lịch sử – tìm tất cả các đơn đặt hàng và giao dịch đã thay đổi nó.

Hàm  HistorySelectByPosition(vị trí_ID) phục vụ cho người lập trình khỏi phải viết mã của riêng họ để lặp qua toàn bộ lịch sử giao dịch để tìm kiếm thông tin đó. Một thuật toán điển hình để làm việc với chức năng này:

  1. Có được định danh đúng vị trí.
  2. Lấy, sử dụng hàm HistorySelectByP vị trí(), vào bộ đệm của lịch sử giao dịch, tất cả các lệnh và giao dịch, mã định danh, bằng với định danh của vị trí hiện tại.
  3. Xử lý lịch sử giao dịch theo thuật toán.

Toàn bộ nền tảng hệ thống giao dịch MetaTrader 5 được cân nhắc kỹ lưỡng và thân thiện với người dùng hơn bao giờ hết, sự phong phú của các chức năng giao dịch, cho phép chúng ta giải quyết từng vấn đề cụ thể theo cách hiệu quả nhất.

Nhưng ngay cả khi các lớp giao dịch chuyên biệt từ thư viện chuẩn, cho phép chúng ta không phải lo lắng về quá nhiều sắc thái và viết chương trình ở mức cao, mà không đi sâu vào thực thi, sự hiểu biết cơ bản, sẽ cho phép chúng ta tạo ra nhiều hơn EA giao dịch đáng tin cậy và hiệu quả.

Tất cả các ví dụ đã cho có thể được tìm thấy trong các tệp, đính kèm với bài viết này.

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.