Atascado con Probuilder, ayuda por favor

Foro para tratar todo lo relacionado con el manejo de la herramienta ProRealTime así como la programación de indicadores y sistemas.
Responder
redar t
Mensajes: 11
Registrado: 22 Oct 2010 15:42

Atascado con Probuilder, ayuda por favor

Mensaje por redar t »

¡Hola a todos!

Como es mi primer post, antes de nada quiero saludaros y felicitar a x-trader por crear esta comunidad. Llevo algún tiempo aprendiendo con vuestras aportaciones en este foro, aunque reconozco que soy novato y que hay muchas cosas que me superan y no consigo entender.

He comenzado a utilizar ProRealTime y ahora quiero aprender a usar el Probuilder con la idea de configurar mis propios filtros y ajustar algún indicador. No obstante me encuentro con el siguiente problema y no hallo la solución... lo peor es que seguro que es una tontería, pero no consigo dar con el problema:

IF Close>Average[20](Close) THEN
Resultado=1
ENDIF
RETURN Resultado

Es el ejemplo del manual. Según este, de no cumplirse la condición la variable por defecto será 0. Pues bien, cuando lo aplico el indicador da constantemente 1, como si siempre se cumpliese la condición. Esto mismo ocurre con programas más complejos utilizando IF, con lo que estoy totalmente bloqueado. Como digo, es el ejemplo que viene en el manual. ¿Me estoy olvidando de algo? Gracias por vuestra ayuda
Avatar de Usuario
bolsa1
Mensajes: 1347
Registrado: 13 May 2008 09:53
Ubicación: Gallaecia

Re: Atascado con Probuilder, ayuda por favor

Mensaje por bolsa1 »

Yo no controlo de esta plataforma, e igual estoy diciendo una sandez, pero... ¿no tendrías que añadir un "else Resultado=0"? Porque si no, cuando la condición se cumpla por primera vez, Resultado va a valer 1 siempre, aunque el cierre caiga por debajo de la media... tendrías que actualizar la variable para cuando las condiciones cambien.

Pero ya te digo que yo, de ProReal ni idea.

Saludos! ;-)
"Mercaderes e industriales no deben ser admitidos a la ciudadanía; porque su género de vida es abyecto y contrario a la virtud."

Aristóteles.
redar t
Mensajes: 11
Registrado: 22 Oct 2010 15:42

Re: Atascado con Probuilder, ayuda por favor

Mensaje por redar t »

Ahhh, de acuerdo, creo que lo he entendido :-D

Tal y como está escrito el programa da uno cuando las condiciones se cumplen, pero no va a dejar de dar el resultado de uno (es decir, no dará 0) porque las condiciones dejen de cumplirse: para eso he de introducir otra función... ¿no?. ¡Pues sí que es sútil el lenguaje de programación jejjeje! (se nota que es la primera vez que programo nada :oops: )

Muchas gracias por despejarme la incognita bolsa1, seguiré experimentando a ver qué tal!!
Avatar de Usuario
Enrio
Mensajes: 308
Registrado: 26 Oct 2004 13:36

Re: Atascado con Probuilder, ayuda por favor

Mensaje por Enrio »

La verdad es que la programación a veces se simplifica demasiado...

Para hacerlo bien, lo primero sería darle un valor a la variable (por ejemplo 0), así con la variable inicializada siempre sabes lo que vale y no lo dejas al azar. Y lo segundo, como ya te han indicado, queda todo mucho más controlado si no dejas ninguna opción abierta.

Después vienen las optimizaciones y si tienes la variable inicializada y controlada te puedes ahorrar el "else..."

La explicación de la inicialización es que según el entorno de programación (lenguaje, compilador, etc) al crear una variable nueva no coje el valor 0 sino lo que haya escrito en la posición de memoria que se le asigna.
redar t
Mensajes: 11
Registrado: 22 Oct 2010 15:42

Re: Atascado con Probuilder, ayuda por favor

Mensaje por redar t »

Ahora mismo estoy haciendo pruebas con condiciones imbricadas. He aplicado la solución que me ha aportado bolsa1 al siguiente código (el que viene en el manual):

IF (Average[12](Close) - Average[20](Close) > 0) THEN
IF ExponentialAverage[12](Close) - ExponentialAverage[20](Close) > 0 THEN
Resultado = 1
ELSE
Resultado = -1
ENDIF
ENDIF
RETURN Resultado

