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ư, bộ setting giao dịch hay hướng dẫn tăng rủi ro trên tài khoản thật.

Trả lời ngắn: EA Input là giá trị người dùng nhập để cấu hình chương trình. Trước khi đổi, cần biết giá trị đó điều khiển việc gì, dùng đơn vị nào, mặc định bao nhiêu, được phép nằm trong khoảng nào và phụ thuộc giá trị nào khác.

Kết quả thử trên dữ liệu quá khứ dù đẹp cũng không chứng minh cấu hình phù hợp với sản phẩm, tài khoản hoặc tương lai.

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

  • Cách lập “hộ chiếu” cho từng input.
  • Năm nhóm input khác nhau.
  • Vì sao zero, unit và dependency dễ gây lỗi.
  • Cách thử một thay đổi rồi rollback.

1. Input là cấu hình, không phải nút tăng lợi nhuận

a. Input đổi hành vi theo code đã viết

Trong MQL5, biến input là biến bên ngoài được người dùng thay trước khi chương trình chạy; giá trị không được sửa từ bên trong chương trình như biến thường. Input được khởi tạo lại trước OnInit(). MQL5 Reference — Input Variables

Điều đó không có nghĩa mọi ô trên tab Inputs đều quan trọng ngang nhau. Một ô có thể đổi màu panel; ô khác có thể đổi điều kiện risk. Muốn hiểu tác động, phải đọc code/tài liệu và contract.

b. Bảy trường của một input

Mỗi input nên có:

  1. Name: tên duy nhất.
  2. Purpose: nó thay đổi phần nào.
  3. Type: bool/int/double/enum/string...
  4. Unit: point, second, percent, currency...
  5. Default: giá trị nạp mặc định.
  6. Valid range: khoảng/giá trị hợp lệ.
  7. Dependency/Risk: phụ thuộc input nào và side effect gì.

Hình 1 — Một con số chỉ có nghĩa khi type, unit, range và dependency đều rõ.

Ví dụ MaxSpread = 15 vẫn mơ hồ nếu không biết đơn vị là point hay pip, symbol mấy digits và 0 nghĩa tắt filter hay range lỗi.

c. Default không phải “mức an toàn”

Default là giá trị được đặt sẵn khi chưa thay. Nó có thể chỉ là ví dụ phát triển, tương thích cũ hoặc baseline test. Gọi default là an toàn cần bằng chứng về symbol/account/version và risk policy; không được suy từ việc nó đi kèm file.

2. Năm nhóm input cần tách

a. Behavior và Risk

Behavior input đổi logic hoạt động: timeframe đọc, chu kỳ indicator hoặc mode. Risk input giới hạn exposure/action: cap, permission, loss rule. Hai nhóm này ảnh hưởng decision nên phải review chặt.

Không dùng tên để đoán. AggressiveMode có thể đổi nhiều rule cùng lúc; cần contract cụ thể.

b. Execution và Operations

Execution input liên quan cách tạo request: deviation, order type, retry rule. Operations input liên quan vận hành: timer, logging, file path, alert, recovery.

Execution không phải risk. Một retry nhiều lần có thể làm request lặp nếu idempotency yếu. Timer ngắn có thể tăng tải nhưng không làm dữ liệu chính xác hơn.

c. Display

Display input đổi màu, kích thước panel hoặc mức chi tiết hiển thị. Display lý tưởng không đổi decision. Nếu tắt panel lại làm strategy ngừng, boundary đáng nghi.

Hình 2 — Phân nhóm input giúp ưu tiên review những ô có thể đổi decision và side effect.

Tạo inventory với cột Group. Người vận hành sẽ biết thay màu panel khác mức rủi ro so với thay execution/risk.

d. Đọc label theo behavior, không theo cảm giác

Tên như SafeMode, SmartEntry hoặc AutoRisk nghe dễ hiểu nhưng không phải specification. Hỏi thẳng: mode bật sẽ đổi condition nào, branch nào bị bỏ qua, output/log nào chứng minh? Hai input có tên gần nhau vẫn có thể tác động khác hẳn.

Một cách audit là nối mỗi input tới component ở bài #8. SignalPeriod thuộc Signal; MaxSpread thuộc Risk; RetryDelay thuộc Execution/Operations; PanelColor thuộc Display. Nếu một input nối tới ba component, cần mô tả dependency và test cho từng side effect. Nhóm không chỉ để xếp đẹp; nó giúp tìm đúng owner khi hành vi khác expected.

