differenza tra Close e Exit in Tradingview

Differenza tra Close e Exit con Tradingview

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()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.

differenza tra Close e Exit in Tradingview

Per facilitare la comprensione vediamo i concetti fondamentali in singoli punti.

Strategy.close

È un comando per uscire da una posizione con l’ID specificato:
 
  • 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

È un comando per uscire da tutte le posizione aperte tornando flat sul mercato :
  • Se non ci sono posizioni di mercato aperte nel momento in cui viene attivata la funzione, il comando non ha effetto.
Uso: strategy.close_all(when) → void

 

Strategy.exit

È un comando per uscire da una posizione specifica o da un tutte le posizioni a mercato:
 
  • 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.

Uso: 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 ordine stoplimit 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!)

differenza tra Close e Exit in Tradingview

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:

differenza tra Close e Exit in Tradingview

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.

Tradingview-Esempio-funzione-Close-All-Grafico-2

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.

Tradingview-Esempio-funzione-Close-All-Grafico-3

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:

Tradingview-Esempio-funzione-Exit-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

Gli altri articoli di questa serie

Benvenuto su DataTrading!

Sono Gianluca, ingegnere software e data scientist. Sono appassionato di coding, finanza e trading. Leggi la mia storia.

Ho creato DataTrading per aiutare le altre persone ad utilizzare nuovi approcci e nuovi strumenti, ed applicarli correttamente al mondo del trading.

DataTrading vuole essere un punto di ritrovo per scambiare esperienze, opinioni ed idee.

SCRIVIMI SU TELEGRAM

Per informazioni, suggerimenti, collaborazioni...

Torna in alto
Scroll to Top