hola, estoy intentando realizar un backtest de mi estrategia y me encuentro con el problema de las temporalidades.
La estrategia plantea la entrada según la velas en minutos (ETH) siempre que se cumpla una condición en temporalidad diaria (RTH), en concreto que tengamos un gap>= +-4% a la apertura. el código que he probado es el siguiente, pero no funciona correctamente. Agradezco cualquier ayuda
timeframe(Daily, UPDATEONCLOSE)
bajista= 0.96*close[1]>open
alcista= 1.04*close[1]<open
timeframe(1minute)
//Defino las medias.
//Media larga y media corta:
MediaLarga = Average[200](close)
MediaCorta = Average[20](close)
//Condición 1: Entrada a partir de la quinta vela y antes de la primera hora:
C1 = Time > 093500 AND Time =< 103000
//Condición 2: Entrada a largo por encima de la media corta, la cual está por encima de la media larga, ambas ascendentes, al final de la primera vela verde después de una o varias rojas (retroceso):
C21 = MediaCorta > MediaLarga
C22 = MediaCorta[1] < MediaCorta
C23 = MediaLarga[1] < MediaLarga
C24 = Close > MediaCorta
C25 = Close[1] =< Open[1] AND Close > Open
C2 = C21 and C22 and C23 and C24 and C25
//Condición 3: Entrada a corto por debajo de la media corta, la cual está por debajo de la media larga, ambas descendentes, al final de la primera vela roja después de una o varias verdes (retroceso)::
C31 = MediaCorta < MediaLarga
C32 = MediaCorta[1] > MediaCorta
C33 = MediaLarga[1] > MediaLarga
C34 = Close < MediaCorta
C35 = Close[1] => Open[1] AND Close < Open
C3 = C31 and C32 and C33 and C34 and C35
IF NOT LongOnMarket AND (bajista or alcista) and c1 and c2 THEN
BUY 7000 CASH AT MARKET
ENDIF
// Condiciones de entrada de posiciones cortas
IF NOT ShortOnMarket AND (bajista or alcista) and c1 and c3 THEN
SELLSHORT 7000 CASH AT MARKET
ENDIF
IF (OnMarket AND Not OnMarket[1]) OR (LongOnMarket AND ShortOnMarket[1]) OR (LongOnMarket[1] AND ShortOnMarket) THEN
PC = TradePrice
IF LongOnMarket THEN
Set Stop Price (PC * 0.99)
ELSIF ShortOnMarket THEN
Set Stop Price (PC * 1.01)
ENDIF
ENDIF
IF LongOnMarket THEN
IF close > (PC * 1.02) THEN
Set Stop Price (PC * 1.015)
ELSIF close > (PC * 1.015) THEN
Set Stop Price (PC * 1.01)
ELSIF close > (PC * 1.01) THEN
Set Stop Price (PC * 1.005)
ELSIF close > (PC * 1.005) THEN
Set Stop Breakeven
ENDIF
ELSIF ShortOnMarket THEN
IF close < (PC * 0.98) THEN
Set Stop Price (PC * 0.985)
ELSIF close < (PC * 0.985) THEN
Set Stop Price (PC * 0.99)
ELSIF close < (PC * 0.99) THEN
Set Stop Price (PC * 0.995)
ELSIF close < (PC * 0.995) THEN
Set Stop Breakeven
ENDIF
ENDIF
¿Qué no está funcionando correctamente?
¿Puede decirme en qué instrumento lo probó, en qué período de tiempo (¿1 minuto?) Y cuántas unidades?
hola gracias por la respuesta. Ya he conseguido que me detecte la entrada con el gap diario, sin embargo ahora la salida la ejecuta de forma diferente si le pido backtest desde origen o por ejemplo desde ayer
lo aplico en gráfico de 1 minuto
valor FUTU
adjunto el codigo en el que he definido escalon como una variable=0.005
DEFPARAM CumulateOrders = false
OTD = (Barindex - TradeIndex(1) > IntradayBarIndex)
if time =093000 then
gap=abs(((open-DClose(1))/DClose(1))*100)
endif
timeframe(DEFAULT )
MediaLarga = Average[200](close)
MediaCorta = Average[20](close)
//Condición 1: Entrada a partir de la quinta vela y antes de la primera hora:
C1 = Time > 093500 AND Time =< 103000
//Condición 2: Entrada a largo por encima de la media corta, la cual está por encima de la media larga, ambas ascendentes, al final de la primera vela verde después de una o varias rojas (retroceso):
C21 = MediaCorta > MediaLarga
C22 = MediaCorta[1] < MediaCorta
C23 = MediaLarga[1] < MediaLarga
C24 = Close > MediaCorta
C25 = Close[1] =< Open[1] AND Close > Open
C2 = C21 and C22 and C23 and C24 and C25
//Condición 3: Entrada a corto por debajo de la media corta, la cual está por debajo de la media larga, ambas descendentes, al final de la primera vela roja después de una o varias verdes (retroceso)::
C31 = MediaCorta < MediaLarga
C32 = MediaCorta[1] > MediaCorta
C33 = MediaLarga[1] > MediaLarga
C34 = Close < MediaCorta
C35 = Close[1] => Open[1] AND Close < Open
C3 = C31 and C32 and C33 and C34 and C35
IF NOT LongOnMarket AND (gap>4) and c1 and c2 and OTD THEN
BUY 7000 CASH AT MARKET
ENDIF
// Condiciones de entrada de posiciones cortas
IF NOT ShortOnMarket AND (gap>4) and c1 and c3 and OTD THEN
SELLSHORT 7000 CASH AT MARKET
ENDIF
IF (OnMarket AND Not OnMarket[1]) OR (LongOnMarket AND ShortOnMarket[1]) OR (LongOnMarket[1] AND ShortOnMarket) THEN
PC = TradePrice
IF LongOnMarket THEN
Set Stop Price (PC * 0.99)
ELSIF ShortOnMarket THEN
Set Stop Price (PC * 1.01)
ENDIF
ENDIF
IF LongOnMarket THEN
IF close > (PC * (1+(10*escalon))) THEN
Set Stop Price (PC * (1+(9*escalon)))
ELSIF close > (PC * (1+(9*escalon))) THEN
Set Stop Price (PC * (1+(8*escalon)))
ELSIF close > (PC * (1+(8*escalon))) THEN
Set Stop Price (PC * (1+(7*escalon)))
ELSIF close > (PC * (1+(7*escalon))) THEN
Set Stop Price (PC * (1+(6*escalon)))
ELSIF close > (PC * (1+(6*escalon))) THEN
Set Stop Price (PC * (1+(5*escalon)))
ELSIF close > (PC * (1+(5*escalon))) THEN
Set Stop Price (PC * (1+(4*escalon)))
ELSIF close > (PC * (1+(4*escalon))) THEN
Set Stop Price (PC * (1+(3*escalon)))
ELSIF close > (PC * (1+(3*escalon))) THEN
Set Stop Price (PC * (1+(2*escalon)))
ELSIF close > (PC * (1+(2*escalon))) THEN
Set Stop Price (PC * (1+(1*escalon)))
ELSIF close > (PC * (1+(1*escalon))) THEN
Set Stop Breakeven
ENDIF
ELSIF ShortOnMarket THEN
IF close < (PC * (1-(10*escalon))) THEN
Set Stop Price (PC * (1-(9*escalon)))
ELSIF close < (PC * (1-(9*escalon))) THEN
Set Stop Price (PC * (1-(8*escalon)))
ELSIF close < (PC * (1-(8*escalon))) THEN
Set Stop Price (PC * (1-(7*escalon)))
ELSIF close < (PC * (1-(7*escalon))) THEN
Set Stop Price (PC * (1-(6*escalon)))
ELSIF close < (PC * (1-(6*escalon))) THEN
Set Stop Price (PC * (1-(5*escalon)))
ELSIF close < (PC *(1-(5*escalon))) THEN
Set Stop Price (PC * (1-(4*escalon)))
ELSIF close < (PC * (1-(4*escalon))) THEN
Set Stop Price (PC * (1-(3*escalon)))
ELSIF close < (PC * (1-(3*escalon))) THEN
Set Stop Price (PC * (1-(2*escalon)))
ELSIF close < (PC * (1-(2*escalon))) THEN
Set Stop Price (PC * (1-escalon))
ELSIF close < (PC * (1-escalon )) THEN
Set Stop Breakeven
ENDIF
ENDIF
hola
escalon es una variable que he definido en el apartado de variables para posteriormente poder optimizarla. en concreto para el caso actual su valor es 0.005
lo que pretendo es ir moviendo el stop loss en saltos de 0.5%
Lo he probado en el BMW action (no he encontrado ningún FUTU, ¿cuál es?) y me parece que funciona correctamente.
Dime con qué herramienta lo probaste, la fecha y la hora de algunas operaciones incorrectas. También dime por qué son incorrectos.
hola Roberto, el código lo probé con el siguiente valor: Futu Holdings Limited (NASDAQ: FUTU)
también tengo activado el premarket, es decir las medias se calculan con ETH.
realizando el backtest desde el 1 nov 2022 4:28, hasta la ultima fecha disponible, tenemos:
1 nov 09:37 entrada 36.36 y salida 36.36 ;correcta
4 nov 09:37 entrada 39.21 (correcto) y salida 09:37 39.21. No es correcto, la salida tendría que estar en 38.82
sin embargo, cuando cambio la temporalidad de análisis para que comience el día 4 de noviembre, entonces la entrada y salida sí es correcta
te adjunto unas imágenes para que se vea la diferencia
No es una acción apoyada por IG. No sé qué decirte.
hola Roberto, gracias por la respuesta.
No me queda claro lo que quieres decir con tu respuesta. por acción te refieres a share.