Tự động hóa giao dịch: EA, tập lệnh MQL, cBot và VPS

Tự động hóa chuyển việc lặp lại vào chương trình nhưng trách nhiệm về hoạt động vẫn thuộc bạn. Expert Advisor hoặc cBot cần môi trường thực thi xác định: phần mềm giao dịch, VPS hoặc dịch vụ đám mây. Chúng ta giải thích khác biệt, cách chẩn đoán lỗi và bảo vệ tài khoản sau mất kết nối hay khởi động lại. Bài còn đề cập chi phí lưu trữ, độ trễ thực hiện và các kiểm tra trước khi chương trình chạy trên tài khoản giao dịch ký quỹ.

Cảnh minh họa giáo dục về tự động hóa giao dịch. Thể hiện công cụ và quan hệ phụ thuộc, không phải hiệu quả hay khuyến nghị giao dịch.
Những điểm chính trong 60 giây
  • Robot chạy trong môi trường mà bạn phải duy trì. EA cổ điển trên MetaTrader tính trong phần mềm rồi gửi yêu cầu đến máy chủ nhà môi giới. Tắt phần mềm là tắt logic – trừ phần nhà môi giới giữ ở phía họ
  • Chỉ báo, tập lệnh, EA và cBot có quyền khác nhau. Chỉ báo MetaTrader không truy cập hàm giao dịch; tập lệnh có một điểm vào, OnStart(), và kết thúc cùng hàm đó; còn EA chạy liên tục. Đây không phải các từ đồng nghĩa
  • MQL4 và MQL5 khác mô hình lệnh, vị thế chứ không phải “mức độ tinh vi”. Cả hai hỗ trợ lập trình hướng đối tượng. Chuyển đổi là viết lại lớp giao dịch, không phải biên dịch lại
  • cTrader Algo cho phép viết bằng C# và Python; cBot chạy cục bộ hoặc đám mây. Chạy đám mây không đòi hỏi ứng dụng người dùng luôn mở – giới hạn phụ thuộc loại tài khoản và nhà môi giới [tính đến 2026-08-22]
  • SL/TP tiêu chuẩn và trailing stop hoạt động ở nơi khác nhau; trailing stop còn tùy nền tảng. SL/TP gắn với vị thế được giữ trên máy chủ nhà môi giới. Trailing stop tích hợp MetaTrader 4 và 5 tính trong phần mềm: đóng phần mềm thì mức ngừng dịch chuyển, dù sửa đổi cuối đã gửi vẫn ở máy chủ. cTrader khác – hãng mô tả bảo vệ vị thế vẫn hoạt động khi ứng dụng đóng [22] [tính đến 2026-08-22]
  • VPS mua sự liên tục hoạt động, không mua lợi thế. Nó không sửa chiến lược, không xóa trượt giá, không bảo vệ khỏi sự cố phía nhà môi giới
  • Ping không phải thời gian thực hiện lệnh. Độ trễ có nhiều đoạn, mỗi đoạn phải đo riêng
  • Cơ chế dừng khẩn cấp, giới hạn và nhật ký là mức tối thiểu. Robot không có giới hạn lỗ cứng, giới hạn vị thế, bản ghi quyết định thì không thể kiểm toán. Mọi cơ chế tự đóng vị thế phải thử trước ở chế độ không thực thi – trên demo và không gửi gì đến máy chủ

1. Robot thực sự chạy đâu — EA, phần mềm, máy chủ nhà môi giới

Hiểu lầm thường gặp trong tự động hóa cá nhân là “robot của tôi giao dịch tại nhà môi giới”. Không phải vậy. Expert Advisor trên MetaTrader là chương trình đã biên dịch, chạy trong tiến trình phần mềm giao dịch. Phần mềm nhận luồng báo giá từ máy chủ nhà môi giới, chạy mã robot theo các sự kiện rồi gửi yêu cầu giao dịch đã chuẩn bị. Nhà môi giới kiểm tra và thực hiện hoặc từ chối. Mọi điều robot “biết” và “nhớ” nằm phía môi trường thực thi.

Chuỗi cần nhớ khi phân tích sự cố:

mã EA → phần mềm (môi trường thực thi) → máy chủ nhà môi giới → kiểm tra lệnh → thực hiện hoặc từ chối → phản hồi máy chủ → nhật ký và trạng thái EA

Mỗi mắt xích có thể lỗi riêng và theo cách khác. Lỗi logic nằm ở mắt xích đầu. Đóng phần mềm dừng logic cục bộ và yêu cầu mới; nhà môi giới tiếp tục xử lý lệnh đã lưu trên máy chủ. Lệnh bị từ chối là vấn đề mắt xích thứ tư dù biểu hiện thành “EA không mở vị thế”. Hạ tầng thực phía nhà môi giới và lưu trữ phức tạp hơn nhiều – chuỗi này là mô hình làm việc, không phải sơ đồ mạng.

Sơ đồ hàng đợi NewTick, kiểm tra, yêu cầu và phản hồi.
Sự kiện EA xử lý tuần tự; không phải mỗi tick đều tạo lời gọi mới.

Các sự kiện mà mã phản ứng. Trên MT4 và MT5, chương trình giao dịch hoạt động theo sự kiện. OnInit() chạy lúc khởi động – nên xác minh tham số đầu vào và chuẩn bị trạng thái ở đây. OnTick() kích hoạt khi có báo giá tiếp theo của công cụ gắn robot. OnDeinit() chạy khi gỡ chương trình khỏi biểu đồ, đổi tham số hoặc đóng phần mềm. OnTimer() cho việc định kỳ và OnChartEvent() cho tương tác biểu đồ đều có ở hai ngôn ngữ – tài liệu MQL4 liệt kê cả hai hàm với chữ ký đầy đủ, bên cạnh OnInit(), OnTick() và OnDeinit() [10]. Khác biệt giữa hai môi trường nằm ở lớp giao dịch: MT5 thêm sự kiện MQL4 hoàn toàn không có – OnTrade() và OnTradeTransaction() để phản ứng với thay đổi trạng thái tài khoản [14]. Riêng ngoài lớp giao dịch, MT5 còn có OnBookEvent() — sự kiện dữ liệu thị trường được tài liệu mô tả là xử lý thay đổi độ sâu thị trường, tức sổ lệnh [14]. Nó chỉ hoạt động nơi có cung cấp độ sâu: khả năng có sổ lệnh tùy công cụ và nhà môi giới; tài khoản Forex cá nhân thường không có. Đây không phải khóa lập trình – chỉ là tối thiểu để hiểu lúc nào mã có cơ hội hành động.

Hệ quả thực tế khá bất tiện: OnTick() không phải đồng hồ. Số lần gọi phụ thuộc báo giá đến và xử lý hàng đợi sự kiện. Trong MQL5, NewTick mới không được thêm khi một sự kiện đã nằm trong hàng đợi hoặc đang xử lý[25]. Hai nhà môi giới cùng cặp có thể cung cấp số tick khác rõ vì lọc luồng khác và dùng nguồn thanh khoản khác. Logic giả định tần suất gọi “gần như cố định” thực ra phụ thuộc nhà môi giới và loại tài khoản – khả năng chuyển sang nhà môi giới khác kém hơn vẻ giống hệt của mã gợi ra.

Còn gì khi phần mềm ngừng chạy

Đây là sự phân biệt bảo vệ tài khoản, cũng là nơi cách nói sai “trên MT4 mọi thứ đều phía khách” thường lặp lại.

Stop Loss và Take Profit gắn với vị thế hoặc lệnh chờ được lưu trên máy chủ nhà môi giới, vẫn hoạt động dù phần mềm có chạy hay không. Trailing stop tích hợp giao diện MetaTrader thì ngược lại: tính cục bộ theo báo giá đến, ngừng dịch chuyển stop ngay khi nền tảng đóng. Điều này đúng cho cả MT4 và MT5, nhưng mỗi nền tảng có nguồn xác nhận riêng: trợ giúp MetaTrader 4 mô tả trailing stop chạy trong phần mềm phía khách thay vì máy chủ, ngừng khi tắt phần mềm [8], còn trợ giúp MetaTrader 5 lặp cùng quy tắc: trailing stop thực thi trong nền tảng, không phía máy chủ như Stop Loss [11]. Cần hai điểm làm rõ, nếu không câu sẽ sai. Thứ nhất, đóng phần mềm dừng dịch chuyển nhưng không hủy sửa đổi cuối đã gửi – nó vẫn ở máy chủ, tiếp tục bảo vệ. Thứ hai, không mở rộng mô tả sang mọi nền tảng. cTrader có cơ chế khác: trợ giúp hãng nêu “Mọi bảo vệ hoạt động trên các ứng dụng cTrader và tiếp tục sau khi phiên kết thúc” [22], còn trang Trade Watch nói thẳng về tính năng: “Trailing stop loss vẫn hoạt động khi ứng dụng cTrader đóng hoặc mất kết nối” [23]. Vì vậy điều kiện được duy trì ngoài ứng dụng người dùng, không cần ứng dụng chạy. Cùng tên tính năng, hai mô hình – chính vì vậy không mang thói quen từ nền tảng này sang nền tảng khác; ranh giới lệnh máy chủ và chức năng cục bộ được trình bày rộng hơn trong bài 11.4 [tính đến 2026-08-22; xác nhận phạm vi tại nhà môi giới cụ thể trong tài liệu của họ].

Trường hợp thứ ba nguy hiểm và thường gặp ở mã nghiệp dư: cắt lỗ “ảo” chỉ giữ trong biến EA. Nhà môi giới không biết stop đó. Nếu tiến trình phần mềm chết, vị thế không còn bảo vệ ngoài cơ chế toàn tài khoản. Trước khi cho rằng đã có cắt lỗ, kiểm tra mức có hiển thị phía máy chủ trong cửa sổ vị thế không – không chỉ trên biểu đồ hay nhật ký robot. Mức cho phép và khoảng cách tối thiểu SL, TP theo đặc tả từng nhà môi giới, nên cùng mã có thể được nhận ở tài khoản này, từ chối ở tài khoản khác.

Tự động hóa toàn phần và một phần

Robot không cần quyết định vào lệnh mới hữu ích. Tự động hóa một phần – dời stop hòa vốn, quản lý quy mô, đóng một phần khối lượng tại mức xác định – xử lý đúng đoạn quy trình thường làm tay thiếu nhất quán. Mã ngắn hơn, phạm vi lỗi nhỏ hơn, chẩn đoán đơn giản hơn. Tự động hóa toàn bộ từ tín hiệu đến thực hiện là dự án có mức trách nhiệm hoàn toàn khác.

Tuy nhiên điều kiện tiên quyết chung là quy tắc phải diễn đạt rõ ràng. Nếu vào, thoát và rủi ro đòi hỏi đánh giá “chất lượng” tình huống, bạn chưa có hệ thống để tự động hóa mà có ý kiến về thị trường. Hệ thống tự động thực hiện đặc tả sai cũng nhất quán như đặc tả tốt, chỉ nhanh hơn và không nghỉ. Quy tắc có kỳ vọng dương hay không thuộc tài liệu về lợi thế và kỳ vọng; ở đây chỉ bàn cách vận hành đặc tả an toàn.

