// Definizione dei parametri del codice
DEFPARAM CumulateOrders = False // Posizioni cumulate disattivate
// Condizioni per entrare su posizioni long
indicator1 = ExponentialAverage[200](low)
c1 = (close[1] CROSSES OVER indicator1)
IF c1 THEN
BUY 1 CONTRACT AT MARKET
ENDIF
// Condizioni per uscire da posizioni long
indicator2 = ExponentialAverage[200](low)
c2 = (close[1] CROSSES UNDER indicator2)
IF c2 THEN
SELL AT MARKET
ENDIF
// trailing stop function
trailingstart = 20 //5 trailing will start @trailinstart points profit
trailingstep = 5 //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
CAND = BarIndex - TradeIndex
IF newSL > 0 AND CLOSE[1] > HIGHEST[CAND](CLOSE) THEN
newSL = CLOSE[1] - TrailingStart*PipSize
ENDIF
ENDIF
//manage short positions
IF SHORTONMARKET THEN
//first move (breakeven)
IF newSL = 0 AND TRADEPRICE(1) - CLOSE[1] >= TrailingStart*PipSize THEN
newSL = TRADEPRICE(1) - TrailingStep*PipSize
ENDIF
//next moves
CAND = BarIndex - TradeIndex
IF newSL > 0 AND CLOSE[1] < LOWEST[CAND](CLOSE) THEN
newSL = CLOSE[1] + TrailingStart*PipSize
ENDIF
ENDIF
//stop order to exit the positions
IF newSL > 0 THEN
SELL AT newSL STOP
EXITSHORT AT newSL STOP
ENDIF
In questo Ts su dax in m30, io inserisco il codice trailing stop con trailing start di 20 pip e step di 5 pip.
Cio vuol dire che se il ts apre una posizione a 13.000 lo stop è impostato a 12.980 iniziale e che se il prezzo fa 13.206 e cioè supera lo step di 5 pip, il trailing stop mi dovrebbe essere salito.
Perche’ se io imposto un trailing stop iniziale di 20 pip, ci sono operazioni long che si chiudono con perdite anche di 40/50 pip?
Ho sbagliato qualcosa nel codice?
Questo codice scritto da Nicolas è un sostituto del trailing stop nativo (che non funziona come dovrebbe). Ha lo svantaggio, essendo parte di una strategia, di essere eseguito SOLO alla chiusura della candela, per cui su timeframe alti, come il 30 minuti (su timeframe di 4 ore o maggiori è, secondo me, inutile purtroppo) può capitare che in tanti minuti il prezzo abbia superato quel limite (ed il DAX in 30 minuti può farne di strada!) ed avrebbe dovuto attivare il trailing, ma alla chiusura il prezzo ha ritracciato ed è tornato entro il limite, per cui a quel punto è come se quel limite non fosse stato mai superato. Se a quel punto il prezzo va ancora indietro ti colpisce lo stop loss.
E’ un codice molto utile, specialmente sui TF bassi, ma è un “escamotage” che non da garanzie di successo.
Roberto
ciao Roberto capito perfettamente, ma testato su time frame m5 su dax cmq mi stoppa oppure su time frame m3 cmq mi da lo stesso porblema e cioe’ settando il traling stop start di 20 pip ci sono operazioni che mi arrivano a lossare anche di 80/90 pip
Secondo me funziona alla grande, prova ad aggiungere queste righe a fine codice per il debugging (vanno tolte o commentate quando lanci la strategia):
GRAPH TradePrice(1)
GRAPH newSL
GRAPH CAND
GRAPH close[1]
GRAPH TrailingStart * pipsize
Il Problema principale è che quasi sempre c’è subito un riattraversamento contrario della media che fa terminare il trade.
Fai un ulteriore tentativo con questa versione, dove ho aggiunto le righe di cui sopra, ho commentato la riga del SELL ed ho aggiunto all’inizio lo Stop Loss ed il Target Profit, penso andrà meglio e noterai che il trailing stop funziona:
// Definizione dei parametri del codice
DEFPARAM CumulateOrders = False // Posizioni cumulate disattivate
SET TARGET PPROFIT 20
SET STOP PLOSS 10
// Condizioni per entrare su posizioni long
indicator1 = ExponentialAverage[200](low)
c1 = (close[1] CROSSES OVER indicator1)
IF c1 THEN
BUY 1 CONTRACT AT MARKET
ENDIF
// Condizioni per uscire da posizioni long
indicator2 = ExponentialAverage[200](low)
c2 = (close[1] CROSSES UNDER indicator2)
IF c2 THEN
//SELL AT MARKET
ENDIF
// trailing stop function
trailingstart = 20 //5 trailing will start @trailinstart points profit
trailingstep = 5 //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
CAND = BarIndex - TradeIndex
IF newSL > 0 AND CLOSE[1] > HIGHEST[CAND](CLOSE) THEN
newSL = CLOSE[1] - TrailingStart*PipSize
ENDIF
ENDIF
//manage short positions
IF SHORTONMARKET THEN
//first move (breakeven)
IF newSL = 0 AND TRADEPRICE(1) - CLOSE[1] >= TrailingStart*PipSize THEN
newSL = TRADEPRICE(1) - TrailingStep*PipSize
ENDIF
//next moves
CAND = BarIndex - TradeIndex
IF newSL > 0 AND CLOSE[1] < LOWEST[CAND](CLOSE) THEN
newSL = CLOSE[1] + TrailingStart*PipSize
ENDIF
ENDIF
//stop order to exit the positions
IF newSL > 0 THEN
SELL AT newSL STOP
EXITSHORT AT newSL STOP
ENDIF
GRAPH TradePrice(1)
GRAPH newSL
GRAPH CAND
GRAPH close[1]
GRAPH TrailingStart * pipsize
Ciao Roberto, ho provato il codice, ma purtoppo mi da sempre il solito probelam e cioè se io imposto un trailing iniziale di 20pt, ci sono operazioni in cui il ts mi chiude con perdite anche di 90/100 pt.
io l?ho testato su time frame 5,10 e 15 minuti. Non so cosa non sta funzionando nel codice.
Te lo hai testato personalmente?
Su quale strumento (e per quali periodi) lo hai provato?
Ciao Roberto ho provato il ts sul dax 5 minuti, ma anche dax 15 minuti
L’ho provato anch’io sul DAX a 5 e 15 minuti e mi sembra funzioni correttamente. Non so che dirti.
Indicami un TF preciso ed il periodo preciso del TEST (da… a….) ed allega uno screenshot del grafico.
// Definizione dei parametri del codice
DEFPARAM CumulateOrders = False // Posizioni cumulate disattivate
SET TARGET PPROFIT 100
SET STOP PLOSS 500
// Condizioni per entrare su posizioni long
indicator1 = ExponentialAverage[26](low)
c1 = (close[1] CROSSES OVER indicator1)
IF c1 THEN
BUY 1 CONTRACT AT MARKET
ENDIF
// trailing stop function
trailingstart = 20 //5 trailing will start @trailinstart points profit
trailingstep = 5 //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
CAND = BarIndex - TradeIndex
IF newSL > 0 AND CLOSE[1] > HIGHEST[CAND](CLOSE) THEN
newSL = CLOSE[1] - TrailingStart*PipSize
ENDIF
ENDIF
//manage short positions
IF SHORTONMARKET THEN
//first move (breakeven)
IF newSL = 0 AND TRADEPRICE(1) - CLOSE[1] >= TrailingStart*PipSize THEN
newSL = TRADEPRICE(1) - TrailingStep*PipSize
ENDIF
//next moves
CAND = BarIndex - TradeIndex
IF newSL > 0 AND CLOSE[1] < LOWEST[CAND](CLOSE) THEN
newSL = CLOSE[1] + TrailingStart*PipSize
ENDIF
ENDIF
//stop order to exit the positions
IF newSL > 0 THEN
SELL AT newSL STOP
EXITSHORT AT newSL STOP
ENDIF
GRAPH TradePrice(1)
GRAPH newSL
GRAPH CAND
GRAPH close[1]
GRAPH TrailingStart * pipsize
Ciao Roberto. ad esmpio in questa strategia ho eliminato la condizione di uscita long.
Ho inserito un trailing stop ma purtoppo c’è una posizione che si chiude a -500punti.
ho inserito stop loss in alto di 500pt.
come puoi vedere da screenshot, in data 13/11/2017 la posizione si e chiusa con stop di 500pt (le operazioni sono state eseguite con il codice allegato sopra su time frame 15 minuti)
Come è possibile?
Forse non ho capito bene io la logica del trailing.
Potresti gentilemnte rispiegarmi l’impostazione dei valori “trailingstart” e trailingstep”?
Grazie anticipate
La perdita è su quella del 7, non del 13.
Hai 500 punti di SL perché il Profitto NON supera mai 20 Pips (anzi, è sempre negativo), quindi il Trailing Stop NON può funzionare. Non funzionerebbe neppure in manuale!!! Il Trailing Stop serve per accorciare lo SL (fino a metterlo addirittura in profitto, se possibile) mano a mano che il profitto aumenta. Serve a salvaguardarsi da eccessivi SL dopo avere fatto un certo profitto. Cioè, se tu, in manuale, metti un Target di 200 Pips ed uno Stop di -100, magari puoi scegliere di usare un Trailing Stop di 50 (o altro), per cui dopo i primi 50 Pips guadagnati lo Stop viene portato a -50, dopo ulteriori 50 pips (quindi 100 in totale) viene portato a ZERO, dopo altri 50 (150 in totale) viene portato a +50. Se l’operazione NON supera mai la soglia da te impostata, lo Stop resta in variato come l’hai indicato inizialmente (se non l’hai indicato allora fino quando si verifica una condizione contraria, ad esempio due medie che si invertono in modo opposto, sempre che tu l’abbia previsto, oppure fino al Margin Call).
Quindi il codice funziona perfettamente, l’unico svantaggio di non averlo in piattaforma, ma in codice, è che quest’ultimo verrà eseguito solo alla chiusura della candela, per cui se nei 15 minuti di durata della candela il prezzo supera la soglia da te impostata (ad esempio 20), ma alla chiusura il prezzo è sceso sotto (ad esempio a 19.9) e da li non riparte più…. andrai in stop loss completamente fino alla fine! E’ una scocciatura sicuramente, ma è molto meglio che non avere nessun Trailing Stop!
La logica di quel codice per il Trailing Stop è:
- TRAILINGSTART indica da quanti Pips di profitto vuoi partire a fare il trailing (20 significa che fino a 19.9 pips il trailing non parte)
- TRAILINGSTEP indica di ogni quanti (e di quanti) Pips vuoi incrementare lo Stop ogni volta (5 significa che ad ogni ulteriori 5 pips di profitto dal precedente Stop, lo incrementa della stessa quantità, cioè 5: quindi 20, 25, 30, …); se lo avevi impostato a -47 (sempre a titolo di esempio), dopo i primi 20 pips di profitto verrà portato a -27 (-47 + 20), poi ogni volta a -22, -17, -12, ecc… (di 5 in 5).
Grazie Roberto, ora è tutto chiaro. non avevo capito che il prezzo lo calcola sono in chiusura di candela se super o no il trailing start