Potencias en ProRealTime
Potencias en ProRealTime
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.
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.
Re: Potencias en ProRealTime
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:
Saludos,
X-Trader
https://www.prorealtime.com/en/pdf/prob ... 416313647c
Y aparentemente no hay potencias, estas son las funciones matemáticas que tiene:
Así que sí, me temo que tendrás que tirar de logaritmos y exponenciales.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
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."
Re: Potencias en ProRealTime
Gracias, X-Trader.X-Trader escribió: Así que sí, me temo que tendrás que tirar de logaritmos y exponenciales.
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.
-
- Mensajes: 3842
- Registrado: 22 Dic 2014 10:49
Re: Potencias en ProRealTime
.
Ú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...
si añadimos otro ciclo, entonces tendremos "un triciclo"... famoso trio catalan de humor de los 90....
..y nada mas...
Re: Potencias en ProRealTime
Touché Rango Starr, muy buena solución! Deberías salir más del feretro
Saludos,
X-Trader



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."
-
- Mensajes: 3842
- Registrado: 22 Dic 2014 10:49
Re: Potencias en ProRealTime
.
Ú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...
si añadimos otro ciclo, entonces tendremos "un triciclo"... famoso trio catalan de humor de los 90....
..y nada mas...
Re: Potencias en ProRealTime
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:
Sí sabes seguro que x > 0, entonces:
Por otro lado, hemos de tener en cuenta que para elevar al cuadrado, PRT sí que tiene una función: square.
Saludos.
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.
Re: Potencias en ProRealTime
Aunque nunca he usado ni he visto prorealtime, me voy a meter en la conversación
...

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...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).
Re: Potencias en ProRealTime
Gracias, mascara.mascara escribió:así que a lo mejor puedes crear un indicador con dos parámetros: base y exponente
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.
Re: Potencias en ProRealTime
Gracias, mascara.mascara escribió:a lo mejor puedes crear un indicador con dos parámetros: base y exponente y que te devuelva un valor.
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.mascara escribió:Es una teoría nada más...
Os adjunto las imágenes donde defino el indicador:
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"
Código: Seleccionar todo
z = call power[x, y]
Saludos.
Re: Potencias en ProRealTime
Gracias por compartir Rafa7, te acabo de dar karma 
Saludos,
X-Trader

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."
Re: Potencias en ProRealTime
Gracias, X-Trader.X-Trader escribió:Gracias por compartir Rafa7, te acabo de dar karma
-
- Mensajes: 3842
- Registrado: 22 Dic 2014 10:49
Re: Potencias en ProRealTime
.
Ú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...
si añadimos otro ciclo, entonces tendremos "un triciclo"... famoso trio catalan de humor de los 90....
..y nada mas...
Re: Potencias en ProRealTime
Sres. foristas,
Me he dado cuenta de que el indicador power podría consumir muchísima menos CPU añadiendo un pequeño cambio:
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.
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"
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.
Re: Potencias en ProRealTime
Sres. foristas,
Os adjunto las imágenes donde se ve como ha quedado la definición del indicador:
Y este es el código del indicador:
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.
Os adjunto las imágenes donde se ve como ha quedado la definición del indicador:
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"
Saludos.
Si te ha gustado este hilo del Foro, ¡compártelo en redes!