Atascado con Probuilder, ayuda por favor
Atascado con Probuilder, ayuda por favor
¡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
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
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!
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.
Aristóteles.
Re: Atascado con Probuilder, ayuda por favor
Ahhh, de acuerdo, creo que lo he entendido
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
)
Muchas gracias por despejarme la incognita bolsa1, seguiré experimentando a ver qué tal!!

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

Muchas gracias por despejarme la incognita bolsa1, seguiré experimentando a ver qué tal!!
Re: Atascado con Probuilder, ayuda por favor
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.
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
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!
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
Hola, redar, no soy ningín experto en ProBuilder, pero me imagino que está pasando.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.
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
Saludos.
Última edición por Rafa7 el 22 Oct 2010 21:33, editado 1 vez en total.
Re: Atascado con Probuilder, ayuda por favor
Aquí lo que has programado es: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
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
Hola redar,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).
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
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
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.
Re: Atascado con Probuilder, ayuda por favor
Hola Enrio, me parece que en ProRealTime, si no inicializas una variable tiene el valor Undefined, pero no estoy seguro, ...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.
Saludos.
Re: Atascado con Probuilder, ayuda por favor
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
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!

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!