R05Participant
Veteran
Salse a tutti, ho trovato il codice che allego riguardante il trailing stop. Mi aiutate a capire come va interpretato?
A me servirebbe un trailing stop che quando sta guadagnando diciamo 15 punti metta lo stop a pareggio, e poi andare avanti di step in step ogni 20 punti. Non so se questo codice faccia questo.
Vi ringrazio.
// TRAILING STOP LOGIK
TGL =AverageTrueRange[14](close)*2.5
TGS=AverageTrueRange[14](close)*1.7
if not onmarket then
MAXPRICE = 0
MINPRICE = close
PREZZOUSCITA = 0
ENDIF
if longonmarket then
MAXPRICE = MAX(MAXPRICE,close)
if MAXPRICE-tradeprice(1)>=TGL*pointsize then
PREZZOUSCITA = MAXPRICE-TGL*pointsize
ENDIF
ENDIF
if shortonmarket then
MINPRICE = MIN(MINPRICE,close)
if tradeprice(1)-MINPRICE>=TGS*pointsize then
PREZZOUSCITA = MINPRICE+TGS*pointsize
ENDIF
ENDIF
if onmarket and PREZZOUSCITA>0 then
EXITSHORT AT PREZZOUSCITA STOP
SELL AT PREZZOUSCITA STOP
ENDIF
R05Participant
Veteran
Credo di aver risolto la prima parte, e cioè partendo da uno stop loss iniziale di 30 punti, se il prezzo dovesse essere superiore di 15 punti rispetto all’entrata, allora mette lo stop in pareggio ovvero al prezzo di entrata.
Ora devo capire come fare in modo di continuare il trade con il trailing stop di 20 punti.
SET STOP PLOSS 30
// TRAILING STOP LOGIK
TGL =15
TGS=15
if not onmarket then
MAXPRICE = 0
MINPRICE = close
PREZZOUSCITA = 0
ENDIF
if longonmarket then
MAXPRICE = MAX(MAXPRICE,close)
if MAXPRICE-tradeprice(1)>=TGL*pointsize then
PREZZOUSCITA = MAXPRICE-TGL*pointsize
ENDIF
ENDIF
if shortonmarket then
MINPRICE = MIN(MINPRICE,close)
if tradeprice(1)-MINPRICE>=TGS*pointsize then
PREZZOUSCITA = MINPRICE+TGS*pointsize
ENDIF
ENDIF
if onmarket and PREZZOUSCITA>0 then
EXITSHORT AT PREZZOUSCITA STOP
SELL AT PREZZOUSCITA STOP
ENDIF
Per il Breakeven vedi questo link https://www.prorealcode.com/blog/learning/breakeven-code-automated-trading-strategy/.
Questo è il codice:
startBreakeven = 30 //30 pips in gain to activate the breakeven function
PointsToKeep = 5 //5 pips to keep in profit above/below entry price when the breakeven is activated
//
// test if the price have moved favourably of "startBreakeven" points already
//
// --- LONG side
IF LONGONMARKET AND (close - tradeprice(1)) >= (startBreakeven * pipsize) THEN
breakevenLevel = tradeprice(1) + (PointsToKeep * pipsize) //calculate the breakevenLevel
//place the new stop orders on market at breakevenLevel
IF breakevenLevel > 0 THEN
SELL AT breakevenLevel STOP
ENDIF
ENDIF
// --- SHORT side
IF SHORTONMARKET AND (tradeprice(1) - close) >= (startBreakeven * pipsize) THEN
breakevenLevel = tradeprice(1) + (PointsToKeep * pipsize) //calculate the breakevenLevel
//place the new stop orders on market at breakevenLevel
IF breakevenLevel > 0 THEN
EXITSHORT AT breakevenLevel STOP
ENDIF
ENDIF
Per il Trailing Stop vedi questo link https://www.prorealcode.com/blog/trading/complete-trailing-stop-code-function/.
Questo è il codice:
// trailing stop function
trailingstart = 5 //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
R05Participant
Veteran
Grazie grande, gentilissimo. Eccezionale, sto già facendo delle prove.
R05Participant
Veteran
Gentilissimo Roberto ti ringrazio del codice del trailing stop e ti confermo che funziona alla grande. Volevo vhiederti, gentilmente, se per il giornaliero devo fare qualcosa in particolare, perchè dai backtest o mi prende il take profit o lo stop loss o mi va in pareggio.
Ti ringrazio.
Per il daily forse è un problema di numero di Pips di STOP o TAKE PROFIT, essendo spesso candele grandi è possibile che una candela sia sufficiente a farti uscire, in un modo o nell’altro.
Inoltre sul Daily non devi usare DEFPARAM FLATBEFORE/AFTER, altrimenti la strategia non funziona.
Un’altra cosa, sui TF più grandi spunta la casella “Probacktest in modlità tick per tick” per avere la sicurezza che la performance sia corretta, altrimenti puoi incorrere nel problema della “barra 0”, ovvero quando sulla stessa barra si verificano sia lo STOP LOSS che il TAKE PROFIT. Se tick per tick non è selezionato, ProOrder da per scontato il TAKE PROFIT. Con tick per Tick, invece, viene ricostruita la candela ad ogni tick, garantendoti il corretto ordine in cui sono colpiti. Questa funzionalità, aggiunta lo scorso 1 Gennaio 2017, non va molto indietro però, per cui se devi fare un backtest di più di 2-3 anni non potrai utilizzare questa modalità, rendendo il backtest meno efficace.
R05Participant
Veteran
Gent.mi mi confermate che il trailing stop e il breakeven riportati sopra da Roberto applicate ad una qualsiasi strategia nel conto demo non funzionano?
Perchè nel backtest funzionano perfettamente (anche in demo) mentre quando va ad aprire la posizione direttamente nella piattaforma non me li prende.
Vi ringrazio
Non saprei dirti perché finché non ci sarà la versione multitimeframe opero solo in demo, sembra un pò strano, speriamo che Nicolas possa aiurati/aiutarci!
R05Participant
Veteran
Ho un dubbio: allego il codice cui ho aggiunto il breakeven e il trailing stop per vedere se non abbia io fatto qualche errore nell’aggiungerli.
DEFPARAM CumulateOrders = False
defparam flatbefore = 060000
defparam flatafter = 220000
ONCE TradeOnL = 0 //inizializzazione variabile
ONCE TradeOn = 0 //inizializzazione variabile
IF OnMarket THEN
TradeOnL = 0 //una volta a mercato azzerare la variabile
TradeOn = 0 //una volta a mercato azzerare la variabile
ENDIF
// Condizioni per entrare long
MacdValL = MACD[14,26,9] //valore del MACD
IF MacdValL CROSSES OVER 0 THEN //se incrocia al rialzo....
TradeOnL = 1 //...settare la variabile per tradare e...
TopHigh = highest[10](high) //...salvare il massimo delle ultime 10 candele.
ELSIF MacdValL CROSSES UNDER 0 THEN
TradeOnL = 0 //Se il MACD torna sotto lo 0, annullare tutto
ENDIF
IF summation[6](MacdValL > 0) = 6 THEN //se il MACD è sopra lo 0 da oltre 5 candele...
TradeOnL = 0 //...annullare e ripartire da zero.
ENDIF
IF TradeOnL THEN //Se condizioni soddisfatte aprire il trade
BUY 1 CONTRACT AT tophigh stop
ENDIF
// Condizioni per uscire da posizioni long
indicator3 = MACDline[12,26,9](close)
indicator4 = ExponentialAverage[9](indicator3)
c2 = (indicator3 CROSSES UNDER indicator4)
IF c2 THEN
SELL AT MARKET
ENDIF
// Condizioni per entrare short
MacdVal = MACD[14,26,9] //valore del MACD
IF MacdVal CROSSES UNDER 0 THEN //se incrocia al ribasso....
TradeOn = 1 //...settare la variabile per tradare e...
TopLow = lowest[10](low) //...salvare il minimo delle ultime 10 candele.
ELSIF MacdVal CROSSES OVER 0 THEN
TradeOn = 0 //Se il MACD torna sopra lo 0, annullare tutto
ENDIF
IF summation[6](MacdVal < 0) = 6 THEN //se il MACD è sotto lo 0 da oltre 5 candele...
TradeOn = 0 //...annullare e ripartire da zero.
ENDIF
IF TradeOn THEN //Se condizioni soddisfatte aprire il trade
SELLSHORT 1 CONTRACT AT toplow stop
ENDIF
// Condizioni per uscire da posizioni short
indicator7 = MACDline[12,26,9](close)
indicator8 = ExponentialAverage[9](indicator7)
c4 = (indicator7 CROSSES OVER indicator8)
IF c4 THEN
EXITSHORT AT MARKET
ENDIF
set stop ploss 50
startBreakeven = 15 //15 pips in gain to activate the breakeven function
PointsToKeep = 0 //0 pips to keep in profit above/below entry price when the breakeven is activated
//
// test if the price have moved favourably of "startBreakeven" points already
//
// --- LONG side
IF LONGONMARKET AND (close - tradeprice(1)) >= (startBreakeven * pipsize) THEN
breakevenLevel = tradeprice(1) + (PointsToKeep * pipsize) //calculate the breakevenLevel
//place the new stop orders on market at breakevenLevel
IF breakevenLevel > 0 THEN
SELL AT breakevenLevel STOP
ENDIF
ENDIF
// --- SHORT side
IF SHORTONMARKET AND (tradeprice(1) - close) >= (startBreakeven * pipsize) THEN
breakevenLevel = tradeprice(1) + (PointsToKeep * pipsize) //calculate the breakevenLevel
//place the new stop orders on market at breakevenLevel
IF breakevenLevel > 0 THEN
EXITSHORT AT breakevenLevel STOP
ENDIF
ENDIF
// trailing stop function
trailingstart = 20 //20 trailing will start @trailinstart points profit
trailingstep = 12 //12 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
R05Participant
Veteran
Ho inserito in più set stop ploss 50.
Ho fatto le verifiche sul DAX e TF h1, il problema c’è, ma, purtroppo, non è risolvibile.
Il codice per il trailing stop ed il breakeven opera insieme alla strategia, per cui viene eseguito solo alla fine della candela oraria corrente. A quel punto valuta i livelli e, in molti casi, capita che il livello sia più basso del breakeven; a quel punto NON chiude subito l’operazione (che non è più a breakeven, ma in loss) ma mette un ordine pendente che chiuda l’operazione quando torna a breakeven, cosa che alcune volte non capita e la perdita aumenta. Si potrebbe modificare il codice per dirgli che, se il breakeven era stato attivato precedentemente ed ora l’operazione è in perdita, questa venga immediatamente, In pratica è un pò come dirgli “se riesci a chiudere a breakeven bene, ma in ogni caso chiudi se in perdita”.
Purtroppo sui TF lunghi questo è il problema, almeno finché non sarà messa a disposizione la versione multitimeframe che, stanto a quanto si dice, dovrebbe risolvere questi problemi. magari perché parti del codice, come questi, potrebbero essere eseguiti ogni secondo, lasciando il resto della strategia operare sul TF h1.
Certamente sul TF a 1 minuto grossi problemi non dovrebbero esserci.
R05Participant
Veteran
Ok grazie Roberto. Bene a sapersi, a questo punto devo riconsiderare bene le strategie. Peccato però. Speriamo che prorealtime implementi al più presto la funzionalità multitimeframe perchè altrimenti si potrebbe essere un pò limitati.