problemas con backtest con gap trading

Viewing 10 posts - 1 through 10 (of 10 total)
  • Author
    Posts
  • #202983 quote
    ricardogil
    Participant
    New

    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
    #203001 quote
    robertogozzi
    Moderator
    Master

    ¿Qué no está funcionando correctamente?

    ¿Puede decirme en qué instrumento lo probó, en qué período de tiempo (¿1 minuto?) Y cuántas unidades?

    #203013 quote
    ricardogil
    Participant
    New

    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
    #203395 quote
    robertogozzi
    Moderator
    Master

    ¿Qué es ESCALON?

    #203414 quote
    ricardogil
    Participant
    New

    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%

    #203484 quote
    robertogozzi
    Moderator
    Master

    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.

    #204379 quote
    ricardogil
    Participant
    New

    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

    FUTU.docx
    #204405 quote
    robertogozzi
    Moderator
    Master

    No es una acción apoyada por IG. No sé qué decirte.

    #204500 quote
    ricardogil
    Participant
    New

    hola Roberto, gracias por  la respuesta.

    No me queda claro lo que quieres decir con tu respuesta. por acción te refieres a share.

    #204675 quote
    robertogozzi
    Moderator
    Master

    Si, shares or stocks

Viewing 10 posts - 1 through 10 (of 10 total)
  • You must be logged in to reply to this topic.

problemas con backtest con gap trading


ProOrder: Trading Automático y Backtesting

New Reply
Author
author-avatar
ricardogil @ricardogil Participant
Summary

This topic contains 9 replies,
has 2 voices, and was last updated by robertogozzi
3 years, 3 months ago.

Topic Details
Forum: ProOrder: Trading Automático y Backtesting
Language: Spanish
Started: 10/24/2022
Status: Active
Attachments: 1 files
Logo Logo
Loading...