Me sucedía lo mismo, quedaba activada cuando se daban las dos condiciones y después solo se desactivaba cuando la ema12 cruzaba por debajo a la ema20 (independientemente de que mm12 estuviera encima o debajo del mm20). Para que se desactive cuando dejen de cumplirse las condiciones lo he ampliado de la siguiente manera:

if average[13](close)>average[20](close) then
if exponentialaverage[13](close)>exponentialaverage[20](close) then
result=1
else
result=0
endif
endif
if average[13](close)<average[20](close) then
if exponentialaverage[13](close)>exponentialaverage[20](close) then
result=0
else
result=0
endif
endif
return result

A mí no me parece nada sofisticado, pero es el único modo que he hallado para que se active y se desactive de acuerdo con mi lógica (no tan lógica por lo que veo jeje). El tema de inicializar las variables no lo he entendido muy bien. Enrio, ¿me puedes enseñar cómo mejorar el fragmento de arriba para ahorrarme el ELSE? Esto me resulta totalmente nuevo y ya veo que voy a tener que leer bastante para poder manejar un poco el programa. Si me podéis recomendar algún manual para aprender este lenguaje de programación os estaría muy agradecido, el que viene con el programa se ve bastante básico (por cierto, ¿esto es VisualBasic o es otro lenguaje?). Gracias de nuevo y saludos!

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

Re: Atascado con Probuilder, ayuda por favor

Mensaje por Rafa7 »

redar t escribió:
IF Close>Average[20](Close) THEN
Resultado=1
ENDIF
RETURN Resultado

Es el ejemplo del manual. Según este, de no cumplirse la condición la variable por defecto será 0. Pues bien, cuando lo aplico el indicador da constantemente 1, como si siempre se cumpliese la condición.
Hola, redar, no soy ningín experto en ProBuilder, pero me imagino que está pasando.
Lo que creo que pasa es que si no se cumple la condición Close > Average[20](close), no estás asignando ningún valor a Resultado, por lo cual Resultado nunca cambiará de valor.
Necesitas un ELSE, algo así como:

Código: Seleccionar todo

IF Close > Average[20](Close) THEN
   Resultado = 1
ELSE
   Resultado = 0
ENDIF
RETURN Resultado
¿Has entendido mi explicación de porque no te cambia el valor de Resultado?

Saludos.
Última edición por Rafa7 el 22 Oct 2010 21:33, 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
Enrio
Mensajes: 308
Registrado: 26 Oct 2004 13:36

Re: Atascado con Probuilder, ayuda por favor

Mensaje por Enrio »

redar t escribió:IF (Average[12](Close) - Average[20](Close) > 0) THEN
IF ExponentialAverage[12](Close) - ExponentialAverage[20](Close) > 0 THEN
Resultado = 1
ELSE
Resultado = -1
ENDIF
ENDIF
RETURN Resultado
Aquí lo que has programado es:
Si la mm12 está por encima de la mm20 haz algo sino no hagas nada.

Y el "haz algo" es:
Si la ema12 está por encima de la ema20 Resultado=1 sino Resultado=-1

Con lo que mientras la mm12 esté por debajo de la mm20 no le das ningún valor a Resultado en todo el programa. Entonces Resultado coge un valor que no controlas.

Si inicializas (por ejemplo añades una primera linea al programa "Resultado=0"), cada vela al ejecutarse el programa primero Resultado coge el valor 0 y luego en función del programa cogerá el valor que toque 1 ó -1. Cuando mm12 esté por debajo de mm20, como no tocas Resultado seguirá siendo 0.

No se exactamente el comportamiento que buscas, pero para comprobar el programa debes entender como funciona paso a paso. En otros entornos lo puedes hacer en el ordenador e ir viendo que valores coge cada variable en cada momento y ver que intrucciones se ejecutan y cuales no (p.ej. en VisualBasic) pero en ProBuilder no. Lo puedes hacer a mano con un papel hasta que tengas práctica.

Me parece que tu problema no es el lenguaje en sí sinó el algoritmo. Algo que ayuda a ver es "tabular" las instrucciones, así el programa quedaría:

Resultado = 0
IF (Average[12](Close) - Average[20](Close) > 0) THEN
___IF ExponentialAverage[12](Close) - ExponentialAverage[20](Close) > 0 THEN
______Resultado = 1
___ELSE
______Resultado = -1
___ENDIF
ENDIF
RETURN Resultado

(He puesto "guión bajo" en vez de espacios para que se vea)

