TIMEOPERATE = TIME>075900 AND TIME<180000
Come C1 e C2 ne sto provando alcuni ma puoi mettere ciò che vuoi.
C1= close>ExponentialAverage[50](close) and close>ExponentialAverage[10](close)
C2= close<ExponentialAverage[50](close) and close<ExponentialAverage[10](close)
Ah….. adesso mi sono accorto che hai usato TRADEPRICE (scritto anche TRADEPRICE(1)), che è l’ultimo prezzo tradato, che va bene quando apri uno o più contratti TUTTI insieme e li chiudi TUTTI insieme, altrimenti:
- se, come in questo caso, ne apri 3 TUTTI insieme, ma poi li chiudi separatamente, devi salvare il prezzo d’entrata in una variabile (PREZZO in questo caso), perché alla prima chiusura TRADEPRICE prende il prezzo della chiusura e oper fare riferimento a quello di apertura dovresti scrivere TRADEPRICE(2), alla successiva chiusura scaleranno ancora tutti di una posizione ed il prezzo d’apertura sarà contenuto in TRADEPRICE(3), ecc…
- se, invece ne apri più di uno, ma in TEMPI DIVERSI (usando anche DEFPARAM CumulateOrders=True all’inizio) e li chiudi INSIEME o SEPARATAMENTE, dovrai fare riferimento non più a TRADEPRICE, ma a POSITIONPRICE, che è la media dei vari prezzi d’entrata * il numero di lotti per ciascuina entrata.
Utilizza GRAPH e GRAPHONPRICE per analizzare beme le variabili (te li ho aggiunti alla fine del codice):
TP1=18
TP2=12
TP3=12
SL=15
ONCE Distanza = 10
TIMEOPERATE = TIME>075900 AND TIME<180000
C1= close>ExponentialAverage[50](close) and close>ExponentialAverage[10](close)
C2= close<ExponentialAverage[50](close) and close<ExponentialAverage[10](close)
//************
// LONG *
//************
IF not longonmarket AND C1 AND TIMEOPERATE THEN
BUY 3 CONTRACTS AT MARKET
SET STOP LOSS SL
ENDIF
IF COUNTOFLONGSHARES =3 THEN
Prezzo = TradePrice
IF (close + Distanza) < Prezzo +TP1*POINTSIZE THEN
SELL 1 CONTRACTS AT Prezzo +TP1*POINTSIZE LIMIT
ELSIF (close - Distanza) > Prezzo +TP1*POINTSIZE THEN
SELL 1 CONTRACTS AT Prezzo +TP1*POINTSIZE STOP
ELSE
SELL 1 CONTRACTS AT MARKET
ENDIF
ELSIF COUNTOFLONGSHARES =2 THEN
IF (close + Distanza) < Prezzo +TP2*POINTSIZE THEN
SELL 1 CONTRACTS AT Prezzo +TP2*POINTSIZE LIMIT
ELSIF (close - Distanza) > Prezzo +TP2*POINTSIZE THEN
SELL 1 CONTRACTS AT Prezzo +TP2*POINTSIZE STOP
ELSE
SELL 1 CONTRACTS AT MARKET
ENDIF
ELSIF COUNTOFLONGSHARES =1 THEN
IF (close + Distanza) < Prezzo +TP3*POINTSIZE THEN
SELL 1 CONTRACTS AT Prezzo +TP3*POINTSIZE LIMIT
ELSIF (close - Distanza) > Prezzo +TP3*POINTSIZE THEN
SELL 1 CONTRACTS AT Prezzo +TP3*POINTSIZE STOP
ELSE
SELL 1 CONTRACTS AT MARKET
ENDIF
ENDIF
IF longonmarket and not C1 then
A=COUNTOFLONGSHARES
SELL A CONTRACT AT MARKET
ENDIF
iF LONGONMARKET AND NOT TIMEOPERATE THEN
A=COUNTOFLONGSHARES
SELL A CONTRACT AT MARKET
ENDIF
//************
// SHORT *
//************
IF not SHORTOnmarket and C2 AND TIMEOPERATE THEN
SELLSHORT 3 CONTRACTS AT MARKET
SET STOP LOSS SL
ENDIF
IF COUNTOFSHORTSHARES =3 THEN
Prezzo = TradePrice
IF (close - Distanza) > Prezzo -TP1*POINTSIZE THEN
EXITSHORT 1 CONTRACTS AT Prezzo -TP1*POINTSIZE LIMIT
ELSIF (close + Distanza) < Prezzo -TP1*POINTSIZE THEN
EXITSHORT 1 CONTRACTS AT Prezzo -TP1*POINTSIZE STOP
ELSE
EXITSHORT 1 CONTRACTS AT MARKET
ENDIF
ELSIF COUNTOFSHORTSHARES =2 THEN
IF (close - Distanza) > Prezzo -TP2*POINTSIZE THEN
EXITSHORT 1 CONTRACTS AT Prezzo -TP2*POINTSIZE LIMIT
ELSIF (close + Distanza) < Prezzo -TP2*POINTSIZE THEN
EXITSHORT 1 CONTRACTS AT Prezzo -TP2*POINTSIZE STOP
ELSE
EXITSHORT 1 CONTRACTS AT MARKET
ENDIF
ELSIF COUNTOFSHORTSHARES =1 THEN
IF (close - Distanza) > Prezzo -TP3*POINTSIZE THEN
EXITSHORT 1 CONTRACTS AT Prezzo -TP3*POINTSIZE LIMIT
ELSIF (close + Distanza) > Prezzo -TP3*POINTSIZE THEN
EXITSHORT 1 CONTRACTS AT Prezzo -TP3*POINTSIZE STOP
ELSE
EXITSHORT 1 CONTRACTS AT MARKET
ENDIF
ENDIF
IF SHORTONMARKET AND NOT C2 THEN
A=COUNTOFSHORTSHARES
EXITSHORT A CONTRACTS AT MARKET
ENDIF
iF SHORTONMARKET AND NOT TIMEOPERATE THEN
A=COUNTOFSHORTSHARES
EXITSHORT A CONTRACTS AT MARKET
ENDIF
graphonprice Prezzo
graphonprice Prezzo+TP1
graphonprice Prezzo+TP2
graphonprice Prezzo+TP3
graphonprice Prezzo-TP1
graphonprice Prezzo-TP2
graphonprice Prezzo-TP3
graph abs(CountOfPosition) //numero posizioni aperte (positivo se LONG, negativo se SHORT, usando ABS() non fa differenza)
graph PositionPerf*close/pipsize //PIPS di guadagno (o perdita, se negativo)
Roberto, stasera dopo le 18 tiro giù dal auto trading pro order il codice “vecchio” e metto in pista per domani questo “nuovo” da te suggerito. Non desidero cadere nell’equivoco dell’adulazione, ma confesso nutrire una forma di piacere nel confrontarmi con persone qualificate e preparate come te. Grazie ancora, seguiranno gli aggiornamenti in merito.
Buongiorno, oggi il Dax ha fatto dei movimenti ampi con TF a 5 minuti e con l’ultimo codice messo a disposizione ecco come si comporta.
Esempio di barra delle 9:25
open 15.658,4
min 15655.9
max 15691,4
close 15690,4
Condizioni hanno innescato ordine di acquisto di 3 contratti a 15659 alle 9:25
Gli stop loss sono stati caricati regolarmente, ma l’ordine con stop limit continua a non caricarsi per la stessa barra ed in quella successiva che è andata ancora più in alto è rimasto dentro con tutti i 3 contratti. Devo uscire manualmente ed in alcuni casi mi si pianta il robot.
In definitiva ogni volta che entra con 3 contratti, solo in alcune condizioni e solo nella barra successiva riesce a piazzare l’ordine limit.
A supporto, qui sotto allego la barra delle 9:25 e un immagine che mostra di come ogni volta entri con 3 contratti, l’ordine limit non risulta mai in essere; in alcune condizioni, l0rdine limit verrà inserito nelle barre successive in altre condizioni non scatta nessun ordine (limit, stop o at market).
Grazie per l’attenzione.
Va tutto bene per quel che mi risulta.
E’ entrato alle 9:30, ha piazzato gli ordini pendenti ma non ha raggiunto nessun TP per cui è uscito in SL alle 9:45.
Ma così non va bene. La logica sarebbe questa:
Entra ad esempio a 16500.
Piazza immediatamente lo stop loss per ogni contratto (questo lo fa)
Piazza immediatamente la vendita di un contratto al raggiungimento del primo target. (questo non lo fa)
Cosa sta accadendo ora?
Piazza immediatamente lo stop loss per ogni contratto (questo lo fa)
NON piazza immediatamente la vendita di un contratto al raggiungimento del primo target.
Nella barra successiva ed in determinate condizioni piazza un ordine relativo primo contratto in uscita e quando non riesce fallisce la logica del robot.
Grazie per l’attenzione
“Piazza immediatamente la vendita di un contratto al raggiungimento del primo target. (questo non lo fa)“, perché a te non lo fa? A me lo fa.
Se per piazzare l’ordine pendente intendi piazzarlo immediatamente quando entra a mercato devi dirglielo appositamente. Tu gli hai chiesto di metterli solo quando sono già a mercato determinate posizioni (3, 2 o 1) e questo NON può saperlo subito perché l’ordine potrebbe essere respinto o esguito parzialmente, ecc… quindi ha bisogno di una barra per sapere se (e con quante) posizioni è a mercato.
Una soluzione può essere quella di usare più TF (se cerchi la parola MTF, Multi o Multiple Time Frame, troverai un sacco di discussioni ed esempi, oltre a blog e articoli).
Un’altra soluzione è quella di piazzare immediatamente gli ordini per tutti e 3 i casi (solo la prima volta, poi va bene così com’è). In questo modo:
TP1=18
TP2=12
TP3=12
SL=15
ONCE Distanza = 10
TIMEOPERATE = TIME>075900 AND TIME<180000
C1= close>ExponentialAverage[50](close) and close>ExponentialAverage[10](close)
C2= close<ExponentialAverage[50](close) and close<ExponentialAverage[10](close)
//************
// LONG *
//************
IF not longonmarket AND C1 AND TIMEOPERATE THEN
BUY 3 CONTRACTS AT MARKET
SET STOP LOSS SL
Prezzo = close
SELL 1 CONTRACTS AT Prezzo +TP1*POINTSIZE LIMIT
SELL 1 CONTRACTS AT Prezzo +TP2*POINTSIZE LIMIT
SELL 1 CONTRACTS AT Prezzo +TP3*POINTSIZE LIMIT
ENDIF
IF COUNTOFLONGSHARES =3 THEN
Prezzo = TradePrice
IF (close + Distanza) < Prezzo +TP1*POINTSIZE THEN
SELL 1 CONTRACTS AT Prezzo +TP1*POINTSIZE LIMIT
ELSIF (close - Distanza) > Prezzo +TP1*POINTSIZE THEN
SELL 1 CONTRACTS AT Prezzo +TP1*POINTSIZE STOP
ELSE
SELL 1 CONTRACTS AT MARKET
ENDIF
ELSIF COUNTOFLONGSHARES =2 THEN
IF (close + Distanza) < Prezzo +TP2*POINTSIZE THEN
SELL 1 CONTRACTS AT Prezzo +TP2*POINTSIZE LIMIT
ELSIF (close - Distanza) > Prezzo +TP2*POINTSIZE THEN
SELL 1 CONTRACTS AT Prezzo +TP2*POINTSIZE STOP
ELSE
SELL 1 CONTRACTS AT MARKET
ENDIF
ELSIF COUNTOFLONGSHARES =1 THEN
IF (close + Distanza) < Prezzo +TP3*POINTSIZE THEN
SELL 1 CONTRACTS AT Prezzo +TP3*POINTSIZE LIMIT
ELSIF (close - Distanza) > Prezzo +TP3*POINTSIZE THEN
SELL 1 CONTRACTS AT Prezzo +TP3*POINTSIZE STOP
ELSE
SELL 1 CONTRACTS AT MARKET
ENDIF
ENDIF
IF longonmarket and not C1 then
SELL AT MARKET
ENDIF
iF LONGONMARKET AND NOT TIMEOPERATE THEN
SELL AT MARKET
ENDIF
//************
// SHORT *
//************
IF not SHORTOnmarket and C2 AND TIMEOPERATE THEN
SELLSHORT 3 CONTRACTS AT MARKET
SET STOP LOSS SL
Prezzo = close
EXITSHORT 1 CONTRACTS AT Prezzo -TP1*POINTSIZE LIMIT
EXITSHORT 1 CONTRACTS AT Prezzo -TP2*POINTSIZE LIMIT
EXITSHORT 1 CONTRACTS AT Prezzo -TP3*POINTSIZE LIMIT
ENDIF
IF COUNTOFSHORTSHARES =3 THEN
Prezzo = TradePrice
IF (close - Distanza) > Prezzo -TP1*POINTSIZE THEN
EXITSHORT 1 CONTRACTS AT Prezzo -TP1*POINTSIZE LIMIT
ELSIF (close + Distanza) < Prezzo -TP1*POINTSIZE THEN
EXITSHORT 1 CONTRACTS AT Prezzo -TP1*POINTSIZE STOP
ELSE
EXITSHORT 1 CONTRACTS AT MARKET
ENDIF
ELSIF COUNTOFSHORTSHARES =2 THEN
IF (close - Distanza) > Prezzo -TP2*POINTSIZE THEN
EXITSHORT 1 CONTRACTS AT Prezzo -TP2*POINTSIZE LIMIT
ELSIF (close + Distanza) < Prezzo -TP2*POINTSIZE THEN
EXITSHORT 1 CONTRACTS AT Prezzo -TP2*POINTSIZE STOP
ELSE
EXITSHORT 1 CONTRACTS AT MARKET
ENDIF
ELSIF COUNTOFSHORTSHARES =1 THEN
IF (close - Distanza) > Prezzo -TP3*POINTSIZE THEN
EXITSHORT 1 CONTRACTS AT Prezzo -TP3*POINTSIZE LIMIT
ELSIF (close + Distanza) > Prezzo -TP3*POINTSIZE THEN
EXITSHORT 1 CONTRACTS AT Prezzo -TP3*POINTSIZE STOP
ELSE
EXITSHORT 1 CONTRACTS AT MARKET
ENDIF
ENDIF
IF SHORTONMARKET AND NOT C2 THEN
A=COUNTOFSHORTSHARES
EXITSHORT A CONTRACTS AT MARKET
ENDIF
iF SHORTONMARKET AND NOT TIMEOPERATE THEN
A=COUNTOFSHORTSHARES
EXITSHORT A CONTRACTS AT MARKET
ENDIF
graphonprice Prezzo
graphonprice Prezzo+TP1
graphonprice Prezzo+TP2
graphonprice Prezzo+TP3
graphonprice Prezzo-TP1
graphonprice Prezzo-TP2
graphonprice Prezzo-TP3
graph abs(CountOfPosition) //numero posizioni aperte (positivo se LONG, negativo se SHORT, usando ABS() non fa differenza)
graph PositionPerf*close/pipsize //PIPS di guadagno (o perdita, se negativo)
come vedi ho inserito 3 ordini pendenti, sia dopo BUY che dopo SELLSHORT. Questi li esegue solo la prima volta, poi usa gli altri. Ho dovuto usare CLOSE per il prezzo, in quanto alla chiusura della barra non si sa quale sarà il prezzo d’ingresso. Quindi alla prima barra successiva, se c’è stato un gap o slippage, PREZZO cambierà leggermente, quindi anche i livelli di un’eventuale uscita.
Uno svantaggio di questa soluzione è che, in caso di uno spike, esce con 1 posizione appena il prezzo più vicino viene raggiunto, mentre tu vorresti che la prima uscita venisse fatta al livello più alto, puoi provare ad eliminare le righe (solo per la prima barra, nelle righe dopo subito successive a BUY e SELLSHORT) relative a TP2 e TP3, tanto restano per le barre successive alla prima con il codice già esistente in precedenza.
Ho eliminato la A per le uscite, in quanto per uscire con tutte le restanti posizioni è sufficiente NON indicare il numero di contratti.
Lo metto in onda subito. Bisogna capire se la piattaforma IG riesce ad accumulare 3 ordini limit alla volta. Avevo provato anch’io quasi la stessa cosa, infatti non avevo messo Prezzo=close 🙁
Seguiranno esiti. Grazie
Si, io ne ho messi anche 20, non ci sono problemi (almeno sul backtest, in reale non ne ho mai usati più di 2-3).
Nel dubbio ecco ciò che mi piacerebbe accadere:
Compra a 1650.
Se raggiunto 1668 esce col primo e il secondo sta pronto ad uscire a 1680 ed il terzo sta pronto ad uscire a 1692. (magari nella stessa barra nel caso di uno spike con il terzo se ci arriva)
Se raggiunto il secondo ed uscito con 1680 sta pronto ad uscire con 1692 (magari nella stessa barra nel caso di uno spike).
Scusa in anticipo se non avevo specificato.
Tu gli ordini li hai messi all’inverso.
La prima uscita deve farla a TP1, poi a TP2 ed infine a TP3.
Al momento pare parzialmente risolta così in caso di spyke:
Ho messo solo le due parti al momento modificate.
Penso di dargliela su… nel senso che spaccherò il codice in 3 codici distinti, ognuno entrerà con un take profit diverso e buonanotte…. Avesso funzionato avrei messo altre condizioni per impedire di mangiare il profitto realizzato da primo o secondo contratto.
Nel frattempo sempre grazie.
IF not longonmarket AND C1 AND TIMEOPERATE THEN
BUY 3 CONTRACTS AT MARKET
SET STOP LOSS SL
Prezzo = close
SELL 1 CONTRACTS AT Prezzo +TP1*POINTSIZE LIMIT
SELL 1 CONTRACTS AT Prezzo +TP1+TP2*POINTSIZE LIMIT
SELL 1 CONTRACTS AT Prezzo +TP1+TP2+TP3*POINTSIZE LIMIT
ENDIF
IF not SHORTOnmarket and C2 AND TIMEOPERATE THEN
SELLSHORT 3 CONTRACTS AT MARKET
SET STOP LOSS SL
Prezzo = close
EXITSHORT 1 CONTRACTS AT Prezzo -TP1*POINTSIZE LIMIT
EXITSHORT 1 CONTRACTS AT Prezzo -(TP1+TP2)*POINTSIZE LIMIT
EXITSHORT 1 CONTRACTS AT Prezzo -(TP1+TP2+TP3)*POINTSIZE LIMIT
ENDIF
Anche perchè il robot si interrompe di continuo ora. Va proprio ripensata la logica a questo punto.
Evidentemente si.
Non può non funzionare, se la logica è corretta.