3. Range, zero semantics và dependency

a. Range phải được validate ở OnInit

Range là tập giá trị hợp lệ. Ví dụ demo:

  • TimerSeconds: integer từ 1 đến 3600.
  • MaxSpread: integer lớn hơn 0.
  • RiskMode: enum OFF, DEMO_ONLY.

Nếu TimerSeconds = 0, OnInit nên trả lỗi có lý do thay vì chạy với timer không xác định. Tài liệu MQL5 khuyến nghị OnInit trả mã kết quả để báo initialization success/failure. MQL5 Reference — OnInit

b. Zero không có nghĩa phổ quát

Trong một EA, 0 có thể nghĩa “tắt”. Trong EA khác, 0 là giá trị thật hoặc invalid. Zero semantics phải ghi rõ.

Ví dụ:

  • MaxSpread = 0: invalid, fail init.
  • MaxRetries = 0: không retry.
  • PanelX = 0: tọa độ hợp lệ.

Đừng áp một ý nghĩa cho mọi input.

c. Dependency tạo tổ hợp hợp lệ

Dependency là quan hệ input này phụ thuộc input khác. Ví dụ RetryDelaySeconds chỉ có nghĩa khi MaxRetries > 0. RiskLimit có thể không dùng khi RiskMode = OFF.

Nếu user bật mode nhưng thiếu giá trị đi kèm, EA nên fail/disable rõ. Không âm thầm dùng default khác.

Một dependency phức tạp:

UseTimer = false thì TimerSeconds bị bỏ qua.

UI vẫn hiển thị hai ô không có nghĩa cả hai đang active. Documentation cần ghi “effective when”.

d. Effective config mới là cấu hình thật

Giá trị người dùng nhập chưa chắc là giá trị cuối cùng code dùng. EA có thể clamp về range, đổi theo symbol, bỏ qua vì mode tắt hoặc lấy fallback. Effective config là bộ giá trị sau validation/normalization mà engine thực sự dùng.

Startup log nên ghi cả requested và effective khi chúng khác nhau:

TimerSeconds requested=0 effective=REJECTED

hoặc:

DisplayMode requested=AUTO effective=COMPACT

Nếu code âm thầm đổi 0 thành 60, người dùng nhìn tab Inputs sẽ không giải thích được runtime. Normalization chỉ chấp nhận được khi rule được tài liệu hóa và log rõ; với input risk, fail-closed thường dễ audit hơn fallback bí mật.

4. Sai lầm, giới hạn và rủi ro

a. Đổi nhiều input cùng lúc

Nếu đổi MaxSpread, TimerSeconds và mode cùng lúc rồi kết quả khác, không biết biến nào gây ra. Cách đúng để hiểu causal effect là one-change: giữ baseline, đổi một input, test, compare, rollback.

b. Preset không có version

Preset là tập input lưu thành cấu hình. File preset thiếu EA version, symbol/account assumptions và checksum có thể nạp nhưng nghĩa đã đổi.

Ví dụ version mới đổi unit từ second sang millisecond. Giá trị 60 vẫn đọc được nhưng hành vi khác 1.000 lần. Preset phải đi cùng schema/version.

c. Optimization và overfitting

Strategy Tester có thể chạy nhiều tổ hợp input để optimization. MetaTrader 5 mô tả optimization là nhiều lần chạy với bộ parameter khác nhau. MetaTrader 5 Help — Strategy Optimization

Chọn bộ tốt nhất trên cùng dữ liệu dễ tạo overfitting: khớp nhiễu quá khứ. Optimization không biến input thành chân lý. Cần out-of-sample, robustness, cost assumptions và validation độc lập — nội dung sâu ở bài #10/#11.

d. Bốn lỗi khác

  1. Không ghi unit.
  2. Dùng string tự do thay enum có kiểm soát.
  3. Input risk không có hard cap.
  4. Log không in effective config khi startup.

Câu chắc chắn: input thay đổi được là bề mặt cấu hình.

Câu có điều kiện: nếu code validate đúng và test đủ, input hợp lệ có thể tạo hành vi dự đoán được trong scope test.

