Potencias en ProRealTime

Foro para tratar todo lo relacionado con el manejo de la herramienta ProRealTime así como la programación de indicadores y sistemas.
Avatar de Usuario
Rafa7
Mensajes: 4512
Registrado: 17 Dic 2009 21:36
Contactar:

Potencias en ProRealTime

Mensaje por Rafa7 » 21 Sep 2015 20:42

Sres. foristas,



Supongamos que queremos, en ProRealTime, expresar la siguiente instrucción:

A = B elevado a C

¿Cómo hacerlo?

Probé A = B^C y A = B**C, pero no me acepta ninguna de las dos expresiones.

Podría hacerlo así:
A = exp(C * log(B))
(Con la condición B > 0)

¿Pero no hay una manera tan directa como A = B^C o A = B**C? ¿No tenemos más remedio que usar exponenciales y logaritmos neperianos?



Gracias.


¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com

Avatar de Usuario
X-Trader
Administrador
Mensajes: 10673
Registrado: 06 Sep 2004 10:18
Contactar:

Re: Potencias en ProRealTime

Mensaje por X-Trader » 21 Sep 2015 22:22

Hola Rafa7, he revisado el manual del ProBuilder:

https://www.prorealtime.com/en/pdf/prob ... 416313647c" onclick="window.open(this.href);return false;

Y aparentemente no hay potencias, estas son las funciones matemáticas que tiene:
MIN(a, b): calculate the minimum of a and b
MAX(a, b): calculate the maximum of a and b
ROUND(a): round a to the nearest whole number
ABS(a): calculate the absolute value of a
SGN(a): shows the sign of a (1 if positive, -1 if negative)
SQUARE(a): calculate a squared
SQRT(a): calculate the square root of a
LOG(a): calculate the Neperian logarithm of a
EXP(a): calculate the exponent of a
COS(a): calculate the cosine of a
SIN(a): calculate the sine of a
TAN(a): calculate the tangent of a
ATAN(a): calculate the arc-tangent of a
Así que sí, me temo que tendrás que tirar de logaritmos y exponenciales.

Saludos,
X-Trader


"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."

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

Re: Potencias en ProRealTime

Mensaje por Rafa7 » 22 Sep 2015 07:43

X-Trader escribió: Así que sí, me temo que tendrás que tirar de logaritmos y exponenciales.
Gracias, X-Trader.



En la última página de ese manual, están los operadores + y -. Precisamente ahí es donde debería mostrar la potenciación y no lo hace.
En fin, ¡qué cutre!

Por cierto, el manual original está en castellano (los creadores de ProRealTime son españoles), en https://www.prorealtime.com/es/" onclick="window.open(this.href);return false;, clicando "sistemas" y luego clicando "indicadores personales", encontramos los enlaces a los manuales.
Este es el mismo manual en castellano: Guía de programación ProBuilder



Saludos.


¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com

Rango Starr
Mensajes: 3128
Registrado: 22 Dic 2014 10:49

Re: Potencias en ProRealTime

Mensaje por Rango Starr » 22 Sep 2015 17:21

Rafa7 escribió:
X-Trader escribió: Así que sí, me temo que tendrás que tirar de logaritmos y exponenciales.
Gracias, X-Trader.



En la última página de ese manual, están los operadores + y -. Precisamente ahí es donde debería mostrar la potenciación y no lo hace.
En fin, ¡qué cutre!

Por cierto, el manual original está en castellano (los creadores de ProRealTime son españoles), en https://www.prorealtime.com/es/" onclick="window.open(this.href);return false;, clicando "sistemas" y luego clicando "indicadores personales", encontramos los enlaces a los manuales.
Este es el mismo manual en castellano: Guía de programación ProBuilder



Saludos.
Rafa,

prueba de esta forma:

crea una serie de variables predefinidas de el valor que quieres exponenciar:
a4 =a*a*a*a
a2 = a*a
a1 =a
-----------

entonces, cualquier potencia, te vendrá dada como producto de las variables anteriores.:
a**10 = a4*a4*a2
a**12 = a4*a4*a4
------
a**6 = a4*a2

etc...
la variable "a" , la podras incluir en la definición de variables del indicador, como variable. Suele ser mas rápido y económico en recursos, la multiplicación que los logaritmos, y la forma de economizar espacio y líneas de programación, es como te he puesto. Probuilder es un poco parco en comandos de programación.... supongo que pulirán poco a poco el lenguaje de programación, a la vez que mejoran los backtest, que son de pena, penita pena...


Por cierto , prorealtime, es francesa, de IT-Finance... acrónimo de Information Technology for finance.

Saludos!!



Avatar de Usuario
X-Trader
Administrador
Mensajes: 10673
Registrado: 06 Sep 2004 10:18
Contactar:

Re: Potencias en ProRealTime

Mensaje por X-Trader » 22 Sep 2015 17:48

Touché Rango Starr, muy buena solución! Deberías salir más del feretro ;) :-D :smt023

Saludos,
X-Trader