Ba sự kiện nên biết như những nhóm rủi ro. Không nhằm kể lại, mà để biết cần tìm gì khi thiết kế hệ thống tự động riêng.
  • Knight Capital, ngày 1 tháng 8 năm 2012. Lỗi triển khai phần mềm giao dịch tạo ra hàng loạt lệnh sai trong vài chục phút, gây lỗ hàng trăm triệu đô la; vụ việc được ghi trong thủ tục SEC năm 2013 [9]. Quy mô không thể so EA cá nhân nhưng loại rủi ro giống hệt: thất bại nằm ở quy trình triển khai và thiếu cơ chế dừng, không ở chiến lược.
  • SNB, ngày 15 tháng 1 năm 2015. Sau khi Ngân hàng Quốc gia Thụy Sĩ bỏ trần EUR/CHF, tỷ giá nhảy mạnh. Văn bản trích ở đây không xác định điều kiện cực đoan kéo dài bao lâu – chúng ta cũng không kết luận. Nó xác định hệ quả tài khoản: trong phân tích trước biện pháp can thiệp sản phẩm EU, ESMA ghi nhận sau sự kiện franc, số dư một số nhà đầu tư âm hàng chục nghìn euro – nhiều lần tiền nộp vào nhà cung cấp CFD [13]. Từ góc độ công cụ, chỉ một điều quan trọng: hệ thống thêm vào vị thế lỗ hoặc gửi lại lệnh bị từ chối trong lúc đó đang chống tài khoản. Bảo vệ số dư âm cho khách hàng cá nhân EU có hiệu lực sau này, thuộc phần quy định chứ không phải bài này.
  • Sự kiện chớp nhoáng — vì sao ở đây không mô tả từng phút một sự kiện. Biến động mạnh của yên ngày 3 tháng 1 năm 2019 được nguồn thứ cấp kể theo nhiều cách mâu thuẫn; chúng ta chưa tìm được văn bản có ngày xác nhận chuỗi sự kiện ở độ chi tiết đó. Phần giữ lại là điều được cơ quan ghi nhận và quan trọng nhất cho tự động hóa. Báo cáo Ủy ban Thị trường tại BIS về thuật toán thực hiện trong thị trường ngoại hối (tháng 10 năm 2020) nêu phân tích các sự kiện chớp nhoáng gần đây thường chỉ ra phối hợp yếu tố như “tập trung lệnh cắt lỗ hoặc nhân sự ít kinh nghiệm hơn ngoài múi giờ hoạt động chính của đồng tiền” [20]. Phần sau trích dẫn nói về nhân sự ít kinh nghiệm phía thị trường, không phải công cụ hoạt động ngoài múi giờ của nó; chúng ta không mở rộng hơn. Với hệ thống tự động, liên hệ trực tiếp trong báo cáo là đủ: lệnh bảo vệ tập trung một mức, cộng thời điểm ngoài múi giờ chính của đồng tiền. Khi đó bộ lọc chênh lệch giá hiệu chỉnh ở phiên bình thường không còn ý nghĩa cũ; logic thử lại yêu cầu bị từ chối bắt đầu chống tài khoản. Muốn biết một phiên cụ thể ảnh hưởng hệ thống thế nào, lấy dữ liệu tick của nhà môi giới hôm đó rồi chạy chiến lược qua – mô tả sự kiện của người khác không nói gì về tài khoản của bạn.
Kết luận chỉ một điều: lọc thanh khoản, giới hạn phơi nhiễm và dừng khẩn cấp không phải trang trí; điều kiện biên hiếm xuất hiện nhưng chính lúc đó logic hiệu chỉnh theo phiên bình thường thất bại.
EA không phải dịch vụ tín hiệu hay sao chép giao dịch. Dịch vụ tín hiệu là thuê quyết định của người khác, sao chép giao dịch là tự động tái tạo giao dịch tài khoản khác, còn công cụ sao chép là lớp kỹ thuật giữa hai tài khoản. Với EA riêng ít nhất bạn truy cập được logic và tham số. Trường hợp còn lại là mua quy trình quyết định của người khác – cần đánh giá quy trình đó, không phải mã.
Khối lượng tick không phải khối lượng giao dịch thị trường. Trong Forex cá nhân, phần mềm thường hiển thị khối lượng tick – số thay đổi báo giá trong kỳ, không phải khối lượng tập trung. Logic robot dựa “khối lượng” vì vậy đo hoạt động luồng của một nhà cung cấp. Đại lượng phụ thuộc nhà môi giới, không so được giữa các nền tảng.

2. Chỉ báo, tập lệnh, EA và cBot — bốn nhóm công cụ khác nhau

Câu “tìm tập lệnh giao dịch thay tôi” thường xuất hiện và thường hàm ý khác nghĩa đen. Tập lệnh MetaTrader có quyền hàm giao dịch, có thể gửi nhiều thao tác trong một lần, nên “tập lệnh giao dịch” không tự mâu thuẫn. Mâu thuẫn nằm chỗ khác: tập lệnh có một điểm vào, OnStart(), kết thúc cùng hàm đó nên không có gì theo dõi thị trường một tuần. Ba loại chương trình MetaTrader khác vòng đời và quyền truy cập; cTrader phân chia khác.

Tính năngExpert AdvisorTập lệnhChỉ báo tùy chỉnh
Vòng đờiLiên tục — chạy đến khi gỡ khỏi biểu đồMột lần — thực hiện rồi kết thúcLiên tục — tính lại theo dữ liệu biểu đồ
Có gửi lệnh không?CóCó — kể cả nhiều thao tác trong một lần chạyKhông có quyền hàm giao dịch
Sự kiện chínhOnTick()OnStart()OnCalculate()
Vẽ trên biểu đồCó thể, nhưng không phải vai trò chínhKhông điển hìnhNhiệm vụ cốt lõi
Cách dùng điển hìnhGiao dịch tự động, quản lý vị thếThao tác hàng loạt: đóng vị thế, đặt mứcChỉ báo dao động, vùng, bảng đa khung
Số lượng trên một biểu đồMộtMỗi lần mộtNhiều đồng thời

Phân quyền là ưu điểm, nhưng bảo đảm hẹp hơn cách thường nói. Chỉ báo không có quyền hàm giao dịch nên không tự gửi lệnh – chỉ kết luận được vậy. Không có nghĩa lỗi chỉ báo vô hại: EA đọc bộ đệm rồi quyết định thì giá trị tính sai biến thành giao dịch sai do EA gửi. Kiến trúc rõ ràng vẫn vậy: chỉ báo tính và đưa kết quả vào bộ đệm; EA đọc và quyết định giao dịch. Phân tích tách thực hiện, từng lớp có thể kiểm thử riêng – với điều kiện kiểm tra cả nội dung bộ đệm, không chỉ logic EA.

cTrader chia khác, không ánh xạ từng loại được. Tương đương EA là cBot, tương đương chỉ báo vẫn là chỉ báo. Không có nhóm “tập lệnh” riêng; thao tác một lần do cBot làm trong phương thức khởi động rồi tự dừng.

Ba sai lầm tốn thời gian:

  • Mong chỉ báo tự giao dịch. Chỉ báo MetaTrader không có quyền hàm giao dịch. Sản phẩm quảng cáo “chỉ báo tự giao dịch” hoặc không phải chỉ báo, hoặc có chương trình riêng chạy nền – mã chương trình đó mới chịu trách nhiệm lệnh
  • Dùng EA khi tập lệnh là đủ. Đóng tất cả vị thế một lần là việc tập lệnh. EA gắn biểu đồ sẽ tiếp tục sống, phản ứng báo giá sau và cần giám sát
  • Một khối lớn thay vì mô-đun. Chương trình đồng thời chạy năm chiến lược, theo dõi rủi ro tài khoản, vẽ và thông báo khó chẩn đoán hơn. Mỗi chiến lược có hệ thống riêng, bộ giám sát rủi ro riêng cho phép tắt từng phần

Trước khi viết robot, hãy viết tập lệnh thông tin. Không phải vì bài nhập môn, mà vì chương trình chủ ý không có một lời gọi giao dịch nào giúp kiểm tra bạn có đọc đúng môi trường không: mã, báo giá, chi phí, tiền khả dụng. Đọc sai thì mọi quyết định robot đều dựa trên sai.

Phần sau không phải chương trình để biên dịch, mà là phác thảo cấu trúc: thứ tự kiểm tra và tên hàm MQL4 để dùng trong triển khai riêng. Đừng dán rồi chạy như tệp hoàn chỉnh. Nó chưa được xác minh bằng biên dịch hay thử trên tài khoản môi giới. Biên dịch kiểm tra cú pháp, không tự xác nhận số đọc, quyền hay hành vi trong môi trường đã chọn. Giữ thứ tự, viết triển khai đầy đủ, kiểm tra kết quả trên demo; hồ sơ phép thử mới giúp đánh giá hoạt động.

PHÁC THẢO CẤU TRÚC - chẩn đoán môi trường trước khi viết robot
Ký hiệu định hướng cho MQL4. Đây không phải mã đầy đủ có thể biên dịch.

điểm vào: OnStart() - chạy một lần, kết thúc cùng hàm

1. symbol   := Symbol()
   Không ghi cứng tên - hậu tố nhà môi giới làm tên thay đổi.

2. bid, ask := MarketInfo(symbol, MODE_BID / MODE_ASK)
   point    := MarketInfo(symbol, MODE_POINT)
   spread   := if point > 0 then (ask - bid) / point
               nếu không: chưa xác định được kết quả đọc
   point bằng không nghĩa là đọc đặc tả thất bại, không phải
   chênh lệch giá bằng không - hai tình huống phải có mục nhật ký khác nhau.

3. lotMin   := MarketInfo(symbol, MODE_MINLOT)
   lotStep  := MarketInfo(symbol, MODE_LOTSTEP)
   Thuộc tính công cụ tại nhà môi giới cụ thể, không phải hằng ngôn ngữ.

4. ghi nhật ký: symbol, bid, spread, lotMin, lotStep,
   OrdersTotal(), AccountFreeMargin()

5. tradePossible := IsTradeAllowed()
   Nhãn nhật ký: có thể giao dịch ở thời điểm này.
   Không phải: được phép giao dịch tự động - xem đoạn bên dưới.

những gì phác thảo này không có và không được có:
   không gọi OrderSend, OrderClose hoặc OrderModify.

Ba điều từ phác thảo sẽ lặp lại trong mọi robot: đọc tên mã từ môi trường thay vì ghi cứng, đọc bước khối lượng từ đặc tả, kiểm tra rõ lúc này có giao dịch được không. Điểm cuối cần sửa cách nói tắt phổ biến. IsTradeAllowed() không chỉ trả lời có đồng ý tự động hóa không – tài liệu MQL4 mô tả kiểm tra “Expert Advisor được phép giao dịch và ngữ cảnh giao dịch không bận” [15]. Kết quả false có thể do thiếu quyền hoặc ngữ cảnh giao dịch bận, tức trạng thái tạm rồi tự hết. Vì vậy ghi riêng kết quả hàm và nguyên nhân xác định bằng kiểm tra thêm; nếu không, chẩn đoán “giao dịch bị tắt” rơi vào thứ chưa hề bị tắt. Phần lỗi vận hành quay lại cả ba số đọc.

3. MQL4 và MQL5 — hai môi trường, không phải hai phiên bản của một

Cách nói “MQL5 là MQL4 thêm hàm” sai đúng chỗ quan trọng thực tế: mô hình lệnh và vị thế. Cũng cần bỏ ngay ngộ nhận khác. MQL4 không thuần thủ tục – tài liệu MetaQuotes mô tả lớp, kế thừa, hàm ảo và mẫu [1]. Khác biệt không ở mô hình lập trình mà ở giao diện giao dịch, cách đọc chỉ báo và biểu diễn phơi nhiễm mở.

Lớp giao dịch. Trong MQL4, một hàm, OrderSend(), mở vị thế; còn OrderSelect() chuyển ngữ cảnh sang phần tử tiếp trong danh sách có cả lệnh chờ lẫn vị thế mở. MQL5 tách khái niệm: lệnh, vị thế và giao dịch lịch sử khác nhau. Gửi yêu cầu là điền cấu trúc rồi kiểm tra cấu trúc trả về chứa mã phản hồi máy chủ; lớp thư viện chuẩn như CTrade là lớp bao tiện lợi của cơ chế, không phải chế độ hoạt động riêng [2].

Lớp dữ liệu. Trong MQL4, lời gọi chỉ báo trả giá trị cho nến chỉ định. MQL5 trả bộ định danh, tạo một lần – thường trong OnInit() — rồi lấy giá trị vào mảng bằng hàm sao chép bộ đệm. Viết lại nguyên xi sẽ tạo định danh mới mỗi báo giá thay vì dùng cái có sẵn – trình biên dịch không báo vì lỗi nằm ở nơi tạo, không phải cú pháp. Đây là bẫy chuyển đổi kinh điển vì không lộ ngay.

