Random

Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

Yo los backtesting los hago siempre por la tarde/noche, cuando el mercado cerró. Así que si usara una variable random (un indicador personal de PRT que yo pudiera crear) no tendría más remedio que entrar la semilla manualmente.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

Creo que me extoy explicando muy mal.
En realidad no necesito que la semilla sea aleatoria, sino que cambie cada pocos segundos para que si repito un backtesting, la semilla sea diferente.
Necesito semillas diferentes para obtener series de números diferentes.

Y no existe ninguna forma de conseguir, en ProRealTime cuando el mercado está cerrado, una semilla diferente salvo que la introduzca manualmente.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Rango Starr
Mensajes: 3842
Registrado: 22 Dic 2014 10:49

Re: Random

Mensaje por Rango Starr »

.
Última edición por Rango Starr el 18 May 2021 18:56, editado 1 vez en total.
un ciclo y otro ciclo, son un biciclo...
si añadimos otro ciclo, entonces tendremos "un triciclo"... famoso trio catalan de humor de los 90....

..y nada mas...
Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

Gracias, Rango Starr.


Los volúmenes, cuando el mercado está cerrado, no cambian. Si miras el volumens de hace 5 barras, será el mismo tanto si lo miras en un momento, como si lo miras 10 minutos después, ...
A ver. puedes conseguir una semilla. Pero si repites el proceso no vas a conseguir una semilla diferente, hasta pasadas 24 horas.

Con el mercado cerrado, todas los datos de ProRealTime están congelados, y, por lo tanto, es imposible conseguir una semilla variable mientras el mercado esté cerrado.



Saludos.
Última edición por Rafa7 el 20 Abr 2018 12:44, editado 1 vez en total.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Avatar de Usuario
mascara
Mensajes: 344
Registrado: 18 Oct 2007 23:15

Re: Random

Mensaje por mascara »

