Przejdź do treści

Optymalizacja cBota

Polecenie optimize sprawdza różne wartości parametrów cBota, aby znaleźć kombinacje dające najlepsze wyniki według wybranych kryteriów. Wykonuje takie samo przeszukiwanie genetyczne lub przeszukiwanie siatki kombinacji parametrów jak aplikacja komputerowa cTrader, ale z poziomu terminala, na podstawie pliku JSON z ustawieniami parametrów. To odpowiednik polecenia do backtestingu, przeznaczony do optymalizacji.

Zakres zastosowania

Polecenie optimize służy do optymalizacji parametrów cBotów. Wskaźniki i wtyczki mają własne polecenia (indicator calculate, indicator history, create, build) i nie są objęte optymalizacją.

Wymagania wstępne

  • Musisz mieć zainstalowany cTrader CLI i możliwość zalogowania się.
  • cBot musi być wyeksportowany do pliku .algo i skompilowany dla .NET 8.
  • Plik parametrów określający, które parametry mają być zmieniane.

Uwaga

Polecenie optimize jest dostępne wyłącznie w lokalnej wersji cTrader CLI. Nie jest dostępne w wersjach wewnętrznych ani chmurowych.

Polecenie optimize

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

Pierwszym argumentem jest ścieżka do pliku .algo. Opcja --params jest wymagana. Podstawowe ramy czasowe muszą być określone przez --timeframe albo w pliku parametrów. Jeśli nie podano ich w żadnym z tych miejsc, polecenie zakończy się błędem.

Opcje optymalizacji

Wymagana jest tylko opcja --params. Najczęściej używane opcje dodatkowe, przedstawione w poniższych przykładach, to --timeframe, --method, --criteria, --optres i --passes-dir.

Przed rozpoczęciem warto poznać kilka opcji:

  • --method – genetic (domyślnie) lub grid. Wybierz grid, jeśli kombinacji parametrów jest niewiele i chcesz sprawdzić wszystkie. Przy dużej liczbie kombinacji wybierz genetic, jeśli ukierunkowane przeszukiwanie będzie szybsze.
  • --cores – liczba równoległych procesów roboczych wykonujących backtesting w ramach każdego przebiegu optymalizacji. Każdy proces roboczy korzysta z jednego wątku CPU, więc optymalizacja zajmuje w przybliżeniu tyle wątków, ile wskazuje podana wartość. Dozwolone są liczby całkowite od 1 wzwyż. Domyślnie jest to połowa liczby procesorów plus jeden. Na niewielkim serwerze VPS zmniejsz tę wartość, aby pozostawić zasoby dla innych zadań. Na maszynie dedykowanej możesz ją zwiększyć, by rozdzielić przeszukiwanie genetyczne między większą liczbę wątków.
  • --auto-select-best – automatycznie wybiera najlepszy przebieg po zakończeniu optymalizacji, dzięki czemu plik .cbotset z najlepszymi ustawieniami jest gotowy do użycia bez dodatkowych czynności.

Uwaga

Polecenie optimize używa --timeframe, a nie --period. Polecenia run i backtest nadal używają --period. Opcja --period przekazana do optimize zostanie odrzucona jako nieznana.

Plik parametrów

Plik wskazany przez --params to obiekt JSON zawierający tablicę parameters. Ma taką samą strukturę jak plik eksportowany z interfejsu optymalizacji aplikacji komputerowej cTrader, dlatego możesz bezpośrednio wykorzystać plik wyeksportowany z tej aplikacji.

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

Zasady dotyczące pól

  • Pole Name jest wymagane i musi odpowiadać nazwie właściwości cBota. Uruchom ctrader-cli metadata <path-to-algo>, aby sprawdzić dostępne nazwy właściwości. Jeśli nazwa nie występuje w metadanych cBota, informacja zostaje zapisana w dzienniku, parametr jest pomijany, a optymalizacja pozostałych parametrów trwa dalej.
  • Wartość true pola Optimize powoduje uwzględnienie parametru w przeszukiwaniu. Wartość false utrzymuje parametr na stałym poziomie.
  • Parametry zakresowe, takie jak liczby całkowite i zmiennoprzecinkowe, wymagają pól Min, Max i Step, jeśli mają być zmieniane podczas optymalizacji.
  • Parametry przyjmujące wartości dyskretne, takie jak wyliczenia i symbole, wymagają niepustej tablicy Values, jeśli mają być zmieniane.
  • Pole ParameterType jest opcjonalne. Jeśli je pominięto, typ jest ustalany na podstawie metadanych cBota poprzez dopasowanie do Name.

Ustawienie stałej wartości parametru

Aby zachować stałą wartość parametru, dodaj go z Optimize: false i odpowiednią wartością Value:

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

Ostrzeżenie

