Vai al contenuto

Ottimizzare un cBot

Il comando optimize esplora diversi valori dei parametri di un cBot per individuare le combinazioni che offrono i risultati migliori in base ai criteri scelti. Esegue la stessa ricerca genetica o a griglia dell'applicazione desktop cTrader, ma dal terminale e utilizzando un file JSON contenente i parametri. È l’equivalente, per l’ottimizzazione, del comando di backtesting.

Ambito di utilizzo

Il comando optimize ottimizza i parametri dei cBot. Gli indicatori e i plugin hanno comandi propri (indicator calculate, indicator history, create, build) e non rientrano nell’ottimizzazione.

Prerequisiti

  • cTrader CLI deve essere installato e devi poter effettuare l’accesso.
  • Il cBot deve essere esportato come file .algo e compilato per .NET 8.
  • Un file dei parametri che definisca quali parametri variare.

Nota

Il comando optimize è disponibile soltanto nell’edizione locale di cTrader CLI. Non è incluso nelle versioni interne o cloud.

Il comando optimize

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

Il percorso del file .algo è il primo argomento. L’opzione --params è obbligatoria. Il periodo di tempo di base deve essere specificato tramite --timeframe oppure nel file dei parametri. Se non è definito in nessuno dei due, il comando si interrompe con un errore.

Opzioni di ottimizzazione

È obbligatoria soltanto l’opzione --params. Le opzioni facoltative più comuni, utilizzate negli esempi seguenti, sono --timeframe, --method, --criteria, --optres e --passes-dir.

Prima di iniziare, è utile conoscere alcune opzioni:

  • --method – genetic (predefinito) oppure grid. Scegli grid se le combinazioni di parametri sono poche e vuoi provarle tutte; scegli genetic se sono numerose e una ricerca guidata può essere più rapida.
  • --cores – numero di processi worker paralleli che eseguono il backtesting di ogni passaggio. Ogni worker utilizza un thread della CPU, quindi l’ottimizzazione impiega approssimativamente tanti thread quanti ne indica il valore specificato. Sono accettati i numeri interi maggiori o uguali a 1. Per impostazione predefinita, il valore corrisponde alla metà del numero di processori più uno. Riduci il valore su un VPS di piccole dimensioni per lasciare risorse ad altre attività, oppure aumentalo su una macchina dedicata per distribuire la ricerca genetica su più thread.
  • --auto-select-best – seleziona automaticamente il passaggio migliore al termine dell’ottimizzazione, così il file .cbotset con i parametri più efficaci è disponibile senza ulteriori interventi.

Nota

Il comando optimize utilizza --timeframe, non --period. I comandi run e backtest continuano a utilizzare --period. Se usi --period con optimize, l’opzione viene rifiutata come sconosciuta.

Il file dei parametri

Il file indicato tramite --params è un oggetto JSON che contiene un array parameters. Ha la stessa struttura dei file esportati dall’interfaccia di ottimizzazione dell’applicazione desktop cTrader, quindi puoi utilizzare direttamente un file esportato dall’applicazione.

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

Regole dei campi

  • Name è obbligatorio e deve corrispondere al nome di una proprietà del cBot. Esegui ctrader-cli metadata <path-to-algo> per visualizzare i nomi delle proprietà disponibili. Se un nome non compare nei metadati del cBot, viene registrato nel log e ignorato; l’ottimizzazione prosegue con gli altri parametri.
  • Impostando Optimize su true, il parametro viene incluso nella ricerca. Con false, il parametro rimane fisso.
  • I parametri basati su intervalli, come numeri interi e a virgola mobile, richiedono Min, Max e Step se devono variare.
  • I parametri con valori discreti, come enumerazioni e simboli, richiedono un array Values non vuoto se devono variare.
  • ParameterType è facoltativo. Se viene omesso, il tipo viene ricavato dai metadati del cBot tramite corrispondenza con Name.

Impostare un parametro su un valore fisso

Per mantenere un parametro fisso, includilo con Optimize: false e il relativo Value:

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

Avvertenza

