Trailing stop

Viewing 14 posts - 1 through 14 (of 14 total)
  • Author
    Posts
  • #47557 quote
    R05
    Participant
    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
    #47561 quote
    R05
    Participant
    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
    
    #47575 quote
    robertogozzi
    Moderator
    Master

    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
    Andrea thanked this post
    #47576 quote
    robertogozzi
    Moderator
    Master

    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
    Andrea thanked this post
    #47578 quote
    R05
    Participant
    Veteran

    Grazie grande, gentilissimo. Eccezionale, sto già facendo delle prove.

    #47632 quote
    R05
    Participant
    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.

    #47639 quote
    robertogozzi
    Moderator
    Master

    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.

    #47668 quote
    R05
    Participant
    Veteran

    Ok  grazie.

    #49043 quote
    R05
    Participant
    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

    #49089 quote
    robertogozzi
    Moderator
    Master

    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!

    #49142 quote
    R05
    Participant
    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
    
    #49143 quote
    R05
    Participant
    Veteran

    Ho inserito in più set stop ploss 50.

    #49234 quote
    robertogozzi
    Moderator
    Master

    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.

    #49397 quote
    R05
    Participant
    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.

Viewing 14 posts - 1 through 14 (of 14 total)
  • You must be logged in to reply to this topic.

Trailing stop


ProOrder: Trading Automatico & Backtesting

New Reply
Author
author-avatar
R05 @r05 Participant
Summary

This topic contains 13 replies,
has 2 voices, and was last updated by R05
8 years, 3 months ago.

Topic Details
Forum: ProOrder: Trading Automatico & Backtesting
Language: Italian
Started: 09/27/2017
Status: Active
Attachments: No files
Logo Logo
Loading...