Bảng một số khác biệt giữa API MQL4 và MQL5.
Tên hàm tương tự không đồng nghĩa cách lấy dữ liệu giống nhau.
Tiêu chíMQL4 (MetaTrader 4)MQL5 (MetaTrader 5)
Lập trình hướng đối tượngHỗ trợHỗ trợ
Mô hình giao dịchDanh sách chung lệnh và vị thếTách lệnh, vị thế và giao dịch
Gửi yêu cầuMột lời gọi có tham sốCấu trúc yêu cầu và phản hồi có mã trả về
Đọc chỉ báoTrả trực tiếp giá trịĐịnh danh tạo một lần, sao chép giá trị từ bộ đệm
Hạch toán phơi nhiễmVị thế riêng trên cùng mãNetting hoặc hedging — nhà môi giới đặt chế độ tài khoản
Khung thời gian tiêu chuẩn921
Bộ kiểm thử chiến lượcMột mãKiểm thử đa tiền tệ, kiểm thử tiến, nhiều mô hình tạo tick, mô phỏng độ trễ
Trạng thái sản phẩm [tính đến 2026-08-22]Không mua được giấy phép mới: trang MetaQuotes cho nhà môi giới nêu “giấy phép nền tảng MetaTrader 4 không còn được bán” [19]. Báo ngành đưa tin dừng bán ngày 12 tháng 1 năm 2018 [12]. Tuy nhiên vẫn bảo trì kỹ thuật: nhật ký phát hành ghi bản 1460 ngày 5 tháng 3 năm 2026 (“cải thiện bảo mật quan trọng, sửa lỗi, tăng ổn định”) và bản 1470 ngày 12 tháng 3 năm 2026 (“cải thiện bản dịch giao diện, sửa lỗi, tăng ổn định”) [21]; bản 1490 ngày 2 tháng 10 năm 2026 thêm sửa lỗi và cải thiện quản lý SL/TP trên tài khoản FIFO[21]. Đây là bảo trì nền tảng hiện hữu, không phải trở lại phát triển ý tưởng mới. Không tuyên bố có ngày nào tìm được cho biết hãng sẽ hỗ trợ cài đặt cũ bao lâu và đến mức nào, nên đừng mặc định thời hạnĐang phát triển tích cực. Hãng thông báo “các cập nhật về ý tưởng mới chỉ phát hành cho nền tảng đa tài sản này” [19]

Dòng chế độ hạch toán cần giải thích riêng vì dễ gây lỗi bất ngờ. Netting là một vị thế ròng mỗi công cụ: gửi lệnh ngược không mở vị thế thứ hai mà giảm hoặc đảo vị thế có sẵn. Robot chuyển từ MT4 giả định nhiều vị thế độc lập cùng mã sẽ tự đóng lệnh vào của mình. Nhà môi giới đặt chế độ tài khoản, nên không phải “mặc định MT5” mà là thuộc tính từng tài khoản cần kiểm tra trước triển khai, tốt nhất đọc bằng mã.

Khi nào nên chuyển đổi. Khi môi trường cũ thực sự hạn chế: cần kiểm thử đa tiền tệ, kiểm thử tiến trong bộ kiểm thử, mô hình tick chính xác hơn hoặc công cụ nhà môi giới không có trên MT4. Chỉ “mới hơn” không đủ lý do: viết lại lớp giao dịch và đọc chỉ báo tạo bộ lỗi mới trong mã từng chạy được. Thời gian tùy quy mô hệ thống – không có con số trung thực để nêu chung. Nếu chuyển, so từng giao dịch, không chỉ tổng. Tổng giống mà danh sách khác nghĩa là hai logic khác tình cờ cho kết quả gần nhau.

MT5 còn có tối ưu phân tán trả phí trong mạng tính toán MetaQuotes. Nhưng công suất cao hơn nghĩa là thử thêm tổ hợp tham số, trực tiếp tăng rủi ro khớp quá khứ. Phương pháp – chia dữ liệu, chi phí, số biến thể – thuộc bài về demo, kiểm thử quá khứ và kiểm thử tiến và được trình bày đầy đủ ở đó.

4. cTrader Algo — C#, Python, chạy cục bộ và đám mây

Đây là phần dễ lặp mô tả sản phẩm cũ nhất: tài liệu trước gọi môi trường tự động cTrader là cAlgo hoặc cTrader Automate, nói chỉ dùng C# và chỉ chạy cục bộ. Cả hai nhận định hiện đều sai.

Theo tài liệu Spotware chính thức, môi trường có tên cTrader Algo và hỗ trợ xây thuật toán bằng hai ngôn ngữ: C# và Python [3]. cBot chạy cục bộ hoặc đám mây; tài liệu tính năng đám mây nói rõ cBot chạy trong môi trường cô lập do cTrader cung cấp; ứng dụng người dùng Windows, Mac, di động hay trình duyệt không cần mở hoặc kết nối internet [4]. Điều đó đổi toàn bộ phép tính lưu trữ được bàn ở phần sau.

Giới hạn chạy đám mây, tính đến 2026-08-22. Tài liệu nêu tài khoản thực chạy tối đa mười phiên bản đồng thời liên tục; tài khoản demo một phiên bản, tự dừng chậm nhất sau bảy ngày. Tài liệu lưu ý quy tắc có thể khác theo nhà môi giới; cBot dùng gói ngoài chạy được trên đám mây khi đáp ứng thêm điều kiện [4]. Coi số này là trạng thái sản phẩm ngày công bố, kiểm tra lại trước khi dựa kiến trúc vào.

Cấu trúc cBot. Chương trình kế thừa lớp robot cơ sở. Phương thức khởi động tương ứng khởi tạo quen thuộc trong MQL, xử lý báo giá tiếp tương ứng OnTick(), phương thức dừng tương ứng giải phóng. Khác biệt hữu ích là hỗ trợ trực tiếp sự kiện đóng nến; MetaTrader phải tự phát hiện bằng so giờ mở nến hiện tại với giờ đã nhớ.

Sơ đồ phát triển cBot và chạy cục bộ hoặc đám mây.
Dừng bản cục bộ trong ứng dụng đang chạy; bản đám mây quản lý được từ ứng dụng khác.

Open API không phải REST. Cần ghi chính xác vì nguồn thứ cấp hay nói “cTrader có REST API”. Tài liệu Spotware mô tả trao đổi dữ liệu Open API qua đối tượng JSON hoặc Google Protocol Buffers [5]. FIX API là dịch vụ riêng. Quyền, khả năng sử dụng và điều kiện kết nối tùy nhà môi giới; lên kế hoạch tích hợp sau khi đọc tài liệu nhà cung cấp cụ thể, không dựa mô tả nền tảng chung.

Tiêu chí chọn môi trườngMetaTrader (MQL4 / MQL5)cTrader Algo
Ngôn ngữMQL4 hoặc MQL5C# hoặc Python
Trình soạn thảo và công cụMetaEditor tích hợp nền tảngTrình soạn thảo trong ứng dụng, có thể dùng IDE bên ngoài
Gói bên ngoàiKhông có trình quản lý gói; tích hợp qua thư viện hệ thốngCó, kể cả trên đám mây khi đáp ứng điều kiện dịch vụ
Chạy không cần máy tính riêngLưu trữ nền tảng hoặc VPS chạy phần mềmcBot chạy đám mây hoặc VPS
Giao diện lập trình ngoài nền tảngPython tích hợp phần mềm, giải pháp tùy chỉnhOpen API (JSON hoặc Protobuf), FIX API riêng
Kho mã có sẵnRất lớn, chất lượng rất khác nhauNhỏ hơn đáng kể
Khả năng sử dụngTùy dịch vụ nhà môi giớiTùy dịch vụ nhà môi giới

Chọn môi trường không phải chọn “nền tảng tốt hơn”. Nếu nhà môi giới chỉ có một, quyết định đã được đặt sẵn. Nếu có cả hai, tiêu chí thực tế là bạn có thể viết, duy trì mã và hiểu hoạt động trong môi trường nào, muốn bảo đảm liên tục ra sao. Ngôn ngữ không tạo lợi thế mà đổi chi phí bảo trì và số lỗi trên đường.

Webhook làm cầu nối đến hệ thống khác

Đường tự động hóa thứ hai không đi qua mã trong nền tảng: sự kiện ngoài – chẳng hạn cảnh báo nền tảng biểu đồ – gửi yêu cầu HTTP đến địa chỉ thống nhất; ứng dụng trung gian sau đó chuyển thành lời gọi API nhà môi giới. Chuỗi thành sự kiện → webhook → ứng dụng trung gian → API nhà môi giới → kiểm tra → lệnh → phản hồi máy chủ, webhook chỉ phụ trách một mắt xích: gửi yêu cầu. Chuyển đến không phải thực hiện – nhận webhook đúng không nói gì về khối lượng có đúng đặc tả, tài khoản có đủ ký quỹ khả dụng hay máy chủ nhận lệnh không. Mỗi điểm trung gian thêm độ trễ và kiểu lỗi riêng – gồm lặp lại cùng yêu cầu sau kết nối lại. Địa chỉ webhook cần bảo vệ nhưng biết địa chỉ không được thay quyền xác thực: trung gian phải kiểm tra bên gửi, độ mới yêu cầu và mã định danh duy nhất. Cấu hình cảnh báo phía nền tảng biểu đồ thuộc bài riêng; ở đây chỉ cần biết cầu nối nằm đâu trong chuỗi và không bảo đảm gì.

5. Quyền, biên dịch, nhật ký và nhận diện vị thế của mình

“Robot không giao dịch” là phản ánh điển hình và có thể không liên quan logic chiến lược. Trước gỡ lỗi điều kiện vào, kiểm tra bốn việc: mã đã biên dịch chưa, gắn đúng biểu đồ chưa, mọi cấp đã cho tự động giao dịch chưa, nhật ký ghi chính xác gì.

Biên dịch và nơi chứa tệp

Mã nguồn trong MetaEditor là tệp văn bản, còn thứ gắn lên biểu đồ là tệp đã biên dịch. Tệp phải nằm thư mục dữ liệu nền tảng, đúng thư mục con của loại chương trình – nếu không nền tảng không thấy. Mở thư mục dữ liệu từ menu; đừng mặc định là thư mục cài vì thường không phải. Chép xong làm mới danh sách ở cửa sổ điều hướng. Đọc cảnh báo biên dịch – cảnh báo chuyển kiểu ngầm trong mã giao dịch có thể làm khối lượng bị cắt về không.

Ba cấp đồng ý giao dịch tự động

Cho phép tự động không phải một nút. Cấp đầu là cài đặt toàn nền tảng – nút giao dịch thuật toán trên thanh công cụ. Cấp hai là thuộc tính chương trình khi gắn biểu đồ. Cấp ba ngoài quyền bạn: tài khoản. Nhà môi giới có thể chặn tự động cho loại tài khoản hoặc hạn chế giao dịch nói chung, chẳng hạn tài khoản chỉ đọc. Robot không kiểm tra chỉ báo lệnh thất bại mà không nêu nguyên nhân.

Dưới đây là phác thảo cấu trúc khác, không phải tệp biên dịch, lần này cho MQL5. Nó cho thấy thứ tự kiểm tra quyền và chuẩn hóa khối lượng, chưa phải triển khai đã xác minh. Biên dịch riêng không chứng minh hoạt động trên tài khoản cụ thể: cần kiểm tra phản hồi phần mềm, thuộc tính mã và quyền khi kết nối nhà môi giới. Bài không trình bày phép thử như vậy. Dùng phác thảo làm cơ sở tự kiểm tra, không coi mô-đun giao dịch có sẵn. Không có lời gọi gửi lệnh.

PHÁC THẢO CẤU TRÚC - kiểm tra quyền và chuẩn hóa khối lượng
Ký hiệu định hướng cho MQL5. Đây không phải mã đầy đủ có thể biên dịch.

A. CÓ ĐƯỢC GIAO DỊCH KHÔNG - bốn kết quả đọc, mỗi kết quả có mục nhật ký riêng

   TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)
      false -> nền tảng tắt giao dịch thuật toán
   MQLInfoInteger(MQL_TRADE_ALLOWED)
      false -> thuộc tính chương trình tắt giao dịch
   AccountInfoInteger(ACCOUNT_TRADE_ALLOWED)
      false -> tài khoản chặn giao dịch
   AccountInfoInteger(ACCOUNT_TRADE_EXPERT)
      false -> nhà môi giới không cho phép giao dịch tự động ở đây

   Chỉ được giao dịch khi cả bốn kết quả là true.
   Nhật ký phải cho biết mục nào thất bại - nếu không,
   chẩn đoán dừng ở câu "robot không giao dịch".

