Buongiorno,
Nonostante in questi giorni abbia fatto dei notevoli progressi (considerando che con la programmazione sono una capra! :D), non riesco a creare un codice per testare un semplice breakout di un range.
Lo strumento è il DAX, timeframe 1h. Il range da considerare è quello che va dalle ore (formato h24) 2 alle 8. Il sistema va long se il breakout avviene nella candela delle 9, 10 o 11, stessa logica per lo short.
Stop al minimo (long) o massimo (short) del range. L’operazione viene chiusa automaticamente alle 17.
Non condivido alcun codice perchè le mie prove sono state del tutto fallimentari.
Grazie in anticipo per l’aiuto
Eccolo:
ONCE TradeON = 0
IF (OpenTime = 020000) OR ((OpenTime > 020000) AND (OpenTime[1] < 020000)) THEN
myHigh = high
myLow = low
TradeON = 1
ENDIF
IF (OpenTime >= 020000) AND (OpenTime <= 080000) THEN
myHigh = max(myHigh,high)
myLow = max(myLow,low)
myRange = myHigh - myLow
ENDIF
TimeEntry = ((OpenTime = 090000) OR (OpenTime = 100000) OR (OpenTime = 110000)) OR ((OpenTime > 090000) AND (OpenTime[1] < 090000)) OR ((OpenTime > 100000) AND (OpenTime[1] < 100000)) OR ((OpenTime > 110000) AND (OpenTime[1] < 110000))
IF TimeEntry AND Not OnMarket AND TradeON THEN
IF close > myHigh THEN
BUY 1 Contract at Market
SET STOP PRICE myLow
TradeON = 0
ELSIF close < myLow THEN
SELLSHORT 1 Contract at Market
SET STOP PRICE myHigh
TradeON = 0
ENDIF
ENDIF
IF ((OpenTime = 170000) OR ((OpenTime > 170000) AND (OpenTime[1] < 170000))) THEN
SELL at Market
EXITSHORT at Market
ENDIF
Grazie Roberto, funziona.
Due piccoli appunti, lo stop vorrei che andasse nel minimo (long) o massimo (short) dell’intero range che va dalle 2 alle 8, al momento non capisco come stia funzionando.
Vorrei anche che il numero di operazioni al giorno fosse solo una, dunque se un’operazione raggiunge lo stop loss per quel giorno non verranno aperte altre posizioni.
E’ possibile far disegnare sul grafico il range con delle semplici linee orizzontali o questa operazione va fatta dagli indicatori?
Intanto, rileggendo il codice, mi sono accorto che la riga 9 è errata e va sostituita con questa:
myLow = min(myLow,low)
altrimenti considera il MINIMO più alto, non quello più basso, falsando il range.Questo dovrebbe mettere a posto i dati un pò “strani” che vedi.
Questo è il nuovo codice modificato, con la correzione, l’aggiunta della variabile OTD per una sola operazione al giorno e le 3 istruzioni grafiche (alla fine del codice) per vedere i dati. I prezzi li vedrai direttamente con delle linee sul grafico, mentra il range, essendo fuori scala, sarebbe quasi invisibile per cui lo vedrai in un’apposita finestra delle variabili:
ONCE TradeON = 0
OTD = (Barindex - TradeIndex(1) > IntradayBarIndex) // Una sola operazione al giorno
IF (OpenTime = 020000) OR ((OpenTime > 020000) AND (OpenTime[1] < 020000)) THEN
myHigh = high
myLow = low
TradeON = 1
ENDIF
IF (OpenTime >= 020000) AND (OpenTime <= 080000) THEN
myHigh = max(myHigh,high)
myLow = min(myLow,low)
myRange = myHigh - myLow
ENDIF
TimeEntry = ((OpenTime = 090000) OR (OpenTime = 100000) OR (OpenTime = 110000)) OR ((OpenTime > 090000) AND (OpenTime[1] < 090000)) OR ((OpenTime > 100000) AND (OpenTime[1] < 100000)) OR ((OpenTime > 110000) AND (OpenTime[1] < 110000))
IF TimeEntry AND Not OnMarket AND TradeON AND OTD THEN
IF close > myHigh THEN
BUY 1 Contract at Market
SET STOP PRICE myLow
TradeON = 0
ELSIF close < myLow THEN
SELLSHORT 1 Contract at Market
SET STOP PRICE myHigh
TradeON = 0
ENDIF
ENDIF
IF ((OpenTime = 170000) OR ((OpenTime > 170000) AND (OpenTime[1] < 170000))) THEN
SELL at Market
EXITSHORT at Market
ENDIF
graphonprice myHigh AS "Highest" coloured("Blue")
graphonprice myLow AS "Lowest" coloured("Red")
graph myRange AS "Range" coloured("Green")
Questo è l’indicatore per vedere il range in un nuovo pannello sotto il grafico (come MACD, ad esempio):
IF (OpenTime = 020000) OR ((OpenTime > 020000) AND (OpenTime[1] < 020000)) THEN
myHigh = high
myLow = low
ENDIF
IF (OpenTime >= 020000) AND (OpenTime <= 080000) THEN
myHigh = max(myHigh,high)
myLow = min(myLow,low)
myRange = myHigh - myLow
ELSE
myRange = 0
ENDIF
RETURN myRange AS "Range"