Ciao a tutti, ho inserito nel codice di un sistema su GBPJPY uno STOP $LOSS di 50000 che come dice la descrizione è nella Currency dello strumento. Lanciando il backtest noto diversi STOP oltre i 50000 ¥, addirittura uno da 112000 ¥ che è più del doppio.
Interpreto male il significato della funzione?
Dove si trova l'istruzione nel tuo codice? Sei sicuro che non si trovi in una condizione in modo che lo stoploss non sia impostato affatto? Stai eseguendo il backtest in tick-by-tick? Hai incluso le tasse?
If TIME = OrarioIngresso AND FiltroShort THEN
SELLSHORT nCON SHARES AT LOW STOP
SET STOP $LOSS 50000
SET TARGET $PROFIT 300000
Endif
Allego blocco del codice in questione, il long è speculare e funziona correttamente con stop a 150000 ¥, lo short ha quelle operazioni in foto che non riesco a giustificare. Il test è fatto sia con tick-by-tick che senza e non cambia. Non ho aggiunto commissioni
Usi un ordine condizionale e metti uno stoploss solo al momento in cui lo metti, quindi il sistema non ha idea se l'ordine verrà eseguito o meno nel periodo successivo. È necessario spostare le istruzioni SET STOP e SET TARGET al di fuori delle proprie condizioni, ad esempio alla fine del codice. In questo modo, ti assicurerai che lo stoploss sarà posizionato correttamente una volta che il tuo ordine STOP è stato attivato sul mercato.
Ho provato e in effetti funziona, grazie! Ho un dubbio però, ho altri sistemi tipo questo sul DAX e lo stop funziona correttamente, cosa c’è di diverso?
If TIME >= MyTimeInS AND TIME <= MyTimeOutS THEN
SELLSHORT 1 SHARES AT MinS STOP
SET STOP PLOSS 80
Endif
E tra l’altro ho un sistema gemello a quello su GBPJPY che lavora su USDJPY e che invece funziona correttamente anche con la struttura precedente
Quando si utilizzano ordini in sospeso, dipende da quando vengono attivati. Stai usando le istruzioni TIMEFRAME?
Questo è il codice intero
DEFPARAM CumulateOrders = False // Posizioni cumulate disattivate
//---------------------------------------------------------------------------------------------------
TIMEFRAME(DAILY)
//FILTRO DI COMPRESSIONE
IF DAYOFWEEK = 1 THEN
BlastOff = (DHIGH(2) - DLOW(2)) < (DHIGH(3) - DLOW(3))
ENDIF
IF DAYOFWEEK = 2 THEN
BlastOff = (DHIGH(1) - DLOW(1)) < (DHIGH(3) - DLOW(3))
ENDIF
IF (DAYOFWEEK = 3 OR DAYOFWEEK = 4 OR DAYOFWEEK = 5) THEN
BlastOff = (DHIGH(1) - DLOW(1)) < (DHIGH(2) - DLOW(2))
ENDIF
//---------------------------------------------------------------------------------------------------
TIMEFRAME(1H)
//ORARI DI ENTRATA
MyTimeInL = 110000
MyTimeInS = 20000
//CONTRATTI
nCON = 1
//---------------------------------------------------------------------------------------------------
//CONDIZIONI DI INGRESSO LONG
If TIME = MyTimeInL AND BlastOff THEN
BUY nCON SHARES AT HIGH stop
ENDIF
//CONDIZIONI DI USCITA LONG
IF LONGONMARKET THEN
SET STOP $LOSS 15000
SET TARGET $PROFIT 30000
ENDIF
//---------------------------------------------------------------------------------------------------
//CONDIZIONI PER INGRESSO SHORT
If TIME = MyTimeInS AND BlastOff THEN
SELLSHORT nCON SHARES AT LOW STOP
Endif
//CONDIZIONI PER USCITA SHORT
IF SHORTONMARKET THEN
SET STOP $LOSS 5000
SET TARGET $PROFIT 30000
ENDIF
Se incorpori le tue istruzioni STOP LOSS in una condizione " SE SHORTONMARKET POI", vuoi che la strategia sappia che sei già sul mercato. Quindi, in questo caso, e poiché il codice viene letto solo una volta a Close, saprà solo che sei al mercato, 1 bar troppo tardi. Pertanto, per 1 periodo, il tuo ordine non è protetto da uno stoploss. È necessario rimuovere tali condizioni alle righe 27 e 37.
Questa l’unica soluzione che ho trovato rispetto al codice iniziale perché mi hai indicato di togliere l’istruzione da dove era. Se nel primo caso non è corretto e nel secondo caso è pericoloso, come faccio a indicare uno stop loss che sia diverso per il lato long e il lato short?