Bỏ qua

Tối ưu hóa cBot

Lệnh optimize thử nhiều giá trị tham số của cBot để tìm các tổ hợp đạt kết quả tốt theo những tiêu chí bạn chọn. Lệnh này thực hiện cùng phương pháp tìm kiếm bằng thuật toán di truyền hoặc tìm kiếm theo lưới như ứng dụng cTrader trên máy tính, nhưng được điều khiển từ terminal bằng một tệp JSON chứa các thiết lập tham số. Đây là lệnh tối ưu hóa tương ứng với lệnh backtest.

Phạm vi áp dụng

Lệnh optimize dùng để tối ưu hóa các tham số cBot. Chỉ báo và plugin có các lệnh riêng (indicator calculate, indicator history, create, build) và không thuộc phạm vi tối ưu hóa này.

Điều kiện tiên quyết

  • cTrader CLI đã được cài đặt và bạn có thể đăng nhập.
  • cBot đã được xuất thành tệp .algo và biên dịch cho .NET 8.
  • Có tệp tham số xác định các tham số cần thay đổi trong quá trình tìm kiếm.

Ghi chú

Lệnh optimize chỉ có trong phiên bản cTrader CLI chạy cục bộ. Lệnh này không có trong phiên bản nội bộ hoặc phiên bản đám mây.

Lệnh optimize

ctrader-cli optimize <path-to-algo-file> --params=<path-to-params-file> [options]

Đối số đầu tiên là đường dẫn đến tệp .algo. Bắt buộc phải có tùy chọn --params. Khung thời gian cơ sở phải được xác định bằng --timeframe hoặc trong tệp tham số. Nếu cả hai nơi đều không xác định khung thời gian, lệnh sẽ dừng và báo lỗi.

Các tùy chọn tối ưu hóa

Chỉ có --params là bắt buộc. Các tùy chọn không bắt buộc thường dùng trong ví dụ bên dưới gồm --timeframe, --method, --criteria, --optres và --passes-dir.

Bạn nên nắm rõ một số tùy chọn trước khi bắt đầu:

  • --method – genetic (mặc định) hoặc grid. Chọn grid nếu có ít tổ hợp tham số và bạn muốn thử tất cả. Nếu có nhiều tổ hợp và cách tìm kiếm có định hướng sẽ nhanh hơn, hãy chọn genetic.
  • --cores – số tiến trình xử lý song song thực hiện phần backtest của từng lượt chạy tối ưu hóa. Mỗi tiến trình sử dụng một luồng CPU, vì vậy quá trình tối ưu hóa dùng số luồng xấp xỉ giá trị được chỉ định. Chấp nhận các số nguyên từ 1 trở lên. Giá trị mặc định bằng một nửa số bộ xử lý cộng thêm một. Hãy giảm giá trị trên VPS cấu hình nhỏ để dành tài nguyên cho các tác vụ khác, hoặc tăng giá trị trên máy chuyên dụng để phân bổ tìm kiếm di truyền trên nhiều luồng hơn.
  • --auto-select-best – tự động chọn lượt chạy tốt nhất khi tối ưu hóa kết thúc, giúp bạn có ngay tệp .cbotset chứa bộ tham số hiệu quả nhất mà không cần thao tác thêm.

Ghi chú

Lệnh optimize sử dụng --timeframe, không phải --period. Các lệnh run và backtest vẫn sử dụng --period. Nếu truyền --period cho optimize, tùy chọn này sẽ bị từ chối vì không được nhận diện.

Tệp tham số

Tệp được chỉ định qua --params là một đối tượng JSON chứa mảng parameters. Tệp có cùng cấu trúc với tệp xuất từ giao diện tối ưu hóa của ứng dụng cTrader trên máy tính, nên bạn có thể sử dụng trực tiếp tệp đã xuất từ ứng dụng.

{
  "parameters": [
    { "Name": "SlowPeriods",  "Optimize": true, "Min": "5",  "Max": "50", "Step": "5" },
    { "Name": "StopLossPips", "Optimize": true, "Min": "10", "Max": "60", "Step": "5" },
    { "Name": "MAType",       "Optimize": true, "Values": ["0", "1", "2"] },
    { "Name": "MySymbol",     "Optimize": true, "Values": ["EURUSD", "GBPUSD"] }
  ]
}

