Come aggiungere metodi all'API di cTrader
I metodi di estensione sono uno strumento cruciale se vuoi aggiungere nuove funzionalità all'API di cTrader. Usando una sintassi relativamente semplice, puoi aggiungere nuovi comportamenti a qualsiasi classe API predefinita, come Symbol o Position. Dopo aver definito un metodo di estensione, puoi chiamarlo da qualsiasi oggetto della classe che hai esteso.
Caso d'uso per i metodi di estensione
Prima di tutto, faremo una rapida dimostrazione del perché potresti voler usare i metodi di estensione.
Usando un cBot, vogliamo essere in grado di accedere alla dimensione di una determinata posizione in lotti, poiché questa informazione influisce direttamente sulla nostra strategia di trading preferita. Per farlo, possiamo provare a inizializzare una variabile della classe Position e poi provare ad accedere al suo metodo Lots().
1 2 | |
Se semplicemente digitiamo il codice così com'è, riceveremo un errore che suggerisce che l'accessor Lots() non esiste nell'API. Ma cosa succederebbe se ci fosse un modo per aggiungere un nuovo metodo a un membro API esistente senza influenzare altre funzionalità?
Supponendo che questo metodo esistesse, avremmo potuto creare un semplice cBot che, ad ogni barra, itererebbe su un elenco di tutte le posizioni correnti e stamperebbe la loro dimensione in lotti nel log. Definiremmo il metodo OnBar() come segue.
1 2 3 4 5 6 | |
I metodi di estensione ci permettono di aggiungere la funzionalità Lots() in poche righe di codice e poi riutilizzarla quando vogliamo su qualsiasi oggetto della classe Position. Di seguito, spieghiamo come puoi crearne uno e forniamo diversi esempi di algoritmi che li utilizzano.
Come funzionano i metodi di estensione
Quando lavori con i metodi di estensione, tieni presente le seguenti regole.
- I metodi di estensione sono sempre statici.
Per dichiarare un metodo statico, tutto ciò che devi fare è usare la parola chiave static. Di seguito, dichiara il metodo Lots() con un corpo vuoto.
1 2 3 4 | |
- I metodi di estensione possono avere un numero qualsiasi di argomenti, ma il primo argomento deve sempre designare il tipo di dati/classe per cui il metodo deve essere chiamato, preceduto dalla parola chiave
this.
Aggiungeremo un oggetto della classe Position come primo e unico argomento del metodo Lots(). Poiché un oggetto Position contiene anche informazioni sul simbolo per cui la posizione è aperta, non abbiamo bisogno di altri argomenti.
1 2 3 | |
- I metodi di estensione possono contenere qualsiasi logica adatta agli argomenti forniti.
Non è necessario usare una sintassi speciale quando si definisce il corpo di un metodo di estensione. Possiamo trattarlo come qualsiasi altro metodo e, quindi, possiamo definire il suo corpo come segue.
1 2 3 4 5 | |
- I metodi di estensione possono essere chiamati come metodi di istanza o metodi statici.
Ci sono due possibili modi per chiamare il nostro metodo di estensione nel codice di un cBot.
Quando si usa la sintassi del metodo di istanza, chiamiamo il metodo da qualsiasi oggetto adatto del tipo Position.
1 2 | |
Quando si usa la sintassi del metodo statico, possiamo chiamare il nostro metodo di estensione dopo aver specificato completamente la sua classe statica corrispondente.
1 2 | |
Sta a te determinare quale metodo di chiamata dei metodi di estensione è il più conveniente.
Firme dei metodi
Quando usi la sintassi di istanza, evita i casi in cui i tuoi metodi di estensione hanno le stesse firme di uno qualsiasi dei metodi API integrati (come Position.Close()). In queste situazioni, un metodo integrato verrà chiamato ogni volta che tenti di chiamare un metodo di estensione con la firma corrispondente.
IntelliSense
Quando tentiamo di chiamare un metodo di estensione, IntelliSense usa un'icona speciale per distinguerlo dai membri API integrati.
Per dimostrare il nostro nuovo metodo in azione, possiamo creare un cBot che piazza tre ordini all'avvio, ciascuno con un volume diverso. Ad ogni barra, il cBot stampa il volume di tutte le posizioni attualmente aperte in lotti.
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Dopo aver compilato e avviato il nostro cBot, dovremmo vedere i valori corretti stampati nel log.
Usa i metodi di estensione nei cBot
Ora proveremo a creare un cBot più complesso. Ad ogni barra, il nostro algoritmo esaminerà l'elenco delle posizioni attualmente aperte e regolerà i loro livelli di stop loss in modo che siano al break-even. Per farlo, dovremo creare un metodo di estensione BreakEven() per la classe Position.
Creiamo un nuovo cBot e lo rinominiamo. Successivamente, eliminiamo tutto il codice di cui non abbiamo bisogno e aggiungiamo la classe MyExtensions.
1 2 3 | |
Il nostro codice per il metodo BreakEven() è relativamente semplice. Controlliamo se una posizione ha uno stop loss, se il suo profitto lordo è maggiore di zero e se lo stop loss attualmente impostato non è uguale al prezzo di entrata della posizione. Se tutte queste condizioni sono vere, modifichiamo lo stop loss della posizione in modo che sia uguale al prezzo di entrata della posizione.
1 2 3 4 5 6 7 | |
Nel cBot stesso, non abbiamo bisogno di usare alcun metodo diverso da OnBar(). Ad ogni barra chiediamo al cBot di eseguire un'operazione semplice, ovvero iterare sulla collezione Positions e chiamare il nuovo metodo BreakEven() per ogni elemento in essa.
1 2 3 4 5 6 | |
Dopo aver compilato e avviato il nostro cBot, possiamo vederlo in azione. Può essere un utile assistente di trading, specialmente quando si gestiscono molte posizioni aperte.
Usa i metodi di estensione negli indicatori
Creeremo anche un indicatore utile che si basa sui metodi di estensione. L'indicatore misurerà la volatilità tracciando la percentuale di variazione del prezzo di un simbolo su ogni barra rispetto al prezzo di apertura di quella barra.
Per farlo, creeremo un nuovo indicatore e lo rinomineremo. Nella finestra dell'editor di codice, creeremo la classe MyExtensions per estendere la classe Bar.
1 2 3 | |
Aggiungeremo anche il metodo PercentageChange(). Nella variabile priceChange, sottraiamo il prezzo di chiusura di una barra dal suo prezzo di apertura. Il metodo restituisce la nostra variazione di prezzo divisa per il prezzo di apertura e moltiplicata per 100.
1 2 3 4 5 6 7 8 | |
Nel codice dell'indicatore stesso, non abbiamo bisogno del metodo Initialize() e dei parametri non necessari. Nel corpo del metodo Calculate(), chiamiamo semplicemente il nostro nuovo metodo PercentageChange() su ogni barra.
1 2 3 4 5 6 7 8 | |
Successivamente, salviamo e compiliamo il nostro indicatore. Dopo aver creato un'istanza, dovremmo vedere le corrette variazioni percentuali tracciate. Possono essere utilizzate per determinare la volatilità a breve e lungo termine, a vantaggio di tutti i tipi di strategie di trading.
Riepilogo
In conclusione, i metodi di estensione sono uno strumento prezioso se vuoi creare codice riutilizzabile che aggiunge nuove funzionalità all'API di cTrader. Consigliamo vivamente di sperimentare con i metodi di estensione poiché possono rendere i tuoi algoritmi più efficienti e più facili da mantenere.