콘텐츠로 이동

cBot 최적화하기

optimize 명령어는 선택한 평가 기준에서 좋은 결과를 내는 조합을 찾기 위해 cBot 매개변수의 여러 값을 탐색합니다. cTrader 데스크톱 애플리케이션과 동일한 유전 알고리즘 방식 또는 그리드 방식으로 탐색하지만, 터미널과 매개변수 설정이 담긴 JSON 파일을 사용해 실행합니다. 백테스트 명령어에 대응하는 최적화 명령어입니다.

적용 범위

optimize 명령어는 cBot 매개변수를 최적화합니다. 지표와 플러그인에는 각각 별도의 명령어(indicator calculate, indicator history, create, build)가 있으며, 최적화 대상에는 포함되지 않습니다.

사전 요구 사항

  • cTrader CLI가 설치되어 있고 로그인할 수 있어야 합니다.
  • cBot을 .algo 파일로 내보내고 .NET 8용으로 컴파일해야 합니다.
  • 탐색할 매개변수를 정의한 매개변수 파일이 필요합니다.

참고

optimize 명령어는 cTrader CLI의 로컬 에디션에서만 사용할 수 있습니다. 내부용 버전이나 클라우드 버전에는 포함되어 있지 않습니다.

optimize 명령어

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

첫 번째 인수는 .algo 파일의 경로입니다. --params 옵션은 필수입니다. 기본 시간 프레임은 --timeframe 또는 매개변수 파일에서 지정해야 합니다. 어느 쪽에서도 지정하지 않으면 명령어가 오류와 함께 중단됩니다.

최적화 옵션

필수 옵션은 --params뿐입니다. 다음 예제에서 사용하는 일반적인 선택 옵션에는 --timeframe, --method, --criteria, --optres, --passes-dir가 있습니다.

시작하기 전에 알아둘 만한 옵션은 다음과 같습니다.

  • --method – genetic(기본값) 또는 grid. 매개변수 조합이 적고 모든 조합을 시험하려면 grid를 선택하세요. 조합이 많아 탐색 범위를 효율적으로 좁히는 편이 빠르다면 genetic을 선택하세요.
  • --cores – 각 최적화 패스의 백테스트 단계를 병렬로 실행하는 작업자 프로세스 수입니다. 작업자 하나가 CPU 스레드 하나를 사용하므로, 최적화에 사용되는 스레드 수는 지정한 값과 거의 같습니다. 1 이상의 정수를 사용할 수 있습니다. 기본값은 프로세서 수의 절반에 1을 더한 값입니다. 소형 VPS에서는 다른 작업에 필요한 자원을 남겨 두도록 값을 낮추세요. 전용 컴퓨터에서는 값을 높여 더 많은 스레드에서 유전 알고리즘 탐색을 수행할 수 있습니다.
  • --auto-select-best – 최적화가 끝나면 최상의 패스를 자동으로 선택해, 성능이 가장 좋은 매개변수를 담은 .cbotset 파일을 추가 단계 없이 사용할 수 있게 합니다.

참고

optimize 명령어는 --period가 아닌 --timeframe을 사용합니다. run과 backtest 명령어는 계속 --period를 사용합니다. optimize에 --period를 전달하면 알 수 없는 옵션으로 간주되어 거부됩니다.

매개변수 파일

--params로 지정하는 파일은 parameters 배열을 포함하는 JSON 객체입니다. cTrader 데스크톱 애플리케이션의 최적화 화면에서 내보낸 파일과 구조가 같으므로, 데스크톱에서 내보낸 파일을 그대로 사용할 수 있습니다.

{
  "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"] }
  ]
}

필드 규칙

  • Name은 필수이며 cBot 속성 이름과 일치해야 합니다. 사용 가능한 속성 이름은 ctrader-cli metadata <path-to-algo>를 실행해 확인하세요. cBot 메타데이터에 없는 이름은 로그에 기록되고 해당 매개변수는 건너뜁니다. 나머지 매개변수에 대한 최적화는 계속 진행됩니다.
  • Optimize를 true로 설정하면 해당 매개변수를 탐색에 포함합니다. false로 설정하면 해당 매개변수의 값을 고정합니다.
  • 정수나 배정밀도 실수(double)처럼 범위로 값을 지정하는 매개변수를 탐색하려면 Min, Max, Step이 필요합니다.
  • 열거형이나 심벌처럼 개별 값 중에서 선택하는 매개변수를 탐색하려면 비어 있지 않은 Values 배열이 필요합니다.
  • ParameterType은 선택 사항입니다. 이 필드가 없으면 Name과 일치하는 cBot 메타데이터를 바탕으로 유형을 결정합니다.

매개변수를 단일 값으로 고정하기

값을 고정하려면 Optimize: false와 해당 Value를 지정해 매개변수를 추가하세요.

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

경고