Decydujące znaczenie ma plik parametrów. Przed zastosowaniem pliku cTrader CLI resetuje ustawienia wszystkich parametrów, tak aby przeszukiwane były tylko te wskazane jako Optimize: true. Parametr całkowicie pominięty w pliku zachowuje wartość domyślną, nawet jeśli w samym cBocie domyślnie podlega optymalizacji. Aby uwzględnić parametr w optymalizacji, dodaj go z Optimize: true.

Optymalizacja głównych ram czasowych

Polecenie optimize pozwala sprawdzać różne główne ramy czasowe, a także parametry cBota. Główne ramy czasowe można określić na dwa sposoby, przy czym pierwszeństwo ma --timeframe.

  • --timeframe <tf> – pojedyncza wartość ustala główne ramy czasowe, a kilka wartości rozdzielonych przecinkami pozwala przeszukać różne ramy czasowe.
  • Plik parametrów – plik wyeksportowany z aplikacji komputerowej zawiera już specjalny syntetyczny parametr ram czasowych służący do tego celu.

Podstawowe ramy czasowe danych odpowiadają jedynej podanej wartości, wartości ustalonej na stałe lub najkrótszym z przeszukiwanych ram czasowych.

Zgodność ram czasowych z trybami danych

Główne ramy czasowe, niezależnie od tego, czy są stałe, czy przeszukiwane, muszą być zgodne z wybranym --data-mode.

Tryb danych Dozwolone główne ramy czasowe
open Ramy czasowe tego samego typu, będące dokładnymi wielokrotnościami najkrótszych wybranych ram czasowych.
m1 lub m1-csv Dowolne ramy czasowe wyznaczane na podstawie czasu. Typy nieoparte na czasie, takie jak Renko czy wykresy zakresowe, są odrzucane.
ticks Dowolne ramy czasowe inne niż niestandardowe.

Uwaga

Nieprawidłowa kombinacja przerywa działanie polecenia jeszcze przed wczytaniem danych i wyświetla wartości, które spowodowały błąd.

Kryteria

Każdy element --criteria łączy wskaźnik efektywności z kierunkiem max lub min, na przykład NetProfit:max. Poniższa tabela zawiera wszystkie obsługiwane nazwy wskaźników i wyjaśnia, co mierzą.

Wskaźnik Co mierzy
NetProfit Końcowy zysk netto lub strata netto w walucie konta
ProfitFactor Zysk brutto podzielony przez stratę brutto
MaxEquityDrawdownPercentages Największy procentowy spadek kapitału od szczytu do dołka
MaxBalanceDrawdownPercentages Największy procentowy spadek salda od szczytu do dołka
MaxEquityDrawdown Największy bezwzględny spadek kapitału w walucie konta
MaxBalanceDrawdown Największy bezwzględny spadek salda w walucie konta
WinningTrades Liczba transakcji zamkniętych z zyskiem
LosingTrades Liczba transakcji zamkniętych ze stratą
TotalTrades Łączna liczba zamkniętych transakcji
AverageTrade Zysk netto podzielony przez liczbę zamkniętych transakcji

Aby maksymalizować zysk netto, a jednocześnie minimalizować maksymalny spadek kapitału:

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

Jeśli chcesz zastosować własny sposób oceny wyników, użyj zamiast tego --fitness. Metoda cBota GetFitness zwraca ocenę punktową, a optymalizacja zachowuje przebiegi z najwyższymi wartościami. Opcje --fitness i --criteria wzajemnie się wykluczają. Podaj tylko jedną z nich.

Opcje środowiska testowego

Polecenie optimize korzysta z tych samych opcji środowiska testowego co backtest. Poniższa tabela zawiera opcje obsługiwane przez bieżącą wersję CLI, ich przeznaczenie oraz, w odpowiednich przypadkach, różnice między oboma poleceniami.

Opcja Przeznaczenie Dostępność
--account Numer konta handlowego. Oba polecenia
--symbol Symbol, na którym wykonywany jest test. Oba polecenia
--start Data i godzina rozpoczęcia okresu testowego. Oba polecenia
--end Data i godzina zakończenia okresu testowego. Oba polecenia
--balance Saldo początkowe symulacji. Oba polecenia
--data-mode open, m1, m1-csv, tick-csv lub ticks. Oba polecenia
--data-file Ścieżka do pliku CSV dla m1-csv lub tick-csv. Oba polecenia
--commission Kwota prowizji za transakcję. Oba polecenia
--spread Spread w pipsach. Oba polecenia
--precise-conversion Stosowanie dokładnego przeliczania między różnymi parami walutowymi. Oba polecenia
--timeframe Podstawowe ramy czasowe przeszukiwania parametrów. Tylko optimize
--period Podstawowe ramy czasowe wykonania testu. Tylko backtest
--report Ścieżka zapisu raportu HTML. Tylko backtest
--report-json Ścieżka zapisu raportu JSON. Tylko backtest

Uwaga

