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
.algoi 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) lubgrid. Wybierzgrid, jeśli kombinacji parametrów jest niewiele i chcesz sprawdzić wszystkie. Przy dużej liczbie kombinacji wybierzgenetic, 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.cbotsetz 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
Namejest wymagane i musi odpowiadać nazwie właściwości cBota. Uruchomctrader-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ść
truepolaOptimizepowoduje uwzględnienie parametru w przeszukiwaniu. Wartośćfalseutrzymuje parametr na stałym poziomie. - Parametry zakresowe, takie jak liczby całkowite i zmiennoprzecinkowe, wymagają pól
Min,MaxiStep, 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
ParameterTypejest opcjonalne. Jeśli je pominięto, typ jest ustalany na podstawie metadanych cBota poprzez dopasowanie doName.
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
--optrescTrader CLI zapisuje pełne wyniki w pliku JSON.optresz 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-dircTrader CLI zapisuje w tym katalogu raporty z każdego przebiegu. Dla każdego tworzony jest podfolder zawierający pliki.html,.txt,.jsoni.cbotset. Plik.cbotsetzawiera 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.
- Otwórz plik
.cbotsetjednego z przebiegów w katalogu--passes-diri sprawdź, czy wartości optymalizowanych parametrów zmieniają się między przebiegami, a parametry ustalone na stałe lub pominięte pozostają bez zmian. - Jeśli przeszukiwane były różne ramy czasowe, sprawdź wartość
Chart.Periodw pliku.cbotsetkażdego przebiegu. Powinna odpowiadać wybranym ramom czasowym. - Otwórz plik
.optreslub 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. |