Quy tắc đối với các trường

  • Trường Name là bắt buộc và phải khớp với tên thuộc tính của cBot. Chạy ctrader-cli metadata <path-to-algo> để xem các tên thuộc tính có sẵn. Nếu tên không có trong siêu dữ liệu của cBot, hệ thống sẽ ghi nhận vào nhật ký và bỏ qua tham số đó. Quá trình tối ưu hóa tiếp tục với các tham số còn lại.
  • Khi Optimize có giá trị true, tham số được đưa vào quá trình tìm kiếm. Khi có giá trị false, tham số được giữ cố định.
  • Các tham số dạng khoảng giá trị, chẳng hạn số nguyên và số thực độ chính xác kép, cần có Min, Max và Step nếu muốn quét nhiều giá trị.
  • Các tham số nhận giá trị rời rạc, như kiểu liệt kê và ký hiệu, cần có mảng Values không rỗng nếu muốn quét nhiều giá trị.
  • Trường ParameterType là không bắt buộc. Nếu không có trường này, kiểu dữ liệu sẽ được xác định từ siêu dữ liệu của cBot bằng cách đối chiếu với Name.

Cố định tham số ở một giá trị

Để giữ nguyên giá trị của một tham số, hãy thêm tham số đó với Optimize: false và giá trị Value tương ứng:

{ "Name": "MAType",      "Value": "1", "Optimize": false },
{ "Name": "FastPeriods", "Value": "5", "Optimize": false }

Cảnh báo

Các thiết lập trong tệp tham số được ưu tiên áp dụng. Trước khi áp dụng tệp, cTrader CLI đặt lại toàn bộ thiết lập tham số để chỉ những tham số được liệt kê với Optimize: true mới được đưa vào tìm kiếm. Tham số hoàn toàn không xuất hiện trong tệp sẽ giữ giá trị mặc định, ngay cả khi cBot mặc định đặt tham số đó là tham số cần tối ưu hóa. Để đưa một tham số vào quá trình tối ưu hóa, hãy thêm tham số đó với Optimize: true.

Tối ưu hóa khung thời gian chính

Ngoài các tham số cBot, lệnh optimize còn có thể thử nhiều khung thời gian chính. Khung thời gian chính có thể được lấy từ hai nguồn, trong đó --timeframe được ưu tiên.

  • --timeframe <tf> – một giá trị sẽ cố định khung thời gian chính; nhiều giá trị phân tách bằng dấu phẩy sẽ cho phép thử các khung thời gian khác nhau.
  • Tệp tham số – tệp xuất từ ứng dụng trên máy tính đã có sẵn một tham số khung thời gian tổng hợp dành riêng cho mục đích này.

Khung thời gian cơ sở của dữ liệu là giá trị duy nhất được chỉ định, giá trị đã cố định hoặc khung thời gian nhỏ nhất trong các giá trị được thử.

Khả năng tương thích giữa khung thời gian và chế độ dữ liệu

Các khung thời gian chính, dù được thử hay cố định, đều phải tương thích với --data-mode đã chọn.

Chế độ dữ liệu Các khung thời gian chính hợp lệ
open Các khung thời gian cùng loại và là bội số nguyên chính xác của khung thời gian nhỏ nhất đã chọn.
m1 hoặc m1-csv Mọi khung thời gian dựa trên thời gian; các loại không dựa trên thời gian như Renko và biểu đồ thanh theo biên độ giá sẽ bị từ chối.
ticks Mọi khung thời gian không phải loại tùy chỉnh.

Ghi chú

Tổ hợp không hợp lệ sẽ khiến lệnh dừng trước khi tải dữ liệu và hiển thị các giá trị gây ra lỗi.

Tiêu chí

Mỗi mục trong --criteria ghép một chỉ số hiệu suất với hướng max hoặc min, chẳng hạn NetProfit:max. Bảng dưới đây liệt kê toàn bộ tên chỉ số được hỗ trợ và ý nghĩa của chúng.