B. CHUẨN HÓA KHỐI LƯỢNG THEO LƯỚI BƯỚC

   đầu vào: symbol, vol
   đầu ra:  bội số của bước, hoặc 0.0 nghĩa là "không gửi"

   B1. if not MathIsValidNumber(vol) or vol <= 0.0
          -> ghi lỗi và trả về 0.0
       So sánh thông thường không loại NaN đáng tin cậy. Phải xác minh
       rõ đầu vào hữu hạn trước khi tính; nếu không, kết quả
       có thể vẫn không hợp lệ.

   B2. đọc đặc tả bằng biến thể trả về trạng thái:
          SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN,  vmin)
          SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX,  vmax)
          SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP, vstep)
       bất kỳ kết quả nào là false hoặc vstep <= 0.0
          -> ghi _LastError và trả về 0.0
       Biến thể chỉ trả số không báo lỗi rõ ràng
       mà trả không, không phân biệt được với giá trị không thực sự.

   B3. TOL   := 1e-8            dung sai phép chia nhị phân
       steps := MathFloor(vol / vstep + TOL)
       result := NormalizeDouble(steps * vstep, 8)

       Hậu điều kiện hàm cam kết - và chỉ cam kết:
         kết quả là bội số nguyên của bước,
         kết quả không vượt đầu vào quá
         TOL * vstep.
       Hàm không cam kết kết quả tuyệt đối không bao giờ vượt đầu vào.

   B4. if result > vmax
          -> result := NormalizeDouble(MathFloor(vmax / vstep + TOL) * vstep, 8)
       if result < vmin
          -> trả về 0.0
       Thứ tự quan trọng: chỉ kiểm tra tối thiểu, tối đa sau khi
       giá trị đã được đưa lên lưới bước.

Hàm thứ hai trông nhỏ nhưng chịu trách nhiệm cho cả nhóm từ chối. Bước, tối thiểu và tối đa khối lượng là thuộc tính công cụ tại từng nhà môi giới, khác giữa tài khoản. Quy mô tính theo rủi ro gần như không rơi đúng bước; máy chủ từ chối khối lượng sai thay vì làm tròn hộ.

Hai chi tiết của hàm thuộc cùng nhóm lỗi cảnh báo biên dịch đã nhắc: mã chạy nhưng kết quả âm thầm khác phép tính. Thứ nhất, khối lượng được tạo bằng đếm số bước nguyên rồi nhân lại bước, không làm tròn theo số chữ số thập phân cố định. Làm tròn hai chữ số biến 0,003 thành không trên công cụ có bước 0,001 – có ở tài khoản cent và một số CFD. Suy số chữ số từ logarit của bước cũng sai khi bước không là lũy thừa mười: bước 0,25 khiến 1,75 làm tròn thành 1,8, không còn bội số bước, nên máy chủ từ chối như khối lượng chưa chuẩn hóa. Thứ hai, phép chia số thực có thể thấp hơn số nguyên một chút; thiếu lượng hiệu chỉnh nhỏ, làm tròn xuống âm thầm mất một bước – 0,3 chia 0,1 cho kết quả dưới ba, vị thế nhỏ hơn phép tính rủi ro. Vì vậy chỉ kiểm tra min/max cuối cùng trên giá trị đã đưa về lưới bước: làm tròn xuống có thể dưới mức tối thiểu vừa đạt trước đó; cắt tối đa phải nằm cùng lưới.

Nhưng lượng hiệu chỉnh có mặt khác cần nói rõ thay vì hứa quá khả năng hàm. Vì cộng trước làm tròn xuống, kết quả có thể lớn hơn đầu vào chút ít: khối lượng 0,2999999995 với bước 0,1 cho 0,3, tức nhiều hơn năm phần mười tỷ lot. Với các bước ví dụ, khác biệt không đáng kể – nhưng cam kết phải đúng: kết quả là bội bước, không vượt đầu vào quá dung sai chấp nhận. Đây là ranh giới chọn có chủ đích; thiếu nó, cùng mã mất cả bước ở 0,3. Hai việc dễ quên phải chặn riêng: đầu vào không hữu hạn mà so sánh thường không loại tin cậy, và đọc đặc tả thất bại. Vì vậy phác thảo có MathIsValidNumber() ở đầu vào và dùng SymbolInfoDouble() phiên bản trả trạng thái thay vì chỉ trả số – phiên bản chỉ số trả không khi lỗi, không phân biệt được không thực.

Nhật ký — dấu vết chẩn đoán cơ bản sau sự cố

Nền tảng giữ các nhật ký riêng, sự tách biệt hữu ích. Thẻ nhật ký chương trình chứa mã in ra cùng thông báo khởi tạo, gỡ bỏ. Nhật ký nền tảng ghi hạ tầng: đăng nhập, mất mạng, nối lại, yêu cầu gửi và phản hồi. Bộ kiểm thử chiến lược có nhật ký riêng. Bản sao vào tệp thư mục dữ liệu nên tồn tại qua khởi động lại – chỉ nhờ đó mới tái dựng sự cố ban đêm.

Tối thiểu robot tự ghi: thời điểm quyết định cùng giá, chênh lệch; tham số yêu cầu gửi; mã phản hồi máy chủ; giá thực hiện thật; mọi sửa mức và kích hoạt bảo vệ. Thiếu giá và mã phản hồi, không phân biệt lỗi logic với từ chối phía nhà môi giới – hai vấn đề hoàn toàn khác.

Cần phân biệt ngay vì sẽ trở lại ở phần sự cố. Nhật ký là dấu vết chẩn đoán cơ bản: nói chương trình làm gì, thấy gì lúc đó. Nhưng nguồn chuẩn về thực hiện là trạng thái tài khoản và lịch sử giao dịch trên máy chủ nhà môi giới. Phân biệt trở nên thiết yếu khi mất kết nối: nhật ký robot có thể dừng ở lỗi gửi trong khi máy chủ đã thực hiện. Mâu thuẫn thì máy chủ quyết định.

Nhận diện vị thế của mình

Robot phải trả lời “vị thế này có phải của tôi không”. Tài khoản có thể cùng giữ giao dịch thủ công, robot khác và cùng chiến lược trên mã khác. Dùng mã số định danh gán lúc gửi – cả hai MetaTrader gọi là magic number – cùng trường bình luận. Quy tắc đơn giản: mọi vòng lặp vị thế lọc đồng thời định danh và mã công cụ, không chỉ mã.

Bỏ lọc gây hậu quả: robot đóng vị thế thủ công; hai robot cùng định danh sửa mức của nhau. Netting khó hơn vì vị thế ròng không có một chủ – robot phải tự ghi phơi nhiễm phân cho mình, dựng lại sau khởi động từ lịch sử giao dịch thay vì trạng thái hiện tại.

6. Danh mục lỗi vận hành — từ kết nối lại đến thay đổi đặc tả mã

Một số lỗi tự động hóa thuộc môi trường chạy, không thuộc quy tắc chiến lược. Kiểm thử quá khứ tiêu chuẩn không tái hiện hết; có trường hợp cần thử lỗi riêng. Danh sách dưới không phải chuyện hiếm lạ – phải sẵn sàng khi duy trì robot nhiều tháng.

Sự cốBiểu hiệnBảo vệ bằng mã hoặc quy trình
Kết nối lại sau mất mạngBộ nhớ chương trình còn nguyên – vấn đề là yêu cầu gửi ngay trước mất mạng chưa rõ kết quả: đã tới và đã thực hiện chưaSau mỗi yêu cầu chưa xác nhận kết quả, đọc vị thế hiện tại và lịch sử lọc bằng định danh riêng trước khi thử lại
Lệnh trùngHai vị thế giống nhau mở cách vài giâyKiểm tra phơi nhiễm trước gửi, khóa thời gian, định danh bền vững cho từng quyết định – không chỉ magic number
Báo giá cũQuyết định theo giá hơn chục giây trước; máy chủ từ chốiKiểm tra giờ báo giá cuối trước quyết định, bỏ thay vì thử lại mù
Sai mã hoặc hậu tố nhà môi giớiRobot không thấy công cụ hoặc chạy nhầm công cụĐọc mã từ môi trường biểu đồ, kiểm tra khả dụng trong OnInit()
Bước khối lượng không khớpYêu cầu bị từ chối vì khối lượng saiChuẩn hóa theo bước, kiểm tra min/max
Không xử lý mã phản hồi máy chủRobot coi lệnh bị từ chối là đã thực hiện, tính vị thế không tồn tạiKiểm tra kết quả mọi thao tác, ghi mã phản hồi, giới hạn số thử lại
Khởi động lại hoặc khởi tạo lại chương trìnhLúc này trạng thái trong bộ nhớ mới mất: bộ đếm lỗ ngày đặt lại, đỉnh vốn tính lại, mức theo dõi bằng mã không còn được theo dõiLưu trạng thái bền vững, dựng lại lúc khởi động từ vị thế và lịch sử, không từ biến; mức quan trọng phía máy chủ
Đổi đặc tả công cụĐổi khoảng cách tối thiểu của mức, bước khối lượng hoặc giờ giao dịchĐọc đặc tả khi khởi tạo và định kỳ thay vì hằng số trong mã
Đổi giờ và giờ máy chủBộ lọc giờ lệch một giờ sau đổi giờDùng giờ máy chủ nhà môi giới, quy đổi múi giờ rõ ràng, kiểm thử ranh giới đổi giờ
Cập nhật nền tảng hoặc hệ thốngKhởi động lại giữa phiên: bộ biểu đồ cùng chương trình gắn khôi phục theo hồ sơ, nhưng chương trình khởi tạo lại và tự động giao dịch chưa chắc bật [24]Cửa sổ cập nhật ngoài giờ giao dịch, tự khôi phục bộ biểu đồ, kiểm tra riêng tự động giao dịch sau khởi động
Hết dung lượng hoặc tiến trình lỗiNgừng ghi nhật ký, chương trình kết thúc không dấu vếtLuân chuyển tệp nhật ký, giám sát tài nguyên và tiến trình có thông báo

Kịch bản tự tái hiện: lệnh trùng sau kết nối lại

Mô tả riêng vì không thể chủ động gây ra chỉ bằng một lần nhấp. Nhóm biên tập chưa tái hiện tình huống này — phần sau không có kết quả đo hay hồ sơ môi trường của phép đo. Chỉ có cơ chế và hướng dẫn tự kiểm tra.

Điều kiện. Robot xác định điều kiện vào, gửi yêu cầu mở vị thế. Đang chờ phản hồi thì mất kết nối. Lệnh đã tới máy chủ và được thực hiện nhưng phản hồi không về. Robot ghi lỗi và kết luận chưa có vị thế.

Hệ quả dự kiến. Nếu khi nối lại điều kiện vẫn đúng, robot gửi lại. Tài khoản hedging có hai vị thế thay vì một, rủi ro thật gấp đôi kế hoạch. Netting ghi khác nhưng phơi nhiễm vẫn tăng: vị thế ròng lớn lên, robot vẫn thấy một lần vào. Đây là kết luận từ cơ chế, không phải số đọc từ thử nghiệm đã làm.

Cách tự kiểm tra. Tự tắt card mạng “ngay sau gửi” là trò may rủi, không phải quy trình. Không kiểm soát được yêu cầu đã tới máy chủ chưa; nếu chưa, bạn tái hiện việc khác – lệnh thất bại bình thường. Trên demo, quy tắc tường lửa hoặc công cụ chẩn đoán có thể ngắt có kiểm soát, nhưng xác nhận đã gửi không chứng minh thực hiện. Chỉ tái hiện được khi lịch sử máy chủ xác nhận thực hiện mà phần mềm không nhận phản hồi. Bộ kiểm thử chiến lược không tái hiện, nên thử thủ công và phải ghi hồ sơ. Ghi đầy đủ các mục sau; thiếu một mục thì kết quả không giúp kết luận, không so được lần khác:

  • nền tảng, phiên bản và số bản dựng phần mềm – đọc cửa sổ thông tin, không theo trí nhớ
  • nhà môi giới, số demo, máy chủ kết nối, loại tài khoản hedging hay netting – hệ quả tùy điều đó
  • mã đủ hậu tố nhà môi giới, khối lượng yêu cầu, chế độ thực hiện của công cụ
  • ngày giờ thử theo máy chủ nhà môi giới, không giờ địa phương
  • cách ngắt kết nối và thời điểm hiệu lực so lúc gửi – tham số duy nhất quyết định đang tái hiện trường hợp này hay trường hợp khác
  • kết quả: toàn bộ mục nhật ký robot đối chiếu lịch sử phía máy chủ. Lịch sử quyết định lệnh đã tới chưa – riêng nhật ký không đủ vì chính việc phần mềm không biết là hiện tượng đang nghiên cứu
  • số lần lặp và bao nhiêu lần cùng kết quả; một lần qua không chứng minh gì

