Cómo conseguir valores equivalentes de los inidiadores de distintos activos
Forums › ProRealTime foro Español › Soporte ProOrder › Cómo conseguir valores equivalentes de los inidiadores de distintos activos
- This topic has 2 replies, 2 voices, and was last updated 9 months ago by Iván.
-
-
02/23/2024 at 1:09 AM #228606
Objetivo:
encontrar un enfoque robusto para que los valores de los indicadores oscilantes con valores ilimitados sean equivalentes entre distintos instrumentos financieros (en adelante IFs).
Antes de continuar, veo conveniente comentar que he buscado información al respecto pero no he dado con nada directamente relacionado. No obstante, pido disculpas por adelantado si las cuestiones (y sus respuestas) que aquí planteo ya son de sobra conocidas, pues yo no llevo mucho en el mundo del trading.
También es importante aclarar que lo voy a hacer a continuación es una exposición de mis deducciones seguidas de unas preguntas finales. Por mi falta de experiencia, estas deducciones pueden ser equivocadas en mayor o menor o menor medida, por lo que deben de ser tomadas con cautela. Es más, por ello agradecería cualquier ayuda para saber si los planteamientos siguientes van en buen camino o no. En caso afirmativo, pienso que sería una gran noticia, pues, como veréis, eso facilitaría mucho la adaptación de nuestros algoritmos de un IF a otro. Empezamos.
¿Por qué hacer esto?
Para tratar de ajustar con mayor facilidad los rangos de valores de las variables que emplea ProBacktest para optimizar un sistema algorítmico rentable a otros IFs. De estar en lo correcto, ajustes que podrían resultar inviables podrían ser relativamente sencillos,
Cuál es la problemática
Cómo mejor se entiende la problemática es fijándose donde no la hay. Esto sucede indicadores oscilantes con valores limitados. Por ejemplo, el RSI, ya que sus valores siempre estarán entre 0 y 100. Veamos un ejemplo ahora.
Imaginemos una estrategia algorítmica que resulta exitosa con un primer IF y usa para una de sus condiciones un valor optimo de RSI de 75. Dicho valor se ha obtenido obtenido optimizando al hacer backtesting de su correspondiente variable con un rango de valores de 65 a 85 y con un incremento de 2,5.
En el caso de que queramos comprobar la solidez de nuestro algoritmo con otro IF, seguramente este rango de valores original o uno aproximado también valga para testar la estrategia original.
Sin embargo, sería muy difícil que eso mismo sucediera con un valor de MACD, un indicador que –como tantos otros– ofrece valores “ilimitados”.
De hecho encontrar el rango de valores equivalente puede llegar a ser muy difícil. Por ejemplo, partiendo de un timeframe de 5 min., un rango de valores de MACD en GAS NATURAL de 5 a 20 corresponde aproximadamente a un rango en GBP/USD de 0,000333 a 0,001333.
Lógicamente, este problema se multiplica cuando nuestra estrategia depende de múltiples valores “ilimitados” extraídos de otros indicadores o incluso de cálculos internos de la propia estrategia. A veces, la dificultad se multiplica tanto que resulta una excesiva inversión de tiempo, por lo que no puedes comprobar si esa estrategia de éxito puede ser aplicada con tus IFs favoritos. Un hecho que considero muy interesante comprobar, pues si una buena estrategia original funciona también con otros IFs se reafirmaría la solidez de su planteamiento.
Conclusiones preliminares
Llegados a este punto –si sabemos que los valores MACD se obtienen a partir de la resta de dos medias móviles–, es muy fácil darse cuenta de que la gran diferencia de los valores de MACD entre los dos IFs de nuestro ejemplo es fruto de la diferencia de la volatilidad del precio de cada uno de ellos.
Por tanto, no sería descabellado pensar en extraer un coeficiente de dicha volatilidad que nos ayude a convertir los valores “ilimitados” del MACD de cada IF a valores mucho más equivalentes entre ellos.
Dicho de otra manera: el coeficiente extraído de la volatilidad de cada IF traduce el lenguaje distinto de cada MACD a uno común. Serían como valores MACD “universales”.
En caso de que lo anterior fuera un planteamiento correcto para solventar la problemática antes expuesta, pienso que un enfoque mediante ProBuilder para realizar la traducción a valores MACD “universales” (lógicamente, este mismo planteamiento se podría aplicar a otros valores “ilimitados”.) podría ser mediante a un código con un planteamiento similar al siguiente:
MACD con valores “universales”12345678910111213141516171819n = barindexampli = 1000 // Amplificador. Evita números demasiado bajos.// Cálculo de la Volatilidad media (VM) del instrumento financiero (IFif IsLastBarUpdate and MACDtranslation = 0 thenVOL = AverageTrueRange[n](close) * ampli // Volatilidad media (VM)DEV = std[barindex](VOL) * ampli // Desviación estandar de la VMVolatilityCoef = VOL + DEV // Coeficiente de la VM del IFendif// Traducción a valores “universales” de MACDif MACDtranslation = 1 thenunivMACD = MACDline[12,26,9](close * SQUARE(ampli) / IFcoef)univMACDs = MACDSignal[12,26,9](close * SQUARE(ampli) / IFcoef)univMACDh = univMACD - univMACDsendifreturn VolatilityCoef as "Volatility Coefficent" coloured(0,0,0,255) style(dottedline4,1), 0 as "zero" coloured(0,0,0,255) style(dottedline4,1), univMACDh as "histogram" STYLE(histogram,1), univMACD as "MACD line" coloured(50,50,220,255) , univMACDs as "Signal" coloured(220,100,100,255)NOTA 1: Para mayor facilidad, recomiendo instalar el archivo .itf adjunto.
NOTA 2: Ver el vídeo de este enlace para entender mas fácilmente como usar este código.
INTRUCIONES DE USO
1. (Recomendación) Seleccionar un número de velas alto (100K velas o más) en Datos históricos del IF. Si lo que queremos es hacer optimizaciones con datos históricos, lo lógico es que el número de velas sea, al menos, el mismo con el que vamos a hacer backtesting.
2. Cargar el código en un nuevo panel y ejecutar el código. Aquí es donde se obtiene el coeficiente de volatilidad del IF.
ATENCIÓN: cada timeframe tiene su propio coeficiente. Por ejemplo: el coeficiente extraído en un timeframe de 5 minutos hace que se puedan obtener los valores universales solo para dicho timeframe y no valdría ni para 4 minutos ni para 6 minutos.3. En la ventana Configuración del Gráfico sustituir el valor original (“1“) de la variable VolatilityCoef por el valor que indica Volatility en el nuevo panel.
4. Sin salir de la ventana Configuración del Gráfico pulsar MACD Universal value translation para activar esta función. Así en el nuevo panel aparecerán los valores universales MACD del IF para el time elegido.
5. Si se desea, ahora ya se puede reducir el número de velas de la Vista temporal.
NOTA: Lógicamente, si se quieren comparar los valores MACD “universales” obtenidos con los de otro IF, primero hay repetir todos los pasos con ese nuevo IF.
Una última deducción importante
Supongo que la manera ideal de conseguir el objetivo, no es ir aplicado por separado este código con cada indicador con valores “ilimitados”, en cada IF y fuera de nuestro algoritmo. Deduzco que lo eficiente es que nuestro algoritmo se base directamente en valores universales de forma nativa. Así se puede aplicar directamente sobre otros IFs haciendo unos ajustes mucho más sencillos de los valores de los rangos de optimización de cada variable.
Para ello, primero habría que calcular el coeficiente de volatilidad (fuera de nuestro algoritmo). Luego, en nuestro algoritmo se aplicaría el coeficiente a cada valor “ilimitado” y así ya trabajaría de forma nativa con valores “universales” compatibles con otros IFs
Preguntas a resolver:
• ¿Es un planteamiento realmente viable tratar traducir los valores “ilimitados” a un “lenguaje universal” ?
En caso afirmativo:
• ¿Es una buena idea para la conversión de valores “ilimitados” un coeficiente basado el ATR y su desviación de cada IF o hay otros métodos más fiables y que incluso pueden ser muy distintos del planteamiento que he compartido?
• En caso de ser una buena idea, ¿se puede mejorar de alguna manera lo aquí expuesto?
Muchas gracias por adelantado por vuestras aportaciones.
02/23/2024 at 1:17 AM #22860702/26/2024 at 10:05 AM #228743Buenas!!
La verdad es que este hilo que has abierto da para mucho…
Para transformar un indicador la verdad es que hay muchas opciones. Yo soy partidario de hacerlo muy sencillo.
Te pongo un ejemplo para escalar de 0 a 100 cualquier indicador:PRC_ReScale an Indicator123456789101112131415161718192021//PRC_RE-SCALE A INDICATOR//version = 0//26.02.24//Iván González @ www.prorealcode.com//Sharing ProRealTime knowledge///////RE-SCALE 0 - 100//////////////////////////////////////myindicator = MACD[12,26,9](close) //example//LOOKBACK PERIODlookback = 100//input myindicatorinputmin = lowest[lookback](myindicator)inputmax = highest[lookback](myindicator)inputrange = inputmax - inputmin//output myindicator rescaledoutputmin = 0outputmax = 100outputrange = outputmax - outputmin//Rescaledmyindicatorrescaled = (myindicator - inputmin)*(outputrange/inputrange)RETURN myindicatorrescaled as "Rescaled"Te pongo otro, en este caso complicándolo un poco más e introduciendo la desviación stándar:
PRC_Z score Transformation12345678910111213141516//PRC_Z score Transformation//version = 0//26.02.24//Iván González @ www.prorealcode.com//Sharing ProRealTime knowledge///////////////////////////////////////////////Original indicatormyindicator = MACDline[12,26,9](close)///Parameterslength = 20///Z Score functionzs = (myindicator - Average[length](myindicator))/STD[length](myindicator)return zs as "Z Score Transformation"Y así lo podemos complicar todo lo que queramos 🙂
-
AuthorPosts
Find exclusive trading pro-tools on