"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."

Rango Starr
Mensajes: 3128
Registrado: 22 Dic 2014 10:49

Re: Potencias en ProRealTime

Mensaje por Rango Starr » 22 Sep 2015 18:18

Rafa,

si vas a utilizar un for ... next,
tampoco creo que necesites log y exp

bastara que asignes:

a1 =a1*a,

en la iteración... Pero los bucles for next, del proreal, se me antojan infinitos. Y si es para calculo de algún indicador, para diario sirve, porque 20 años son unas 4500 velas. Pero si te vas a timeframe inferiores, puedes llegar a 150000 velas, si vas a pleno data. El ordenador tarda en cargar ese indicador unos cinco minutos, amen de que java se carga ... y no descarga. Asi que hay cosas que no utilizo porque tardan mucho en cargarse, y si mueves parámetro, vuelve a cargarse.... y asi todas las veces.... Al final ralentiza el sistema por potente que sea...

Es delicado. Porque si vas a intradia o scalping, puedes bloquear en el momento menos oportuno. Pero para gustos, colores. En cuanto a proreal, desde el 2008 al menos aparece It-Finance, como copyright de proreal. Desconozco si antes era español o no... Si que se que pagas y hablas en España, pero los datos de facturación eran franceses.

X-Trader,

lo del féretro es un eufemismo :lol: :lol: :lol:

intento ser útil.

Saludos



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

Re: Potencias en ProRealTime

Mensaje por Rafa7 » 22 Sep 2015 22:38

Gracias, Rango.



Has contestado un aporte que eliminé. Lo eliminé porque quería modificarlo y no tenía tiempo de hacerlo.

La idea que das es interesante en algunos casos concretos, pero, en genérico no lo veo adecuado.
El problema es que si necesitas cambiar la base o el exponente, tienes que retocar varias líneas. Es mucho más fácil dejar A = exp(B * log(C)), que no tienes que cambiar aunque cambien los valores de B o C.
Otro problema es si B y C son parámetros externos. Así no hay por donde cogerlo intentando hacer como dices (habría que hacer una programación un poco compleja).

Lo más sencillo, para obtener x^y, es de la forma exp(y * log(x)). En cuanto al consumo de CPU, no te preocupes, es el chocolate del loro. Lo que sí es importante, respecto al consumo de CPU es evitar que un indicador personal llame a otro indicador personal. Pero llamar a funciones de prorealtime, poca CPU consume.

Así que si el consumo de CPU no se dispara, no hay necesidad de complicarnos, mejor lo sencillo: exp(y * log(x)).

Hay un caso particular a tener en cuenta. Si sabes, para calcular x^y, que x puede ser nulo o negativo, entonces se puede hacer esto:

Código: Seleccionar todo

//Queremos calcular z = x^y, considerando que pueda ser que x <= 0
z = exp(y * log(abs(x)))
if (x <= o) and (y mod 2 <> o) then
   z = -z
endif


Sí sabes seguro que x > 0, entonces:

Código: Seleccionar todo

//Queremos calcular z = x^y, considerando que x > 0
z = exp(y * log(x))


Por otro lado, hemos de tener en cuenta que para elevar al cuadrado, PRT sí que tiene una función: square.



Saludos.
Última edición por Rafa7 el 23 Sep 2015 23:13, editado 6 veces 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: 335
Registrado: 18 Oct 2007 23:15

Re: Potencias en ProRealTime

Mensaje por mascara » 22 Sep 2015 23:24

Aunque nunca he usado ni he visto prorealtime, me voy a meter en la conversación :-D ...
Rafa7 escribió: La idea que das es interesante en algunos casos concretos, pero, en genérico no lo veo adecuado.
El problema es que si necesitas cambiar la base o el exponente, tienes que retocar varias líneas. Es mucho más fácil dejar A = exp(B * log(C)), que no tienes que cambiar aunque cambien los valores de B o C.
Otro problema es si B y C son parámetros externos. Así no hay por donde cogerlo intentando hacer como dices (habría que hacer una programación un poco compleja).
He ojeado el manual y no dice nada de que se puedan crear funciones o rutinas propias, pero si puedes crear indicadores, así que a lo mejor puedes crear un indicador con dos parámetros: base y exponente y que te devuelva un valor. Así haces las cuentas como quieres en un sólo sitio y puedes reutilizarlo cuando quieras sin tocar nada más... Es una teoría nada más...


Imagen

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

Re: Potencias en ProRealTime

Mensaje por Rafa7 » 22 Sep 2015 23:34

mascara escribió:así que a lo mejor puedes crear un indicador con dos parámetros: base y exponente
Gracias, mascara.



La idea que has comentado estaba pensando en escribirla en otro aporte. Te has adelantado.
La función la llamaría potencia.
potencia(base, exponente)

Me faltaría probarlo.

El gran inconveniente es que si en un indicador personal llamas a otro indicador personal (potencia) el consumo de CPU se dispara.
Este inconveniente me hace dudar. Claro que si la CPU se dispara, con copy/paste se arregla evitando llamar al indicador potencia.