매개변수 파일의 설정이 우선 적용됩니다. cTrader CLI는 파일을 적용하기 전에 모든 매개변수 설정을 초기화하므로, Optimize: true로 명시한 매개변수만 탐색합니다. 파일에 아예 포함되지 않은 매개변수는 cBot에서 기본적으로 최적화 대상으로 설정되어 있어도 기본값으로 고정됩니다. 최적화에 포함하려는 매개변수는 Optimize: true로 추가하세요.

기본 시간 프레임 최적화하기

optimize 명령어는 cBot 매개변수뿐 아니라 여러 기본 시간 프레임도 탐색할 수 있습니다. 기본 시간 프레임은 두 곳에서 가져올 수 있으며 --timeframe이 우선합니다.

  • --timeframe <tf> – 값을 하나 지정하면 기본 시간 프레임이 고정되고, 쉼표로 구분한 여러 값을 지정하면 시간 프레임을 탐색합니다.
  • 매개변수 파일 – 데스크톱 애플리케이션에서 내보낸 파일에는 이를 위한 합성 시간 프레임 매개변수가 이미 포함되어 있습니다.

데이터의 기본 시간 프레임은 하나만 지정한 경우 그 값, 고정된 값 또는 탐색 대상 중 가장 짧은 시간 프레임입니다.

시간 프레임과 데이터 모드의 호환성

탐색하거나 고정하는 기본 시간 프레임은 선택한 --data-mode와 호환되어야 합니다.

데이터 모드 사용 가능한 기본 시간 프레임
open 동일한 유형이며 선택한 가장 짧은 시간 프레임의 정확한 정수배인 시간 프레임.
m1 또는 m1-csv 시간을 기준으로 하는 모든 시간 프레임이 허용됩니다. 렌코(Renko)나 레인지 바처럼 시간에 기반하지 않는 유형은 거부됩니다.
ticks 사용자 지정 시간 프레임을 제외한 모든 시간 프레임.

참고

호환되지 않는 조합을 지정하면 데이터를 불러오기 전에 명령어가 중단되며 문제가 된 값이 표시됩니다.

평가 기준

--criteria의 각 항목은 성과 지표와 max 또는 min 방향을 짝지어 지정합니다. 예를 들어 NetProfit:max입니다. 아래 표에는 지원되는 모든 지표 이름과 각 지표가 측정하는 항목이 나와 있습니다.

지표 측정 항목
NetProfit 계정 통화로 표시한 최종 이익 또는 손실
ProfitFactor 총이익을 총손실로 나눈 값
MaxEquityDrawdownPercentages 평가금이 최고점에서 최저점까지 하락한 최대 비율
MaxBalanceDrawdownPercentages 잔고가 최고점에서 최저점까지 하락한 최대 비율
MaxEquityDrawdown 계정 통화로 표시한 평가금의 최대 절대 하락액
MaxBalanceDrawdown 계정 통화로 표시한 잔고의 최대 절대 하락액
WinningTrades 이익으로 청산된 거래 수
LosingTrades 손실로 청산된 거래 수
TotalTrades 청산된 전체 거래 수
AverageTrade 순이익을 청산된 거래 수로 나눈 값

순이익을 극대화하면서 평가금의 최대 낙폭을 최소화하려면 다음과 같이 지정합니다.

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

사용자 지정 순위 기준을 사용하려면 대신 --fitness를 지정하세요. cBot의 GetFitness 메서드는 점수를 반환하며, 최적화는 반환값이 가장 높은 패스를 유지합니다. --fitness와 --criteria는 동시에 사용할 수 없습니다. 둘 중 하나만 지정하세요.

테스트 환경 옵션

optimize는 backtest의 테스트 환경 옵션을 동일하게 사용합니다. 아래 표에는 현재 CLI에서 허용하는 옵션, 각 옵션의 기능 및 필요한 경우 두 명령어의 차이점이 나와 있습니다.

옵션 기능 사용 가능한 명령어
--account 거래 계정 번호. 둘 다
--symbol 테스트할 심벌. 둘 다
--start 테스트 기간의 시작 날짜와 시간. 둘 다
--end 테스트 기간의 종료 날짜와 시간. 둘 다
--balance 시뮬레이션의 초기 잔고. 둘 다
--data-mode open, m1, m1-csv, tick-csv 또는 ticks. 둘 다
--data-file m1-csv 또는 tick-csv에 사용할 CSV 파일 경로. 둘 다
--commission 거래당 수수료 금액. 둘 다
--spread 핍(pip) 단위 스프레드. 둘 다
--precise-conversion 서로 다른 통화 간 환산에 정확한 환율 계산을 사용합니다. 둘 다
--timeframe 매개변수 탐색을 위한 기본 시간 프레임. optimize 전용
--period 실행을 위한 기본 시간 프레임. backtest 전용
--report HTML 보고서를 저장할 경로. backtest 전용
--report-json JSON 보고서를 저장할 경로. backtest 전용

참고

