Trả lời ngắn: Kiến trúc Expert Advisor là cách chia một EA thành các khối có trách nhiệm rõ, rồi quy định dữ liệu và quyền cập nhật trạng thái đi qua chúng thế nào. Một kiến trúc dễ kiểm tra thường tách lớp nhận event, pipeline quyết định, khối thực thi và vòng xác nhận từ terminal.

Đọc xong, bạn sẽ hiểu:

  • Vì sao kiến trúc không được đo bằng số file hay số class.
  • Event, snapshot, signal, filter, risk và execution nối với nhau thế nào.
  • Vì sao gửi request chưa đồng nghĩa đã có position.
  • Cách điền một Architecture Card trong 10–15 phút mà không giao dịch.

Lưu ý giáo dục: Bài này dạy cách tổ chức một hệ thống phần mềm. Ví dụ “EA Mây X”, tín hiệu và thông số rủi ro đều là dữ liệu giả để học kiến trúc, không phải chiến lược, tín hiệu giao dịch hay lời hứa lợi nhuận.

1. Kiến trúc EA là bản đồ trách nhiệm, không phải số lượng file

a. Câu hỏi kiến trúc cần trả lời

Expert Advisor, viết tắt là EA, là chương trình chạy trong MetaTrader để đọc dữ liệu và thực hiện quy tắc đã viết sẵn. Nếu khái niệm này còn mới, hãy đọc EA là gì? trước.

Kiến trúc là cách hệ thống phân chia trách nhiệm, truyền dữ liệu và quy định ai được thay đổi trạng thái. Nó phải trả lời được bốn câu:

  1. Điều gì bắt đầu một lượt xử lý?
  2. Dữ liệu nào được chụp để các khối cùng sử dụng?
  3. Khối nào được ra quyết định hoặc gửi yêu cầu?
  4. Nguồn nào xác nhận trạng thái cuối cùng?

Một EA có mười file vẫn rối nếu ba file cùng gửi lệnh. Module là khối có một trách nhiệm chính; tách file không tự chứng minh trách nhiệm đã được tách.

b. Ví dụ bếp nhà hàng

Hãy hình dung một bếp nhỏ. Chuông gọi món là event; người điều phối chuyển phiếu tới đúng trạm; thu ngân xác nhận thanh toán. Tương tự, signal không tự gửi request và state không đánh dấu “đã có position” chỉ vì execution vừa thử gửi. So sánh này chỉ giải thích phân vai; hàng đợi event và trade server — hệ thống tiếp nhận, xử lý yêu cầu giao dịch — có quy tắc riêng.

c. Có người điều phối, nhưng không có “siêu khối”

Orchestration, hay điều phối, gọi các module đúng thứ tự và chuyển đầu ra giữa chúng. Nếu nó tự đọc indicator (chỉ báo), tạo signal, tính risk, gửi request rồi sửa state, nó thành “god function”. Với EA nhỏ, vài hàm rõ tên có thể đủ; chỉ tách thêm lớp khi ranh giới giúp kiểm tra hoặc truy lỗi.

2. Vỏ event: Init, Tick, Timer, TradeTransaction và Deinit

a. Event không phải vòng lặp tự do

Event là một sự kiện do terminal đưa tới. Tick là một lần cập nhật giá mới; candle là cây nến gom dữ liệu trong một khoảng thời gian; timer là bộ hẹn giờ. Event handler là hàm MT5 gọi để EA xử lý một loại event.

Theo MetaQuotes, NewTick được tạo khi mã gắn trên chart nhận tick mới. Event được xử lý tuần tự; nếu NewTick đang nằm trong hàng đợi hoặc được xử lý, NewTick khác không được thêm tiếp.

Vì vậy, OnTick() càng nặng càng dễ xử lý chậm. Kiến trúc phải chọn việc nào cần mỗi tick, candle mới hoặc timer.

