con l’aggiunta dei stop loss su questo codice il risultato si sballa
DEFPARAM FLATAFTER=170000
BegTime=094000
EndTime=163000
Bolld=BollingerUp[20](close)
Bollu=BollingerDown[20](close)
MyContracts=1
IF Time = 094000 THEN
maxSetup = highest[3](high[1])
minSetup = lowest[3](low[1])
sllong = minSetup
slshort = maxSetup
ENDIF
c1 = (close > Bolld)//+nbpoint*pointsize)
c2 = (close < Bollu)//+nbpoint*pointsize)
if intradaybarindex=0 then
tradethisday=0
else
if barindex=tradeindex then
tradethisday=1
endif
endif
If close > maxsetup and c1 and Time >= BegTime and Time <= EndTime and tradethisday=0 then
Buy mycontracts contract at minSetup stop
sell at sllong stop
endif
If close < minsetup and c2 and Time >= BegTime and Time <= EndTime and tradethisday=0 then
sellshort mycontracts contract at maxSetup stop
exitshort at slshort stop
endif
graphonprice maxSetup coloured(0,255,0,255)
graphonprice minSetup coloured(255,0,0,255)
graph tradethisday
graph c1
graph c2
graph Time
Per prima cosa gli ordini pendenti d’entrata non sono STOP, bensì LIMIT in quanto acquisti & vendi ad un prezzo migliore rispetto a quello corrente (vedi tabella allegata).
Poi ho variato alcune cose nel calcolo dello Stop Loss.
Ho anche aggiunto un target (tp) che è un certo fattore moltiplicativo dello stop loss (ho messo 2, ma puoi provare altri valori, anche decimali se vuoi un TARGET inferiore allo stop loss).
Infine ho variato la parte iniziale della IF CLOSE… nelle righe di entrata, sia long che short.
Per il resto mi pare vada bene.
Volendo puoi aggiungere un trailing stop.
DEFPARAM FLATAFTER=170000
BegTime=094000
EndTime=163000
Bolld=BollingerUp[20](close)
Bollu=BollingerDown[20](close)
MyContracts=1
IF Time = 094000 THEN
maxSetup = highest[3](high[1])
minSetup = lowest[3](low[1])
sllong = MinSetup - abs(maxSetup-minSetup)//maxSetup//minSetup
slshort = MaxSetup + sllong//minSetup//maxSetup
tp = abs(maxSetup-minSetup) * 2 //intervallo tra Min e Max * 2
ENDIF
c1 = (close > Bolld)//+nbpoint*pointsize)
c2 = (close < Bollu)//+nbpoint*pointsize)
if intradaybarindex=0 then
tradethisday=0
else
if barindex=tradeindex then
tradethisday=1
endif
endif
If close > minsetup and c1 and Time >= BegTime and Time <= EndTime and tradethisday=0 then
Buy mycontracts contract at minSetup limit
sell at sllong stop
endif
If close < maxsetup and c2 and Time >= BegTime and Time <= EndTime and tradethisday=0 then
sellshort mycontracts contract at maxSetup limit
exitshort at slshort stop
endif
SET TARGET PROFIT tp
graphonprice maxSetup coloured(0,255,0,255)
graphonprice minSetup coloured(255,0,0,255)
graph tradethisday
graph c1
graph c2
graph Time
ho provato il codice ma ho notato che non fa piu quello che serve, l’idea è che alle 9e40 il sistema analizza le 4 candele precedenti e da quello ricava il minsetup e maxsetup, successivamente se si verifica che la chiusura barra è superiore al maxsetup e bollinger apre long con stop o stop e reverse al minsetup e viceversa
Ok, allora basta che metti LIMIT al posto di STOP.
Perché se vuoi verificare le 4 candele precedenti hai scritto 3 con high e low?
entra a vari orari senza rispettare le condizioni
Dimmi su quale strumento (Dax, Nasdaq, ecc…) l’hai provato e su quale time frame.
Posta anche l’ultimo codice che hai usato per le prove.
questo è il codice aggiornato ma vedo che ci sono ancora errori, io voglio avere gli stop esattamente al valore maxsetup perr gli short e minsetup per i long, ho fatto varie prove ma si sballa tutto, dax a 10 minuti
DEFPARAM FLATAFTER=173000
BegTime=094000
EndTime=163000
Bolld=BollingerUp[20](close)
Bollu=BollingerDown[20](close)
MyContracts=1
IF Time = 094000 THEN
maxSetup = highest[3](high[1])
minSetup = lowest[3](low[1])
sllong = MinSetup// - abs(maxSetup-minSetup)//maxSetup//minSetup
slshort = MaxSetup// + sllong//minSetup//maxSetup
tp = abs(maxSetup-minSetup) * 2 //intervallo tra Min e Max * 2
ENDIF
c1 = (close > Bolld)//+nbpoint*pointsize)
c2 = (close < Bollu)//+nbpoint*pointsize)
if intradaybarindex=0 then
tradethisday=0
else
if barindex=tradeindex then
tradethisday=1
endif
endif
If close > maxsetup and c1 and Time >= BegTime and Time <= EndTime and tradethisday=0 then
Buy mycontracts contract at maxSetup stop
sell at sllong stop
endif
If close < minsetup and c2 and Time >= BegTime and Time <= EndTime and tradethisday=0 then
sellshort mycontracts contract at minSetup stop
exitshort at slshort stop
endif
SET TARGET PROFIT tp
graphonprice maxSetup coloured(0,255,0,255)
graphonprice minSetup coloured(255,0,0,255)
graph tradethisday
graph c1
graph c2
graph Time
Perché lo SL lo hai messo all’interno di IF..ENDIF, quindi per gli Short piazza l’ordine STOP solo se il prezzo è < MinSetup, altrimenti no (viceversa per i Long).
Aggiungi queste righe subito dopo la 30:
IF LongOnMarket THEN
sell at sllong stop
ELSIF ShortOnMarket THEN
exitshort at slshort stop
ENDIF
DEFPARAM FLATAFTER=220000
BegTime=094000
EndTime=163000
MyContracts=1
IF Time = 094000 THEN
maxSetup = highest[3](high[1])
minSetup = lowest[3](low[1])
sllong = MinSetup
slshort = MaxSetup + sllong//minSetup//maxSetup
tp = maxSetup+40*pipsize// * 2 //intervallo tra Min e Max * 2
ENDIF
if intradaybarindex=0 then
tradethisday=0
else
if barindex=tradeindex then
tradethisday=1
endif
endif
If close > maxsetup and Time >= BegTime and Time <= EndTime and tradethisday=0 then
Buy mycontracts contract at maxSetup limit
sell at sllong stop
endif
set target profit tp
graphonprice tp coloured(255,255,0,255)
graphonprice maxSetup coloured(0,255,0,255)
graphonprice minSetup coloured(255,0,0,255)
graph tradethisday
graph Time
ciao, sto facendo delle prove con questo codice ma benchè individui bene il tp non vende al raggiungimento di tale valore, qual’è l’errore?
Perché set target profit richiede una differenza espressa in prezzo e set target pprofit una differenza espressa in pips (sul Dax è uguale, ma su EurUsd, ad esempio, il primo richiede 0.0040 ed il secondo 40).
Tu hai assegnato a TP il valore di maxSetup+40*pipsize (linea 11), che è un prezzo MAGGIORATO di 40 pips, quindi inserisce uno STOP LOSS di quasi 16000 pip! (sul grafico lo vedi perfettamente perché è un prezzo, ma SET STOP… lo vede completamente errato).
Alla linea 11 metti tp = 40*pipsize e alla linea 25 è meglio che tu usi set target pprofit tp.
Con GRAPHONPRICE usa graphonprice MaxSeup + tp coloured(255,255,0,255), altrimenti non lo vedi più sul grafico.
Aggiungi anche queste righe subito dopo la 26, prima dei vari GRAPH…:
if LongOnMarket then
sell at sllong stop
endif
altrimenti ti mette lo SL quando entra a mercato, ma non successivamente, perché gli ordini pendenti SCADONO automaticamente alla chiusura di ogni candela e, se ti servono ancora, occorre piazzarli di nuovo.
io volevo un tp del valore maxsetup(che cambia di volta in volta) + x*pipsize mentre come hai scritto tu c è solo 40*pipsize… in più pensavo di mettere al. posto del tp la. seguente stringa, if longonmarket then sell at tp stop endif. secondo te può andare?
Si, può andare, in questo modo risolvi il problema.
DEFPARAM FLATAFTER=220000
BegTime=094000
EndTime=163000
MyContracts=1
IF Time = 094000 THEN
maxSetup = highest[3](high[1])
minSetup = lowest[3](low[1])
sllong = MinSetup
slshort = MaxSetup + sllong//minSetup//maxSetup
tp = maxSetup+40*pipsize// * 2 //intervallo tra Min e Max * 2
ENDIF
if intradaybarindex=0 then
tradethisday=0
else
if barindex=tradeindex then
tradethisday=1
endif
endif
If close > maxsetup and Time >= BegTime and Time <= EndTime and tradethisday=0 then
Buy mycontracts contract at maxSetup limit
endif
if longonmarket then
sell at sllong stop
endif
if longonmarket then
sell at tp stop
endif
graphonprice tp coloured(255,255,0,255)
graphonprice maxSetup coloured(0,255,0,255)
graphonprice minSetup coloured(255,0,0,255)
graph tradethisday
graph Time
usando questo codice le operazioni risultano sballate e anche modificando il valore del tp vende sempre alla barra successiva
Perché stai usando STOP al posto di LIMIT (alla riga 28).
Gli ordini pendenti possono essere di due tipi:
- STOP quando il prezzo attuale (nel momento in cui gli ordini vengono piazzati) è migliore del prezzo dell’ordine pendente (in apertura o chiusura che sia), quindi entri o esci ad un prezzo peggiore
- LIMIT quando il prezzo attuale (nel momento in cui gli ordini vengono piazzati) è peggiore del prezzo dell’ordine pendente (in apertura o chiusura che sia), quindi entri o esci ad un prezzo migliore.
Ti allego una foto con un grafico che illustra quando usare STOP e quando LIMIT. Le linee VERDI e ROSSE indicano il prezzo d’entrata, il punto BLU indica il prezzo corrente.
Dovresti SEMPRE verificare, quando piazzi un ordine pendente, se deve essere di tipo LIMIT o STOP, basta che con IF… verifichi se il prezzo attuale è maggiore o minore e se entry Long o Short (la chiusura di un Long è un ordine Short, e viceversa).
Dovresti anche sempre verificare, con gli ordini pendenti, se il prezzo d’entrata o uscita è sufficientemente distante dal prezzo corrente in modo da rispettare la distanza minima richiesta dal broker (IG in questo caso). Per ogni strumento è diverso, va verificato sulla piattaforma o sul sito di IG. Durante il giorno può variare anche molto. Sul Dax è normalmente 6-7 pip, ma a volte di notte o in caso di alta volatilità può arrivare a 300! Se non la rispetti il backtest non può saperlo, ma quando esegui in demo o in reale la strategia ti verrà interrotta con il relativo messaggio d’errore.