Piramidazione su Tradingview

Piramidazione con Tradingview

In questo articolo descriviamo come funziona la piramidazione con TradingView per il trading algoritmico. Vediamo cos’è la piramidazione, come influisce sulla strategia e alcuni punti di attenzione e criticità comuni che possono verificarsi quando usiamo questa funzione.

La Piramidazione con Tradingview

Per semplificare lo sviluppo della strategia, Tradingview limita il numero di entrate ad una in uno specifico momento quando usiamola funzione strategy.entry(). In altre parole se abbiamo già aperto una posizione long e le nostre condizioni di ingresso di acquisto sono nuovamente true mentre siamo ancora long, Tradingview non apre ulteriori posizioni long. Il motore di backtest attenderà fino a quando non usciamo (o invertiamo) dalla posizione prima di considerare nuovamente una posizione long.

La piramidazione con Tradingview permette alla strategia di entrare più volte nella stessa direzione. La piramidazione è anche chiamata “Averaging Into” o “Scaling Into” in una posizione. Può essere particolarmente utile per implementare complesse strategie di ingresso e uscita. In Tradingview dobbiamo accedere all’opzione Pyramiding all’interno della scheda “proprietà strategia” in questo modo:

Piramidazione su Tradingview - Scheda Proprieta

Nota: il precedente screenshot mostra le proprietà della strategia del modello predefinito dello script di una strategia. Questo è il modello fornito da Tradingview quando selezioniamo “Nuovo –> Strategia”. Vediamo che la  Piramidazione su Tradingview è abilitata di default ma la dimensione dell’ordine è limitata a uno., cioè siamo limitati a un acquisto o vendita in una data posizione. Credo che non ci sia differenza tra attivare la piramidazione con 1 ordine o disattivarla effettivamente!

Modifica dell’impostazione predefinita

Se lo desideriamo, possiamo modificare l’impostazione di default della piramidazione nel codice pine-script tramite il parametro  pyramiding della chiamata di funzione alla strategy(). La piramidazione si disattiva impostando a zero questa variabile. Un valore diverso da zero corrisponde al numero massimo di ordini consentiti.

strategy("My Strategy", overlay=true, pyramiding=100)

L’esempio precedente imposterà il limite  al numero di ordine pari a 100. Di seguito abbiamo un esempio completamente funzionante per effettuare questi impostazioni in un codice pine-script

Piramidazione con strategy.order()

Vale la pena sottolineare che l’opzione Pyramiding non influisce sulla funzione strategy.order(). Il motivo è descritto brevemente nella documentazione di Tradingview:

questo comando inserisce sia ordini di entrata che di uscita. Non è influenzato dall’impostazione piramidale e dalla parola chiave strategy.risk.allow_entry_in . Ti consente di creare complesse costruzioni di ordini di entrata e uscita quando le logiche di  strategy.entry  e  strategy.exit  non sono sufficienti.

Quindi, se la funzione strategy.order() è esguita indipendentemente dalla valore impostato in Pyramiding. Il parametro Pyramiding ha effetto solo per strategy.entry().

Riferimento: https://www.tradingview.com/wiki/Strategies

Codice

Ora mettiamo in pratica la piramidazione con Tradingview! Il seguente esempio mostra un semplice script che prevede di ridurre la media di carico ogni volta che il nostro portafoglio scende del x%. L’idea è quella di abbassare il nostro costo medio in modo da poter comunque uscire con un profitto quando le condizioni miglioreranno. Con questo in mente, la strategia deve anche avere una semplice uscita take profit al x% sopra il nostro prezzo medio.

				
					//@version=3
strategy("Average Down", overlay=true, pyramiding=4, default_qty_type=strategy.percent_of_equity,
  default_qty_value=10)
 
// Range di date
from_month = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
from_day   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
from_year  = input(defval = 2010, title = "From Year")
to_month   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
to_day     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
to_year    = input(defval = 9999, title = "To Year")
start  = timestamp(from_year, from_month, from_day, 00, 00)  // backtest start window
finish = timestamp(to_year, to_month, to_day, 23, 59)        // backtest finish window
window = time >= start and time <= finish ? true : false // create function "within window of time"

// Input della strategia
target_perc = input(-10, title='Target Loss to Average Down (%)', maxval=0)/100
take_profit = input(10, title='Target Take Profit', minval=0)/100
target_qty  = input(50, title='% Of Current Holdings to Buy', minval=0)/100 
sma_period  = input(20, title='SMA Period') 
 
// Ottenere la SMA usata nella prima entrata 
ma = sma(close,sma_period)
 
// Calcolare i livelli chiave
pnl = (close - strategy.position_avg_price) / strategy.position_avg_price
take_profit_level = strategy.position_avg_price * (1 + take_profit)
 
// Prima posizione
first_long = crossover(close, ma) and strategy.position_size == 0 and window
if (first_long)
    strategy.entry("Long", strategy.long)
 
// Media al ribasso
if (pnl <= target_perc)
    qty = floor(strategy.position_size * target_qty)
    strategy.entry("Long", strategy.long, qty=qty)
 
// Take Profit
strategy.exit("Take Profit", "Long", limit=take_profit_level)
 
// Grafico
plot(ma, color=blue, linewidth=2, title='SMA')
plot(strategy.position_avg_price, style=linebr, color=red, title='Average Price')

				
			

Commento del codice

Poiché questo non è il primo articolo su Tradingview nel sito DataTrading.info, non descriviamo il codice riga per riga. Se non conosci la programmazione con pinescript, puoi iniziare dall’articolo Primo Script con Tradingview.

