Ciao Roberto, potresti controllare questo TS su UsdJpy a 15 minuti, che utilizza uno split della posizione ed un trailing a pareggio, ma non chiude correttamente la seconda parte della posizione?
Per chiarezza posto un immagine dello stesso TS con trailing a pareggio senza split della posizione (TS A), che funziona correttamente (rif. immagine operazione del 2-3 settembre 2021)
senza trailing a pareggio e con split della posizione (TS B), che funziona correttamente
con trailing a pareggio e con split della posizione (TS C) che NON funziona correttamente: splitta correttamente la prima parte della posizione, ma chiude subito la seconda parte, mentre dovrebbe chiuderla dove c’è la freccia marrone nell’immagine.
Grazie
Defparam cumulateorders = false
positionSize = 1
//————————————
ratio = 0.6
period = 8
startTime = 210000
endTime = 231500
cTime = time >= startTime and time <= endTime
exitLongTime = 210000
exitShortTime = 80000
//——————————————————————————————-
if time = startTime then
range2H = highest[Period](high) – lowest[Period](low) //2H
chiusura = close //chiusura barra delle 20:45, opera dalle 21:00
endif
if cTime and dayOfWeek <>5 then
buy positionSize contracts at chiusura – range2H*ratio limit
sellshort positionSize contract at chiusura + range2H*ratio limit
endif
//—————————————————————————-
if time = exitLongTime then
sell at market
endif
if time = exitShortTime then
exitShort at market
endif
//————————————————————–
SET STOP PLOSS 30
SET TARGET PPROFIT 15
//———————————————————-
pointToReachBreakeven=10*pointSize //Trp a breakeven
if not onmarket then
breakeven=0
endif
if longOnMarket and close-tradePrice>=pointToReachBreakEven then
breakeven=1
endif
if shortOnMarket and tradePrice-close>=pointToReachBreakeven then
breakeven=1
endif
if breakeven=1 then
sell at tradePrice STOP
exitShort at tradePrice STOP
endif
//———————————————————————————————————————
once partialcloseGain = 1
If partialcloseGain then
ONCE PerCent = 0.5
ONCE PerCentGain = 0.0009 //=0.09%
ONCE MinLotSize = 0.5
ExitQuantity = abs(CountOfPosition) * PerCent
LeftQty = max(MinLotSize,abs(CountOfPosition) – ExitQuantity)
CloseQuantity = abs(CountOfPosition) – LeftQty
IF Not OnMarket THEN
Flag = 1
ENDIF
IF partialcloseGain AND LongOnMarket and close >= (PositionPrice * (1 + PerCentGain)) AND Flag THEN
SELL CloseQuantity Contracts AT Market
Flag = 0
endif
IF partialcloseGain AND ShortOnMarket and close <= (PositionPrice * (1 – PerCentGain)) AND Flag THEN
exitshort CloseQuantity Contracts AT Market
Flag = 0
endif
endif
L’immagine non è di UsdJpy.
Ti spiace dirmi la data e ora candela dove l’operazione in questione è stata aperta?
L’operazione e’ aperta il 2 settembre dopo le 21 e chiusa la mattina del 3 settembre. E’ tutto indicato nell’immagine.
Ecco un altra immagine dell’ operazione sopra riportata. Il problema comunque è nella formula in generale che non chiude a breakeven la metà della posizione restante. Probabilmente i due codici (snippet) non vanno semplicemente assemblati come ho scritto.
Il mercato è UsdJpy a 15 minuti, come si vede meglio nella nuova immagine (la seconda metà della posizione dovrebbe essere chiusa a breakeven dove ho inserito la X rossa).
Perché quando lui esce con metà posizione piazza anche l’ordine per uscire con l’altra metà (righe 42 e 43), solo che evidentemente non c’è la distanza minima dal prezzo (chiude a 110.017 ed il prezzo d’entrata è 109.939), quindi esce subito, a mercato.
Non mi pare ci siano altre cause.
Quando si usano ordini pendenti è sempre bene prevedere una distanza minima (putroppo cambia durante il giorno, specialmente in orari notturni, devi cercare di mettere quella richiesta da IG, magari con 1 punto o 2 in più) e fare anche una verifica che l’ordine sia STOP o LIMIT.
Ciao Roberto, non sono sicuro che sia questa la causa, Per me non funzionano i due codici insieme.
Guarda quest’altro esempio, come mai qui, che non chiude subito la posizione come sopra, poi non esce con la seconda parte a breakeven (X viola), ma molto dopo (rettangolo arancione) ? (operazione di lunedi 13 settembre ore 23).
Non mi sembra che qui ci siano problemi di distanza, altrimenti il Ts avrebbe chiuso subito la posizione, come nell’esempio precedente.
Perché al primo massimo raggiunto dal prezzo, il profitto era meno di pointToReachBreakeven, poi sarebbe stato maggiore, ma hai usato TRADEPRICE (che è sempre l’ultimo prezzo, in questo caaso la chiusura di mezza posizione) invece di POSITIONPRICE.
Aggiungi queste righe al tuo codice, ti aiuteranno a scoprire più agevolmente gli errori:
graph breakeven
graph positionsize
graph ExitQuantity
graph LeftQty
graph CloseQuantity
graph Flag
graph PositionPrice * PositionPerf / PipSize
graph pointToReachBreakeven
graph (close - PositionPrice)
graph (close - TradePrice)
graphonprice (PositionPrice * (1 + PerCentGain)) coloured(0,128,0,150)
graphonprice (PositionPrice * (1 - PerCentGain)) coloured(0,0,255,255)
graphonprice (PositionPrice + pointToReachBreakeven) coloured(0,0,0,255)
Finalmente con positionPrice funziona! Non avrei mai immaginato di usare positionPrice nello split delle posizioni (di solito si usa per conoscere il prezzo medio di più posizioni).
Un ultima cosa: siccome SL, TP e TrP sono in punti, all’inizio avevo provato ad aggiungere il codice dello split delle posizioni vincenti in punti e non in percentuale (usando “PipsGain ” 10 come è 10 punti il trailing a pareggio), ma non funzionava forse per i punti decimali delle valute(?) forse per il MinLotSize(?)
Riusciresti a scrivere 10 punti in “PipsGain” (dove c’è XXX) nella formula sotto riportata dello split gain delle posizioni vincenti in punti (òa formula è verificata per gli indici, mai usata per le valute).
once partialcloseGain = 1 // splittare una posizione VINCENTE in punti
If partialcloseGain then
ONCE PerCent = 0.5
PipsGain = XXX
ONCE MinLotSize = 0.5
ExitQuantity = abs(CountOfPosition) * PerCent
LeftQty = max(MinLotSize,abs(CountOfPosition) – ExitQuantity)
CloseQuantity = max(0,abs(CountOfPosition) – LeftQty)
TempGain = PositionPerf * PositionPrice / PipSize
IF Not OnMarket THEN
Flag = 1
ENDIF
IF partialcloseGain AND LongOnMarket and TempGain >= PipsGain*pipsize AND Flag THEN
SELL CloseQuantity Contracts AT Market
Flag = 0
endif
IF partialcloseGain AND ShortOnMarket and TempGain >= PipsGain*pipsize AND Flag THEN
exitshort CloseQuantity Contracts AT Market
Flag = 0
endif
endif
Basta che metti 10, però non usare, più sotto, PipsGain*pipsize, ma solo PipsGain, perché il profitto è già in Pips.
Ho provato e verificato che in questo modo il codice funziona bene anche con i punti.
Un ultima precisazione, questa modifica (l’eliminazione di *pipsize ) va fatta solo per le valute, oppure anche per gli indici (riguarda cioè proprio la formula dello splitPosition a punti)?
Per gli indici non occorrerebbe, perché hanno un rapporto Prezzo:Pip di 1:1, però se un giorno vuoi utilizzare quel codice su una coppia valutaria o altro, sarebbe meglio che tu la facessi. È solo una questione di portabilità del codice.
Ad ogni modo, se certamente l’utilizzerai solo con indici non occorre,
Nel caso di TempGain = PositionPerf * PositionPrice / PipSize, c’è già il profitto, espresso in prezzo (TempGain = PositionPerf * PositionPrice), che viene convertito in pips, in modo da essere confrontato con i Pips.
Se scrivi TempGain >= PipsGain*pipsize, converti PipsGain in prezzo dopo avere già convertito TempGain in pips, rendendo il confronto impossibile.
Comunque è solo una spiegazione, confermo, come hai detto tu, che con gli indici non serve, perché dividere o moltiplicare per 1 non altera nessun risultato.
Ottima spiegazione, quindi con gli indici lascio *pipsize, mentre per le valute tolgo *pipsize.
Ciao Roberto, nel codice iniziale (riporto sotto la parte interessata) cosa devo aggiungere per far entrare comunque il TS con un ordine a mercato (poco prima del limite temporale impostato) nel caso non venga preso l’ordine limite? Ho fatto delle prove, ma senza successo. Grazie
ratio = 0.6
period = 8
startTime = 210000
endTime = 231500
cTime = time >= startTime and time <= endTime
//-------------------------------------------------------------------------------------------
if time = startTime then
range2H = highest[Period](high) - lowest[Period](low)
chiusura = close
endif
if cTime and dayOfWeek <>5 then
buy positionSize contracts at chiusura - range2H*ratio limit
sellshort positionSize contract at chiusura + range2H*ratio limit
endif
Gli dici di entrare, in alternativa all’ordine pendente, alla fine del tempo:
if cTime and dayOfWeek <>5 then
if (Time = EndTime) AND Not OnMarket THEN
buy positionSize contracts at Market
//sellshort positionSize contract at Market
else
buy positionSize contracts at chiusura - range2H*ratio limit
sellshort positionSize contract at chiusura + range2H*ratio limit
endif
endif
Io ho messo entrambe le righe, BUY e SELLSHORT, però ne ho commentata una perché entrambe non possono entrare a mercato. Tu puoi mettere un ulteriore IF…ENDIF per verificare le condizioni in base alle quali fare entrare l’una o l’altra.
Ho separato il buy – sell, ma puoi controllare (mi sembra che entra sempre short at market).
if time = startTime then
range2H = highest[Period](high) – lowest[Period](low) //2H
chiusura = close //chiusura barra delle 20:45, opera dalle 21:00
endif
if cTime and dayOfWeek <>5 then
if (time = endTime) and not onMarket then
buy positionSize contracts at market
else
buy positionSize contracts at chiusura – range2H*ratio limit
endif
endif
if cTime and dayOfWeek <>5 then
if (time = endTime) and not onMarket then
sellShort positionSize contracts at market
else
sellshort positionSize contract at chiusura + range2H*ratio limit
endif
endif