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ỹ.

- 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.
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.
- 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.
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ăng | Expert Advisor | Tập lệnh | Chỉ báo tùy chỉnh |
|---|---|---|---|
| Vòng đời | Liê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úc | Liê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ạy | Không có quyền hàm giao dịch |
| Sự kiện chính | OnTick() | OnStart() | OnCalculate() |
| Vẽ trên biểu đồ | Có thể, nhưng không phải vai trò chính | Không điển hình | Nhiệm vụ cốt lõi |
| Cách dùng điển hình | Giao dịch tự động, quản lý vị thế | Thao tác hàng loạt: đóng vị thế, đặt mức | Chỉ báo dao động, vùng, bảng đa khung |
| Số lượng trên một biểu đồ | Một | Mỗi lần một | Nhiề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.
| Tiêu chí | MQL4 (MetaTrader 4) | MQL5 (MetaTrader 5) |
|---|---|---|
| Lập trình hướng đối tượng | Hỗ trợ | Hỗ trợ |
| Mô hình giao dịch | Danh sách chung lệnh và vị thế | Tách lệnh, vị thế và giao dịch |
| Gửi yêu cầu | Mộ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áo | Trả 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ễm | Vị 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ẩn | 9 | 21 |
| Bộ kiểm thử chiến lược | Mộ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ớ.
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ường | MetaTrader (MQL4 / MQL5) | cTrader Algo |
|---|---|---|
| Ngôn ngữ | MQL4 hoặc MQL5 | C# hoặc Python |
| Trình soạn thảo và công cụ | MetaEditor tích hợp nền tảng | Trình soạn thảo trong ứng dụng, có thể dùng IDE bên ngoài |
| Gói bên ngoài | Không có trình quản lý gói; tích hợp qua thư viện hệ thống | Có, 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êng | Lưu trữ nền tảng hoặc VPS chạy phần mềm | cBot chạy đám mây hoặc VPS |
| Giao diện lập trình ngoài nền tảng | Python tích hợp phần mềm, giải pháp tùy chỉnh | Open API (JSON hoặc Protobuf), FIX API riêng |
| Kho mã có sẵn | Rất lớn, chất lượng rất khác nhau | Nhỏ hơn đáng kể |
| Khả năng sử dụng | Tùy dịch vụ nhà môi giới | Tù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ện | Bảo vệ bằng mã hoặc quy trình |
|---|---|---|
| Kết nối lại sau mất mạng | Bộ 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ưa | Sau 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ùng | Hai vị thế giống nhau mở cách vài giây | Kiể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ối | Kiể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ới | Robot 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ớp | Yêu cầu bị từ chối vì khối lượng sai | Chuẩ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ại | Kiể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ình | Lú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õi | Lư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ống | Khở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ỗi | Ngừng ghi nhật ký, chương trình kết thúc không dấu vết | Luâ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.

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 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.
| Quy mô tài khoản | 120 USD mỗi năm | 180 USD mỗi năm |
|---|---|---|
| 2.000 USD | 6,00% | 9,00% |
| 10.000 USD | 1,20% | 1,80% |
| 25.000 USD | 0,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ố | Điểm khởi đầu | Lư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ịch | Nhiều lõi quan trọng cho tối ưu, không cho chạy hệ thống |
| Đĩa | Lư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ống | Tương thích yêu cầu nền tảng | Lớ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ới | Hỏi nhà môi giới máy chủ tài khoản ở đâu trước khi chọn |
| Độ sẵn sàng | Theo cam kết hợp đồng | Chê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ữ:
- 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
- Đặ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
- 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
- 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
- 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
- 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
- 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
- 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
- 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ạn | Phạm vi | Cách đo |
|---|---|---|
| Ping mạng | Thời gian gói đi đến máy chủ và quay lại | Cô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ới | Thời gian khứ hồi theo giao thức nền tảng | Chỉ 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ầu | Từ 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ến | Từ 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ới | Bộ đế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ường | Tuổ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 đó.
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ễ.
| Mục tiêu | Tỷ trọng chi phí | Hệ quả |
|---|---|---|
| 5 pip | 40% | Chi phí chi phối kết quả – riêng nó chiếm hai phần năm mục tiêu |
| 10 pip | 20% | Thực hiện vẫn quan trọng, cần đo dữ liệu riêng |
| 20 pip | 10% | Tác động thấy rõ nhưng không quyết định |
| 50 pip | 4% | 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.
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ó:
- 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
- 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ớ
- Giới hạn số vị thế mở. Trần cứng độc lập logic vào
- 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
- 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
- Bộ lọc giờ. Cửa sổ robot không mở vị thế mới
- 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.
- Mã robot. Giới hạn nêu trên. Chỉ hoạt động khi chương trình chạy
- 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ã
- 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.
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?
Đóng phần mềm thì điều gì ngừng hoạt động?
Mã MT4 có chạy trên MT5 không?
cBot cTrader có cần ứng dụng đang chạy không?
Tôi có cần VPS không?
Ping thấp có nghĩa thực hiện lệnh nhanh hơn không?
Làm sao thử dừng khẩn cấp mà không rủi ro tiền?
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.
- 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
- 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
- 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
- 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
- Spotware Systems, “cTrader Open API” — trao đổi qua đối tượng JSON hoặc Google Protocol Buffers. help.ctrader.com/open-api
- 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
- 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
- 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
- Ủ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
- 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 - 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
- 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
- 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
- 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 - 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
- MetaQuotes Software Corp., “MQL4 Reference — AccountInfoInteger” — đọc
ACCOUNT_TRADE_MODEvới phân biệtACCOUNT_TRADE_MODE_DEMO,ACCOUNT_TRADE_MODE_CONTESTvà tài khoản thực. Kiểm tra ngày 2026-08-22. docs.mql4.com/account/accountinfointeger - 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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.