b. Năm cửa vào có vai trò khác nhau

  • OnInit() chuẩn bị indicator handle — mã tham chiếu để EA làm việc với một chỉ báo — cùng timer và cấu hình; lỗi tài nguyên quan trọng phải được báo và dừng an toàn. OnInit
  • OnTick() nhận NewTick, thường để kích hoạt snapshot hoặc kiểm tra candle mới.
  • OnTimer() dành cho việc định kỳ không cần từng tick. OnTimer
  • OnTradeTransaction() nhận thay đổi liên quan request, order, deal và position. OnTradeTransaction
  • OnDeinit() dọn timer, handle và tài nguyên phù hợp. OnDeinit

Hình 1 — Event mở đúng cửa xử lý; nó không tự thay thế phần quyết định bên trong.

c. AutoTrading tắt không có nghĩa EA ngừng chạy

Tắt AutoTrading ngăn EA gửi trade request mới nhưng không ngăn EA chạy hoặc xử lý OnTick(). MetaQuotes Vì vậy, kiểm tra quyền giao dịch ngay trước đường tạo hành động; đừng giả định state tự mất khi nút tắt.

3. Tám khối tạo thành pipeline quyết định

Ta dùng một ví dụ xuyên suốt tên EA Mây X. EA giả này chỉ quan sát candle M5 đã đóng và một đường MA minh họa. Các điều kiện không được kiểm định và không dùng để giao dịch.

a. Từ event đến trade intent

Snapshot là ảnh chụp dữ liệu tại một thời điểm. Data module tạo một gói nhất quán thay vì để signal, filter và risk đọc các thời điểm khác nhau. Giống ảnh hiện trường, snapshot chỉ đúng trong phạm vi và thời gian đã ghi.

Signal là nhận định từ quy tắc; ở đây là “close trước nằm trên MA”, chưa phải lệnh. Filter chặn hoặc cho signal đi tiếp. Risk giới hạn quyền hành động. Khi cả ba qua, orchestrator mới tạo trade intent. Thấy mây giống signal; quyết định mang ô giống intent.

Câu đoán chắc là: “close trên MA thì EA chắc chắn có position”. Câu đúng có điều kiện là: “nếu signal xuất hiện, filter và risk đều cho qua, request được xử lý và terminal xác nhận, position mới có thể đổi”. Cách hiểu đầu tiên sai ngay khi bất kỳ bước nào bị chặn hoặc không được xác nhận.

b. Bản đồ tám trách nhiệm

Khối Đầu vào Đầu ra Không được tự làm
Event shell Event từ terminal Lượt xử lý có context Tự tạo signal
Data / snapshot Market và account data Gói dữ liệu có thời điểm Gửi request
Signal Snapshot BUY, SELL hoặc WAIT theo quy tắc Tự chọn khối lượng
Filter Signal và snapshot Cho qua hoặc chặn kèm lý do Sửa signal để ép qua
Risk Intent sơ bộ và mức rủi ro đang mở Cho phép, giới hạn hoặc từ chối Giả định position đã tồn tại
Trade intent Các kết quả đã qua kiểm tra Hành động mong muốn có key Gọi trade server
Execution Intent hợp lệ Request và kết quả kỹ thuật Tự xác nhận position
State / log Confirmation và snapshot mới State đối chiếu cùng dấu vết lý do Viết lại lịch sử để khớp kỳ vọng

Standard Library có CExpert, CExpertSignal, CExpertMoneyCExpertTrailing. Đây không phải mẫu bắt buộc, nhưng là ví dụ tách điều phối, signal và money/risk. Expert Base Classes

Hình 2 — Một EA rõ trách nhiệm có ba lớp: nhận event, ra quyết định và xác nhận trạng thái.

c. State và log phải trả lời “vì sao”

State là trạng thái EA đang tin là hiện tại. Nguồn sự thật không phải Boolean tự đặt, mà là dữ liệu mới từ terminal/account. Log, hay audit trail, ghi event, snapshot ID, quyết định, intent key, kết quả request và state sau đối chiếu. Reason code như SNAPSHOT_STALE hay REQUEST_REJECTED giúp phân biệt đứng ngoài có chủ ý với lỗi.

4. Vòng xác nhận: request không đồng nghĩa đã có position