Así se ve claro que cuando mm12<mm20 no haces nada y cuando mm12>mm20 Resultado vale 1 ó -1 en función de las emas.

No se si te he aclarado algo o acabado de liar.
Avatar de Usuario
Rafa7
Mensajes: 4923
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Atascado con Probuilder, ayuda por favor

Mensaje por Rafa7 »

redar t escribió:Ahora mismo estoy haciendo pruebas con condiciones imbricadas. He aplicado la solución que me ha aportado bolsa1 al siguiente código (el que viene en el manual):

IF (Average[12](Close) - Average[20](Close) > 0) THEN
IF ExponentialAverage[12](Close) - ExponentialAverage[20](Close) > 0 THEN
Resultado = 1
ELSE
Resultado = -1
ENDIF
ENDIF
RETURN Resultado

Me sucedía lo mismo, quedaba activada cuando se daban las dos condiciones y después solo se desactivaba cuando la ema12 cruzaba por debajo a la ema20 (independientemente de que mm12 estuviera encima o debajo del mm20).
Hola redar,

no se que pretendes, pero lo intuyo, ...

Prueba esto:

Código: Seleccionar todo

Resultado = 0
IF (Average[12](Close) - Average[20](Close) > 0) THEN
   IF ExponentialAverage[12](Close) - ExponentialAverage[20](Close) > 0 THEN
      Resultado = 1
   END-IF
END-IF
IF (Average[12](Close) - Average[20](Close) < 0) THEN
   IF ExponentialAverage[12](Close) - ExponentialAverage[20](Close) < 0 THEN
      Resultado = -1
   END-IF
END-IF
RETURN Resultado
De esta manera Resultado podrá darte los valores 1, -1 y 0.

Otra forma, que da el mismo resultado, mas fácil de entender (porque no usa IF anidado), es esta:

Código: Seleccionar todo

Resultado = 0
IF (Average[12](Close) > Average[20](Close)) AND (ExponentialAverage[12](Close) > ExponentialAverage[20](Close)) THEN
   Resultado = 1
END-IF
IF (Average[12](Close) < Average[20](Close)) AND (ExponentialAverage[12](Close) < ExponentialAverage[20](Close)) THEN
   Resultado = -1
END-IF
RETURN Resultado
El problema, siempre es el mismo, tienes que asignar algo a resultado (DE LO CONTRARIO Resultado NO CAMBIARA DE VALOR si no se cumple ninguna condición).
Si desde el principio lo inicializas con cero, todo irá mejor. Entonces si ninguna condición se cumple, Resultado quedará con valor cero.

Mi consejo es el siguiente, inicializa SIEMPRE el valor de Resultado. Otra cosa es que te interese que si no se cumple una condición Resultado no cambie de valor, en este caso no deberías inicializar Resultado.

Espero que entiendas esto de que si no inicializas una variable, si no se cumple la condición, no cambiará de valor. ¿Lo entiendes?

Saludos.
Última edición por Rafa7 el 22 Oct 2010 21: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
Rafa7
Mensajes: 4923
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Atascado con Probuilder, ayuda por favor

Mensaje por Rafa7 »

Enrio escribió:al crear una variable nueva no coje el valor 0 sino lo que haya escrito en la posición de memoria que se le asigna.
Hola Enrio, me parece que en ProRealTime, si no inicializas una variable tiene el valor Undefined, pero no estoy seguro, ...

Saludos.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
redar t
Mensajes: 11
Registrado: 22 Oct 2010 15:42

Re: Atascado con Probuilder, ayuda por favor

Mensaje por redar t »

Vaya qué mal, dejé totalmente olvidado este hilo. Lo primero muchas gracias a los tres (bolsa1, enrio y rafa7) por haberme echado una mano. Aunque sea con 5 meses (!) de retraso os lo quería agradecer :oops:

Releyendo ahora este hilo me doy cuenta de lo verdísimo que estaba en esto de 'programar', jejeje. ¡Qué preguntas! Aunque sigo sin ser ningún experto (y me intuyo que nunca me acercaré a serlo..) he aprendido alguna cosa y ya me he hecho algún indicador que, aunque muy rudimentario, me ha sido útil. Ahora que tengo algo de tiempo y que me he llevado algún palo creo que voy a volver a empecinarme con esto de programar a ver si consigo testear alguna idea que tengo en mente...Lo dicho señores, ¡gracias de nuevo y un saludo!
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “ProRealTime”