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: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Potencias en ProRealTime

Mensaje por Rafa7 »

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: 12781
Registrado: 06 Sep 2004 10:18
Contactar:

Re: Potencias en ProRealTime

Mensaje por X-Trader »

Hola Rafa7, he revisado el manual del ProBuilder:

https://www.prorealtime.com/en/pdf/prob ... 416313647c

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: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Potencias en ProRealTime

Mensaje por Rafa7 »

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/, 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: 3842
Registrado: 22 Dic 2014 10:49

Re: Potencias en ProRealTime

Mensaje por Rango Starr »

.
Última edición por Rango Starr el 19 May 2021 07:02, 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
X-Trader
Administrador
Mensajes: 12781
Registrado: 06 Sep 2004 10:18
Contactar:

Re: Potencias en ProRealTime

Mensaje por X-Trader »

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: 3842
Registrado: 22 Dic 2014 10:49

Re: Potencias en ProRealTime

Mensaje por Rango Starr »

.
Última edición por Rango Starr el 19 May 2021 07:02, 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: Potencias en ProRealTime

Mensaje por Rafa7 »

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: 344
Registrado: 18 Oct 2007 23:15

Re: Potencias en ProRealTime

Mensaje por mascara »

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...
Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Potencias en ProRealTime

Mensaje por Rafa7 »

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: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Potencias en ProRealTime

Mensaje por Rafa7 »

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:
Definición del parámetro &quot;base&quot;
Definición del parámetro "base"
Definición del parámetro &quot;exponente&quot;
Definición del parámetro "exponente"
Definición del indicador &quot;power&quot;
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: 12781
Registrado: 06 Sep 2004 10:18
Contactar:

Re: Potencias en ProRealTime

Mensaje por X-Trader »

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: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Potencias en ProRealTime

Mensaje por Rafa7 »

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: 3842
Registrado: 22 Dic 2014 10:49

Re: Potencias en ProRealTime

Mensaje por Rango Starr »

.
Última edición por Rango Starr el 18 May 2021 20:33, 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: Potencias en ProRealTime

Mensaje por Rafa7 »

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: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Potencias en ProRealTime

Mensaje por Rafa7 »

Sres. foristas,


Os adjunto las imágenes donde se ve como ha quedado la definición del indicador:
Parámetro &quot;base&quot;
Parámetro "base"
Parámetro &quot;exponente&quot;
Parámetro "exponente"
Indicador &quot;Power&quot;
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
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “ProRealTime”