Cần sửa thêm công thức thường được truyền sẵn. Magic number nhận diện chiến lược, không nhận diện ý định của từng lệnh: hai yêu cầu cùng robot có cùng mã nên riêng nó không đủ biết “lệnh cụ thể này đã gửi chưa”. Cần định danh bền vững cho từng quyết định, gán và ghi trước khi gửi, lưu ngoài bộ nhớ tiến trình. Chỉ vậy mới phân biệt khi đối soát “chưa gửi” với “đã gửi và chưa biết chuyện gì xảy ra”. Trường bình luận phù hợp để mang mã vào lệnh nhưng đôi khi máy chủ cắt hoặc ghi đè – coi là manh mối, quyết định bằng so bản ghi riêng với lịch sử máy chủ.

Biện pháp bảo vệ. Quy tắc đơn giản nhưng bất tiện: trạng thái tài khoản là chuẩn, không phải bộ nhớ robot. Sau mỗi yêu cầu thất bại hoặc chưa xác nhận kết quả, trước thử lại phải đọc vị thế hiện tại và giao dịch lịch sử gần nhất, kiểm tra lệnh đã có chưa – lọc theo định danh riêng. Khóa thời gian giữa các lần gửi cùng mã là bổ sung rẻ nhưng riêng nó chưa đủ.

Cùng nguyên tắc chặn nhóm tai nạn thứ hai: robot không kiểm tra phơi nhiễm gửi yêu cầu ở mỗi lần gọi liên tiếp khi thị trường nhanh. Hệ quả là lũ lệnh, cực đoan thì nhà môi giới hạn chế truy cập máy chủ. Kiểm tra trạng thái trước gửi và giới hạn thao tác mỗi đơn vị thời gian là hai điều kiện bắt buộc trước khi ra khỏi demo.

7. Duy trì hoạt động: máy tính, VPS, lưu trữ nền tảng — và phép tính chi phí

Hệ thống MetaTrader cổ điển cần phần mềm chạy. Đó là lý do duy nhất bàn lưu trữ – không phải tốc độ hay “chuyên nghiệp”, mà tiến trình tắt không tính gì. Ngoại lệ là đường đám mây cTrader Algo: cBot đáp ứng điều kiện có thể không cần VPS ngoài. Điều kiện này quan trọng vì cùng hệ sinh thái vẫn có chạy cục bộ, lúc đó toàn bộ câu hỏi lưu trữ trở lại. Giới hạn phiên bản thực thi tùy loại tài khoản, nhà môi giới; gói ngoài chỉ chạy đám mây khi thêm điều kiện.

Máy tính ở nhà thêm gì vào bài toán. Mất điện, khởi động lại sau cập nhật, đường mạng nhà cung cấp lỗi, hệ thống treo. Mỗi sự kiện cắt môi trường thực thi và toàn bộ logic robot. Không cắt SL, TP đã ghi trên máy chủ – chính ranh giới này giúp đánh giá thật sự mất gì khi sự cố.

VPS không làm gì. Không cải thiện chiến lược, không xóa trượt giá hay từ chối. Không bảo vệ khỏi sự cố nhà môi giới hoặc đường kết nối của họ với nhà cung cấp thanh khoản. Không bảo đảm liên tục – độ sẵn sàng công bố là cam kết hợp đồng, không phải định luật vật lý. Bạn mua một điều: loại phần cứng và đường mạng riêng khỏi danh sách nguyên nhân lỗi.

Kiến trúc minh họa: máy tính quản lý, VPS chạy phần mềm và EA, máy chủ giao dịch nhà môi giới.
EA trên VPS có thể chạy khi máy ở nhà tắt. VPS không bảo đảm thực hiện lệnh hay độ sẵn sàng hạ tầng nhà môi giới.

Hai sản phẩm khác nhau dưới một tên

“VPS” được dùng cho hai giải pháp quản trị hoàn toàn khác.

Máy chủ ảo có hệ điều hành đầy đủ được thuê như máy tính thường ở trung tâm dữ liệu. Kết nối màn hình từ xa, tự cài nền tảng, tự quản cập nhật, tự khởi động, giám sát và sao lưu cấu hình. Tự do đầy đủ – chạy nhiều nền tảng, tập lệnh giám sát riêng, công cụ chẩn đoán – và trách nhiệm bảo trì đầy đủ, gồm bảo mật truy cập từ xa.

Lưu trữ tích hợp nền tảng hoạt động khác. MetaTrader VPS khởi chạy ngay trong nền tảng, di chuyển môi trường bằng một lệnh; dịch vụ lưu trữ hệ thống tự động đang chạy và thuê bao sao chép tín hiệu, không cần quản trị Windows hay kết nối màn hình từ xa [6]. Đơn giản có giá: không cài tùy ý phần mềm và phải dùng trong tài nguyên giới hạn.

Tính đến 2026-08-22 — thông số và giá MetaTrader VPS theo MetaQuotes [6]. Dịch vụ công bố hơn ba mươi địa điểm, kết nối mạng tới 96% máy chủ môi giới dưới 10 ms và 84% dưới 3 ms, tối đa 3 GB bộ nhớ và 16 GB đĩa, độ sẵn sàng 99,99%. Giá theo kỳ có bốn bậc: từ 15 USD/tháng khi trả tháng, qua ba tháng và sáu tháng, đến 10 USD/tháng khi trả năm. Phép tính dưới chỉ dùng hai đầu để cho thấy khoảng chi phí. Đây là số nhà cung cấp và có thể thay đổi – kiểm tra lại trước mua. Thời gian truy cập mạng công bố mô tả đoạn mạng, không phải thực hiện lệnh; phần sau giải thích.

Tính chi phí hạ tầng bằng ví dụ rõ ràng

Dùng số từ bảng giá trên để ví dụ kiểm chứng được, không chỉ minh họa. Trả năm có chi phí 12 × 10 USD = 120 USD mỗi năm. Trả tháng, 12 × 15 USD = 180 USD mỗi năm.

Chi phí lưu trữ năm theo phần trăm tài khoản (tính đến 2026-08-22)
Quy mô tài khoản120 USD mỗi năm180 USD mỗi năm
2.000 USD6,00%9,00%
10.000 USD1,20%1,80%
25.000 USD0,48%0,72%

Kết luận giới hạn ở ví dụ. Tài khoản khoảng 2.000 USD mất vài phần trăm vốn mỗi năm riêng lưu trữ, trước cả chênh lệch và hoa hồng – cạnh tranh với kết quả có thể kỳ vọng thực tế. Tài khoản lớn gấp mười thì cùng dịch vụ chiếm một phần mười tỷ lệ vốn đó. Không suy ra VPS “đáng” hay “không đáng” với người khác; chỉ suy ra phải tính hạ tầng theo vốn riêng, không theo giá trên trang nhà cung cấp.

Chọn thông số và triển khai

Robot chỉ giao dịch đòi hỏi khiêm tốn – tải nặng đến từ tối ưu trong bộ kiểm thử, làm nơi khác được. Lưu ý trước bảng quan trọng hơn nội dung: số là minh họa, không từ phép đo cho bài hay yêu cầu hãng, chỉ cho thấy thông số cần kiểm tra. Tự đo – chạy cấu hình mục tiêu trên demo, đọc đỉnh bộ nhớ và CPU của tiến trình nền tảng từ trình quản lý tác vụ sau vài ngày rồi chọn máy theo đó.

Thông số máy — giá trị minh họa, không phải kết quả đo
Thông sốĐiểm khởi đầuLưu ý
Bộ nhớ2 GB mỗi phiên bản nền tảng với vài biểu đồChỉ báo tùy chỉnh và lịch sử dài tăng mức dùng; hãy tự đo
Bộ xử lý1–2 lõi cho riêng giao dịchNhiều lõi quan trọng cho tối ưu, không cho chạy hệ thống
ĐĩaLưu trữ thể rắn, dư chỗ cho nhật ký và lịch sửNhật ký tăng; lên kế hoạch luân chuyển tệp
Hệ thốngTương thích yêu cầu nền tảngLớp tương thích Linux cần kiểm tra các phiên bản OS, Wine, nền tảng và tiện ích đã chọn; hãng có hướng dẫn cài
Vị tríGần trung tâm dữ liệu máy chủ nhà môi giớiHỏi nhà môi giới máy chủ tài khoản ở đâu trước khi chọn
Độ sẵn sàngTheo cam kết hợp đồngChênh lệch 99,5% và 99,9% tương đương khoảng 44 và 9 giờ ngừng trong năm 365 ngày

Thị trường nhà cung cấp chia ba nhóm, khác ở ai chịu chi phí bảo trì chứ không phải giá. Lưu trữ nhà môi giới đôi khi ưu đãi theo mức hoạt động – tiện nhưng gắn với một nhà môi giới. Dịch vụ chuyên lưu trữ giao dịch đặt máy tại trung tâm dữ liệu của nhà môi giới FX. Đám mây công cộng phổ thông để toàn bộ cấu hình cho bạn. Tôi chủ ý không nêu tên: vị trí, khả năng và điều kiện đổi nhanh hơn bài; danh sách trong tài liệu giáo dục quá dễ thành khuyến nghị.

Danh sách kiểm tra triển khai lưu trữ:

  1. Chạy toàn cấu hình trên demo, giữ không theo số ngày cố định mà đến khi qua ba sự kiện: buộc khởi động lại máy, mất và khôi phục kết nối, đóng rồi mở thị trường cuối tuần. Sau đó mới đổi tài khoản
  2. Đặt cập nhật hệ thống ngoài giờ giao dịch, kiểm tra sau buộc khởi động lại
  3. Cấu hình tự khởi động nền tảng, khôi phục bộ biểu đồ cùng chương trình gắn
  4. Kiểm tra riêng tự động giao dịch có bật lại không – nền tảng khởi động chưa bảo đảm
  5. Giám sát độc lập độ sẵn sàng máy và riêng tiến trình nền tảng; ping không phát hiện ứng dụng treo
  6. Tắt làm tối màn hình và ngủ, luân chuyển nhật ký, theo dõi đĩa trống
  7. Bảo vệ từ xa bằng mật khẩu mạnh, duy nhất, đa yếu tố nếu nhà cung cấp có; giới hạn theo địa chỉ nếu được
  8. Sao lưu mẫu biểu đồ và bộ tham số. Không giữ đăng nhập tài khoản trong tệp cấu hình hay ghi chú – dùng trình quản lý mật khẩu
  9. Lập quy trình mất máy: khôi phục từ đâu, mất bao lâu

Điểm cuối hay bị bỏ. Lưu trữ chưa là bảo vệ nếu chưa biết dựng lại môi trường mất bao lâu và chưa thử trong điều kiện bình tĩnh.

8. Độ trễ — đo chính xác điều gì và phép đo không cho biết gì

“Ping 2 ms” không có nghĩa “thực hiện lệnh 2 ms”. Nên đọc hai lần vì bán hạ tầng giao dịch dựa vào làm mờ khác biệt. Độ trễ chuỗi có nhiều đoạn, đo riêng bằng công cụ và độ chính xác khác nhau.

ĐoạnPhạm viCách đo
Ping mạngThời gian gói đi đến máy chủ và quay lạiCông cụ hệ thống; nói về mạng, không phải ứng dụng
Phần mềm – máy chủ nhà môi giớiThời gian khứ hồi theo giao thức nền tảngChỉ báo kết nối trong nền tảng; đã bao gồm lớp ứng dụng
Gửi và tiếp nhận yêu cầuTừ lời gọi hàm đến phản hồi máy chủDấu thời gian nhật ký robot
Quan sát toàn tuyếnTừ gọi hàm gửi lệnh phía bạn đến giao dịch xuất hiện trong lịch sử – gồm truyền hai chiều và xử lý phía nhà môi giớiBộ đếm cục bộ độ phân giải cao đo khứ hồi; ghi riêng dấu thời gian giao dịch từ lịch sử máy chủ. Không tách được thời gian trong hạ tầng nhà môi giới nếu thiếu số liệu phía họ
Độ trễ dữ liệu thị trườngTuổi báo giá dùng quyết địnhĐọc giờ báo giá cuối bằng mã lúc quyết định

