Página 1 de 1

Atascado con Probuilder, ayuda por favor

Publicado: 22 Oct 2010 15:59
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

Re: Atascado con Probuilder, ayuda por favor

Publicado: 22 Oct 2010 16:06
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! ;-)

Re: Atascado con Probuilder, ayuda por favor

Publicado: 22 Oct 2010 16:22
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!!

Re: Atascado con Probuilder, ayuda por favor

Publicado: 22 Oct 2010 16:38
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.

Re: Atascado con Probuilder, ayuda por favor

Publicado: 22 Oct 2010 17:31
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!

Re: Atascado con Probuilder, ayuda por favor

Publicado: 22 Oct 2010 20:57
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.

Re: Atascado con Probuilder, ayuda por favor

Publicado: 22 Oct 2010 21:06
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.

Re: Atascado con Probuilder, ayuda por favor

Publicado: 22 Oct 2010 21:10
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.

Re: Atascado con Probuilder, ayuda por favor

Publicado: 22 Oct 2010 21:20
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.

Re: Atascado con Probuilder, ayuda por favor

Publicado: 10 Mar 2011 17:54
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!