Il file dei parametri è la fonte di riferimento. Prima di applicarlo, cTrader CLI reimposta tutti i parametri, in modo che vengano esplorati soltanto quelli contrassegnati con Optimize: true. Un parametro completamente assente dal file mantiene il valore predefinito, anche se il cBot lo prevede come ottimizzabile per impostazione predefinita. Includi un parametro con Optimize: true per aggiungerlo all’ottimizzazione.

Ottimizzare il periodo di tempo principale

Il comando optimize può esplorare periodi di tempo principali diversi, oltre ai parametri del cBot. Il periodo di tempo principale può provenire da due fonti, ma --timeframe ha la precedenza.

  • --timeframe <tf> – un solo valore fissa il periodo di tempo principale; più valori separati da virgole permettono di esplorare periodi di tempo diversi.
  • File dei parametri – un file esportato dall’applicazione desktop contiene già un parametro sintetico del periodo di tempo destinato a questo scopo.

Il periodo di tempo di base dei dati corrisponde al valore unico, a quello fissato oppure al periodo di tempo più breve tra quelli esplorati.

Compatibilità tra periodi di tempo e modalità dei dati

I periodi di tempo principali esplorati o fissati devono essere compatibili con la modalità --data-mode selezionata.

Modalità dei dati Periodi di tempo principali validi
open Periodi di tempo dello stesso tipo che siano multipli esatti del periodo di tempo più breve selezionato.
m1 o m1-csv Qualsiasi periodo di tempo basato sul tempo; sono esclusi quelli non temporali, come Renko e le barre range.
ticks Qualsiasi periodo di tempo non personalizzato.

Nota

Una combinazione non valida interrompe il comando prima del caricamento dei dati e mostra i valori responsabili dell’errore.

Criteri

Ogni elemento di --criteria associa un indicatore di performance a una direzione max o min, ad esempio NetProfit:max. La tabella seguente elenca tutti i nomi degli indicatori supportati e il significato di ciascuno.

Indicatore Che cosa misura
NetProfit Profitto netto o perdita netta finale nella valuta del conto
ProfitFactor Profitto lordo diviso per la perdita lorda
MaxEquityDrawdownPercentages Massimo calo percentuale del capitale netto tra un picco e un minimo
MaxBalanceDrawdownPercentages Massimo calo percentuale del saldo tra un picco e un minimo
MaxEquityDrawdown Massimo calo assoluto del capitale netto nella valuta del conto
MaxBalanceDrawdown Massimo calo assoluto del saldo nella valuta del conto
WinningTrades Numero di operazioni chiuse in profitto
LosingTrades Numero di operazioni chiuse in perdita
TotalTrades Numero totale di operazioni chiuse
AverageTrade Profitto netto diviso per il numero di operazioni chiuse

Per massimizzare il profitto netto e, allo stesso tempo, minimizzare il drawdown massimo del capitale netto:

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

Se vuoi definire una classifica personalizzata, utilizza invece --fitness. Il metodo GetFitness del cBot restituisce un punteggio; l’ottimizzazione mantiene i passaggi con i punteggi più alti. --fitness e --criteria sono incompatibili: specificane soltanto uno.

Opzioni del contesto di test

optimize riutilizza le opzioni del contesto di test di backtest. La tabella seguente mostra le opzioni accettate dalla versione corrente della CLI, che cosa configurano e, quando necessario, le differenze tra i due comandi.

Opzione Funzione Disponibilità
--account Numero del conto di trading. Entrambi
--symbol Simbolo su cui eseguire il test. Entrambi
--start Data e ora di inizio dell’intervallo di test. Entrambi
--end Data e ora di fine dell’intervallo di test. Entrambi
--balance Saldo iniziale della simulazione. Entrambi
--data-mode open, m1, m1-csv, tick-csv oppure ticks. Entrambi
--data-file Percorso del file CSV per m1-csv o tick-csv. Entrambi
--commission Importo della commissione per operazione. Entrambi
--spread Spread in pip. Entrambi
--precise-conversion Utilizza una conversione precisa per le coppie di valute incrociate. Entrambi
--timeframe Periodo di tempo di base per l’esplorazione dei parametri. Solo optimize
--period Periodo di tempo di base per l’esecuzione. Solo backtest
--report Percorso in cui salvare un report HTML. Solo backtest
--report-json Percorso in cui salvare un report JSON. Solo backtest

Nota

