Página 1 de 1

Fibonacci Number

Publicado: 04 Oct 2015 00:06
por Rafa7
Sres foristas,



Voy a compartir con vosotros un indicador que he programado con el nombre FibonacciNumber.
FibonacciNumber[n] devuelve es el n-ésimo número de Fibonacci.

Está programado con el lenguaje de ProReaTime, pero como es muy fácil el código, fácilmente lo podéis implementar en otros lenguajes que conozcáis.

En este hilo pienso mostraros un ejemplo de un sistema de trading optimizado con parámetros de Fibonacci.

Importantísimo: El indicador FibonacciNumber, en ProRealTime, no podrá funcionar si antes no habéis implementado el indicador Power. El indicador Power lo podéis implementar con las indicaciones de este enlace: Potencias en ProRealTime. Para los que programais en otros lenguajes, no es necesario que programéis el indicador Power si vuestro leguaje admite la potenciación (Power[base, exponente] = base^exponente).



Saludos.

Re: Fibonacci Number

Publicado: 04 Oct 2015 00:16
por Rafa7
Sres. foristas.



Os adjunto las definiciones del indicador FibonacciNumber.
Parámetro "n"
Parámetro "n"
Indicador "FibonacciNumber"
Indicador "FibonacciNumber"
Este es el código:

Código: Seleccionar todo

//Programado por Rafa7, forista de x-trader.net
//parámetros:
//   n = número entero > 0
//Objetivo: retornar el n-ésimo nº de Fibonacci.
if calculado = 0 then
   calculado = 1
   n = n + 1
   raiz5 = Sqrt(5)
   aureo = (1 + raiz5) / 2
   aux1 = call Power[aureo, n]
   aux2 = call Power[1 - aureo, n]
   FibonacciNumber = round((aux1 - aux2) / raiz5)
endif
return FibonacciNumber as "%Fibonnacci Number"
El "if calculado = 0" es para evitar que el cálculo se realize en cada vela, ya que el resultado siempre sería el mismo.
El "n = n + 1", es una instrucción que se ejecuta una sola vez (gracias al "IF calculado = 0") y es para evitar la repetición del uno. Sin la instrucción "n = n + 1" FibonacciNumber funcionaría perfectamente, solo que el uno lo repetiría (1, 1, 2, 3, 5, 8, ...) y lo que pretendo es el 1 no se repita (1, 2, 3, 5, 8, ...)

La serie (1, 1, 2, 3, 5, 8, ...) es la sucesión de Fibonnacci. Y la serie (1, 2, 3, 5, 8, ...) son los números de Fibonacci.
Lo que pretendo es que FibonacciNumber[n] no retorne el n-ésimo elemento de la sucesión de Fibonacci, sino el n-ésimo número de Fibonacci.

Estos son los retornos:
FibonacciNumber[1] = 1
FibonacciNumber[2] = 2
FibonacciNumber[3] = 3
FibonacciNumber[4] = 5
FibonacciNumber[5] = 8
FibonacciNumber[6] = 13
FibonacciNumber[7] = 21
FibonacciNumber[8] = 34
Etc...



Saludos.

Re: Fibonacci Number

Publicado: 04 Oct 2015 00:37
por Rafa7
Sres. foristas,



Os comparto una aplicación práctica de los números de Fibonacci. Supongamos que tenemos programado operar en largos los cruces entre media móvil exponencial corta y media móvíl exponencial larga.
Este podría ser el código:

Código: Seleccionar todo

DEFPARAM NoCashUpdate=True
DEFPARAM CumulateOrders=False
corta = ExponentialAverage[n](close)
larga = ExponentialAverage[m](close)
entrada = (corta crosses over larga)
salida = (corta crosses under larga)

REM Entrada largos
IF (NOT LongOnMarket and entrada) THEN
   BUY 1 SHARES AT MARKET nextbaropen
ENDIF

REM Salida largos
IF (LongOnMarket AND salida) THEN
   SELL AT market NEXTBAROPEN
ENDIF
Donde n es el periodo de la media corta, y m el periodo de la media larga.

Supongamos que queremos optimizar n y m pero solo nos interesa que sean números de Fibonacci.

La solución es muy sencilla: Solo tenemos que añadir estás dos instrucciones al principio:
n = call FibonacciNumber[n]
m = call FibonacciNumber[m]

De esta manera, en lugar de operar con periodos n y m, operariamos con el n-ésimo número de Fibonacci y con el m-ésimo número de Fibonacci.

El codigo, en este ejemplo, quedaría así:

Código: Seleccionar todo

DEFPARAM NoCashUpdate=True
DEFPARAM CumulateOrders=False
n = call FibonacciNumber[n]
m = call FibonacciNumber[m]
corta = ExponentialAverage[n](close)
larga = ExponentialAverage[m](close)
entrada = (corta crosses over larga)
salida = (corta crosses under larga)

REM Entrada largos
IF (NOT LongOnMarket and entrada) THEN
   BUY 1 SHARES AT MARKET nextbaropen
ENDIF

REM Salida largos
IF (LongOnMarket AND salida) THEN
   SELL AT market NEXTBAROPEN
ENDIF
Luego, el resultado de la optimización se tiene que interpretar. Por ejemplo, si la optimización nos dice que el cruce entre 4 y 7 es el mejor, tenemos que interpretar que se trata del cuarto y séptimo números de Fibonacci, o sea, 5 y 21.