Chỉ số Đại lượng được đo
NetProfit Lãi hoặc lỗ cuối cùng, tính theo đơn vị tiền tệ của tài khoản
ProfitFactor Tổng lãi chia cho tổng lỗ
MaxEquityDrawdownPercentages Mức sụt giảm lớn nhất theo tỷ lệ phần trăm của vốn tức thời từ đỉnh xuống đáy
MaxBalanceDrawdownPercentages Mức sụt giảm lớn nhất theo tỷ lệ phần trăm của số dư từ đỉnh xuống đáy
MaxEquityDrawdown Mức sụt giảm tuyệt đối lớn nhất của vốn tức thời, tính theo đơn vị tiền tệ của tài khoản
MaxBalanceDrawdown Mức sụt giảm tuyệt đối lớn nhất của số dư, tính theo đơn vị tiền tệ của tài khoản
WinningTrades Số giao dịch đã đóng có lãi
LosingTrades Số giao dịch đã đóng bị lỗ
TotalTrades Tổng số giao dịch đã đóng
AverageTrade Lãi ròng chia cho số giao dịch đã đóng

Để tối đa hóa lãi ròng đồng thời giảm thiểu mức sụt giảm tối đa của vốn tức thời:

--criteria="NetProfit:max,MaxEquityDrawdownPercentages:min"

Nếu muốn tự xác định cách xếp hạng, hãy sử dụng --fitness thay thế. Phương thức GetFitness của cBot trả về một điểm số và quá trình tối ưu hóa giữ lại những lượt chạy có điểm số cao nhất. --fitness và --criteria loại trừ lẫn nhau. Chỉ được chỉ định một trong hai.

Các tùy chọn ngữ cảnh kiểm thử

optimize sử dụng lại các tùy chọn ngữ cảnh kiểm thử của backtest. Bảng dưới đây liệt kê những tùy chọn mà CLI hiện tại hỗ trợ, chức năng của từng tùy chọn và điểm khác biệt giữa hai lệnh nếu có.

Tùy chọn Chức năng Khả năng sử dụng
--account Số tài khoản giao dịch. Cả hai
--symbol Ký hiệu dùng để kiểm thử. Cả hai
--start Ngày và giờ bắt đầu khoảng thời gian kiểm thử. Cả hai
--end Ngày và giờ kết thúc khoảng thời gian kiểm thử. Cả hai
--balance Số dư ban đầu của mô phỏng. Cả hai
--data-mode open, m1, m1-csv, tick-csv hoặc ticks. Cả hai
--data-file Đường dẫn đến tệp CSV dùng cho m1-csv hoặc tick-csv. Cả hai
--commission Mức phí hoa hồng cho mỗi giao dịch. Cả hai
--spread Chênh lệch giá tính bằng pip. Cả hai
--precise-conversion Sử dụng quy đổi chính xác giữa các cặp tiền tệ khác nhau. Cả hai
--timeframe Khung thời gian cơ sở dùng để tìm kiếm tham số. Chỉ optimize
--period Khung thời gian cơ sở dùng khi chạy kiểm thử. Chỉ backtest
--report Đường dẫn lưu báo cáo HTML. Chỉ backtest
--report-json Đường dẫn lưu báo cáo JSON. Chỉ backtest

Ghi chú

Các tùy chọn báo cáo không áp dụng cho optimize. Thay vào đó, hãy dùng --optres và --passes-dir để lưu kết quả.

Ví dụ

ctrader-cli optimize "C:/test/Sample Trend cBot.algo" \
  --params=C:/test/optimize-params.json \
  --account=1234567 --symbol=EURUSD --timeframe=h1,h2 \
  --start="01/01/2025" --end="01/02/2025" \
  --balance=100000 --data-mode=open --commission=30 --spread=2 \
  --method=grid \
  --criteria="NetProfit:max,MaxEquityDrawdownPercentages:min" \
  --auto-select-best \
  --optres=C:/test/result.optres \
  --passes-dir=C:/test/result-passes \
  --ctid=letstrade --pwd-file=C:/test/password.pwd

Đầu ra

Trong khi chạy, optimize liên tục hiển thị tiến trình trên terminal:

Progress | Loading EURUSD, h1 | 42.00 % |
Progress | Optimization | 37.50 % |
  • Tóm tắt – khi hoàn tất, cTrader CLI in tóm tắt lên terminal, gồm tổng số lượt chạy, thời gian đã trôi qua và lượt chạy tốt nhất cùng các số liệu thống kê.
  • Tệp kết quả – khi chỉ định --optres, cTrader CLI lưu toàn bộ kết quả vào tệp JSON .optres liệt kê tất cả lượt chạy. Tệp này có cùng định dạng với kết quả tối ưu hóa trong ứng dụng trên máy tính, nên bạn có thể mở hoặc nhập tệp vào giao diện tối ưu hóa của ứng dụng.
  • Báo cáo theo lượt chạy – khi chỉ định --passes-dir, cTrader CLI lưu các tệp báo cáo của từng lượt chạy trong thư mục này. Mỗi lượt chạy có một thư mục con chứa các tệp .html, .txt, .json và .cbotset. Tệp .cbotset ghi lại chính xác các giá trị tham số được dùng trong lượt chạy đó.