보고서 옵션은 optimize에 적용되지 않습니다. 결과를 저장하려면 대신 --optres와 --passes-dir을 사용하세요.

예제

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

출력

optimize는 실행 중 진행 상황을 터미널에 계속 표시합니다.

Progress | Loading EURUSD, h1 | 42.00 % |
Progress | Optimization | 37.50 % |
  • 요약 – 최적화가 끝나면 cTrader CLI가 총 패스 수, 경과 시간, 최상의 패스와 해당 통계를 터미널에 표시합니다.
  • 결과 파일 – --optres를 지정하면 cTrader CLI가 모든 패스의 전체 결과를 .optres 형식의 JSON 파일로 저장합니다. 이 파일은 데스크톱 애플리케이션의 최적화 결과와 동일한 형식을 사용하므로, 데스크톱 최적화 화면에서 열거나 가져올 수 있습니다.
  • 패스별 보고서 – --passes-dir을 지정하면 cTrader CLI가 해당 디렉터리에 각 패스의 보고서 파일을 저장합니다. 패스마다 .html, .txt, .json, .cbotset 파일이 들어 있는 하위 폴더가 생성됩니다. .cbotset 파일에는 해당 패스에서 사용한 매개변수의 정확한 값이 표시됩니다.

--optres와 --passes-dir을 모두 지정하지 않으면 최적화가 완료된 후 요약만 표시됩니다.

참고

optimize 명령어는 전체 패스를 통합한 HTML 보고서를 생성하지 않습니다. 단, --passes-dir을 지정했다면 각 패스의 HTML 파일은 해당 디렉터리에 저장됩니다.

최적화가 올바르게 적용되었는지 확인하기

실행 후에는 의도한 매개변수가 실제로 탐색되었는지 확인하세요.

  1. --passes-dir에서 패스별 .cbotset 파일을 열고 최적화 대상 매개변수 값은 패스마다 달라지지만, 고정하거나 생략한 매개변수 값은 변하지 않는지 확인하세요.
  2. 시간 프레임을 여러 개 탐색했다면 각 패스의 .cbotset 파일에서 Chart.Period 값을 확인하세요. 이 값은 선택한 시간 프레임과 일치해야 합니다.
  3. .optres 파일을 열거나 데스크톱 애플리케이션의 최적화 화면으로 가져와 설정과 모든 패스 결과를 함께 검토하세요.

유효성 검사와 일반적인 오류

아래 표의 각 행에는 오류 증상, 추정 원인, 오류 발생 시 cTrader CLI가 반환하는 종료 코드, 다음에 취할 조치가 나와 있습니다. cTrader CLI는 유효성 검사 오류가 발생할 때마다 0이 아닌 종료 코드를 반환합니다. 따라서 스크립트는 메시지를 해석하지 않고도 첫 오류에서 중단할 수 있습니다.

표의 종료 코드는 cTrader CLI가 셸에 반환하는 값입니다. 구체적인 숫자 코드는 공개되지 않았습니다. 따라서 non-zero는 별도의 코드가 지정되지 않은 실패를, unknown은 빌드를 변경하거나 지원팀에 문의해야 하는 내부 오류를 의미합니다.

증상 추정 원인 종료 코드 다음 조치
유효성 검사 오류: --params 누락 JSON 매개변수 파일을 지정하지 않았습니다. 0이 아닌 값 --params=<path>를 지정하세요.
유효성 검사 오류: 알 수 없는 시간 프레임 --timeframe 값이 인식 가능한 식별자와 일치하지 않습니다. 0이 아닌 값 ctrader-cli periods를 실행하고 목록에 표시된 식별자 중 하나를 사용하세요.
유효성 검사 오류: 잘못된 기본 시간 프레임 선택한 --data-mode와 호환되지 않는 시간 프레임입니다. 0이 아닌 값 다른 시간 프레임이나 --data-mode를 선택하세요.
유효성 검사 오류: 잘못된 형식의 기준 쌍 지표 이름이 잘못되었거나 방향이 max 또는 min이 아닙니다. 0이 아닌 값 지원되는 지표 이름 중 하나에 max 또는 min을 지정하세요.
유효성 검사 오류: 알 수 없는 기준 지표 --criteria에 입력한 지표 이름이 지원 목록에 없습니다. 0이 아닌 값 Criteria 섹션에 나열된 지표 이름 중 하나를 사용하세요.
유효성 검사 오류: 알 수 없는 --method 값 --method 값이 genetic 또는 grid가 아닙니다. 0이 아닌 값 --method=genetic(기본값) 또는 --method=grid를 사용하세요.
--fitness와 --criteria를 함께 지정함 두 옵션은 함께 사용할 수 없습니다. 0이 아닌 값 --fitness와 --criteria 중 하나만 지정하세요.
optimize를 사용할 수 없음 내부용 또는 클라우드 버전의 CLI를 사용하고 있습니다. 알 수 없음 사용자용 로컬 에디션으로 전환하세요.