Hola. Buenos dias. Estoy probando un sistema con medias móviles de 15 y 35. El sistema es sencillo. Es un sistema contratendencia, y consiste en comprar cuando el precio está por debajo de ambas medias y vender cuando está por encima. En la plataforma de prueba de pro-realtime va bastante bien. El problema está al usarla en IG, ya que los spreads se cargan la estrategia. Os voy a enviar mi código actual y a ver si alguien me puede ayudar a cambiar lo siguiente, que creo que solucionaría el problema: necesito que la orden de compra o venta no sea a mercado, sino en el mismo punto donde empieza la siguiente vela. De esta forma se perderán algunas ordenes, ya que con el spread habrá veces que no se comprará o venderá, pero serán solo algunas, ya que la mayoria de las veces el precio retrocede lo suficiente como para que la operación se dé. Os envío mi código actual. Gracias de antemano.
// Definición de los parámetros del código
DEFPARAM CumulateOrders = False // Acumulación de posiciones desactivada
// Impide al sistema operar en días precisos de la semana
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
// Condiciones para entrada de posiciones largas
indicator1 = ExponentialAverage[14](close)
c1 = (close < indicator1)
indicator2 = ExponentialAverage[35](close)
c2 = (close < indicator2)
IF (c1 AND c2) AND not daysForbiddenEntry THEN
BUY 1 SHARES AT MARKET
ENDIF
// Condiciones de salida de posiciones largas
indicator3 = ExponentialAverage[14](close)
c3 = (close > indicator3)
indicator4 = ExponentialAverage[35](close)
c4 = (close > indicator4)
IF c3 AND c4 THEN
SELL AT MARKET
ENDIF
// Condiciones de entrada de posiciones cortas
indicator5 = ExponentialAverage[14](close)
c5 = (close > indicator5)
indicator6 = ExponentialAverage[35](close)
c6 = (close > indicator6)
IF (c5 AND c6) AND not daysForbiddenEntry THEN
SELLSHORT 1 SHARES AT MARKET
ENDIF
// Condiciones de salida de posiciones cortas
indicator7 = ExponentialAverage[14](close)
c7 = (close < indicator7)
indicator8 = ExponentialAverage[35](close)
c8 = (close < indicator8)
IF c7 AND c8 THEN
EXITSHORT AT MARKET
ENDIF
// Stops y objetivos
SET STOP pLOSS 10
SET TARGET pPROFIT 10
Hola Nuria,
Creo que no se puede abrir posición con el precio de inicio de vela puesto que en PRT el código se ejecuta al final de cada vela pero sí se puede hacer al precio de cierre de la vela anterior que normalmente será casi igual salvo en el caso de velas de 1 día o mayores que puede haber gaps.
Si quieres abrir posición con el precio de cierre de la vela debes sustituir el comando BUY/SELLSHORT AT MARKET por BUY/SELLSHORT AT CLOSE LIMIT.
Como bien dices con esta opción te ahorras el spread (y también el posible slippage) pero tiene la desventaja de que algunas operaciones no llegarán a ejecutarse, normalmente las mejores. Yo he hecho pruebas con esta opción en mis sistemas y mi conclusión es que merece la pena cuando son sistemas que realizan bastantes operaciones aunque te aviso que a veces te llevarás grandes disgustos por operaciones muy buenas que no se ejecutan.
Otra opinión personal es que si un sistema depende del spread para ser rentable no es muy interesante, en esta misma página encontrarás sistemas que tienen, al menos en backtest, una rentabilidad mucho mayor.
Buena suerte
Muchas gracias. Acabo de cambiarlo. Ya te cuento que tal va.
A ver si alguien me puede ayudar con otro problema. Ahora mismo la estrategia funciona de la siguiente manera. Cuando el precio está por debajo de las dos medias, compra. Y cuando el precio está por encima de las dos medias, vende. Pero cuando hay una subida importante cada vez que salta el stop (10 p), vuelve a hacer otra compra u otra venta, y si sigue subiendo, otra. Esto se carga la estrategia. necesito poner una orden para que cuando salte el stop, no se vuelva a hacer otra compra hasta que el precio este por debajo de las dos medias. O sea, una vz que salte el stop, la siguiente operación tiene que ser en sentido contrario. Si salta el stop cuando estoy en compra, ya no vuelvo a entrar hasta que el precio esté por debajo de las dos medias, que sería en venta. Os mando el código tal y como está ahora mismo.
// Definición de los parámetros del código
DEFPARAM CumulateOrders = False // Acumulación de posiciones desactivada
// Impide al sistema operar en días precisos de la semana
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
// Condiciones para entrada de posiciones largas
indicator1 = ExponentialAverage[14](close)
c1 = (close < indicator1)
indicator2 = ExponentialAverage[35](close)
c2 = (close < indicator2)
IF (c1 AND c2) AND not daysForbiddenEntry THEN
BUY 1 CONTRACT AT CLOSE LIMIT
ENDIF
// Condiciones de salida de posiciones largas
indicator3 = ExponentialAverage[14](close)
c3 = (close > indicator3)
indicator4 = ExponentialAverage[35](close)
c4 = (close > indicator4)
IF c3 AND c4 THEN
SELL AT CLOSE LIMIT
ENDIF
// Condiciones de entrada de posiciones cortas
indicator5 = ExponentialAverage[14](close)
c5 = (close > indicator5)
indicator6 = ExponentialAverage[35](close)
c6 = (close > indicator6)
IF (c5 AND c6) AND not daysForbiddenEntry THEN
SELLSHORT 1 CONTRACT AT CLOSE LIMIT
ENDIF
// Condiciones de salida de posiciones cortas
indicator7 = ExponentialAverage[14](close)
c7 = (close < indicator7)
indicator8 = ExponentialAverage[35](close)
c8 = (close < indicator8)
IF c7 AND c8 THEN
EXITSHORT AT CLOSE LIMIT
ENDIF
// Stops y objetivos
SET STOP pLOSS 10
Hay varias formas de lidiar con el problema que tienes, la que me parece más sencilla es creando una variable para que no entre más de una vez seguida en un solo sentido. Quedaría así:
// Definición de los parámetros del código
DEFPARAM CumulateOrders = False // Acumulación de posiciones desactivada
// Impide al sistema operar en días precisos de la semana
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
//Variable para NO entrar mas de una vez seguida en el mismo sentido
ONCE ULTIMAENTRADA=0
// Condiciones para entrada de posiciones largas
indicator1 = ExponentialAverage[14](close)
c1 = (close < indicator1)
indicator2 = ExponentialAverage[35](close)
c2 = (close < indicator2)
IF ULTIMAENTRADA<>1 AND c1 AND c2 AND not daysForbiddenEntry THEN
BUY 1 CONTRACT AT CLOSE LIMIT
ULTIMAENTRADA=1
ENDIF
// Condiciones de salida de posiciones largas
indicator3 = ExponentialAverage[14](close)
c3 = (close > indicator3)
indicator4 = ExponentialAverage[35](close)
c4 = (close > indicator4)
IF c3 AND c4 THEN
SELL AT CLOSE LIMIT
ENDIF
// Condiciones de entrada de posiciones cortas
indicator5 = ExponentialAverage[14](close)
c5 = (close > indicator5)
indicator6 = ExponentialAverage[35](close)
c6 = (close > indicator6)
IF ULTIMAENTRADA<>-1 AND c5 AND c6 AND not daysForbiddenEntry THEN
SELLSHORT 1 CONTRACT AT CLOSE LIMIT
ULTIMAENTRADA=-1
ENDIF
// Condiciones de salida de posiciones cortas
indicator7 = ExponentialAverage[14](close)
c7 = (close < indicator7)
indicator8 = ExponentialAverage[35](close)
c8 = (close < indicator8)
IF c7 AND c8 THEN
EXITSHORT AT CLOSE LIMIT
ENDIF
// Stops y objetivos
SET STOP pLOSS 10
Muchas gracias. Lo pruebo y te digo que tal va. Un saludo