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
.algovà 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ặcgrid. Chọngridnế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ọngenetic.--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.cbotsetchứ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
Namelà bắt buộc và phải khớp với tên thuộc tính của cBot. Chạyctrader-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
Optimizecó 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,MaxvàStepnế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
Valueskhông rỗng nếu muốn quét nhiều giá trị. - Trường
ParameterTypelà 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ớiName.
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.optresliệ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,.jsonvà.cbotset. Tệp.cbotsetghi 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.
- Mở tệp
.cbotsetcủa một lượt chạy trong--passes-dirvà 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. - Nếu bạn đã thử nhiều khung thời gian, hãy kiểm tra giá trị
Chart.Periodtrong tệp.cbotsetcủ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. - Mở tệp
.optreshoặ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. |