Opcje raportowania nie dotyczą polecenia optimize. Aby zapisać wyniki, użyj zamiast nich --optres i --passes-dir.

Przykład

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

Wynik

Podczas działania polecenie optimize stale wyświetla postęp w terminalu:

Progress | Loading EURUSD, h1 | 42.00 % |
Progress | Optimization | 37.50 % |
  • Podsumowanie – po zakończeniu cTrader CLI wyświetla w terminalu podsumowanie zawierające łączną liczbę przebiegów, czas wykonania oraz najlepszy przebieg i jego statystyki.
  • Plik wyników – po podaniu --optres cTrader CLI zapisuje pełne wyniki w pliku JSON .optres z informacjami o wszystkich przebiegach. Plik ma ten sam format co wyniki optymalizacji w aplikacji komputerowej, dlatego można go otworzyć lub zaimportować w jej interfejsie optymalizacji.
  • Raporty poszczególnych przebiegów – po podaniu --passes-dir cTrader CLI zapisuje w tym katalogu raporty z każdego przebiegu. Dla każdego tworzony jest podfolder zawierający pliki .html, .txt, .json i .cbotset. Plik .cbotset zawiera dokładne wartości parametrów użytych w danym przebiegu.

Jeśli nie podasz ani --optres, ani --passes-dir, po zakończeniu optymalizacji zostanie wyświetlone tylko podsumowanie.

Uwaga

Polecenie optimize nie tworzy zbiorczego raportu HTML. Pliki HTML poszczególnych przebiegów są jednak zapisywane w katalogu --passes-dir, jeśli podasz tę opcję.

Sprawdzanie, czy optymalizacja została poprawnie zastosowana

Po zakończeniu sprawdź, czy przeszukiwanie objęło zamierzone parametry.

  1. Otwórz plik .cbotset jednego z przebiegów w katalogu --passes-dir i sprawdź, czy wartości optymalizowanych parametrów zmieniają się między przebiegami, a parametry ustalone na stałe lub pominięte pozostają bez zmian.
  2. Jeśli przeszukiwane były różne ramy czasowe, sprawdź wartość Chart.Period w pliku .cbotset każdego przebiegu. Powinna odpowiadać wybranym ramom czasowym.
  3. Otwórz plik .optres lub zaimportuj go w interfejsie optymalizacji aplikacji komputerowej, aby przejrzeć ustawienia i wszystkie przebiegi.

Weryfikacja i typowe błędy

Każdy wiersz poniższej tabeli przedstawia objaw błędu, prawdopodobną przyczynę, kod zakończenia zwracany przez cTrader CLI oraz zalecane działanie. W przypadku każdego błędu weryfikacji cTrader CLI zwraca kod zakończenia różny od zera. Dzięki temu skrypt może zatrzymać się przy pierwszym błędzie bez konieczności analizowania treści komunikatu.

Kod zakończenia w tabeli oznacza wartość zwracaną przez cTrader CLI do powłoki. Dokładne kody liczbowe nie są publikowane. Dlatego non-zero oznacza błąd bez odrębnego opublikowanego kodu, a unknown oznacza błąd wewnętrzny, w przypadku którego należy zmienić wersję programu lub skontaktować się z pomocą techniczną.

Objaw Prawdopodobna przyczyna Kod zakończenia Zalecane działanie
Błąd weryfikacji: brak --params Nie podano pliku JSON z parametrami. non-zero Podaj --params=<path>.
Błąd weryfikacji: nieznane ramy czasowe Wartość --timeframe nie odpowiada żadnemu rozpoznawanemu identyfikatorowi. non-zero Uruchom ctrader-cli periods i użyj jednego z wyświetlonych identyfikatorów.
Błąd weryfikacji: nieprawidłowe główne ramy czasowe Ramy czasowe nie są zgodne z wybranym --data-mode. non-zero Wybierz inne ramy czasowe lub inny --data-mode.
Błąd weryfikacji: nieprawidłowy format par kryteriów Nazwa wskaźnika jest nieprawidłowa albo kierunek nie jest równy max ani min. non-zero Użyj jednej z obsługiwanych nazw wskaźników wraz z max lub min.
Błąd weryfikacji: nieznany wskaźnik kryterium Nazwa podana w --criteria nie znajduje się na liście obsługiwanych wskaźników. non-zero Użyj jednej z nazw wskaźników wymienionych w sekcji Criteria.
Błąd weryfikacji: nieznana wartość --method Wartość --method nie jest równa genetic ani grid. non-zero Użyj --method=genetic (domyślnie) lub --method=grid.
Jednocześnie podano --fitness i --criteria Te dwie opcje wzajemnie się wykluczają. non-zero Podaj --fitness albo --criteria, ale nie obie opcje naraz.
Polecenie optimize jest niedostępne Używana jest wewnętrzna lub chmurowa wersja CLI. unknown Przejdź na lokalną wersję przeznaczoną dla użytkowników.