a. Năm khái niệm phải tách

Đường đi tối giản là:

intent → request → order → deal → position → refresh state

  • Intent: hành động EA muốn thực hiện sau các bước kiểm tra nội bộ.
  • Request: yêu cầu kỹ thuật được gửi tới trade server.
  • Order: chỉ thị giao dịch được hệ thống ghi nhận để xử lý.
  • Deal: một lần khớp thực tế.
  • Position: trạng thái nắm giữ hiện tại. Ở chế độ netting, mỗi mã được gộp thành một position; ở hedging, tài khoản có thể giữ nhiều position riêng trên cùng mã.

Một lần gửi không hoàn tất cả chuỗi. Một request có thể tạo nhiều trade transaction; EA không được giả định thứ tự chúng tới. MetaQuotes

Hình 3 — Chỉ cập nhật state theo điều terminal đã xác nhận, không theo điều EA vừa yêu cầu.

b. Ví dụ lỗi state đến sớm

Nếu EA Mây X đặt hasPosition = true ngay sau khi gửi, state có thể đi trước sự thật. Request có thể bị từ chối hoặc order chưa khớp. EA nên giữ trạng thái “chờ xác nhận”, xử lý transaction rồi đọc lại account. Giống chuyển khoản, bấm “gửi” khác nhận biên nhận; MT5 còn có order, deal và position riêng.

c. Chống thực thi trùng bằng intent key

Idempotency nghĩa là xử lý lặp cùng ý định không tạo thêm hành động ngoài dự kiến, như quét lại một mã vé không sinh thêm ghế. Intent key có thể ghép mã giao dịch, chiến lược, hướng và candle. Tuy vậy, khởi động lại có thể mất bộ nhớ; EA vẫn phải đối chiếu account thật.

5. Năm lỗi kiến trúc và Architecture Card 15 phút

a. Năm dấu hiệu cần dừng lại

  1. Mọi việc nằm trong OnTick(). Dấu hiệu không phải số dòng, mà là đọc data, tạo signal, tính risk, gửi request và sửa state đan vào nhau.
  2. Nhiều owner cùng có quyền gửi. Signal module và recovery module đều gọi execution trực tiếp, khiến thứ tự và giới hạn khó kiểm.
  3. Dữ liệu không cùng snapshot. Signal dùng candle đã đóng nhưng filter đọc spread hoặc position ở thời điểm khác mà không ghi lại.
  4. Gửi xong là tự nhận đã khớp. State đổi theo kỳ vọng thay vì confirmation và snapshot mới.
  5. Không có đường lỗi. Indicator handle lỗi, dữ liệu thiếu hoặc quyền trade tắt nhưng pipeline vẫn tạo hành động.

Fail-closed nghĩa là thiếu dữ liệu hoặc tài nguyên quan trọng thì không tạo hành động mới. Nó không có nghĩa tự đóng terminal hay mọi position; position mở cần chính sách khẩn cấp riêng. Kiến trúc rõ giúp test, không chứng minh lợi nhuận và không thay thế validation.

b. Checklist trước khi thêm một module

  • Module này sở hữu đúng trách nhiệm nào?
  • Input có snapshot ID hoặc thời điểm rõ chưa?
  • Output là dữ liệu, quyết định hay side effect?
  • Ai là owner duy nhất được gửi request?
  • Nguồn sự thật để xác nhận state là gì?
  • Request lỗi hoặc khởi động lại thì đi đường nào?
  • Cùng intent chạy hai lần có bị trùng không?

Hình 4 — Sáu câu hỏi ngắn đủ để lộ phần trách nhiệm còn chồng chéo hoặc thiếu đường lỗi.

c. Bài tập 10–15 phút, chưa dùng tiền thật

Dùng giấy hoặc Google Docs. Tạo tám dòng: Event, Snapshot, Signal, Filter, Risk, Intent, Confirmation và Stop condition; ghi owner và đường lỗi. Không cần compile, bật AutoTrading hay gửi lệnh.

d. Mẫu tham khảo đã điền

