Dopo vari giorni sono riuscito a finirlo.
E’ il mio codice postato sopra, trasformato in indicatore:
ONCE myCapital = 10000 //Capitale iniziale
ONCE Direzione = 0
ONCE NowLong = 0 //LongOnMarket
ONCE NowShort = 0 //ShortOnMarket
ONCE myProfit = 0 //StrategyProfit
ONCE EntryPrice = 0 //TradePrice
ONCE Wins = 0 //operazioni vincenti (o neutre)
ONCE Losses = 0 //operazioni perdenti
ONCE SL = 400 * PipSize
ONCE TP = SL * 3
ONCE TrailStart = 40 //trailing will start @trailinstart points profit
ONCE TrailStep = 70 //trailing step to move the "stoploss"
ONCE tempGain = 0
myEquity = myCapital + myProfit //Equity
NowOnMarket = NowLong OR NowShort //OnMarket
TotalTrades = Wins + Losses
Offset1 = average[20,0](range) * 1.2
Offset2 = Offset1 * 1.1
//
//-------------------------------------------------------------------------------------------------------------------
//
// verifcare:
// 1) se raggiunto TP o Trailing Stop (in tal caso aggiornare myProfit e segnalare l'operazione come chiusa)
// 2) se raggiunto SL (in tal caso aggiornare myProfit e segnalare l'operazione come chiusa)
// 3) profitto temporaneo (se ancora a mercato)
//
IF NowLong THEN //LONG
tempGain = (close - EntryPrice) / PipSize * PipValue
ELSIF NowShort THEN //SHORT
tempGain = (EntryPrice - close) / PipSize * PipValue
ENDIF
IF NowLong THEN //LONG
IF (close >= TPprice) OR (newSL <> 0 AND close >= newSL) OR (close <= SLprice) THEN //TP, Trailing Stop, o SL
NowLong = 0
NowOnMarket = 0
myProfit = myProfit + tempGain
myEquity = myCapital + myProfit
IF tempGain >= 0 THEN
Wins = Wins + 1
ELSE
Losses = Losses + 1
ENDIF
TotalTrades = Wins + Losses
newSL = 0
trailingTEMP = TrailStep
ENDIF
ELSIF NowShort THEN //SHORT
IF (close <= TPprice) OR (newSL <> 0 AND close <= newSL) OR (close >= SLprice) THEN //TP, Trailing Stop, o SL
NowShort = 0
NowOnMarket = 0
myProfit = myProfit + tempGain
myEquity = myCapital + myProfit
IF tempGain >= 0 THEN
Wins = Wins + 1
ELSE
Losses = Losses + 1
ENDIF
TotalTrades = Wins + Losses
newSL = 0
trailingTEMP = TrailStep
ENDIF
ENDIF
//
//-------------------------------------------------------------------------------------------------------------------
//
// stampa dei simboli di chiusura operazione
//
IF TotalTrades <> TotalTrades[1] THEN
IF tempGain >= 0 THEN
DrawText("☺",BarIndex,high + Offset1,dialog,bold,16) coloured("Green")
ELSE
DrawText("☹",BarIndex,high + Offset1,dialog,bold,13) coloured("Red")
ENDIF
ENDIF
//
//-------------------------------------------------------------------------------------------------------------------
//
// calcolo del PIVOT
//
ONCE N = 5
PP = (DHigh(1) + DLow(1) + DClose(1))/3 //PP calculation
//
//-------------------------------------------------------------------------------------------------------------------
//
// verifica delle condizioni (PP funge sia da Resistenza che Supporto)
//
Res1 = summation[N](close <= PP) = N //il prezzo deve essere da N candele sotto il PIVOT
Res2 = summation[N](high >= PP) //il massimo deve essere sopra il PIVOT
Res = Res1 AND Res2 //trovata la resistenza
//
Sup1 = summation[N](close >= PP) = N //il prezzo deve essere da N candele sopra il PIVOT
Sup2 = summation[N](low <= PP) //il minimo deve essere sotto il PIVOT
Sup = Sup1 AND Sup2 //trovato il supporto
//
//-------------------------------------------------------------------------------------------------------------------
//
// apertura posizioni (se le condizioni sono verificate)
//
IF Sup AND Not NowOnMarket THEN //LONG
//
NowLong = 1
NowShort = 0
NowOnMarket = 1
EntryPrice = close
SLprice = close - SL
TPprice = close + TP
trailingTEMP= TrailStep
newSl = 0
Direzione = 1
DrawText("↑",BarIndex,low - Offset1,dialog,bold,28) coloured("DeepSkyBlue")
//
ELSIF Res AND Not NowOnMarket THEN //SHORT
//
NowShort = 1
NowLong = 0
NowOnMarket = 1
EntryPrice = close
SLprice = close + SL
TPprice = close - TP
trailingTEMP= TrailStep
newSl = 0
Direzione = -1
DrawText("↓",BarIndex,low - Offset1,dialog,bold,28) coloured("DarkGoldenRod")
//
ENDIF
//
//*********************************************************************************
// https://www.prorealcode.com/blog/trading/complete-trailing-stop-code-function/
// (lines 17- 56), modificato
//
//trailing stop function
//
IF NowOnMarket then
Volatilita = close / close[3] // aggiornamento dello STEP secondo la volatilità delle ultime 4 candele
//
IF NowLong THEN
IF Volatilita > 1.005 THEN
trailingTEMP = trailingTEMP + 1 //oppure trailingTEMP = trailingTEMP * 1.1, o altro...
ELSIF Volatilita < 0.995 THEN
trailingTEMP = trailingTEMP - 1 //oppure trailingTEMP = trailingTEMP * 0.9, o altro...
ENDIF
trailingTEMP = max(0,trailingTEMP)
//
ELSIF NowShort THEN
IF Volatilita < -0.995 THEN
trailingTEMP = trailingTEMP + 1 //oppure trailingTEMP = trailingTEMP * 1.1, o altro...
ELSIF Volatilita > 1.005 THEN
trailingTEMP = trailingTEMP - 1 //oppure trailingTEMP = trailingTEMP * 0.9, o altro...
ENDIF
trailingTEMP = max(0,trailingTEMP)
ENDIF
//manage long positions
IF NowLong THEN
//first move (breakeven)
IF newSL=0 AND close-EntryPrice>=TrailStart*pipsize THEN
newSL = EntryPrice+trailStart*pipsize
ENDIF
//next moves
IF newSL>0 AND close-newSL>=trailingTEMP*pipsize THEN
newSL = newSL+trailingTEMP*pipsize
newSL = max(newSL,newSL[1])
ENDIF
ENDIF
//manage short positions
IF NowShort THEN
//first move (breakeven)
IF newSL=0 AND EntryPrice-close>=TrailStart*pipsize THEN
newSL = EntryPrice-trailStart*pipsize
ENDIF
//next moves
IF newSL>0 AND newSL-close>=trailingTEMP*pipsize THEN
newSL = newSL-trailingTEMP*pipsize
newSL = min(newSL,newSL[1])
ENDIF
ENDIF
ENDIF
//*********************************************************************************
//
// sezione stampa REPORT
//
IF IsLastBarUpdate THEN
IF Direzione[1] = 1 THEN
drawtext ("LONG ", -150 ,-6) anchor(TopRight) coloured("Green")
ELSIF Direzione[1] = -1 THEN
drawtext ("SHORT", -150 ,-6) anchor(TopRight) coloured("Red")
ENDIF
pWins = round(Wins * 100 / TotalTrades,2)
pLosses = 100.00 - pWins
drawtext ("Prezzo Entrata #EntryPrice#" , -242 ,-6) anchor(TopRight) coloured("DimGrey")
drawtext ("TP #TPprice#" , -242 ,-18) anchor(TopRight) coloured("DimGrey")
drawtext ("SL #SLprice#" , -242 ,-30) anchor(TopRight) coloured("DimGrey")
drawtext ("Trailing Stop #newSL#" , -241 ,-41) anchor(TopRight) coloured("DimGrey")
drawtext ("Profitto temp. #tempGain#" , -241 ,-53) anchor(TopRight) coloured("DimGrey")
drawtext ("Profitto Strategia #myEquity#" , -242 ,-63) anchor(TopRight) coloured("DimGrey")
drawtext ("Operazioni #TotalTrades#" , -120 ,-18) anchor(TopRight) coloured("RosyBrown")
drawtext (" Wins #Wins# (#pWins#)" , -105 ,-30) anchor(TopRight) coloured("RosyBrown")
drawtext (" Losses #Losses# (#pLosses#)" , -107 ,-41) anchor(TopRight) coloured("RosyBrown")
ENDIF
//
RETURN
Ho fatto un pò di prove sul DAX (Giornaliero, 4 ore, 1 ora e 5 minuti). Mi sembra funzioni tutto regolarmente. Le verifiche, sia dello SL, TP e Trailing Stop è fatto con CLOSE alla chiusura della candela, perché un indicatore non ha la possibilità di usare ordini pendenti.
Si potrebbe, in uscita, fare un calcolo sul prezzo effettivo, ma era un pò più complicato e non avevo tempo per (cercare di) farlo.