Nếu không chỉ định cả --optres lẫn --passes-dir, quá trình tối ưu hóa kết thúc và chỉ hiển thị phần tóm tắt.

Ghi chú

Lệnh optimize không tạo báo cáo HTML tổng hợp. Tuy nhiên, nếu chỉ định --passes-dir, các tệp HTML của từng lượt chạy vẫn được lưu trong thư mục đó.

Kiểm tra việc áp dụng tối ưu hóa có chính xác hay không

Sau khi chạy, hãy kiểm tra xem những tham số dự định tối ưu hóa có thực sự được đưa vào tìm kiếm hay không.

  1. Mở tệp .cbotset của một lượt chạy trong --passes-dir và kiểm tra xem các tham số được tối ưu hóa có thay đổi giữa các lượt chạy, trong khi các tham số cố định hoặc bị bỏ qua vẫn giữ nguyên.
  2. Nếu bạn đã thử nhiều khung thời gian, hãy kiểm tra giá trị Chart.Period trong tệp .cbotset của từng lượt chạy. Giá trị này phải khớp với những khung thời gian đã chọn.
  3. Mở tệp .optres hoặc nhập tệp vào giao diện tối ưu hóa của ứng dụng trên máy tính để xem lại cấu hình cùng kết quả của tất cả lượt chạy.

Kiểm tra tính hợp lệ và các lỗi thường gặp

Mỗi hàng trong bảng dưới đây cho biết dấu hiệu lỗi, nguyên nhân có thể xảy ra, mã thoát mà cTrader CLI trả về khi gặp lỗi và cách xử lý tiếp theo. cTrader CLI trả về mã thoát khác 0 cho mọi lỗi kiểm tra tính hợp lệ. Vì vậy, tập lệnh có thể dừng ngay khi gặp lỗi đầu tiên mà không cần phân tích thông báo.

Trong bảng, mã thoát là giá trị cTrader CLI trả về cho shell. Các mã số cụ thể không được công bố. Vì vậy, non-zero biểu thị lệnh thất bại nhưng không có mã riêng được công bố; unknown biểu thị lỗi nội bộ, cần chuyển sang bản dựng khác hoặc liên hệ bộ phận hỗ trợ.

Dấu hiệu Nguyên nhân có thể xảy ra Mã thoát Cách xử lý tiếp theo
Lỗi kiểm tra tính hợp lệ: thiếu --params Chưa cung cấp tệp tham số JSON. khác 0 Chỉ định --params=<path>.
Lỗi kiểm tra tính hợp lệ: khung thời gian không xác định Giá trị --timeframe không khớp với bất kỳ mã định danh được công nhận nào. khác 0 Chạy ctrader-cli periods và sử dụng một trong các mã định danh được liệt kê.
Lỗi kiểm tra tính hợp lệ: khung thời gian chính không hợp lệ Có khung thời gian không tương thích với --data-mode đã chọn. khác 0 Chọn khung thời gian khác hoặc giá trị --data-mode khác.
Lỗi kiểm tra tính hợp lệ: cặp tiêu chí sai định dạng Tên chỉ số không đúng hoặc hướng không phải max hay min. khác 0 Sử dụng một trong các tên chỉ số được hỗ trợ cùng với max hoặc min.
Lỗi kiểm tra tính hợp lệ: chỉ số tiêu chí không xác định Tên được chỉ định trong --criteria không nằm trong danh sách chỉ số được hỗ trợ. khác 0 Sử dụng một trong các tên chỉ số được liệt kê ở mục Criteria.
Lỗi kiểm tra tính hợp lệ: giá trị --method không xác định Giá trị --method không phải genetic hay grid. khác 0 Sử dụng --method=genetic (mặc định) hoặc --method=grid.
Chỉ định đồng thời --fitness và --criteria Hai tùy chọn này không thể dùng cùng nhau. khác 0 Chỉ định --fitness hoặc --criteria, không dùng cả hai.
Không thể sử dụng optimize Đang sử dụng phiên bản CLI nội bộ hoặc trên đám mây. không xác định Chuyển sang phiên bản cục bộ dành cho người dùng.