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

- ProRealTime.random
- ProRealTime.random.png (40.11 KiB) Visto 4367 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