bahlParticipant
Average
stavo guardando https://www.prorealcode.com/blog/trading/complete-trailing-stop-code-function/
e mi chiedo il parametro newsl che viene cosi definito come gisce poi? come, nel caso long, un ordine di vendita stop al valore del parametro?
bahlParticipant
Average
a me pare comunque che ci sia un errore nel codice, io alla r, o si 4iiga 34 sostituirei >= con >, o si rischia un aumento del trailingstop a candele stazionarie o poco crescenti. Ma forse non capisco bene.
Si tratta del Trailing Stop, ho cambiato l’oggetto.
NewSL è il valore a cui deve uscire un’operazione (in profitto, dal momento che se ha un valore è perché ha superato un certo profitto, altrimenti sarebbe zero).
Quando non si è a mercato viene azzerato (righe 23-25), dopodiché, quando si è a mercato verifica che siano stati superati i pips di trailingstart (e poi di trailingstep) per assegnargli un pareggio e poi un eventuale profitto, che crescerà finché non ci sarà un ritracciamento che lo andrà a colpire (a meno che l’operazione non esca prima al raggiungimento del TP stabilito dalla strategia).
Le righe di valorizzazione di NewSL sono le 27-37 per i Long e 39-49 per gli Short. Alle righe 51-55 c’è l’uscita, se è stato valorizzato (quindi ha un valore maggiore di 0). Esegue comunque entrambe le istruzioni di uscita, sia Long che Short, anche se una di esse sarà ignorata da ProOrder, in quanto può esserci aperta solo un’operazione in una direzione, non anche in quella contraria.
E’ un codice molto utile, creato da Nicolas anni fa per sostituire SET STOP pTRAILING.
Se è stato messo un passo di 5 pips, non deve adeguare NewSL da 6, quindi va bene >=.
bahlParticipant
Average
Sto solo cercando di capire in modo dettagliato cosa sto facendo. Mi spiace se le mie osservazioni possono apparire grossolane,.
mi restano alcune perplessità: ho capito che “NewSL è il valore a cui deve uscire un’operazione”. Ma quello che uno si aspetta fissando un trailing stop ad un certo numero di pips, p.es 5 pips, sotto il livello di entrata, è che ad ogni aumento di prezzo a chiusura, lo stop si sposti rimanendo sotto 5 pips dalla chiusura (sempre che nel completamento della candela non si sia andati a colpire lo stop), qui quello che succede è che ad aumenti MINIMI di 5 pips si alza lo stop di 5 pips, per altro se la chiusura di una candela fosse molto superiore a quella precedente, lo stop si alzerebbe ugualmente solo di 5 pips, perché nel suo computo contano solo lo stop precedente ed il numero di pips definiti inizialmente come trailingstep .
Non sto criticando, sto cercando di capire se questo è il movimento del newsl descritto dal codice. Avremmo quindi, nel caso long, una volta innescato il newsl, un innalzamento del newsl di tanti pips quanti determinati dal trailingstep, ogni volta che una candela chiude piu di almeno i pip del trailing step.
se la differenza di chiusura tra due candele successive fosse molto superiore al trilingstep, ugualmente lo stop si innalzerebbe solo del triling step.
E’ cosi?
Inoltre, nel caso la candela successiva apra con un gap al ribasso, sotto lo il valore di trailing stop fissato a quel momento, e non raggiunga il livello di trailing stop, ma continui a scendere, si innesca ugualmente lo stop? Ovvero era un ordine di uscita tipo “sell at newsl stop” ? Nel qualcaso lo stop non verrebbe innescato.
bahlParticipant
Average
un ultima domanda, per testare il codice lo copio lo aggiungo a una strategia, ma come scrivo i punti di stop e trailing, semplicemente sostituendo nel codice quelli che voglio provare?
Inizia a fare trailing da TRAILINGSTART pips di guadagno, dopodiché lo aggiorna ogni TRAILINGSTEP pips.
Se l’aumento successivo è di 20 pips ne aumenta solo 5 (se lo step è di 5).
E’ un codice di base che ognuno puà modificarsi a piacimento, ce ne sono anche altri più complessi (cercando TRAILING STOP li trovi, questo è uno che ho fatto io, che può andare bene anche con l’accumulo di più posizioni https://www.prorealcode.com/topic/breakeeven-trailing-profit/page/3/#post-158898).
Il discorso dei GAP non riguarda il codice, ma il broker. Un ordine STOP viene sempre esguito (questa è la regola), al prezzo indicato o al più vicino possibile, per cui se c’è un gap ampio puoi andare in perdita anche se il trailing stop era attivato ed in profitto.
Si, basta che modifichi i valori numerici, sono siolo due, lo start e lo step.
(nel mio è un pò più complicato, magari quando hai acquisito una certa padronanza della codifica).
bahlParticipant
Average
alla fine ho provato a modificare di un poco il codice, come vi sembra?
//************************************************************************
//trailing stop function
trailingstart = 20 //trailing will start @trailinstart points profit
trailingstep = 5 //trailing step to move the "stoploss"
//reset the stoploss value
IF NOT ONMARKET THEN
newSL=0
ENDIF
//manage long positions
IF LONGONMARKET THEN
//first move (breakeven)
IF newSL=0 AND close-tradeprice(1)>=trailingstart*pipsize THEN
newSL = tradeprice(1)+trailingstep*pipsize
ENDIF
//next moves
IF newSL>0 AND close-newSL>=trailingstep*pipsize THEN
newSL = HIGHEST[BarIndex - TradeIndex](high)-trailingstep*pipsize
ENDIF
ENDIF
//manage short positions
IF SHORTONMARKET THEN
//first move (breakeven)
IF newSL=0 AND tradeprice(1)-close>=trailingstart*pipsize THEN
newSL = tradeprice(1)-trailingstep*pipsize
ENDIF
//next moves
IF newSL>0 AND newSL-close>=trailingstep*pipsize THEN
newSL = lowest[barindex-tradeindex](low)-trailingstep*pipsize
ENDIF
ENDIF
//stop order to exit the positions
IF newSL>0 THEN
SELL AT newSL STOP
EXITSHORT AT newSL STOP
ENDIF
Mi sembra un’ottima soluzione per lo STEP che va bene nella generalità dei casi.
Non funzionerà:
- in caso di chiusure parziali di posizioni, in quanto TRADEPRICE farà riferimento all’ultimo prezzo, che sarà quello di uscita di una parte della posizione, non quello d’entrata. In tal caso andrà trovato un sistema più preciso (o si continua ad usare il codice originale di Nicolas)
- quando si accumulano posizioni, in quanto in quel caso il prezzo di riferimento non è più TRADEPRICE, ma POSITIONPRICE che ne è una media (basta sostuire la seconda istruzione alla prima, anzi, puoi metterla già, in quanto se non fai nessun accumulo le due istruzioni sono identiche).
Un suggerimento, per evitare che l’espressione tra parentesi quadre [BarIndex – TradeIndex] possa essere zero, ti suggerisco di sostituirla con:
[max(1,BarIndex - TradeIndex])