Quando ho iniziato a far girare i miei robot su IG avevo letto l’avviso che IG poteva modificare arbitrariamente i livelli di SL e TP se questi fossero troppo vicini al prezzo di ingresso. Inizialmente non mi sono preoccupato perchè i miei livelli di SL e TP sono generalmente mai a meno di 2 – 3% dal prezzo, quindi al di sotto dei limiti citati da IG. Ma poi, nonostante questo, mi vedo ogni tanto modificare i livelli SL.
Ovviamente la cosa non mi piace affatto perchè chi fa trading automatico, ha nel setup di SL e TP parte della sua strategia, quindi se qualcuno li modifica a cacchio di cane, la strategia salta.
Si può evitare questa cosa ? Come ?
GRazie
Mi viene in mente di programmare lo stop loss manuale, invece di utilizzare l’istruzione nativa.
Non l’ho provato ma forse funzionerà.
defparam cumulateorders=false
himax=highest[20]
lomin=lowest[20]
irange=himax-lomin
if not onmarket and close crosses over himax[1] then
stoploss=lomin
takeprofit=himax+irange
buy 1 contract at market
// set stop price stoploss
// set target price himax+irange
endif
if onmarket then
sell at stoploss stop
sell at takeprofit limit
endif
graphonprice himax coloured("blue")
graphonprice lomin coloured("purple")
graphonprice stoploss coloured("red")
E’ una idea che è venuta anche a me ma io lavoro con ordini multipli, con mql4 saprei come fare ma con PRT mi trovo in difficoltà perchè non è possibile caricare i dati degli ordini running. Tu come faresti ?
Se hai più ordini non puoi fare chiusure STOP/LIMIT parziali.
O li chiudi tutti, oppure devi gestirli manualmente, ma solo con ordini A MERCATO, quindi devi attendere la chiusura della candela e verificare se CLOSE (oppure High o Low, secondo le tue preferenze, ma con questi ultimi lo stop o target potrebbero essere stati toccati ma poi il prezzo potrebbe essere tornato indietro) abbia raggiunto quel prezzo e in quel caso uscire, anche con un’uscita parziale.
A me ve bene chiuderli tutti insieme ma come pensi di fare ? la tua spiegazione non mi è chiara….
Usa
SELL AT StopPrice STOP //LONG
EXITSHORT AT StopPrice STOP //SHORT
Che differenza c’è con altri metodi ? Sul manuale non trovo molto.
Le istruzioni che hai postato chiudono TUTTI gli ordini Long e Short o solo la quantità indicata (che tu non hai indicato)
Per il take profit ??
Puoi farmi vedere un esempio di codice di un Proorder che li usa sia per SL che per TP ?
Questo chiude TUTTE le posizioni all’ultimo prezzo indcato, in STOP o in TARGET:
DEFPARAM CumulateOrders = True
ONCE SL = 100 * PipSize
ONCE TP = SL * 2
Sma = average[20,0](close)
IF close CROSSES OVER Sma THEN
BUY AT MARKET
StopPrice = close - SL
TargetPrice = close + TP
Set Target Price TargetPrice
Set Stop Price StopPrice
ENDIF
graphonprice StopPrice
graphonprice TargetPrice
Questo chiude TUTTE le posizioni, non accumulandole, allo stesso TP o allo stesso SL:
DEFPARAM CumulateOrders = false
ONCE SL = 100
ONCE TP = SL * 2
Sma = average[20,0](close)
IF close CROSSES OVER Sma THEN
BUY AT MARKET
Set Stop pLOSS SL
Set Target pPROFIT TP
ENDIF
Questo chiude ciascuna posizione al proprio SL o TP, mantenendoli distinti per ciascuna operazione d’acquisto:
DEFPARAM CumulateOrders = True
ONCE SL = 100
ONCE TP = SL * 2
Sma = average[20,0](close)
IF close CROSSES OVER Sma THEN
BUY AT MARKET
Set Stop pLOSS SL
Set Target pPROFIT TP
ENDIF
Io l’ho fatto cosi, senza usare gli stoploss e takeprofit della piattaforma in modo che IG non possa cambiarli.
/ Setup Hide SL and TP
Once SLoss=1 //Percentage SL
Once SProfit=2 //Percentage TP
if LongOnMarket and CountOfLongShares>0 and CountOfLongShares<1.1 then
SLPrice = TradePrice-(TradePrice/100)*Sloss
TPPrice = TradePrice+(TradePrice/100)*SProfit
endif
if LongOnMarket and Low<=SLPrice then
SELL AT SLPrice STOP
endif
if LongOnMarket and High>=TPPrice then
SELL AT TPPrice LIMIT
endif
if ShortOnMarket and CountOfShortShares>0 and CountOfShortShares<1.1 then
SLPrice = TradePrice+(TradePrice/100)*Sloss
TPPrice = TradePrice-(TradePrice/100)*SProfit
endif
if ShortOnMarket and High>=SLPrice then
EXITSHORT AT SLPrice STOP
endif
if ShortOnMarket and Low<=SLPrice then
EXITSHORT AT TPPrice LIMIT
endif
Come ti sembra ??
In generale il concetto va bene, però vanno modificati alcuni tipi di ordine, perché LIMIT va usato quando il prezzo di uscita sarà migliorativo (produrrà un maggior profitto rispetto al prezzo corrente), mentre STOP quando sarà peggiorativo.
Inoltre usare HIGH e LOW (invece di CLOSE), come riferimenti può causare uscite impreviste, perché possono essere entrambi oltre il TP o lo SL, ma CLOSE è sotto e quindi inserisci un ordine pendente, ma se non c’è abbastanza distanza tra CLOSE e TP o SL, l’uscita può avvenire a mercato.
Io ho messo ad un certo punto:
RifHIGH = close //oppure high
RifLOW = close //oppure low
se preferisci rimetti HIGH o LOW e torna tutto com’era prima, senza dovere modificare il codice ulteriormente. Resta il problema della distanza, richiesta dal broker e che è diversa per ciascun strumento e può cambiare anche più volte durante uno stesso giorno, generalmente è più elevata la notte e meno durante il normale orario di trading, tranne se c’è alta volatilità (non c’è modo, come per lo spread, di conoscerne il valore). Se non vuoi usare la DISTANZA basta che gli assegni valore 0. Se usi HIGH e LOW, mettila a 0, ha un senso solo se usi CLOSE:
Sma = average[20,0](close)
IF close CROSSES OVER Sma THEN
BUY AT MARKET
ENDIF
once Distanza = 6
RifHIGH = close //oppure high
RifLOW = close //oppure low
// Setup Hide SL and TP
Once SLoss=1 //Percentage SL
Once SProfit=2 //Percentage TP
if LongOnMarket and CountOfLongShares>0 and CountOfLongShares<1.1 then
SLPrice = TradePrice-(TradePrice/100)*Sloss
TPPrice = TradePrice+(TradePrice/100)*SProfit
endif
if LongOnMarket THEN
IF RifLOW<(SLPrice-Distanza) then
SELL AT SLPrice LIMIT//STOP
ELSIF RifLOW>(SLPrice+Distanza) then
SELL AT SLPrice STOP
endif
//
IF RifHIGH > (TPPrice+Distanza) then
SELL AT TPPrice STOP//LIMIT --- meglio uscire subito a Mercato, stai guadagnando oltre il TP
ELSIF RifHIGH < (TPPrice-Distanza) then
SELL AT TPPrice LIMIT
endif
ENDIF
if ShortOnMarket and CountOfShortShares>0 and CountOfShortShares<1.1 then
SLPrice = TradePrice+(TradePrice/100)*Sloss
TPPrice = TradePrice-(TradePrice/100)*SProfit
endif
if ShortOnMarket THEN
IF RifHIGH > (SLPrice+Distanza) then
EXITSHORT AT SLPrice LIMIT//STOP
ELSIF RifHIGH < (SLPrice-Distanza) then
EXITSHORT AT SLPrice STOP
endif
//
IF RifLOW < (SLPrice-Distanza) then
EXITSHORT AT TPPrice STOP//LIMIT --- meglio uscire subito a Mercato, stai guadagnando oltre il TP
ELSIF RifLOW < (SLPrice+Distanza) then
EXITSHORT AT TPPrice LIMIT
endif
endif
graphonprice SLPrice coloured("Red")
graphonprice TPPrice coloured("Blue")
Allora, il rischio di mettere un SL o un TP a meno della distanza consentita non credo ci sia io lavoro al minimo all’ 1% del prezzo. Le distanze minime messe dai broker sono dell’ordine di pips ed anche quando si alzano a causa di volatilità diventano qualche decina di pips, quindi non credo di starci mai dentro.
Invece il discorso dell’High e Low mi interessa. In pratica mi stai dicendo che PRT non chiude al prezzo corrente ma alla chiusura della candela quindi al prezzo close della candela corrente, giusto ? Ho capito bene ?
Se ho capito bene, tu mi consigli di usare close nel test perchè tanto quello è il prezzo a cui verrà chiuso il trade, corretto ?
Inoltre come vedi il mio codice non fa usa delle istruzioni SET STOP e SET TARGET, ci sono eventuali svantaggi ??
Fammi sapere e grazie
Si, meglio usare CLOSE, perché è quello il riferimento per determinare se un ordine è di tipo LIMIT o STOP.
Non usare SET STOP e SET TARGET ha sia vantaggi che svantaggi.
Il vantaggio è che il broker non sa dove sono SL e TP, se usi un’uscita a mercato perché se usi un ordine pendente LIMIT o STOP lo capisce.
Lo svantaggio, in caso di uscita a mercato, è che alla chiusura della candela il prezzo può essere andato OLTRE lo SL o il TP, dandoti una perdita o un guadagno maggiore.
Riassumo per vedere se ho capito bene come funzionano Limit e Stop.
Limit indica un prezzo a cui devo arrivare in gain, cioè per Long sarà sopra al prezzo di acquisto mentre per Short sarà sotto.
Stop è il contrario, cioè indica un prezzo a cui devo arrivare in loss, per Long sarà sotto al prezzo d’acquisto mentre per Short sarà sopra.
Corretto ?
In particolare non ho ben capito i passaggi che fai su questo codice:
Come mai prevedi 2 uscite per ogni condizione SL e TP di ogni tipo di ordine ?
Non mi è chiaro
No, LIMIT è quando il prezzo d’entrata, rispetto a quello attuale (cioè CLOSE), è migliorativo, ad esempio se sei LONG e sei già in profitto e vuoi uscire ad un punto più in alto per un profitto maggiore, dovrai usare LIMIT, se vuoi uscire in profitto ma ad un punto più basso devi usare STOP (è il caso del trailing stop, che in realtà può diventare un trailing profit).
Ovviamente le condizioni sono rovesciate nel caso tu sia SHORT.
Ti allego uno schema visivo.
Prevedo 2 uscite per ogni condizione SL e TP perché voglio verificare se il prezzo attuale è minore o maggiore del prezzo di entrata/uscita in modo da usare STOP o LIMIT (considerando anche la distanza).