Ciao a tutti, ho fatto un trading sistem ma presenta due bug che non capisco, in pratica non mi chiude i long quando vorrei nonostante io abbia impostato questo parametro di uscita:
// Condizioni per uscire da posizioni long
ciclo = CCI[7]
escilong = (ciclo CROSSES UNDER 100)
IF escilong THEN
SELL AT MARKET
ENDIF
Come ho messo nella foto sarebbe dovuto essere inserito un ordine di chiusura quando il CCI oltrepassa in discesa 100, ma ciò non è avvenuto. (meno male che sta solo in demo).
Ho un altro problema, lo script, nonostante abbia questi parametri iniziali;
DEFPARAM FLATBEFORE = 080000
// Cancellare tutti gli ordini in attesa e chiudere tutte le posizioni all’orario “Flat After”
DEFPARAM FLATAFTER = 210000
Mantiene le posizioni aperte oltre le ore 21, non le chiude proprio la sera.
Non capisco perchè. Potete aiutarmi?
Questo mi accade sul CFD Futures di IG scandenza Marzo del Germany30, possibile che sia perchè non è ancora scaduto Dicembre?
Per quanto riguarda la prima domanda, forse alla candela da te indicata può darsi che il CCI fosse 100,00 e quindi non ancora UNDER, però avrebbe dovuto chiudere il trade alla candela successiva. Occorrerebbe il codice completo, perché può darsi che quelle poche righe che tu hai scritto facciano parte, per tua scelta o per tuo errore, di unblocco IF che risulta FALSO e non viene mai eseguito, quindi anche gli IF più interni seguono la stessa sorte.
Per la seconda domanda, non so proprio dirti, prova con altri strumenti oppure stesso strumento ma di diverso tipo, mini ecc….
Per scrivere il codice , utilizza il pulsante <> “insert PRT code”
Per quanto riguarda la prima domanda, forse alla candela da te indicata può darsi che il CCI fosse 100,00 e quindi non ancora UNDER, però avrebbe dovuto chiudere il trade alla candela successiva. Occorrerebbe il codice completo, perché può darsi che quelle poche righe che tu hai scritto facciano parte, per tua scelta o per tuo errore, di unblocco IF che risulta FALSO e non viene mai eseguito, quindi anche gli IF più interni seguono la stessa sorte. Per la seconda domanda, non so proprio dirti, prova con altri strumenti oppure stesso strumento ma di diverso tipo, mini ecc…. Per scrivere il codice , utilizza il pulsante <> “insert PRT code”
Grazie mille! Il problema era proprio la funzione IF in origine avevo questa funzione:
//*****APERTURA LONG***** Condizioni per entrare su posizioni long
IF NOT ONMARKET THEN
parametri
if time > 080000 and C1 and c2 and not daysForbiddenEntry then
BUY PositionSize CONTRACT AT MARKET
ENDIF
// Condizioni per uscire da posizioni long
ciclo = CCI[55]
escilong = (ciclo CROSSES UNDER 100)
IF escilong THEN
SELL AT MARKET
ENDIF
ENDIF
ed infatti non usciva, allora ho eliminato il primo if not on market ed ho fatto così
if time > 080000 and C1 and c2 and not daysForbiddenEntry and not onmarket then
BUY PositionSize CONTRACT AT MARKET
ENDIF
ed ora è uscito!
ehm… se aggiusto il codice per lo short con gli stessi settaggi torna a dare errore..
// Definizione dei parametri del codice
DEFPARAM CumulateOrders = False // Posizioni cumulate disattivate
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
// /////////////////////////////////////////////////////////////////////////
positionsize=1//+2*round((strategyprofit*2)/10000)
// PARAMETRI DI PREZZO
// Stop e target
SET STOP PLOSS 70
set target profit 187
//WeightedClose
//TotalPrice
//TypicalPrice
//TRADEPRICE
//TOTALPRICE
//*****APERTURA LONG***** Condizioni per entrare su posizioni long
IF NOT ONMARKET THEN
I1 =
I2 =
c1 =
c2 =
if time > 080000 and C1 and c2 and not daysForbiddenEntry then
BUY PositionSize CONTRACT AT MARKET
ENDIF
// Condizioni per uscire da posizioni long
ciclo = CCI[7]
escilong = (ciclo CROSSES UNDER 100)
IF escilong THEN
SELL AT MARKET
ENDIF
ENDIF
//*****APERTURA SHORT*****
///////////////////
IF NOT ONMARKET THEN
I1 =
I2 =
c1 =
c2 =
if time>080000 and C1 and c2 and not daysForbiddenEntry then
sellshort PositionSize CONTRACT AT MARKET
ENDIF
// Condizioni per uscire da posizioni long
ciclo = CCI[55]
escishort = (ciclo CROSSES UNDER 84.1)
IF escishort THEN
exitshort AT MARKET
ENDIF
ENDIF
//************************************************************************
//trailing stop function
trailingstart = 96 //trailing will start @trailinstart points profit
trailingstep = 8 //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
//************************************************************************
/////////////////////////////////////////////////////////////////////////////////////
// Sell at end of day
if time>215300 then
exitshort at market
sell at market
endif
// Earlier friday exit. Insurance against accidental holding over weekends
if dayofweek=5 and time>212300 then
exitshort at market
sell at market
endif
@robertogozzi
Se elimino la riga 18 e la 31, l’uscita viene recepita dal sistema e l’ordine viene chiuso correttamente, ma se vado ad eliminare ugualmente la 35 e la 48 il problema mi si ripresenta 🙁
La riga 45 credo dovrebbe essere
escishort = (ciclo CROSSES OVER 84.1)
questo credo sia il problema, non l’avere tolto le righe 35 e 48.
Il fatto è che se elimino sia la 18 che la 31 e poi la 35 e la 48, il sistema ugualmente non chiude l’operazione al verificarsi dei parametri.
Intanto grazie per avermi fatto notare l’errore. Ma pare che oggi quell’operazione che ieri apriva e non chiudeva non sarebbe stata aperta… possibile che possa esser stato per causa del rollover sullo strumento della data di ieri?
Il problema è che backtestare sui 30 minuti viene molto limitato nel tempo, e questo rende il tutto molto aleatorio.
Non credo c’entri il rollover, ma non saprei dirlo con certezza.