Saludos.


¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com

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

Re: Potencias en ProRealTime

Mensaje por Rafa7 » 23 Sep 2015 22:21

mascara escribió:a lo mejor puedes crear un indicador con dos parámetros: base y exponente y que te devuelva un valor.
Gracias, mascara.
mascara escribió:Es una teoría nada más...
Ahora es más que una teoría. Lo he programado y probado. Al indicador le he llamado power. Con dos parámetros: base y exponente.

Os adjunto las imágenes donde defino el indicador:
base.png
Definición del parámetro "base"
exponente.png
Definición del parámetro "exponente"
power.png
Definición del indicador "power"
Y aqui pongo comparto el código del indicador:

Código: Seleccionar todo

//Programado por Rafa7, forista de x-trader.net
//parámetros:
//   base y exponente
//   power devuelve base^exponente
if (base < 0) and (exponente = round(exponente)) then
   power = exp(exponente * log(-base))
   if (exponente mod 2 <> 0) then
      power = -power
   endif
else
   power = exp(exponente * log(base))
endif
return power as "%Power"
Ejemplo. Supongamos que queremos calcular z = x^y, dentro de un indicador o dentro de un sistema de trading. Entonces podemos llamar al indicador power, de esta manera:

Código: Seleccionar todo

z = call power[x, y]


Saludos.


¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com

Avatar de Usuario
X-Trader
Administrador
Mensajes: 10673
Registrado: 06 Sep 2004 10:18
Contactar:

Re: Potencias en ProRealTime

Mensaje por X-Trader » 24 Sep 2015 09:12

Gracias por compartir Rafa7, te acabo de dar karma ;)

Saludos,
X-Trader


"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."

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

Re: Potencias en ProRealTime

Mensaje por Rafa7 » 24 Sep 2015 12:07

X-Trader escribió:Gracias por compartir Rafa7, te acabo de dar karma ;)
Gracias, X-Trader.


¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com

Rango Starr
Mensajes: 3128
Registrado: 22 Dic 2014 10:49

Re: Potencias en ProRealTime

Mensaje por Rango Starr » 24 Sep 2015 13:07

Rafa,

Buen trabajo. Bien solucionado el tema negativos positivos, y las potencias n/m...
Lo he pasado por timeframe 5m 90000 velas, y corre estupendamente. Lo guardo en el arsenal, por si algún dia necesito gastarlo.

Muchas gracias.



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

Re: Potencias en ProRealTime

Mensaje por Rafa7 » 02 Oct 2015 07:59

Sres. foristas,


Me he dado cuenta de que el indicador power podría consumir muchísima menos CPU añadiendo un pequeño cambio:

Código: Seleccionar todo

//Programado por Rafa7, forista de x-trader.net
//parámetros:
//   base y exponente
//   power devuelve base^exponente
if calculado = 0 then
   calculado = 1
   if (base < 0) and (exponente = round(exponente)) then
      power = exp(exponente * log(-base))
      if (exponente mod 2 <> 0) then
         power = -power
      endif
   else
      power = exp(exponente * log(base))
   endif
endif
return power as "%Power"
Lo que he añadido es la instrucción "if calculado = 0" y su correspondiente instrucción "endif", y la instrucción "calculado = 1".
En ProRealTime, cuando preguntamos por una variable que no se ha inicilizado (en este caso la variable "calculado") tiene valor 0.
Pregunto por "calculado" a fin de que el cálculo del indicador se realize solamente en la primera vela.

Rango Starr, por favor, comprueba si el indicador con este cambio vuela (va mucho mas deprisa con el "if" que he añadido). Me parece que va mucho más deprisa.



Saludos.


¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com

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

Re: Potencias en ProRealTime

Mensaje por Rafa7 » 03 Oct 2015 23:52

Sres. foristas,


Os adjunto las imágenes donde se ve como ha quedado la definición del indicador:
base.png
Parámetro "base"
exponente.png
Parámetro "exponente"
power.png
Indicador "Power"
Y este es el código del indicador:

Código: Seleccionar todo

//Programado por Rafa7, forista de x-trader.net
//parámetros:
//   base y exponente
//   power devuelve base^exponente
if calculado = 0 then
   calculado = 1
   if (base < 0) and (exponente = round(exponente)) then
      power = exp(exponente * log(-base))
      if (exponente mod 2 <> 0) then
         power = -power
      endif
   else
      power = exp(exponente * log(base))
   endif
endif
return power as "%Power"
La variable "calculado" la uso para que los cálculos del indicador se realicen solamente en la 1ª vela. Sin el IF este indicador se calcularía innecesariamente en cada vela. Digo innecesariamente porque el resultado del cálculo sería siempre el mismo. Sin el IF podríamos tener serios problemas de lentitud (por ejemplo si en un sistema de trading usáramos un indicador personal que llamase a power).



Saludos.


¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com


Responder

Volver a “ProRealTime”