Y, al optimizar, ¿cómo hacemos variar n y m? Bueno, si no nos interesa valores superiores a 300, basta que los hagamos variar entre 1 y 12, ya que el doceavo número de Fibonacci es 233, y el treceavo número de Fibonacci es 377, el cual, es mayor que 300.



Saludos.

Re: Fibonacci Number

Publicado: 04 Oct 2015 00:46
por Rafa7
Sres. Foristas.



¿Qué ventajas tiene optimizar con números de Fibonacci?
Las ventajas son:
1.- Es una buena medida que nos ayuda a no sobreoptimizar.
2.- Reducimos el número de iteraciones en las optimizaciones (por ejemplo si no nos interesan mas de 300 periodos, es suficiente indicar al optimizado que variamos los periodos entre 1 y 12, con el consiguiente ahorro de CPU.

Otra alternativa a los números de Fibonacci, para procurar no exponernos a la sobreoptimización, es usar periodos múltiplos de 5 o de 10, o de 20, etc ...



Saludos.

Re: Fibonacci Number

Publicado: 04 Oct 2015 09:19
por Rafa7
Sres, foristas,



El cálculo del indicador FibonacciNumber que he programado, está basado en la fórmula explícita de los números de la sucesión de Fibonacci, de Édouard Lucas, reconocido matemático francés del siglo XIX:
Número n-ésimo de la sucesión de Fibonacci = (númeroÁureo^n - (númeroÁureo - 1)^n) / 5^0,5
Siendo númeroAúreo = (1 + 5^0,5) / 2.

https://es.wikipedia.org/wiki/Sucesión_de_Fibonacci

Pero como quería los números de Fibonacci (sin repetir el 1), empleé esta otra fórmula:
Número n-ésimo de Fibonacci = (númeroÁureo^(n + 1) - (númeroÁureo - 1)^(n + 1)) / 5^0,5

(De ahí la instrucción n = n + 1)



Saludos.

Re: Fibonacci Number

Publicado: 05 Oct 2015 11:29
por Rango Starr
.

Re: Fibonacci Number

Publicado: 05 Oct 2015 23:13
por Rafa7
Rango Starr escribió:Rafa,

Gracias por el curre.

Saludos
Gracias Rango.



Poco a poco voy aprendiendo nuevos trucos.
Cuando diseñé el Power, ya estaba pensando en el FibonacciNumber como posible aplicación.
Supongo que el FibonacciNumber será interesante para los incondicionales del Fibonacci (entre los cuales no me encuentro).



Saludos.

Re: Fibonacci Number

Publicado: 07 Oct 2015 18:14
por X-Trader
Hola Rafa7, muy interesante el aporte, podría ser una buena manera de simplificar mucho las optimizaciones de estrategias basadas en medias móviles.

Ahora la pregunta que yo me hago... ¿por qué no trabajas con Metatrader para que podamos jugar con tus cacharritos :-D?

Saludos,
X-Trader

Re: Fibonacci Number

Publicado: 07 Oct 2015 21:56
por Rafa7
X-Trader escribió:Hola Rafa7, muy interesante el aporte, podría ser una buena manera de simplificar mucho las optimizaciones de estrategias basadas en medias móviles.
Gracias, X-Trader.



Podría simplificar optimizaciones de muchos indicadores. Compartí una forma de optimizar periodos de medias móviles, a modo de ejemplo, para mostrar que se podría hacer con otros indicadores.
X-Trader escribió: Ahora la pregunta que yo me hago... ¿por qué no trabajas con Metatrader para que podamos jugar con tus cacharritos :-D?
De profesión soy analista-programador, así que para mi es muy fácil aprender un lenguaje u otro.
Tengo entendido que Metatrader se usa en Forex, pero yo, por ahora, solo opero en bolsa. ¿Metratader se usa también en bolsa? ¿Es gratuito? ¿se pueden obtener datos gratuitos de la bolsa española en timeframe diario para Metatrader aunque sea a fin de día?, etc ... Me falta informarme sobre metratader. Cuando pueda me miraré metratader, a ver si puede ser interesante para mí.



Saludos.

Re: Fibonacci Number

Publicado: 08 Oct 2015 10:37
por X-Trader
Rafa7 escribió:
X-Trader escribió:Ahora la pregunta que yo me hago... ¿por qué no trabajas con Metatrader para que podamos jugar con tus cacharritos :-D?
De profesión soy analista-programador, así que para mi es muy fácil aprender un lenguaje u otro.
Tengo entendido que Metatrader se usa en Forex, pero yo, por ahora, solo opero en bolsa. ¿Metratader se usa también en bolsa? ¿Es gratuito? ¿se pueden obtener datos gratuitos de la bolsa española en timeframe diario para Metatrader aunque sea a fin de día?, etc ... Me falta informarme sobre metratader. Cuando pueda me miraré metratader, a ver si puede ser interesante para mí.

Saludos.
Pues sí, aunque depende del broker, no de la plataforma. Algunos brokers como Hanseatic o ClickTrade ofrecen CFDs sobre acciones españolas, europeas, estadounidenses, etc. por lo que cuentas con el histórico diario completo de la mayoría de ellas así como datos en tiempo real que replican prácticamente al 100% el comportamiento del subyacente. Hale, ya no tienes excusa ;).

Además MQL es muy similar a C++, no te costará mucho aprenderlo :P.

Saludos,
X-Trader