Nếu trước đây bạn nghĩ “input hợp lệ = input tốt”, cần sửa: validity chỉ là gate đầu.

e. Input còn có chi phí vận hành

Một input hợp lệ về type/range vẫn có thể gây tải. Timer 1 giây, log mức verbose hoặc history depth lớn có thể tăng CPU, disk và kích thước log. Execution retry hợp lệ có thể va rate limit. Vì vậy inventory nên có thêm Operational cost: tần suất, tài nguyên và giới hạn.

Input string còn có security boundary. File path, URL hoặc external identifier không nên được ghép/cho phép tùy tiện. Bài này không đi sâu AppSec, nhưng nguyên tắc là allowlist và quyền tối thiểu; không cấp DLL/WebRequest chỉ vì preset yêu cầu mà không rõ owner.

5. Checklist và one-change lab

a. Checklist đọc Inputs

  1. Ghi EA version/preset version.
  2. Export inventory Name/Group/Type/Unit/Default/Range.
  3. Ghi zero semantics.
  4. Ghi dependency và effective condition.
  5. Đánh dấu input đổi risk/execution.
  6. Xác nhận OnInit validation.
  7. Chụp baseline và expected output.
  8. Đổi một input mỗi run.
  9. So log/config/result.
  10. Rollback khi khác expected.

Khi không rõ unit, range hoặc dependency: giữ nguyên và hỏi owner. Không đoán bằng tên.

b. Bài tập 10–15 phút

Dùng Sheets/giấy miễn phí; không terminal/account/tiền thật. Tạo bảng:

Mẫu đối chiếu đã điền

Run MaxSpread TimerSeconds RiskMode Expected
Baseline 15 60 OFF INIT_OK
A 0 60 OFF REJECT_RANGE
B 15 30 OFF TIMER_30
C 15 30 ON Không so vì đổi 2 biến

Hình 3 — One-change giữ nguyên baseline để ta biết biến nào thực sự tạo khác biệt.

Run C cố tình sai phương pháp. Khoanh cả hai ô thay đổi và loại khỏi so sánh causal. Tạo lại C1 chỉ đổi mode; C2 chỉ đổi timer. Kết quả mong đợi là mỗi run có một biến độc lập và expected rõ.

c. Điểm dừng

Dừng nếu preset không có version, startup log không in effective config, input risk không có range hoặc kết quả không rollback được. Không chuyển bộ demo thành setting live.

6. Tổng kết

a. Năm ý chính

  • Input là bề mặt cấu hình, không phải nút tăng lợi nhuận.
  • Bảy trường giúp một input có nghĩa đầy đủ.
  • Behavior / Risk / Execution / Operations / Display cần tách.
  • Zero, unit và dependency phải ghi rõ.
  • One-change test tốt hơn đổi nhiều biến rồi đoán.

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

  • Vì sao MaxSpread=15 vẫn mơ hồ?
  • Default có đồng nghĩa an toàn không?
  • Run C trong bảng sai ở đâu?
  • Preset cần metadata gì?

c. Gợi ý đáp án

Xem gợi ý câu 1

Thiếu unit, range và zero semantics nên 15 chưa đủ nghĩa. Xem lại mục 1 và mục 3.

Xem gợi ý câu 2

Không; default chỉ là giá trị đặt sẵn, cần bằng chứng scope/risk. Xem lại mục 1.

Xem gợi ý câu 3

Run C đổi hai input nên không biết nguyên nhân. Xem lại mục 4 và mục 5.

Xem gợi ý câu 4

EA/schema version, assumptions và checksum/nguồn. Xem lại mục 4.

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

Thuật ngữ Giải thích ngắn
Input Tham số cấu hình đọc khi khởi tạo.
Type Kiểu dữ liệu của input.
Unit Đơn vị diễn giải giá trị.
Default Giá trị đặt sẵn khi chưa thay.
Range Tập giá trị hợp lệ.
Dependency Quan hệ input phụ thuộc input khác.
Preset Tập input lưu thành cấu hình.
Baseline Bộ giá trị mốc để so sánh.
Overfitting Khớp nhiễu quá khứ hơn quy luật bền.

e. Nguồn tham khảo

Bài trước: Các thành phần chính của một EA #8. Bài tiếp theo: Backtest EA là gì? #10.

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ư, bộ preset, setting live hoặc cam kết hiệu quả EA.