Programmazione ProRealtime
by Marcello Belguardi
La differenza tra una exit e uno stop è che la prima è l'uscita dalla posizione in guadagno, la seconda in perdita rispetto al prezzo di ingresso. E' importante distinguerle ai fini della programmazione.
Un'altra distinzione esiste tra i custom stop ed i built-in stop. La prima categoria comprende tutte le tecniche di uscita dalla posizione che possiamo programmare e aggiornare ad ogni barra, con semplici comandi sell ed exit short, la seconda categoria si riferisce ai comandi di protezione stop offerti nativamente dalla piattaforma. Vediamo di chiarire il concetto con gli esempi che seguono (per il caso long). Iniziamo con alcuni custom stop.
Breakeven Stop
E' lo stop in pari, il tipo di stop più semplice. Si esce dalla posizione corrente appena il prezzo passa sotto il prezzo d'acquisto. Non c'e' sostanzialmente perdita salvo slippage e commissioni.
Ai fini della simulazione, come faccio di solito, utilizzo ingressi forzati ad una certa data.
Ingresso: in chiusura di barra il 20-02-2015 lo script gira e la condizione goLong è verificata. Ciò implica che si invia un ordine a mercato valido per il giorno dopo (il 20 è un venerdì quindi valido per il lunedì successivo, il 23). Il 23 si entra in posizione long in apertura a mercato.
Uscita: Il 23 in chiusura di barra quando lo script gira, si è a mercato, e la condizione if longonmarket è verificata. Il trading system invia quindi un ordine di vendita di tipo stop valido per il giorno dopo al prezzo di breakeven, che è il prezzo registrato di ingresso TRADEPRICE, che è 129.62 . Il giorno dopo, il 24 questo prezzo non viene toccato e l'ordine stop non scatta, e scade perchè è un ordine daily.
Il 24 però in chiusura di barra lo script viene ovviamente valutato nuovamente ed il sistema invia un ordine di vendita di tipo stop valido per il giorno dopo. Questa volta, il 25, scatta lo stop in pari.
Notare i triangolini che mostrano l'ingresso e l'uscita dalla posizione allo stesso prezzo (129.62$), di breakeven appunto.
Il codice per la simulazione è il seguente:
goLong = (date=20150220)
if goLong then
buy 1 share at market
endif
if longonmarket then
sell at TRADEPRICE stop
endif
NOTE:
TRADEPRICE (o TRADEPRICE(1)) è il prezzo di ingresso in posizione al trade più recente.
Tenete presente inoltre che le tre linee di codice seguenti sono equivalenti quando il timeframe è daily:
buy 1 share at market
buy 1 share at market NextBarOpen
buy 1 share at market TomorrowOpen
Classic Stop Loss
Complichiamo le cose: settiamo lo stop loss di protezione. Se scatta c'e' una perdita perchè il mercato ci sta dando torto. Poniamo lo stop ad una distanza del 3% dal prezzo.
Stesso ingresso di prima il 23 Febbraio a 129.62$. Dalla chiusura del 24 Febbraio fino alla chiusura del 4 Marzo lo script viene fatto girare dal sistema ed un ordine stop è inviato per il giorno dopo. Ad ogni barra scade perchè è un ordine daily ed è quindi rinnovato in chiusura. Scatterà per la prima volta il 5 Marzo quando il prezzo perforerà al ribasso il prezzo di ingresso del 3%, a 125.73$, come previsto.
Questo il codice della simulazione, dovrebbe risultare autoesplicativo:
// stop loss %
goLong = (date=20150220)
percentStop = 3 // percent stop at 3%
if longonmarket then
stopLossPrice = (TRADEPRICE(1) - TRADEPRICE(1)*percentStop*0.01)
endif
if goLong then
buy 1 share at market TomorrowOpen
endif
if longonmarket then
sell at stopLossPrice stop
endif
Built-In Stop
Ci sono, inoltre, i comandi di stop loss predefiniti dalla piattaforma.
Esempio:
// built-in stop loss percentuale rispetto al prezzo di ingresso
SET STOP %LOSS 1.5
// built-in stop loss in dollari rispetto al prezzo di ingresso
SET STOP $LOSS 2
Perche quindi esistono questi comandi di stop se è possibile, come abbiamo visto, programmare gli stop utilizzando semplici comandi di sell per posizioni long (ed exit short per posizioni short) ?
I motivi sono due: il primo è che con gli ordini predefiniti si è protetti sin dalla barra di ingresso. Infatti l'ordine di stop che viene inserito nello script è attivo dalla barra seguente, naturalmente se si è effettivamente entrati in posizione.
L'altro motivo è che questo tipo di stop va inteso attivo per tutta la durata del trade (Good Until Cancel - GTC) e non solo per una barra come i precedenti ordini daily. E' insomma uno stop loss di protezione assoluta che andrebbe sempre inserito (in aggiunta agli stop custom).
Quindi per ricapitolare: Gli stop inseriti come ordini sell o exit short che abbiamo visto all'inizio del post sono attivi non dalla prima barra in posizione ma dalla seconda, perchè la condizione onmarket che va inserita nel codice è testata in chiusura della barra in cui si è entrati in ingresso e vanno rinnovati ad ogni barra, eventualmente con condizioni differenti, per esempio per creare un trailing stop.
Gli ordini standard della piattaforma invece sono automaticamente attivi, statici per tutta la durata del trade, ed è la piattaforma che verifica che la posizione sia attiva prima di agganciare lo stop relativo e rinnovare lo stop ogni giorno.
Sono gli stop "di emergenza" per proteggerci da situazioni anomale.
Vediamo un esempio: l'ordine scatta il 24 Febbraio e il sistema entra in posizione il 25 in apertura di mercato. Si assiste ad un downtrend intraday quel giorno e lo stop ci farà uscire ad una distanza del 1.5 % dal prezzo di apertura.
Il codice relativo è il seguente:
// stop loss %
goLong = (date=20150224)
if goLong then
buy 1 share at market TomorrowOpen
endif
SET STOP %LOSS 1.5
//SET STOP $LOSS 2
Lo stop in dollari, commentato nel codice, ha un effetto simile consentendoci di uscire ad una distanza di 2 dollari dal prezzo di ingresso. I due stop sono mutualmente esclusivi.
Un'altra osservazione riguarda il fatto che lo stop built-in aggiunto non è contenuto in uno statement condizionale per esempio di tipo if/then. In questo modo la riga di codice è sempre eseguita ad ogni run dello script, ad ogni chiusura di barra.
Gli esempi sono stati fatti per semplicità solo per posizioni long, ma è immediato scriverli anche per posizioni short.
by Marcello Belguardi
La differenza tra una exit e uno stop è che la prima è l'uscita dalla posizione in guadagno, la seconda in perdita rispetto al prezzo di ingresso. E' importante distinguerle ai fini della programmazione.
Un'altra distinzione esiste tra i custom stop ed i built-in stop. La prima categoria comprende tutte le tecniche di uscita dalla posizione che possiamo programmare e aggiornare ad ogni barra, con semplici comandi sell ed exit short, la seconda categoria si riferisce ai comandi di protezione stop offerti nativamente dalla piattaforma. Vediamo di chiarire il concetto con gli esempi che seguono (per il caso long). Iniziamo con alcuni custom stop.
Breakeven Stop
E' lo stop in pari, il tipo di stop più semplice. Si esce dalla posizione corrente appena il prezzo passa sotto il prezzo d'acquisto. Non c'e' sostanzialmente perdita salvo slippage e commissioni.
Ai fini della simulazione, come faccio di solito, utilizzo ingressi forzati ad una certa data.
Ingresso: in chiusura di barra il 20-02-2015 lo script gira e la condizione goLong è verificata. Ciò implica che si invia un ordine a mercato valido per il giorno dopo (il 20 è un venerdì quindi valido per il lunedì successivo, il 23). Il 23 si entra in posizione long in apertura a mercato.
Uscita: Il 23 in chiusura di barra quando lo script gira, si è a mercato, e la condizione if longonmarket è verificata. Il trading system invia quindi un ordine di vendita di tipo stop valido per il giorno dopo al prezzo di breakeven, che è il prezzo registrato di ingresso TRADEPRICE, che è 129.62 . Il giorno dopo, il 24 questo prezzo non viene toccato e l'ordine stop non scatta, e scade perchè è un ordine daily.
Il 24 però in chiusura di barra lo script viene ovviamente valutato nuovamente ed il sistema invia un ordine di vendita di tipo stop valido per il giorno dopo. Questa volta, il 25, scatta lo stop in pari.
Notare i triangolini che mostrano l'ingresso e l'uscita dalla posizione allo stesso prezzo (129.62$), di breakeven appunto.
Il codice per la simulazione è il seguente:
goLong = (date=20150220)
if goLong then
buy 1 share at market
endif
if longonmarket then
sell at TRADEPRICE stop
endif
NOTE:
TRADEPRICE (o TRADEPRICE(1)) è il prezzo di ingresso in posizione al trade più recente.
Tenete presente inoltre che le tre linee di codice seguenti sono equivalenti quando il timeframe è daily:
buy 1 share at market
buy 1 share at market NextBarOpen
buy 1 share at market TomorrowOpen
Classic Stop Loss
Complichiamo le cose: settiamo lo stop loss di protezione. Se scatta c'e' una perdita perchè il mercato ci sta dando torto. Poniamo lo stop ad una distanza del 3% dal prezzo.
Stesso ingresso di prima il 23 Febbraio a 129.62$. Dalla chiusura del 24 Febbraio fino alla chiusura del 4 Marzo lo script viene fatto girare dal sistema ed un ordine stop è inviato per il giorno dopo. Ad ogni barra scade perchè è un ordine daily ed è quindi rinnovato in chiusura. Scatterà per la prima volta il 5 Marzo quando il prezzo perforerà al ribasso il prezzo di ingresso del 3%, a 125.73$, come previsto.
Questo il codice della simulazione, dovrebbe risultare autoesplicativo:
// stop loss %
goLong = (date=20150220)
percentStop = 3 // percent stop at 3%
if longonmarket then
stopLossPrice = (TRADEPRICE(1) - TRADEPRICE(1)*percentStop*0.01)
endif
if goLong then
buy 1 share at market TomorrowOpen
endif
if longonmarket then
sell at stopLossPrice stop
endif
Ci sono, inoltre, i comandi di stop loss predefiniti dalla piattaforma.
Esempio:
// built-in stop loss percentuale rispetto al prezzo di ingresso
SET STOP %LOSS 1.5
// built-in stop loss in dollari rispetto al prezzo di ingresso
SET STOP $LOSS 2
Perche quindi esistono questi comandi di stop se è possibile, come abbiamo visto, programmare gli stop utilizzando semplici comandi di sell per posizioni long (ed exit short per posizioni short) ?
I motivi sono due: il primo è che con gli ordini predefiniti si è protetti sin dalla barra di ingresso. Infatti l'ordine di stop che viene inserito nello script è attivo dalla barra seguente, naturalmente se si è effettivamente entrati in posizione.
L'altro motivo è che questo tipo di stop va inteso attivo per tutta la durata del trade (Good Until Cancel - GTC) e non solo per una barra come i precedenti ordini daily. E' insomma uno stop loss di protezione assoluta che andrebbe sempre inserito (in aggiunta agli stop custom).
Quindi per ricapitolare: Gli stop inseriti come ordini sell o exit short che abbiamo visto all'inizio del post sono attivi non dalla prima barra in posizione ma dalla seconda, perchè la condizione onmarket che va inserita nel codice è testata in chiusura della barra in cui si è entrati in ingresso e vanno rinnovati ad ogni barra, eventualmente con condizioni differenti, per esempio per creare un trailing stop.
Gli ordini standard della piattaforma invece sono automaticamente attivi, statici per tutta la durata del trade, ed è la piattaforma che verifica che la posizione sia attiva prima di agganciare lo stop relativo e rinnovare lo stop ogni giorno.
Sono gli stop "di emergenza" per proteggerci da situazioni anomale.
Vediamo un esempio: l'ordine scatta il 24 Febbraio e il sistema entra in posizione il 25 in apertura di mercato. Si assiste ad un downtrend intraday quel giorno e lo stop ci farà uscire ad una distanza del 1.5 % dal prezzo di apertura.
Il codice relativo è il seguente:
// stop loss %
goLong = (date=20150224)
if goLong then
buy 1 share at market TomorrowOpen
endif
SET STOP %LOSS 1.5
//SET STOP $LOSS 2
Lo stop in dollari, commentato nel codice, ha un effetto simile consentendoci di uscire ad una distanza di 2 dollari dal prezzo di ingresso. I due stop sono mutualmente esclusivi.
Un'altra osservazione riguarda il fatto che lo stop built-in aggiunto non è contenuto in uno statement condizionale per esempio di tipo if/then. In questo modo la riga di codice è sempre eseguita ad ogni run dello script, ad ogni chiusura di barra.
Gli esempi sono stati fatti per semplicità solo per posizioni long, ma è immediato scriverli anche per posizioni short.