Buongiorno, avrei bisogno di aiuto per un codice che sto cercando di scrivere, il sistema al verificarsi della condizione “acquisto” dovrebbe:
comprare due contratti al massimo della candela dove si è verificata la condizione
l’ordine deve rimanere valido per 5 candele
lo stop loss deve essere al minimo della candela di 2 periodi antecedenti il verificarsi della condizione.
poi il sistema dovrebbe uscire con un contratto al raggiungimento del tp1(prezzo di acquisro piu 10 punti),
il restante contratto deve venire gestito con un trailing che parte al prezzo di vendita del primo contratto e uno stop loss di 5 punti sempre dal prezzo di vendita del primo contratto.
ho provato a scrivere il codice ma non fa quello che vorrei, qualcuno può aiutarmi cosi da capire cosa e come modificare il codice?
DEFPARAM CumulateOrders = false
// Impedisce al sistema di tradare in giorni specifici della settimana
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
// Condizioni per entrare su posizioni long
once count=0
count=count+1
a = adx[14]>=20
b= high[1]<high
acquisto= a and b
if acquisto then
count=0
prezzoacquisto=high
perdita = low[2]
endif
IF count<5 and not daysForbiddenEntry then // barindex-mybar<5 AND not daysForbiddenEntry THEN
BUY 2 CONTRACT AT prezzoacquisto stop
ENDIF
tp1=24
prezzovendita=prezzoacquisto+tp1*pointsize
if countofposition=2 and longonmarket then
sell 1 contract at prezzovendita limit
set stop price perdita
endif
if countofposition=1 then
perditaseconda=prezzovendita-5*pointsize
set stop price perditaseconda
//trailing stop function
trailingstart = 15 //trailing will start @trailinstart points profit
trailingstep = 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
IF newSL>0 AND close-newSL>=trailingstep*pipsize THEN
newSL = newSL+trailingstep*pipsize
ENDIF
ENDIF
//manage short positions
IF SHORTONMARKET THEN
//first move (breakeven)
IF newSL=0 AND tradeprice(1)-close>=trailingstart*pipsize THEN
newSL = tradeprice(1)-trailingstep*pipsize
ENDIF
//next moves
IF newSL>0 AND newSL-close>=trailingstep*pipsize THEN
newSL = newSL-trailingstep*pipsize
ENDIF
ENDIF
//stop order to exit the positions
IF newSL>0 THEN
SELL AT newSL STOP
EXITSHORT AT newSL STOP
ENDIF
endif
//************************************************************************
GRAPHonprice prezzovendita
graphonprice perditaseconda
//graph count //barindex-mybar
Preciso questi punti:
- set stop price perdita è bene che venga messo al BUY iniziale, non all’uscita parziale
- le uscite parziali ProRealTime le accetta, quindi nel backtest funzionano, però IG non le ammette, quindi devi procedere con un’uscita a mercato (quindi solo DOPO che il prezzo ha superato prezzovendita)
- BUY 2 CONTRACT AT prezzoacquisto stop non è detto che si comporti correttamente LIVE (in backtest va bene), perché tra il prezzo corrente e l’entrata potrebbe non esserci la distanza minima richiesta dal broker, nel caso la richieda per quel determinato strumento
- dove c’è il primo BUY, dovresti aggiungere come condizione AND Not OnMarket, per evitare che comunque il codice venga eseguito, anche se non entra più a mercato dopo la prima volta, e che ti cambi lo STOP che hai messo nel trailing stop
- usi stop diversi, questo potrebbe creare conflitti LIVE, in quanto usi set stop price perditaseconda e, più sotto, SELL AT newSL STOP.
- nel trailing stop è opportuno usare una variabile FLAG per fare in modo che le righe perditaseconda=prezzovendita-5*pointsize e set stop price perditaseconda siano eseguite solo la prima volta, questo dovrebbe aiutare anche ad evitare conflitti tra i vari stop di uscita
- la riga if acquisto then va modificata in if acquisto and Not Onmarket then, altrimenti la variabili all’interno di IF…ENDIF le modifica anche quando sei già a mercato.
Questo è come l’ho modificato, fai le verifiche e fammi sapere:
DEFPARAM CumulateOrders = false
// Impedisce al sistema di tradare in giorni specifici della settimana
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
// Condizioni per entrare su posizioni long
once count=0
count=count+1
a = adx[14]>=20
b= high[1]<high
acquisto= a and b
if acquisto then
count=0
prezzoacquisto=high
perdita = low[2]
endif
IF count<5 and not daysForbiddenEntry and Not OnMarket then // barindex-mybar<5 AND not daysForbiddenEntry THEN
BUY 2 CONTRACT AT prezzoacquisto stop
set stop price perdita
flag = 0
ENDIF
tp1=24
prezzovendita=prezzoacquisto+tp1*pointsize
if countofposition=2 and longonmarket then
if close >= prezzovendita then
sell 1 contract at market
flag = 1
endif
endif
if countofposition=1 then
if flag = 1 then
perditaseconda=prezzovendita-5*pointsize
set stop price perditaseconda
flag = 0
endif
//trailing stop function
trailingstart = 15 //trailing will start @trailinstart points profit
trailingstep = 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
IF newSL>0 AND close-newSL>=trailingstep*pipsize THEN
newSL = newSL+trailingstep*pipsize
ENDIF
ENDIF
//manage short positions
IF SHORTONMARKET THEN
//first move (breakeven)
IF newSL=0 AND tradeprice(1)-close>=trailingstart*pipsize THEN
newSL = tradeprice(1)-trailingstep*pipsize
ENDIF
//next moves
IF newSL>0 AND newSL-close>=trailingstep*pipsize THEN
newSL = newSL-trailingstep*pipsize
ENDIF
ENDIF
//stop order to exit the positions
IF newSL>0 THEN
SELL AT newSL STOP
EXITSHORT AT newSL STOP
ENDIF
endif
//************************************************************************
GRAPHonprice prezzovendita coloured("Fuchsia")
graphonprice perditaseconda coloured("LawnGreen")
graphonprice NewSL coloured("Red")
//graph count //barindex-mybar
Grazie mille Roberto, il codice funziona.
per quanto riguarda il punto 3
BUY 2 CONTRACT AT prezzoacquisto stop non è detto che si comporti correttamente LIVE (in backtest va bene), perché tra il prezzo corrente e l’entrata potrebbe non esserci la distanza minima richiesta dal broker, nel caso la richieda per quel determinato strumento
Devo includere la distanza minima in prezzoacquisto?
esempio: distanza minima 4 punti allora prezzoacquisto=high diventa prezzoacquisto=high+4*pipsize? oppure bisogna fare una verifica prima per vedere se la distanza minima è già rispettata?
se si come si codifica?
grazie ancora
Io preferisco fare sempre una verifica sui possibli 3 casi (esempio LONG: prezzo Maggiore dell’entrata + distanza ed entro in LIMIT, prezzo Minore dell’entrata – distanza ed entro STOP, oppure è a rischio perché non c’è la distanza e tralascio fino alla prossima candela oppure entro a Mercato):
Distanza = 6 * pipsize //distanza usuale per il DAX
IF count<5 and not daysForbiddenEntry then // barindex-mybar<5 AND not daysForbiddenEntry THEN
IF close >= (prezzoacquisto + Distanza) THEN
BUY 2 CONTRACT AT prezzoacquisto LIMIT
ELSIF close <= (prezzoacquisto - Distanza) THEN
BUY 2 CONTRACT AT prezzoacquisto STOP
ELSE
//BUY 2 CONTRACT at Market
ENDIF
ENDIF
nell’entrata a Mercato ho messo i commenti, così non entra ed aspetta la prossima candela, nel caso ci siano ancora le condizioni ed il prezzo non sia così vicino. Se vuoi entrare basta che togli le due barre iniziali della riga.
Generalmente per il DAX sono 6 pip di distanza minima, ma durante il giorno può cambiare secondo la volatilità e non si può conoscere il valore. Io di solito metto tra 8 e 10 pips per cercare di essere sicuro. Chiaramente su un timeframe alto, 1 ora o più, 3-4 pip in più non fanno la differenza, mentre su timeframe piccoli possono farla.
La decisione spetta a te.
Grazie mille Roberto, funziona tutto e ho capito quello che mi hai spiegato sulla distanza, appena avro finito il codice lo posto completo cosi potete commentarlo dare consigli e se va bene anche usarlo