Prima di descrivere come calcolare il PnL o come determinare quando effettuare le entrate in posizioni, vediamo una panoramica dei principali input e cosa deveno fare. In questo modo possiamo capire come usare lo script.

La nostra strategia ha 4 principali input:

  • target_perc: Questo è il livello percentuale di target che permette di diminuire la media. In altre parole, se abbiamo una chiusura al di sotto di questo livello rispetto al nostro prezzo di acquisto medio, effettuiamo una media al ribasso.
  • take_profit: Un livello percentuale standard di take profit. E’ usato per impostare l’importo di profitto che  desideriamo.
  • target_qty: è il numero di azioni/contratti che vogliamo acquistare con la media al ribasso. 50 significa che vogliamo comprare il 50% delle attuali quantità. Quindi, se abbiamo 100 azioni, ne compriamo 50 durante la media al ribasso.
  • sma_period: Definisce il periodo lookback della SMA. La strategia entra nella prima/iniziale posizione quando abbiamo una chiusura al di sopra del livello SMA.

PNL

Quando effettuiamo una media al ribasso, dobbiamo sapere qual è il profitto o perdita attuale. Solamente con questa informazione possiamo determinare se dobbiamo mediare al ribasso. Inoltre, vogliamo conoscere i profitti e perdite in termini percentuali invece che in termini monetari (es. $).

Il calcolo per una variazione percentuale è il seguente:

(Nuovo valore – Vecchio valore) / Vecchio valore

(Prezzo Close – Prezzo medio) / (Prezzo medio)

Che è implementato nel codice come:

pnl = (close - strategy.position_avg_price) / strategy.position_avg_price

Perché non usiamo il prezzo di entrata? Bene, durante la prima entrata, strategy.position_avg_price è il nostro prezzo d’ingresso! Ad ogni entrata successiva, il prezzo medio si abbassa. A questo punto, dobbiamo aggiustare sia il take profit che il successivo livello target di media al ribasso a partire da  strategy.position_avg_price. In questo modo il prezzo medio rappresenta sempre il punto dove la combinazione di tutte le entrate si trasformano in profitti o perdite.

Entrate

Lo script prevede entrate semplici e dirette. Nella prima entrata, controlliamo semplicemente se abbiamo un crossover con la SMA ed effettuiamo un ordine a mercato. Questa entrata è inserita in una specifica condizione poiché vogliamo effettuare la prima entrata solo quando siamo flat, cioè la dimensione della posizione è zero (strategy.position_size == 0).

Per i successivi trade, controlliamo semplicemente se il valore PnL è inferiore o uguale al target percentuale. In questo caso inseriamo un ordine di ingresso a mercato, come segue:

if (pnl <= target_perc)

I grafici

Dopo aver eseguito lo script otteniamo un grafico simile al seguente. Possiamo vedere che tracciamo sia la SMA che la linea del prezzo medio per aiutare a verificare se la strategia funziona come previsto.

Piramidazione su Tradingview - Grafico

Se modifichiamo il numero di livelli piramidali, vediamo che il numero di posizioni previste per alcuni trade aumenta o diminuisce al variare del numero dei livelli. (Durante i trade dove il prezzo si muove in modo significativo contro di noi)

Punti di attenzione

Sulla carta questa strategia può sembrare ottima, ma nel trading live può consumare rapidamente tutto il capitale. Pertanto, consigliamo di impostare la dimensione della posizione con una piccola percentuale del capitale del conto. Consigliamo anche di limitare il numero massimo di operazioni piramidali o le successive dimensioni della posizione per le operazioni  di media al ribasso tramite il parametro target_qty.

Infine, attenzione alle commissioni. Più entrate effettuiamo, più commissioni dobbiamo pagare a meno di non avere un broker senza commissioni.

Potenziali critificità

Ora che sappiamo come usare la Piramidazione su Tradingview, descriviamo alcuni esempi di problemi che possono verificarsi.

La piramidazione non funziona

Ci sono alcuni tipi di strategie dove l’opzione Pyramiding non funzionerà mai. Ad esempio, se prendiamo una semplice strategia di crossover della media mobile, il prezzo incrocia la media al rialzo una volta prima di tornare indietro e generare un segnale short. Pertanto, anche se aumentiamo il ​​numero di ordini piramidali consentiti, i risultati non cambiano.

Il seguente codice è tratto dal modello di strategia predefinito di Tradingview. Si ottiene quando selezioniamo uno “Script di strategia vuoto” nell’editor di script pine.

				
					
//@version=3
strategy("My Strategy", overlay=true)
 
longCondition = crossover(sma(close, 14), sma(close, 28))
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)
 
shortCondition = crossunder(sma(close, 14), sma(close, 28))
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)
				
			

Carichiamo questo codice, accediamo alla scheda “proprietà strategia” e attiviamo il numero di ordini piramidali consentiti. Vediamo che i risultati non cambiano.

Tradingview-Default-Template-1
Tradingview-Default-Template-2

Ci sono troppe entrate!

Un’altra potenziale causa di confusione potrebbe essere la visualizzazione di troppe entrate sul grafico. In questo caso dobbiamo controllare se nel codice stiamo usando le chiamatecontrolla se stai usando strategy.order(). Come detto all’inizio dell’articolo, il valore dell’opzione Pyramiding non ha effetto su quella funzione.

Codice completo

In questo articolo abbiamo descritto come usare la piramidazione su 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

Torna in alto
Scroll to Top