Tuyên bố lưu trữ gần như luôn nói đoạn đầu hoặc thứ hai. MetaQuotes nói từ MetaTrader VPS truy cập 96% máy chủ môi giới dưới 10 ms [6] là mô tả đoạn mạng. Không suy ra thời gian nhà môi giới thực sự hoàn tất giao dịch – còn tùy chính sách thực hiện, thanh khoản và tải máy chủ lúc đó.

So sánh hai thời gian tín hiệu khứ hồi giả định.
Ping thấp hơn không bảo đảm giá, tiếp nhận hay khớp nhanh hơn.

Phép đo duy nhất liên quan tài khoản của bạn đến từ dữ liệu riêng. Ghi ba dấu thời gian và hai mức giá: lúc quyết định với giá robot thấy, lúc gửi yêu cầu, thời điểm và giá thực hiện đọc từ phản hồi máy chủ. Sau chuỗi giao dịch đủ dài, bạn có phân phối chứ không phải con số đơn trên trang nhà cung cấp. Xem phân phối, không chỉ trung bình: lần chậm riêng lẻ quanh công bố hay thanh khoản mỏng quan trọng hơn trung vị yên tĩnh.

Một lưu ý quyết định phép đo có ý nghĩa không. Hai dấu đầu từ đồng hồ máy bạn, giờ giao dịch lịch sử từ đồng hồ máy chủ môi giới. Trừ lẫn hai đồng hồ thêm độ lệch chưa biết mà con số không lộ. Vì vậy đo khứ hồi cục bộ bằng một bộ đếm độ phân giải cao: từ gọi gửi đến nhận phản hồi. Ghi giờ giao dịch lịch sử cạnh đó như đại lượng riêng, không là đầu kia cùng đoạn. Thời gian trong hạ tầng môi giới chưa xác định nếu thiếu số liệu phía họ – đo toàn bộ và so giai đoạn được, không chia từng bước được.

Để đánh giá độ nhạy logic có bộ kiểm thử chiến lược MetaTrader 5, cho mô phỏng độ trễ thực hiện và nhiều mô hình tạo tick, kể cả tick thực nhà môi giới [7]. Đây không phải đo kết nối mà kiểm tra chiến lược có sống qua điều kiện xấu hơn không. Phương pháp đầy đủ thuộc bài về kiểm thử chiến lược.

Khi nào điều này đáng quan tâm

Câu trả lời từ phép tính, không từ niềm tin. Với chi phí cố định, tỷ trọng tăng khi giao dịch trung bình nhỏ lại. Giá trị dưới minh họa – giả định tổng chi phí mỗi giao dịch 2,0 pip, gồm chênh lệch, hoa hồng quy ra pip và trượt giá điển hình. Chi phí thực lấy từ đặc tả tài khoản và giao dịch riêng. Độ trễ không nằm và không thể nằm trong tổng: không phải chi phí theo pip mà là tham số mô hình thực hiện. Vì vậy bảng không đo hay kết luận gì về độ trễ.

Chi phí giao dịch theo phần trăm mục tiêu (minh họa, chi phí 2,0 pip)
Mục tiêuTỷ trọng chi phíHệ quả
5 pip40%Chi phí chi phối kết quả – riêng nó chiếm hai phần năm mục tiêu
10 pip20%Thực hiện vẫn quan trọng, cần đo dữ liệu riêng
20 pip10%Tác động thấy rõ nhưng không quyết định
50 pip4%Chi phí một giao dịch không còn là yếu tố quyết định

Với hệ thống nhắm vài chục pip, ví dụ gợi ý kiểm tra độ trễ có ảnh hưởng đáng kể không trước khi trả tiền giảm. Nhắm vài pip thì độ trễ, trượt giá là vấn đề chiến lược, không phải lưu trữ – máy chủ nào cũng không sửa được.

Tham số bảo vệ trước điều kiện thực hiện kém

Hai cơ chế cần nằm trong mã. Đầu tiên là lọc chênh lệch: trước mỗi quyết định so chênh hiện tại với ngưỡng, vượt thì không mở. Mô tả ngưỡng theo bội số chênh điển hình của công cụ trong giờ giao dịch, không dùng hằng số ghi cứng – cùng ngưỡng sẽ vô nghĩa ở mã và nhà môi giới khác.

Cơ chế thứ hai hay bị gọi là trần giá thực hiện phổ quát – chính xác là không phải. Độ lệch giá tối đa khi gửi chỉ thuộc một chế độ. Trợ giúp MetaTrader 4 kết luận một câu: “Độ lệch giá khi đặt lệnh chỉ dùng trong thực hiện tức thì” [18]. Trang cũng nói trường thật sự làm gì, ngược cách gọi “chống trượt giá”: “nếu lệch nhỏ hơn hoặc bằng tham số, thực hiện ở giá mới không thông báo thêm. Nếu không, nhà môi giới trả giá mới có thể thực hiện” [18]. Biến động trong giới hạn được thực hiện tại giá mới không thông báo; chỉ vượt mới có báo giá lại để xác nhận. Trong chế độ thị trường, không có trường này: trợ giúp MetaTrader 5 mô tả cho Instant Execution, còn Market Execution ngược lại – “nhà môi giới quyết định giá mà không thảo luận thêm với nhà giao dịch”; nói rõ “Gửi lệnh chế độ này là chấp nhận trước thực hiện tại giá đó” [11]. Giá do nhà môi giới đặt, gửi là đồng ý trước; biểu mẫu ở chỗ đó có Fill Policy, không phải độ lệch.

Nhà môi giới đặt chế độ riêng từng mã; câu đầu không phải “nhập bao nhiêu” mà “trường có áp dụng cho công cụ không” – xem đặc tả. Nếu có, bạn chọn giữa hai chi phí: giới hạn chặt tăng báo giá lại và yêu cầu không qua lần đầu; nới thì ít báo lại, nhiều lần khớp giá khác giá thấy khi quyết định. Coi giá trị là phần chiến lược, không chỉ cài kỹ thuật. Nếu không áp dụng, chỉ còn ghi chênh giá quyết định và thực hiện. Cả hai trường hợp đều nên ghi.

Biểu đồ chênh lệch giả định với cửa sổ minh họa biến động cao hơn.
Bộ lọc chênh lệch và giờ cần dùng đúng giờ máy chủ, quy tắc giờ mùa hè.
Đây là sơ đồ, không phải tập dữ liệu. Hình cho thấy cửa sổ chênh giãn lặp trong ngày, không từ đo một cặp ở một nhà cung cấp – không mã, nguồn, ngày, phương pháp phía sau. Chỉ đọc mô hình thật tại nơi mình giao dịch: ghi chênh mỗi báo giá vài ngày cùng giờ máy chủ, rồi suy ngưỡng từ phân phối. Nếu so nhà môi giới, thu cùng cửa sổ thời gian; khác đi là so điều kiện thị trường chứ không phải nhà cung cấp.

Cơ chế thứ ba dựa thời gian và đơn giản nhất: cửa sổ robot không mở vị thế mới. Giờ chuyển ngày và dữ liệu quan trọng là lúc chênh giãn, thanh khoản mỏng. Chặn vào vài dòng mã – với điều kiện tính theo giờ máy chủ, không giờ máy cục bộ, và đã thử hành vi ở ranh giới đổi giờ.

9. Cơ chế dừng khẩn cấp, giới hạn và tiêu chuẩn triển khai tối thiểu

Robot không có cơ chế dừng có thể tiếp tục thua trong phạm vi ký quỹ khả dụng. Không vì viết kém, mà vì không có điều kiện dừng. Dừng khẩn cấp không phải tính năng thêm; đó là điều kiện để nói hệ thống được quản lý thay vì chương trình bị thả tự chạy.

Các giới hạn mọi hệ thống tự động trên tài khoản thực cần có:

  1. Giới hạn sụt giảm vốn chủ sở hữu. Vượt mức giảm cho phép so đỉnh vốn thì robot đóng vị thế của mình, đọc tài khoản xác nhận không còn rồi mới dừng; nếu còn phải giữ hoạt động và báo động. Ngưỡng theo kế hoạch rủi ro đã chọn – phương pháp đặt thuộc tài liệu rủi ro; ở đây cần ngưỡng có trong mã, kiểm tra trước logic chiến lược
  2. Giới hạn lỗ ngày. Bộ đếm đặt lại vào giờ máy chủ xác định, dựng lại sau khởi động từ lịch sử thay vì chỉ bộ nhớ
  3. Giới hạn số vị thế mở. Trần cứng độc lập logic vào
  4. Giới hạn quy mô từng vị thế. Trần áp lên kết quả tính quy mô vị thế để lỗi phép tính không biến thành lệnh khối lượng quá lớn
  5. Bộ lọc chênh lệch và độ lệch giá tối đa nếu chế độ thực hiện của mã hỗ trợ. Cả hai đã mô tả ở phần trước
  6. Bộ lọc giờ. Cửa sổ robot không mở vị thế mới
  7. Phản ứng với kết nối lỗi. Phát hiện mất mạng hay báo giá cũ thì ngừng mở mới nhưng không mù quáng đóng cũ – đóng theo giá cũ đôi khi tệ hơn chờ

Thứ tự quan trọng. Điều kiện an toàn ở đầu xử lý sự kiện, trước mọi logic vào. Vi phạm thì chương trình không mở hay tăng phơi nhiễm – chỉ được đóng vị thế của mình và ghi sự kiện. Trở lại phải do con người chủ động quyết định, không tự chạy lại sau trì hoãn.

điều kiện dừng: vốn hiện tại < đỉnh vốn × (1 − mức giảm cho phép) → ghi nhật ký → đóng vị thế của mình → đếm lại phơi nhiễm riêng → chỉ gỡ chương trình khi không còn vị thế và không lỗi đóng → nếu không thì báo động, tiếp tục hoạt động

Dưới đây là phác thảo cuối và duy nhất đụng hàm đóng vị thế. Vì thế có hai cổng, cả hai ở giá trị mặc định, không trong bình luận. Thứ nhất: mặc định bật chế độ không thực thi – không gửi thao tác, chỉ ghi sẽ đóng gì. Thứ hai: trước báo giá đầu, đọc loại tài khoản, từ chối khởi tạo trên tài khoản không phải demo đến khi người đọc đặt xác nhận riêng rõ ràng. MQL4 đọc bằng AccountInfoInteger(ACCOUNT_TRADE_MODE), tài liệu phân biệt demo, thi đấu và thực [16]. Câu cảnh báo trong bình luận không phải bảo vệ; bảo vệ là mặc định phải chủ động đổi mới xảy ra hành động.

PHÁC THẢO CẤU TRÚC - ngắt khẩn cấp khi vốn chủ sở hữu sụt giảm
Ký hiệu định hướng cho MQL4. Đây không phải mã đầy đủ có thể biên dịch.

THIẾT LẬP ĐẦU VÀO - hai mục đầu quyết định an toàn

   DryRun := TRUE                            giá trị mặc định
      Chương trình không gửi thao tác. Nhật ký ghi những gì
      lẽ ra sẽ đóng: số lệnh, khối lượng và giá tham chiếu.
      Muốn đóng bất kỳ lệnh nào phải tự thay đổi thiết lập này.

   LiveAccountConsent := FALSE                giá trị mặc định
      Thiếu nó, chương trình từ chối khởi chạy trên tài khoản
      không phải demo. Không thể vô tình cấp chấp thuận này.

   MagicNumber    - mã định danh vị thế của chính bạn
   MaxDrawdownPct - mức giảm cho phép từ đỉnh vốn chủ sở hữu
   MaxDeviation   - chỉ hoạt động trong một chế độ thực thi,
                    xem đoạn bên dưới phác thảo

KHỞI ĐỘNG - OnInit()

   mode := AccountInfoInteger(ACCOUNT_TRADE_MODE)
   if mode != ACCOUNT_TRADE_MODE_DEMO
         and not LiveAccountConsent:
      ghi nhật ký: tài khoản không phải demo, chưa có chấp thuận
      kết thúc khởi tạo với lỗi (INIT_FAILED) - chỉ vậy
   peak       := AccountEquity()
   stopped    := FALSE
   lastAlert  := 0          dấu thời gian cảnh báo cuối

