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
.algoe 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) oppuregrid. Scegligridse le combinazioni di parametri sono poche e vuoi provarle tutte; scegligeneticse 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.cbotsetcon 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. Eseguictrader-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
Optimizesutrue, il parametro viene incluso nella ricerca. Confalse, il parametro rimane fisso. - I parametri basati su intervalli, come numeri interi e a virgola mobile, richiedono
Min,MaxeStepse devono variare. - I parametri con valori discreti, come enumerazioni e simboli, richiedono un array
Valuesnon vuoto se devono variare. ParameterTypeè facoltativo. Se viene omesso, il tipo viene ricavato dai metadati del cBot tramite corrispondenza conName.
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.optresche 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,.jsone.cbotset. Il file.cbotsetriporta 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.
- Apri un file
.cbotsetdi un passaggio all’interno di--passes-dire verifica che i parametri ottimizzati cambino da un passaggio all’altro, mentre quelli fissi o omessi rimangano invariati. - Se hai esplorato diversi periodi di tempo, controlla il valore
Chart.Periodnel file.cbotsetdi ciascun passaggio. Deve corrispondere a uno dei periodi di tempo selezionati. - Apri il file
.optresoppure 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. |