Le opzioni dei report non si applicano a optimize: per salvare i risultati utilizza invece --optres e --passes-dir.

Esempio

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

Output

Durante l’esecuzione, optimize mostra continuamente l’avanzamento nel terminale:

Progress | Loading EURUSD, h1 | 42.00 % |
Progress | Optimization | 37.50 % |
  • Riepilogo – al termine, cTrader CLI mostra nel terminale un riepilogo con il numero totale dei passaggi, il tempo trascorso e il passaggio migliore con le relative statistiche.
  • File dei risultati – se specifichi --optres, cTrader CLI salva i risultati completi in un file JSON .optres che elenca tutti i passaggi. Il file utilizza lo stesso formato dei risultati di ottimizzazione dell’applicazione desktop: puoi quindi aprirlo o importarlo nella sua interfaccia di ottimizzazione.
  • Report per passaggio – se specifichi --passes-dir, cTrader CLI salva i report di ciascun passaggio in questa directory, con una sottocartella per passaggio che contiene file .html, .txt, .json e .cbotset. Il file .cbotset riporta i valori esatti dei parametri utilizzati in quel passaggio.

Se non specifichi né --optres né --passes-dir, l’ottimizzazione termina mostrando soltanto il riepilogo.

Nota

Il comando optimize non genera un report HTML complessivo. I file HTML di ciascun passaggio vengono comunque salvati in --passes-dir, se specifichi questa opzione.

Verificare che l’ottimizzazione sia stata applicata correttamente

Al termine dell’esecuzione, verifica che la ricerca abbia interessato i parametri previsti.

  1. Apri un file .cbotset di un passaggio all’interno di --passes-dir e verifica che i parametri ottimizzati cambino da un passaggio all’altro, mentre quelli fissi o omessi rimangano invariati.
  2. Se hai esplorato diversi periodi di tempo, controlla il valore Chart.Period nel file .cbotset di ciascun passaggio. Deve corrispondere a uno dei periodi di tempo selezionati.
  3. Apri il file .optres oppure importalo nell’interfaccia di ottimizzazione dell’applicazione desktop per esaminare insieme la configurazione e tutti i passaggi.

Convalida ed errori comuni

Ogni riga della tabella seguente riporta un sintomo, la probabile causa, il codice di uscita restituito da cTrader CLI in caso di errore e l’azione da intraprendere. cTrader CLI restituisce un codice di uscita diverso da zero per ogni errore di convalida. Uno script può quindi interrompersi al primo errore senza dover interpretare il messaggio.

Nella tabella, «Codice di uscita» indica il valore restituito da cTrader CLI alla shell. I codici numerici esatti non sono pubblicati. Per questo non-zero indica un errore senza un codice specifico; unknown indica un errore interno che richiede di cambiare versione o contattare l’assistenza.

Sintomo Causa probabile Codice di uscita Passaggio successivo
Errore di convalida: manca --params Non è stato fornito il file JSON dei parametri. non-zero Specifica --params=<path>.
Errore di convalida: periodo di tempo sconosciuto Il valore di --timeframe non corrisponde a nessun identificatore riconosciuto. non-zero Esegui ctrader-cli periods e utilizza uno degli identificatori elencati.
Errore di convalida: periodo di tempo principale non valido Un periodo di tempo non è compatibile con il --data-mode selezionato. non-zero Scegli un altro periodo di tempo o un altro --data-mode.
Errore di convalida: coppie di criteri non valide Il nome di un indicatore non è corretto oppure la direzione non è né max né min. non-zero Utilizza uno dei nomi degli indicatori supportati con max o min.
Errore di convalida: indicatore di performance sconosciuto Un nome specificato in --criteria non è compreso nell’elenco dei nomi supportati. non-zero Utilizza uno dei nomi degli indicatori elencati nella sezione Criteri.
Errore di convalida: valore di --method sconosciuto Il valore di --method non è né genetic né grid. non-zero Utilizza --method=genetic (predefinito) oppure --method=grid.
--fitness e --criteria sono stati specificati insieme Queste due opzioni sono incompatibili. non-zero Specifica --fitness oppure --criteria, ma non entrambi.
optimize non disponibile È in uso l’edizione interna o cloud della CLI. unknown Passa all’edizione locale destinata agli utenti.