Generalmente quando viene instanziata una strategy su Pine Script il fattore temporale non viene quasi mai preso in considerazione per il backtesting. Questo perché di fatto Pine va indietro retroattivamente pressoché all’infinito, cioè da quando ha iniziato a collezionare dati sulla coppia che stiamo testando.
Può però essere molto utile identificare due date, cioè un particolare periodo, magari dove il mercato non era favorevole, per cercare di capire come la nostra strategia si sarebbe comportata in quel frangente.
Chiaramente questo è possibile, vediamo un po’ la logica di funzionamento.
Per prima cosa dobbiamo fornire gli input necessari a formare le date, quindi avremo bisogno di Anno, Mese e Giorno sia della data iniziale che quella finale.
// create inputs for start and end date
startDate = input(title="Start Day", type=input.integer, defval=1, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer, defval=2017, minval=1800, maxval=2100)
endDate = input(title="End Day", type=input.integer, defval=1, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer, defval=12, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer, defval=2021, minval=1800, maxval=2100)
In secondo luogo dovremo poi attuare la strategia, nel caso specifico mi sono limitato a copiare una strategia EMA LONG dalla libreria pubblica (creata da coingrabber). Però prima di applicarvi le nostre date dobbiamo mettere un controllo preventivo affinché la data di partenza non risulti posteriore alla data di termine.
// Check if the start time is not before end time
dateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0)) and (time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0))
Successivamente possiamo utilizzare questo controllo per controllare i comandi relativi a strategy.entry e strategy.close. Il risultato finale del codice sarà quanto segue:
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
//
// by Walter Tosolini
// https://trading.tosolini.info
//
// EMA long strategy by coingrabber
// https://www.tradingview.com/script/yeBIG7oZ-Simple-EMA-Long-Only-Strategy/
//
//-------------------------------------------------
// enter start and end date
// plus regulate EMA value
// and simulate trade in specific range of date
//-------------------------------------------------
//@version=4
strategy(title="Trade between two dates", overlay=true, commission_type=strategy.commission.percent, commission_value=0.1)
// create inputs for start and end date
startDate = input(title="Start Day", type=input.integer, defval=1, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer, defval=2017, minval=1800, maxval=2100)
endDate = input(title="End Day", type=input.integer, defval=1, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer, defval=12, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer, defval=2021, minval=1800, maxval=2100)
emaClose = input(title="EMA period", type=input.integer, defval=21, minval=1)
multiply = input(title="Multipler", type=input.float, defval=1, minval=0)
// Check if the start time is not before end time
dateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0)) and (time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0))
// Calculate strategy to EMA cross values
price = sma(close, 2)
average = ema(close, emaClose)
diff = atr(emaClose) * multiply
bull_level = average + diff
bear_level = average - diff
bull_cross = crossover(price, bull_level)
bear_cross = crossover(bear_level, price)
if (dateRange and bull_cross)
strategy.entry("Buy", strategy.long)
if (dateRange and bear_cross)
strategy.close("Sell")
plot(price, title="price", color=color.black, transp=50, linewidth=2)
a0 = plot(average, title="average", color=color.red, transp=50, linewidth=1)
a1 = plot(bull_level, title="bull", color=color.green, transp=50, linewidth=1)
a2 = plot(bear_level, title="bear", color=color.red, transp=50, linewidth=1)
fill(a0, a1, color=color.green, transp=97)
fill(a0, a2, color=color.red, transp=97)