In questo articolo descriviamo la differenza tra Close e Exit, le funzioni della classe Strategy di Tradingview per il trading algoritmico. In sintesi, vogliamo approfondire la differenza tra le funzioni close()
, close_all()
e exit()
poiché il significato delle tre funzioni è abbastanza simile e può creare confusione. Queste funzioni implementano un metodo per chiudere una posizione. In questo articolo descriviamo la logica di ciascuna funzione e la sua applicazione ideale.
La documentazione
Diamo un’occhiata alla documentazione ufficiale di Tradingview. Premendo control + clic del mouse (o command + clic per gli utenti Mac) su qualsiasi funzione mentre siamo nell’editor di Pinescript possiamo visualizzare la relativa documentazione. In generale, la documentazione fornisce le informazioni sufficienti. Tuttavia, i neofiti potrebbero trovare alcuni termini o grandi blocchi di testo difficili da leggere e decifrare.
Per facilitare la comprensione vediamo i concetti fondamentali in singoli punti.
Strategy.close
- Se c’erano più ordini di ingresso con lo stesso ID, sono tutti chiusi contemporaneamente.
- Se non ci sono posizioni aperte con l’ID specificato al momento dell’esecuzione della funzione, il comando non ha effetto.
- La funzione usa ordine a mercato.
- Ogni posizione è chiusa da uno specifico ordine a mercato.
Uso: strategy.close(id, when) → void
Strategy.close_all
- Se non ci sono posizioni di mercato aperte nel momento in cui viene attivata la funzione, il comando non ha effetto.
strategy.close_all(when) → void
Strategy.exit
- Se un ordine con lo stesso ID è già pendente, è possibile modificare l’ordine.
- Se un ordine di entrata non è stato eseguito, ma viene generato un ordine di uscita, l’ordine di uscita attenderà fino a quando l’ordine di entrata non sarà completato e quindi verrà piazzato l’ordine di uscita. (Per disattivare un ordine di uscita, è necessario utilizzare il comando strategy.cancel o strategy.cancel_all.)
- Se la funzione strategy.exit viene chiamata una volta, esce da una posizione solo una volta.
- Se vuoi uscire più volte, il comando strategy.exit dovrebbe essere chiamato più volte.
- Se utilizzi uno stop loss e un trailing stop, il loro tipo di ordine è ‘stop’, quindi ne viene piazzato solo uno (quello che dovrebbe essere eseguito per primo).
- Se tutti i seguenti parametri ‘profit’, ‘limit’, ‘loss’, ‘stop’, ‘trail_points’, ‘trail_offset’ sono ‘NaN’, il comando fallirà.
Per utilizzare un ordine a mercato per uscire, è necessario utilizzare il comando strategy.close o strategy.close_all.
strategy.exit(id, from_entry, qty, qty_percent, profit, limit, loss, stop, trail_price, trail_points, trail_offset, oca_name, comment, when) → void
Differenza tra Close e Exit
Dopo aver approfondito la documentazione, possiamo vedere che i punti chiave sono:
strategy.close()
dovrebbe essere usato se si desidera utilizzare un ordine a mercato per uscire da una specifica posizione.strategy.close_all()
dovrebbe essere usato se desideriamo utilizzare un ordine a mercato per uscire da TUTTE le posizioni.strategy.exit()
dovrebbe essere usato se desideriamo utilizzare un ordinestop
olimit
per uscire da una posizione.
Approfondiamo la differenza tra close e exit con alcuni esempi. Prima di continuare sottolineiamo che strategy.exit()
è stato descritto in dettaglio nell’articolo specifico sullo Stop Loss.
Esempi
Tutti i seguenti esempi sono progettati per essere eseguiti nel timeframe giornaliero. Usiamo la variabile dayofweek
per determinare se aprire una posizione, in questo modo possiamo aprire posizioni diverse in giorni diversi della settimana, e quindi avere più posizioni long aperte contemporaneamente. In realtà non entriamo nel giorno della settimana dove il trade è stato attivato. Ad esempio, negli esempi seguente, ci riferiamo a un trade del lunedì, tuttavia questo è effettivamente eseguito il martedì mattina perché l’ordine di ingresso viene inviato dopo la chiusura del lunedì.
Close() vs Close_all()
Iniziamo con un semplice esempio dove strategy.close()
chiude una singola posizione mentre strategy.close_all()
chiude tutte le posizioni. In termini pratici, se non prevediamo più di un ingresso nella stessa direzione, le due funzioni fanno la stessa cosa. Solamente se abbiamo più entrate possiamo iniziare a vedere la differenza.
Prendiamo il seguente esempio:
//@version=3
strategy("Close and Exit Testing", overlay=true)
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(08, "Backtest Start Month")
testStartDay = input(01, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)
longCondition = time >= testPeriodStart and dayofweek == monday
if (longCondition)
strategy.entry("Monday", strategy.long)
strategy.close("Monday", when=dayofweek == friday)
//strategy.close_all(when=dayofweek == friday)
L’esempio contiene entrambi i metodi close. Tuttavia, strategy.close_all()
è commentato. Toglieremo il commento quando faremo il confronto. Il codice acquista solo il lunedì e vende il venerdì. Entra in una sola posizione quindi vediamo che i due metodi fanno essenzialmente la stessa cosa.
Esecuzione del codice
Con il codice precedente otteniamo un grafico simile al seguente (ovviamente, i dati sui prezzi cambieranno in base all’azione/asset che stiamo guardando!)
Successivamente, commentiamo la riga strategy.close()
e la sostituiamo con la riga strategy.close_all()
, nel seguente modo:
//strategy.close("Monday", when=dayofweek == friday)
strategy.close_all(when=dayofweek == friday)
Quindi eseguiamo di nuovo lo script:
Vediamo che tra i due grafici cambia solamente il testo viola. Uno ci dice che si tratta di un ordine di chiusura dell’entrata del lunedì mentre l’altro ci dice che si tratta di un ordine di chiusura dell’intera posizione. Dato che abbiamo solo un’entrata sono essenzialmente la stessa cosa.
Aggiunta di una seconda entrata
Quando aggiungiamo una seconda entrata, iniziamo a vedere la differenza tra i due metodi. Nel seguente esempio aggiungiamo una seconda entrata il mercoledì e abilitiamo la piramidazione. Quindi confrontiamo i risultati tra i due casi e possiamo vedere come la funzione strategy.close()
chiude sempre e solo l’ordine del lunedi. L’ordine del mercoledì è eseguito all’inizio e non è mai chiuso.
//@version=3
strategy("Close Example", overlay=true, pyramiding=2)
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(09, "Backtest Start Month")
testStartDay = input(01, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)
// Evita di entrare 2 posizioni del mercoledi quando la piramidazione è attiva
// Questo This would prevent us entering a monday position.
wedEntered = na
wedEntered := nz(wedEntered[1], false)
monCondition = time >= testPeriodStart and dayofweek == monday
wedCondition = time >= testPeriodStart and dayofweek == wednesday and (not wedEntered[1])
if (monCondition)
strategy.entry("Monday", strategy.long)
if (wedCondition)
wedEntered := true
strategy.entry("Wednesday", strategy.long)
strategy.close("Monday", when=dayofweek == friday)
Nel codice abbiamo aggiunto la variabile wedEntered
per evitare la piramidazione. In sostanza, se non impediamo una seconda entrata del mercoledì dopo la prima, possiamo ritrovarci con due entrate del mercoledì e nessuna entrata del lunedì dato che il lunedì potrebbe essere un giorno festivo. Quindi il venerdi chiudiamo la posizione del lunedì ma perdiamo l’opportunità di riaprirla il lunedì successivo, il mercoledì poi entriamo nella nostra seconda posizione. Ora abbiamo due posizioni del mercoledì e l’ordine di chiusura del lunedì non si attiverà mai perché non ci sono entrate del lunedì. Questo dà l’illusione che lo script non stia più comprando o vendendo.
Non preoccuparti se paragrafo precedente sembra complesso. La chiave di tutto è capire che l’ordine del mercoledì non viene mai chiuso dalla funzione strategy.close()
!
Nota: Se eliminiamo la variabile wedEntered
nell’esempio precedente, lo script è eseguito come previsto per alcune settimane fino a quando il lunedi non è un giorno festivo.
Nel primo esempio chiudiamo solo una posizione del lunedì. L’entrata del mercoledì rimane sempre aperta. Al contrario, nel secondo esempio, entrambe le posizioni sono chiuse alla fine della settimana.
Ora possiamo vedere come usare close_all(). Possiamo anche rimuovere la variabile wedEntered
che non è più necessaria perché ci aspettiamo che entrambe le posizioni siano chiuse alla fine della settimana e quindi non c’è possibilità di rimanere bloccati come nel primo esempio.
//@version=3
strategy("Close Example", overlay=true, pyramiding=2)
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(09, "Backtest Start Month")
testStartDay = input(01, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)
monCondition = time >= testPeriodStart and dayofweek == monday
wedCondition = time >= testPeriodStart and dayofweek == wednesday
if (monCondition)
strategy.entry("Monday", strategy.long)
if (wedCondition)
strategy.entry("Wednesday", strategy.long)
strategy.close_all(when=dayofweek == friday)
Dopo aver eseguito il codice precedente, possiamo vedere che entrambe le entrate sono chiuse il venerdì e sono successivamente riaperte la settimana successiva.
Strategy.exit() vs strategy.close()
Vediamo la differenza tra Close e Exit. La funzione strategy.exit()
dovrebbe essere usata per inviare ordini limit e stop invece che ordini a mercato. A parte questo, funziona con la stessa logica di strategy.close()
dove possiamo scegliere come target una specifica posizione da chiudere con un ordine stop/limit.
Diamo un’occhiata al codice:
//@version=3
strategy("Close Example", overlay=true, pyramiding=2)
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(09, "Backtest Start Month")
testStartDay = input(01, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)
// Evita di entrare 2 posizioni del mercoledi quando la piramidazione è attiva
// Questo This would prevent us entering a monday position.
wedEntered = na
wedEntered := nz(wedEntered[1], false)
monCondition = time >= testPeriodStart and dayofweek == monday
wedCondition = time >= testPeriodStart and dayofweek == wednesday and (not wedEntered[1])
if (monCondition)
strategy.entry("Monday", strategy.long)
strategy.exit("Monday TP", "Monday", limit=high) // Set a TP at the high of the signal candle.
if (wedCondition)
wedEntered := true
strategy.entry("Wednesday", strategy.long)
Il codice precedente restituisce il seguente grafico:
Proprio come il grafico dell’esempio strategy.close()
, possiamo vedere che l’entrata di mercoledì è eseguita e la posizione mantenuta. Stiamo chiudendo la posizione del lunedì quando si raggiunge il take profit.
Da notare che l’esempio precedente è solo a scopo illustrativo. La logica è imperfetta perché quando usiamo la candela high
del segnale come livello di take profit. Quindi può accadere che il take profit sia raggiunto immediatamente dopo essere entrato perché siamo già al di sopra di esso. Naturalmente, non è da prevedere nella vita reale.
Questi esempio dovrebbero coprire tutti i casi fondamentali di differenze tra i tre tipi di chiusura. Per approfondire l’uso di strategy.exit()
con lo stop loss, si può leggere questo articolo.
Codice completo
In questo articolo abbiamo descritto la differenza tra Close e Exit, le funzioni della classe Strategy di Tradingview per il trading algoritmico. Per il codice completo riportato in questo articolo, si può consultare il seguente repository di github:
https://github.com/datatrading-info/TradingView