Dòng Architecture Card Mẫu EA Mây X Owner Nếu lỗi
Event NewTick, chỉ đánh giá khi có candle M5 đã đóng mới Event shell Ghi NO_NEW_BAR, không tạo intent
Snapshot Candle M5 vừa đóng, MA demo, spread và position đọc cùng lượt Data module Snapshot thiếu hoặc cũ thì dừng
Signal Close trước nằm trên MA, chỉ là ví dụ học tập Signal module Trả WAIT, không gửi request
Filter Candle mới và dữ liệu/spread hợp lệ theo cấu hình demo Filter module Trả reason code cụ thể
Risk Giới hạn giả lập 0,5% để điền card, không áp dụng tài khoản thật Risk module Từ chối nếu input không hợp lệ
Intent Một yêu cầu BUY demo có key chống lặp Orchestrator Key đã có thì không tạo intent mới
Confirmation Nhận transaction rồi đọc lại position State module Không đối chiếu được thì giữ fail-closed
Stop condition Handle lỗi, snapshot thiếu, quyền trade tắt hoặc state lệch Event shell Không tạo hành động giao dịch mới

Tự hỏi: mỗi quyền đã có một owner chưa; request bị từ chối thì state đi đâu; hai tick có tạo hai intent không? Đây là bài thiết kế, không dùng tiền thật.

6. Tổng kết: ba lớp, một nguồn sự thật

a. Năm ý chính

  • Event shell nhận Init, Tick, Timer, TradeTransaction hoặc Deinit và mở đúng workflow.
  • Decision pipeline dùng một snapshot nhất quán qua signal, filter, risk và intent.
  • Execution chỉ gửi request; confirmation loop mới đối chiếu order, deal và position.
  • Mỗi quyền quan trọng cần một owner; state giao dịch phải bám dữ liệu terminal/account mới.
  • Kiến trúc giúp kiểm tra và truy lỗi, không chứng minh chiến lược sẽ sinh lời.

Bài tiếp theo của series là Tick, Candle và Event trong MT5 #2. Nếu nền tảng MetaTrader còn lạ, bài MT5 là gì? sẽ giúp bạn hiểu môi trường trước khi đi sâu vào event.

b. Câu hỏi tự kiểm tra

  • Vì sao tách một EA thành nhiều file chưa đủ để gọi là kiến trúc rõ?
  • Signal khác trade intent ở điểm nào?
  • Khi nào state nội bộ được phép chuyển sang “đã có position”?
  • Fail-closed trong bài này có nghĩa gì?

c. Gợi ý đáp án

Xem gợi ý câu 1

Cần tách trách nhiệm, input/output và quyền cập nhật; số file không tự tạo ranh giới. Xem lại mục 1.

Xem gợi ý câu 2

Signal là nhận định; intent là hành động mong muốn sau filter và risk. Xem lại mục 3.

Xem gợi ý câu 3

Sau confirmation phù hợp và khi EA đã đọc lại nguồn sự thật từ terminal/account. Xem lại mục 4.

Xem gợi ý câu 4

Khi thiếu dữ liệu hoặc tài nguyên quan trọng, mặc định không tạo hành động giao dịch mới. Xem lại mục 5.

d. Thuật ngữ cần nhớ

Thuật ngữ Giải thích ngắn
Event Sự kiện terminal đưa tới EA để xử lý
Snapshot Gói dữ liệu được chụp nhất quán tại một thời điểm
Signal Nhận định từ quy tắc chiến lược, chưa phải lệnh
Trade intent Hành động mong muốn sau các bước kiểm soát
Request Yêu cầu kỹ thuật gửi tới trade server
Deal Một lần giao dịch được khớp
Position Trạng thái nắm giữ hiện tại trên tài khoản
Fail-closed Thiếu điều kiện quan trọng thì không tạo hành động mới

e. Nguồn tham khảo

Nội dung này phục vụ mục đích giáo dục, không phải lời khuyên đầu tư hoặc tín hiệu giao dịch. EA và mọi thị trường đều có rủi ro kỹ thuật lẫn rủi ro mất vốn.