MỖI BÁO GIÁ - OnTick()

   if stopped:
      remaining := CountOwnPositions()
      if remaining > 0
            and TimeCurrent() - lastAlert >= 3600:
         ghi nhật ký: trạng thái đã dừng, remaining
         gửi cảnh báo cho người vận hành
         lastAlert := TimeCurrent()
      kết thúc xử lý báo giá này
         chương trình không tự thử đóng lại - lần thử tiếp theo
         do con người quyết định và thực hiện thủ công
   equity := AccountEquity()
   if equity > peak: peak := equity
   threshold := peak * (1 - MaxDrawdownPct / 100)

   if equity >= threshold:
      nhánh này rỗng - phác thảo chỉ giám sát ngưỡng
      và hoàn toàn không có logic vào lệnh

   nếu không:
      stopped := TRUE
      ghi nhật ký: equity, threshold, peak, dấu thời gian
      errors    := CloseOwnPositions()
      remaining := CountOwnPositions()
      if remaining == 0 and errors == 0 and not DryRun:
         ExpertRemove()          chỉ gỡ sau khi thành công
      nếu không:
         ghi nhật ký: errors, remaining
         gửi cảnh báo cho người vận hành
         lastAlert := TimeCurrent()
         KHÔNG gỡ chương trình - nó tiếp tục hoạt động, không mở
         gì mới, lặp cảnh báo và chờ con người

ĐÓNG - CloseOwnPositions() trả về số lỗi

   errors := 0
   for i from OrdersTotal() - 1 down to 0:

      if not OrderSelect(i, SELECT_BY_POS, MODE_TRADES):
         errors := errors + 1
         ghi nhật ký: vị trí i, GetLastError()
         chuyển sang mục tiếp theo       không được im lặng ở đây

      if OrderType() > OP_SELL: bỏ qua
                                     xử lý lệnh chờ riêng
      if OrderMagicNumber() != MagicNumber
            or OrderSymbol() != Symbol(): bỏ qua
                                     giữ lệnh khác và lệnh thủ công

      RefreshRates()
      price := MarketInfo(OrderSymbol(),
                          MODE_BID cho OP_BUY, MODE_ASK cho OP_SELL)
      if price <= 0:
         errors := errors + 1
         ghi nhật ký: không có báo giá, GetLastError()
         chuyển sang mục tiếp theo

      ticket := OrderTicket()
      volume := OrderLots()

      if DryRun:
         ghi nhật ký: SẼ ĐÓNG lệnh, volume, price
         chuyển sang mục tiếp theo       không gửi gì đến máy chủ

      if not OrderClose(ticket, volume, price, MaxDeviation):
         errors := errors + 1
         ghi nhật ký: số lệnh, GetLastError()

   return errors

XÁC NHẬN - CountOwnPositions()

   Duyệt danh sách lần nữa, trả về số vị thế có MagicNumber
   của bạn trên mã này, bỏ qua lệnh chờ như vòng lặp phía trên.
   Đây là đọc trạng thái tài khoản, không phải bộ nhớ chương trình -
   chỉ kết quả này quyết định có được kết thúc hay không.

Phác thảo không làm gì — quan trọng ngang những việc nó làm. Nó không xóa lệnh chờ, không xử lý đóng một phần, không sống qua khởi động lại: cờ dừng và đỉnh vốn ở bộ nhớ nên nền tảng chạy lại thì tính từ đầu. Cũng không tự thử đóng lại – đây là lựa chọn, không phải thiếu sót. Đóng thất bại thì vào trạng thái dừng và giữ ở đó: không mở mới, đếm vị thế riêng mỗi báo giá tiếp; còn dù một vị thế thì lặp nhật ký, cảnh báo không thường hơn mỗi giờ. Lần đóng tiếp do con người làm tay từ phần mềm hoặc ứng dụng nhà môi giới. Mô tả đó là đầy đủ: tự thử lại không thuộc phác thảo, không có chỗ chờ điền. Một quyết định là bắt buộc: chỉ gỡ chương trình sau đếm lại vị thế riêng, không còn vị thế và không lần đóng nào báo lỗi. Thứ tự quan trọng: tự gỡ vô điều kiện sau đóng lỗi sẽ bỏ lại phơi nhiễm và nhật ký, không còn ai trong hệ thống thử đóng. Vì vậy có lỗi hoặc vị thế còn thì giữ hoạt động và báo động.

Có việc trông như thực hành tốt nhưng không phải. RefreshRates() trả giá trị Boolean; coi false là lỗi sẽ sai: tài liệu MQL4 nói hàm trả true khi dữ liệu được làm mới, giải thích ngay “lý do duy nhất không làm mới được là dữ liệu đã là dữ liệu hiện tại của phần mềm phía khách” [17]. Vì vậy False nghĩa dữ liệu vốn đã hiện hành. Điều cần kiểm tra là giá đọc sau làm mới có dương không. Giá không là đọc đặc tả thất bại hoặc thiếu báo giá; gửi yêu cầu đóng tại đó sẽ bị từ chối.

Còn tham số độ lệch; lưu ý quan trọng hơn chính giá trị. MaxDeviation không phải trần giá phổ quát: chỉ thuộc Instant Execution; trong giới hạn nghĩa thực hiện giá mới không thông báo thêm – vượt mới gửi giá mới về xác nhận. Cơ chế và trích dẫn nguồn nằm ở phần độ trễ, rộng hơn trong bài về nền tảng; ở đây một hệ quả quan trọng. Giá trị khoảng ba point, tức 0,3 pip trên tài khoản năm chữ số, thường chép từ ví dụ không nghĩ, được chọn như vào lệnh yên tĩnh thay vì đóng khẩn cấp. Đóng khẩn cấp xảy ra lúc chênh giãn và trượt giá; ngưỡng chặt khiến máy chủ trả giá mới thay vì thực hiện, chương trình không xử lý báo giá lại sẽ còn vị thế và lỗi. Độ lệch thoát khẩn phải nới rõ hơn lúc vào – và phải gọi đúng: không tăng bảo vệ, mà đồng ý trước đóng ở giá xấu hơn giá quyết định để tăng khả năng yêu cầu qua. Bạn chọn giữa giá xấu và phơi nhiễm còn mở, không giữa an toàn và rủi ro. Nếu mã dùng Market Execution thì không có trường; nhà môi giới đặt giá, gửi là đồng ý trước, chỉ còn ghi giá đóng lệch bao xa so giá quyết định.

Bất đối xứng thứ hai không tùy chế độ mà về phạm vi. Ngưỡng tính từ AccountEquity(), tức vốn toàn tài khoản, nhưng chỉ đóng vị thế mã hiện tại. Cùng hệ thống chạy trên ba biểu đồ vượt ngưỡng sẽ chỉ đóng công cụ vừa có báo giá – phiên bản khác tiếp tục tính đỉnh riêng. Khi nhiều biểu đồ, phải tách giám sát rủi ro toàn tài khoản sang chương trình riêng. Mỗi khoảng trống là quyết định thiết kế riêng phải chủ động giải quyết trước khi mã đụng tiền thực.

Ba lớp bảo vệ

Không lớp nào đủ riêng vì mỗi lớp thất bại trong tình huống khác.

  1. Mã robot. Giới hạn nêu trên. Chỉ hoạt động khi chương trình chạy
  2. Máy chủ nhà môi giới. SL, TP gắn vị thế, gọi ký quỹ và tự đóng ở stop-out. Hoạt động độc lập môi trường của bạn – vì vậy mỗi vị thế tự động mở cần mức bảo vệ phía đó, không chỉ biến trong mã
  3. Con người. Điện thoại báo mở, đóng, dừng, lỗi; cùng khả năng đóng tay đã thử trong ứng dụng nhà môi giới. Lớp cuối khi hai lớp đầu thất bại

Phụ thuộc giữa lớp rất cụ thể. Riêng mức bảo vệ máy chủ không chặn chuỗi lỗ nhỏ, từng khoản trong rủi ro nhưng gộp làm cạn tài khoản – đó là việc giới hạn giảm vốn trong mã. Riêng giới hạn mã không giúp khi máy chạy phần mềm chết – lúc đó chỉ lớp môi giới. Thông báo thiếu hai lớp đầu chỉ kể lỗ đang tiến triển.

Bảo vệ cũng phải kiểm thử

Cơ chế chưa bao giờ kích hoạt chỉ là giả định, chưa phải bảo vệ. Thử trên demo qua hai giai đoạn vì giai đoạn đầu kiểm tra tính đúng rẻ hơn. Đầu tiên bật chế độ không thực thi, đặt ngưỡng đủ thấp để vượt trong một giờ. Chương trình không gửi mà ghi vị thế nào coi của mình, định làm gì. Danh sách không khớp – đôi lúc lần đầu do lọc mã hay định danh quá rộng – bạn biết mà chưa đóng gì. Chỉ khi khớp mới tắt chế độ đó, thử lại. Kiểm tra riêng ba việc: chỉ đóng vị thế riêng không, có ghi nhật ký không, có chỉ dừng sau xác nhận không còn gì mở không. Thử riêng mất kết nối: tắt mạng vài phút, kiểm tra sau nối lại robot đối soát lịch sử hay bắt đầu lại và mở vị thế thứ hai.

Sáu giai đoạn nghiên cứu, kiểm thử và giám sát EA.
Đổi quy tắc cần xác nhận lại; kết quả không được bảo đảm.

Tiêu chuẩn triển khai tối thiểu là: chương trình đã biên dịch có giới hạn, quyền kiểm tra cả ba cấp, quyết định ghi tệp, chạy môi trường mục tiêu trên demo qua buộc khởi động lại, mất mạng, cuối tuần; sau đó chỉ nếu kế hoạch rủi ro cho phép, dùng tài khoản thực khối lượng tối thiểu trước xét tăng phơi nhiễm. Bao nhiêu giao dịch và kết quả nào cho đi tiếp thuộc chủ đề riêng về xác nhận chiến lược — ở đây chỉ xét sẵn sàng vận hành.

Hệ thống tự động mua sẵn bên ngoài

Một lưu ý về sản phẩm trên chợ phần mềm vì liên quan an toàn vận hành. Tệp bán đã biên dịch, không đọc được logic: không kiểm tra được có giới hạn giảm vốn, vị thế có bảo vệ máy chủ hay khối lượng tăng sau chuỗi lỗ không. Đánh giá chiến lược cần công cụ trong phần kiểm thử; ở đây quy tắc đơn giản hơn – hệ thống không dự đoán được hành vi khi lỗi thì không giám sát an toàn được, dù đường hiệu quả đẹp thế nào.

Viết robot thường là phần dễ nhất. Duy trì khó hơn: mỗi tuần xem nhật ký từ chối và thời gian thực hiện bất thường, kiểm tra giảm vốn có đúng giả định, trả lời trung thực thị trường còn giống điều kiện đã thử không. Tự động hóa đưa thực hiện vào mã, loại một số lỗi người; không chuyển trách nhiệm – vẫn thuộc bạn cùng nghĩa vụ dừng kịp lúc.

FAQ — Tự động hóa, EA, MQL và lưu trữ