¿Y si partes de una semilla inicial fija, la que tú quieras y en cada ejecución le sumas o restas los números aleatorios obtenidos, y esa nueva semilla la usas en la siguiente ejecución y así sucesivamente?.
Podrías hacer que en las ejecuciones pares sume los números obtenidos a la semilla y en las impares reste o algo así y así el número se mantendrá en un rango más o menos ( lo digo por si al sumar todo el tiempo, llegas a un valor que no quepa en tu variable "semilla"...

Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

mascara, se trata que, con el emercado cerrado, si generas una serie de números, si repites el proceso obtengas una serie de números diferente a la anterior. Si la semilla no cambia, la serie de números siempre será la misma.

El problema es, ¿cómo sabe la segunda ejecución si hubo una primera ejecución y con que semilla?
Si PRT tuviera variables donde guardemos la semilla empleada, en una segunda ejecución se podría modificar la semilla. Pero, lamentablemente, no hay donde guardar la nueva semilla.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Avatar de Usuario
mascara
Mensajes: 344
Registrado: 18 Oct 2007 23:15

Re: Random

Mensaje por mascara »

:(, es que no conozco prorealtime, pero la verdad parece que no tenga nada jeje... ¿Por qué usar algo que parece tan limitado, estando mq5 o jforex? ¿No existe nada como variables o parámetros globales o algo así?... Ya no se me ocurren más cosas...

¿Quizás haciendo algo en plan recursivo de forma que el valor a sumar a la semilla en cada ejecución sea la salida ( el número aleatorio obtenido de la ejecución anterior?
Última edición por mascara el 20 Abr 2018 12:56, editado 1 vez en total.
Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

Os hago un reto, me da igual que la serie numérica sea aleatoria o no. ¿Podéis conseguir un indicador en ProRealTime que cumpla lo siguiente con el mercado cerrado?
1.- Añado el indicador y anoto el valor del indicador en la última vela.
2.- Cierro el indicador y lo vuelvo a abrir.
3.- Vuelvo añadir el indicador y anoto el valor de la última vela.

Si ambas anotaciones son diferentes, premio. Te concedo el premio Nobel.
Si ambas anotaciones son la misma. Dime que tengo razón en tirar la toalla, por favor.
Última edición por Rafa7 el 20 Abr 2018 12:59, editado 2 veces en total.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

mascara escribió: 20 Abr 2018 12:54:(, es que no conozco prorealtime, pero la verdad parece que no tenga nada jeje... ¿Por qué usar algo que parece tan limitado, estando mq5 o jforex? ¿No existe nada como variables o parámetros globales o algo así?... Ya no se me ocurren más cosas...
Lo bueno de ProRealTime es que es super sencillo para crear indicadores y estrategias. El lenguaje del PRT es ideal para torpes. (Además de un asistente para que diseñes estrategias aunque no tengas ni idea de programación) Y los gráficos son estupendos. Lástima que tenga algunas limitaciones ...
No hay parámetros globales ni nada parecido.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Rango Starr
Mensajes: 3842
Registrado: 22 Dic 2014 10:49

Re: Random

Mensaje por Rango Starr »

.
Última edición por Rango Starr el 18 May 2021 18:56, editado 1 vez en total.
un ciclo y otro ciclo, son un biciclo...
si añadimos otro ciclo, entonces tendremos "un triciclo"... famoso trio catalan de humor de los 90....

..y nada mas...
Avatar de Usuario
Wikmar
Mensajes: 3868
Registrado: 29 Sep 2010 00:01
Ubicación: Madrid

Re: Random

Mensaje por Wikmar »

Trabajar en plataformas que no te den posibilidad de utilizar lenguajes estándar, tampoco casi; estándar (C, Visual Basic, etc), es probable que de sorpresas desagradables, disgustos y mucho trabajo en un momento dado.

¿Cómo va la gente de Metatrader, que tenía que migrar todo el software de v4 a v5 y no era compatible?.
            https://wikmar.wordpress.com
            Si quieres algo de privacidad, cuidado con las Nubes, que nadie ha conseguido todavía ponerles una puerta.
Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

Sres. foristas,



Os adjunto el código de mi función random en ProRealTime:

ProRealTime.random
ProRealTime.random

Es provisional este código.
Ahora no tengo tiempo de explicar el código.



Saludos.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

Sres. foristas,



Como dije, es un código provisional.
De momento veo que hay un error.

Hay una sentencia que es:
(random = 7 * random + i) mod periodo.

Ese 7 está mal.

Para que periodo sea el máximo, según unos teoremas, debería cumplirse:
1.- MCM(1, 144) = 1. Lo cumple.
2.- (7 - 1) = 6, debería ser múltiplo de los factores primos de 144. Lo cumple, ya que 144 = 2^4 * 3^2, o sea sus factores primos son 2 y 3.
3.- (7 - 1) = 6, si 144 es múltiplo de 4 (lo és), debería ser también múltilo de 4. No lo cumple.

De 1, 2 y 3, deduzco que, en el algoritmo (random = a * random + i) mod 144, a - 1 debería ser múltiplo de 12.

O sea, a = n * 12 + 1.

Si tomamos n = 1, a = 13.

13 podría ser un multiplicador adecuado, que cumple 1.-, 2- y 3.-. Además, 13 es primo, y, además, 13 es número de Fibonacci. (Estas dos últimas propiedades no son necesarias, pero para mí son preferibles por razones intuitivas).

O sea, que tal vez, la sentencia de la que hablamos debería sustuituirla por esta otra:
(random = 13 * random + i) mod periodo.

Otro detalle, elegí 144 porque llegué a la conclusión de que no conviene un número primo porque según 1.-, 2.- y 3.-, el multiplicador debería ser 1 y, entonces, la serie es demasiado lineal y previsible. Perefiero que el multiplicador sea primo y que el periodo no sea primo. 144 es el 1r número de Fibonacci no primo mayor que 100 .

Modificaré el código y lo probaré. Espero que esta noche compartiros el código.



Saludos.
Última edición por Rafa7 el 24 Abr 2018 07:56, editado 1 vez en total.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

Sres. foristas,



Os comparto el código de mi función random en ProRealTime.


ProRealTime.random
ProRealTime.random
ProRealTime.random.png (40.11 KiB) Visto 1839 veces

Código: Seleccionar todo

//Programado por Rafa7, forista de x-trader.net
//parámetros: hh (hora), mm (minuto) y ss (segundo), que por defecto son cero
//Si el mercado está cerrado, es necesario informar los parámetros, con la hora actual, ya que las funciones current* retornan ceros.
//Si el mercado está abierto, no hay necesidad de informar los parámetros porque las funciones current* estáran activas.
if i = 0 then
   if hh = 0 and mm = 0 and ss = 0 then
      hh = currentHour
      mm = currentminute
      ss = currentSecond
   endif
   periodo1 = 233
   periodo2 = 144
   random = round((1440 * ss + 24 * mm + hh + days) mod periodo1 * periodo2 / periodo1)
   i = 1
else
   random = (13 * random + 1) mod periodo2
endif
return random / periodo2 as "random"


En la serie de números pseudoaleatorios X(n + 1) = (A * X(n) + C) mod M, para que tenga el máximo periodo posible, o sea, M, es necesario que se cumplan unas condiciones, según el teorema Hull – Dobell:
1.- MCD(C, M) = 1
2.- (A - 1) debe ser múltiplo de los factores primos de M.
3.- Si M es múltiplo de 4, (A - 1) debe ser múltiplo de 4.

Conviene que M no sea primo porque de lo contrario, deduciendo de las 3 condiciones, A debería ser 1, y, entonces, la serie sería demasiado lineal (y previsible, sin parecer aleatoria).

Entonces como me conformo con precisión de 2 decimales, tomo M = 144, el cual es el 1r número de Fibonacci que es mayor que 100 y que no es primo. (M no tiene porque ser de Fibonacci, pero por intuición prefiero números de Fibonacci).

144 = 2^4 * 3^2, por lo tanto 144 tiene como factores primos 2 y 3.

Por la condición 2.-, (A - 1) tiene que ser múltiplo de 2 y 3.
Por la condición 3.-, (A - 1) tiene que ser múltiplo de 4, ya que 144 es múltiplo de 4.
Por tanto, por las condiciones 2.- y 3.-, (A - 1) tiene que ser múltiplo de 12.
Por lo tanto, A - 1 = 12 * n.
Por lo tanto, A = 12 * n + 1.
Si tomamos n = 1, 2, ..., los candidatos son A = 13, 25, 37, 49, 61, 73, 85, 97, 109, 121 y 133
De todos los candidatos, prefiero los que son primos, o sea, 13, 37, 61, 73, 97 y 109.
Y de estos candidatos, prefiero el único que es número de la serie de Fibonacci, o sea, 13.

En cuanto a la semilla, si que me conviene un número primo y tomo el 1r número de la serie de Fibonacci que es primo y que es mayor que 144, o sea, 233.

ProRealTime lo que hace es ejecutar el código vela a vela desde la más antigua hasta la más reciente. Entonces, en la primera vela la variable "i" valdrá cero (por defecto, en ProRealTime, las variables están inicializadas a cero) y si los parámetros hh, mm y ss son nulos, tomará sus valores de las funciones current. En el resto de velas (o sea, todo menos la más antigua), se ejecutara el "else" del "if i = 0".

La función round, es la parte entera. No entiendo porque los de ProRealTime le han dado este nombre porque no redondea, trunca.

Podría explicar más detalles, pero no sé si son de interés. Lo más interesante ya lo he explicado.



Saludos
Última edición por Rafa7 el 24 Abr 2018 11:50, editado 8 veces en total.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

Sres. foristas,



Os adjunto el Excel, donde implemento la serie X(n + 1) = (13 * X(n) + 1) MOD 144.

En A1 se pone la semilla, entre 0 y 143. Y pongáis la que pongáis, veréis que no vuelve a aparecer en la columna A hasta la celda A145. O sea, que realmente, el ciclo es el máximo posible, o sea 144, ya que el multiplicador 13 es adecuado (el cual he explicado en el aporte anterior como lo he elegido).

En la columna B, divido por 144 para obtener un número entre 0 y 1.

random.xlsx
(7.6 KiB) Descargado 177 veces



Saludos.
Última edición por Rafa7 el 25 Abr 2018 09:35, editado 1 vez en total.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “Indicadores”