Expert Advisor của tôi thực sự chạy ở đâu?
Trong tiến trình phần mềm giao dịch, trên máy đang chạy phần mềm – cục bộ, máy chủ thuê hoặc lưu trữ tích hợp nền tảng. Nhà môi giới chỉ nhận yêu cầu giao dịch đã chuẩn bị và kiểm tra. Ngoại lệ là đường đám mây cTrader Algo, nơi cBot chạy trong môi trường nhà cung cấp, không cần ứng dụng người dùng mở.
Đóng phần mềm thì điều gì ngừng hoạt động?
Toàn bộ logic robot: bộ lọc, quản lý vị thế, giới hạn trong mã. SL, TP gắn vị thế vẫn còn vì máy chủ giữ. Trailing stop tích hợp MetaTrader ngừng dịch chuyển do tính phía khách – SL sửa cuối đã gửi vẫn ở máy chủ và bảo vệ. Với cTrader câu trả lời khác: hãng mô tả bảo vệ còn sau phiên, trailing stop loss hoạt động cả khi ứng dụng đóng hay mất kết nối [22] [23] [tính đến 2026-08-22]. Ngược lại, stop chỉ có trong biến robot biến mất cùng tiến trình – với nhà môi giới nó chưa từng tồn tại.
Mã MT4 có chạy trên MT5 không?
Không nếu chưa viết lại lớp giao dịch. Mô hình lệnh, vị thế, gửi yêu cầu và đọc chỉ báo đều khác; MQL5 dùng định danh và sao chép bộ đệm. Khác biệt không phải mô hình lập trình – cả hai hỗ trợ hướng đối tượng. Chuyển hệ thống đang chạy thì so từng giao dịch, không chỉ tổng.
cBot cTrader có cần ứng dụng đang chạy không?
Tùy chế độ thực thi. Cục bộ thì có. Đám mây thì tài liệu Spotware nói ứng dụng không cần mở hoặc kết nối internet. Giới hạn số phiên bản đồng thời và thời gian demo tùy loại tài khoản, có thể khác giữa nhà môi giới; kiểm tra tài liệu hiện hành trước thiết kế kiến trúc.
Tôi có cần VPS không?
Tùy logic có cần chạy liên tục và phục vụ tài khoản nào. Lưu trữ chỉ loại máy tính, kết nối riêng khỏi danh sách nguyên nhân sự cố. Không cải thiện chiến lược, xóa trượt giá hay bảo vệ khỏi lỗi nhà môi giới. Tính chi phí năm theo phần trăm vốn riêng: tài khoản nhỏ có thể mất vài phần trăm mỗi năm riêng hạ tầng.
Ping thấp có nghĩa thực hiện lệnh nhanh hơn không?
Không. Ping mô tả gói khứ hồi trong mạng. Thực hiện còn gồm xử lý yêu cầu máy chủ, chính sách môi giới và thanh khoản. Phép đo đáng tin cho tài khoản từ nhật ký riêng: so dấu thời gian quyết định, gửi, thực hiện trên chuỗi đủ dài; xem phân phối thay vì trung bình. Nhưng đừng lấy giờ thực hiện lịch sử tài khoản trừ giờ nhật ký riêng – đó là hai đồng hồ khác nhau, được bàn riêng ở phần độ trễ.
Làm sao thử dừng khẩn cấp mà không rủi ro tiền?
Hai giai đoạn, chỉ demo. Trước bật chế độ không thực thi: chương trình không gửi thao tác, chỉ ghi vị thế nào coi của mình và định làm gì. Danh sách khớp rồi tắt chế độ đó, thử lại với ngưỡng đủ thấp để vượt trong một giờ. Kiểm tra chỉ đóng vị thế riêng, sự kiện vào nhật ký, chỉ dừng sau xác nhận không còn gì mở. Thử mất mạng riêng: tắt vài phút, xem khi nối lại có đối soát lịch sử hay mở vị thế thứ hai.

Nguồn và tài liệu tham khảo

Tài liệu hãng mô tả trạng thái sản phẩm ngày xác minh 2026-08-22. Phiên bản, giới hạn, giá có thể thay đổi – kiểm tra nguồn lại trước quyết định.

  1. MetaQuotes Software Corp., “MQL4 Reference — Object-Oriented Programming” — tài liệu xác nhận MQL4 hỗ trợ lớp, kế thừa, hàm ảo và mẫu. docs.mql4.com/basis/oop
  2. MetaQuotes Software Corp., “MQL5 Reference” — hàm giao dịch, cấu trúc yêu cầu/phản hồi, thư viện chuẩn, xử lý định danh chỉ báo. mql5.com/en/docs
  3. Spotware Systems, “cTrader Algo” — tài liệu chính thức môi trường tự động; hỗ trợ C# và Python. help.ctrader.com/ctrader-algo
  4. Spotware Systems, “cTrader Algo — Cloud features” — cBot đám mây độc lập ứng dụng người dùng, giới hạn phiên bản thực và demo, quy tắc tùy nhà môi giới. help.ctrader.com/ctrader-algo/documentation/cloud-features
  5. Spotware Systems, “cTrader Open API” — trao đổi qua đối tượng JSON hoặc Google Protocol Buffers. help.ctrader.com/open-api
  6. MetaQuotes Software Corp., “MetaTrader VPS” — lưu trữ khởi chạy trong nền tảng, di chuyển môi trường, thông số mạng và giá công bố. Dữ liệu hãng. mql5.com/en/vps
  7. MetaQuotes Software Corp., “MetaTrader 5 — Strategy Tester” — mô hình tạo tick, tick thực từ nhà môi giới, mô phỏng trễ, kiểm thử đa tiền tệ và tiến. metatrader5.com/en/terminal/help/algotrading/testing
  8. MetaQuotes Software Corp., “MetaTrader 4 Help — Trailing Stop” — trailing stop chạy phía khách, khác SL, TP xử lý máy chủ. metatrader4.com/en/trading-platform/help/positions/trailing
  9. Ủy ban Chứng khoán và Giao dịch Mỹ, “SEC Charges Knight Capital With Violations of Market Access Rule”, thông cáo 2013-222 ngày 16 tháng 10 năm 2013 và thủ tục hành chính số 34-70694 — mô tả sự kiện ngày 1 tháng 8 năm 2012 và cơ chế kiểm soát còn thiếu. sec.gov/newsroom/press-releases/2013-222
  10. MetaQuotes Software Corp., “MQL4 Reference — Event Handling” — danh sách hàm sự kiện cùng chữ ký MQL4, gồm OnTimer() và OnChartEvent(). docs.mql4.com/basis/function/events
  11. MetaQuotes Software Corp., “MetaTrader 5 Help — Performing Deals” — trailing stop chạy nền tảng phía khách thay vì máy chủ như Stop Loss; cùng trang mô tả Deviation trong Instant Execution (“chênh lệch giữa giá thực hiện và giá chỉ định mà nhà giao dịch đồng ý”), Market Execution (“nhà môi giới quyết định giá không thảo luận thêm”; “gửi lệnh là đồng ý trước giá đó”) và Fill Policy. Kiểm tra ngày 2026-08-22. metatrader5.com/en/terminal/help/trading/performing_deals
  12. Finance Magnates, “Metaquotes Will No Longer Sell its MT4 Trading Platform”, ngày 12 tháng 1 năm 2018 — báo ngành về dừng bán giấy phép MT4 cho khách mới. Nguồn thứ cấp chỉ dùng xác định ngày; trạng thái hiện tại theo tuyên bố hãng – mục [19]. financemagnates.com
  13. Cơ quan Chứng khoán và Thị trường châu Âu, “Product Intervention Analysis — Measures on Contracts for Differences”, ESMA50-162-215, ngày 1 tháng 6 năm 2018 — số dư âm khách hàng cá nhân sau sự kiện franc ngày 15 tháng 1 năm 2015. esma.europa.eu
  14. MetaQuotes Software Corp., “MQL5 Reference — Event Handlers” — danh sách hàm sự kiện MQL5, gồm OnTrade(), OnTradeTransaction() và OnBookEvent(), được mô tả xử lý thay đổi độ sâu thị trường. mql5.com/en/docs/event_handlers
  15. MetaQuotes Software Corp., “MQL4 Reference — IsTradeAllowed” — mô tả: “Kiểm tra Expert Advisor được phép giao dịch và ngữ cảnh giao dịch không bận”. Kiểm tra ngày 2026-08-22. docs.mql4.com/check/istradeallowed
  16. MetaQuotes Software Corp., “MQL4 Reference — AccountInfoInteger” — đọc ACCOUNT_TRADE_MODE với phân biệt ACCOUNT_TRADE_MODE_DEMO, ACCOUNT_TRADE_MODE_CONTEST và tài khoản thực. Kiểm tra ngày 2026-08-22. docs.mql4.com/account/accountinfointeger
  17. MetaQuotes Software Corp., “MQL4 Reference — RefreshRates” — trả “True nếu cập nhật, không thì false”; lưu ý “lý do duy nhất không thể làm mới là dữ liệu đã hiện hành trong phần mềm phía khách”. Kiểm tra ngày 2026-08-22. docs.mql4.com/series/refreshrates
  18. MetaQuotes Software Corp., “MetaTrader 4 Help — Open Positions” — phạm vi trường lệch giá: “chỉ dùng trong chế độ thực hiện tức thì”; hoạt động: “nếu lệch nhỏ hơn hoặc bằng tham số, thực hiện giá mới không thông báo thêm. Nếu không, nhà môi giới trả giá mới có thể thực hiện”. Kiểm tra ngày 2026-08-22. metatrader4.com/…/positions_open
  19. MetaQuotes Software Corp., “MetaTrader 4 for Brokers” — hãng tuyên bố trên trang riêng: “Giấy phép MetaTrader 4 không còn bán. Chúng tôi tập trung phát triển MetaTrader 5, cập nhật về ý tưởng mới chỉ phát hành cho nền tảng đa tài sản này”. Kiểm tra ngày 2026-08-22. metatrader4.com/en/brokers
  20. BIS, Ủy ban Thị trường, “FX execution algorithms and market functioning”, báo cáo nhóm do Andréa M Maechler chủ trì, tháng 10 năm 2020, tr. 35 (tr. 41 theo PDF) — nguyên nhân sự kiện chớp nhoáng ngoại hối: “phân tích sự kiện gần đây cho thấy nhiều yếu tố như tập trung lệnh cắt lỗ hoặc nhân sự ít kinh nghiệm ngoài múi giờ chính của đồng tiền góp phần tạo sự kiện”. Lưu ý thuật ngữ: EA trong báo cáo là thuật toán thực hiện, không phải Expert Advisor. bis.org/publ/mktc13.pdf
  21. MetaQuotes Software Corp., “MetaTrader 4 Release Notes” — nhật ký bản MT4: 1460 ngày 5 tháng 3 năm 2026 (“cải thiện bảo mật quan trọng, sửa lỗi, tăng ổn định”), 1470 ngày 12 tháng 3 năm 2026 (“cải thiện dịch giao diện, sửa lỗi, tăng ổn định”). Kiểm tra ngày 2026-08-22. metatrader4.com/en/releasenotes
  22. Spotware Systems, “Trade protections in cTrader” — bảo vệ gồm trailing stop loss và hòa vốn: “Mọi bảo vệ hoạt động trên ứng dụng cTrader và tiếp tục sau khi phiên kết thúc”. Kiểm tra ngày 2026-08-22. help.ctrader.com/ctrader-web/trading/protections
  23. Spotware Systems, “cTrader Help — Trade Watch” — phạm vi: “Trailing stop loss hoạt động khi ứng dụng cTrader đóng hoặc mất kết nối”. Kiểm tra ngày 2026-08-22. help.ctrader.com/ctrader/interface/trade-watch
  24. MetaQuotes Software Corp., “MetaTrader 5 Help — Templates and Profiles” — nội dung hồ sơ: “Mẫu biểu đồ cùng EA đang chạy cũng lưu trong hồ sơ”; khôi phục: “Mở hồ sơ, mỗi biểu đồ và mọi cài đặt nằm đúng vị trí lúc lưu”. Kiểm tra ngày 2026-08-22. metatrader5.com/…/templates_profiles
  25. MetaQuotes, tài liệu: OnTick / NewTick, hàng đợi sự kiện và điều kiện không thêm NewTick mới. Truy cập: 2026-10-08.

Tiến độ học của bạn

Đã học xong bài này? Hãy tự đánh dấu. Mở hoặc cuộn trang không tự động đánh dấu hoàn thành.

Tiến độ cần JavaScript và bộ nhớ trình duyệt.

Chỉ lưu trong trình duyệt này. Không cần tài khoản, không đồng bộ giữa các thiết bị. Xóa dữ liệu trang web có thể làm mất tiến độ.

Jarosław Wasiński

Tổng biên tập, ForexMechanics.com • Chuyên gia phân tích vĩ mô và FX

Chuyên gia phân tích độc lập và chuyên nghiệp với hơn 20 năm kinh nghiệm trong các thị trường tài chính. Hoạt động trong lĩnh vực Forex từ năm 2004, tập trung vào phân tích cơ bản, cấu trúc thị trường OTC và quản lý rủi ro vốn một cách kỷ luật.

  • Người sáng lập và tổng biên tập của MyBank.pl, cung cấp giáo dục tài chính đáng tin cậy từ năm 2004.
  • Tác giả của hàng trăm bài bình luận thị trường chuyên sâu, phân tích cấu trúc và tài liệu giáo dục dành cho trader và nhà đầu tư.
  • Người ủng hộ sự minh bạch của thị trường, thúc đẩy giáo dục dựa trên dữ liệu cụ thể và các báo cáo của tổ chức (BIS, ESMA, CFTC).

Toàn bộ nội dung chỉ mang tính chất giáo dục và cung cấp thông tin – không phải là tư vấn đầu tư hay khuyến nghị bất kỳ. Xin lưu ý: giao dịch có đòn bẩy (Forex/CFD) tiềm ẩn rủi ro cao về mất vốn nhanh chóng.