Página 2 de 3

Depuración código

Publicado: 20 Mar 2009 15:38
por nstrader
En Sistemas con una programación compleja es necesario saber cuanto tarda nuestro EA en ejecutar un proceso o el Ea completo, esto muy importante para que los futuros testeos no tarden tanto en ejecutarse si el código no está optimizado.

:idea: Para ello hay que saber el tiempo en milisegundos de nuestro sistema operativo al inicio del EA y el tiempo en milisegundos al finalizar el EA, hacer la resta y sabremos en milisegundos cuanto ha tardado en ejecutarse.

De esta forma por ejemplo, pude optimizar un ea de unas 6000 lineas de código que tardaba 15 segundos en ejecutarse a que tardara medio segundo, simplemente mejorando la forma de hacer los calculos.

Adjunto la función que extrae los milisegundos de Windows. Espero que os sirva. Un saludo :smt117

Código: Seleccionar todo

#import "kernel32.dll"
void GetLocalTime(int& TimeArray[]);
#import

int TimeScript()
{
  GetLocalTime(TimeArray);
  int nHour=TimeArray[2]&0x0000FFFF;
  int nMin=TimeArray[2]>>16;
  int nSec=TimeArray[3]&0x0000FFFF;
  int nMilliSec=TimeArray[3]>>16;
  int MilliSec = nHour*60*60*1000+nMin*60*1000+nSec*1000+nMilliSec;
  return(MilliSec);
}

Publicado: 21 Mar 2009 05:56
por PucK
macho, ns, tienes ke venir a la kedada9b y explicar conocimentos de programación de metatrader, se te estaría muy agradecido, pq eres un as

Publicado: 21 Mar 2009 13:11
por nstrader
:D , bueno, ya lo dije por algún post, que no se trata de programación se trata de ser creativo, eso es lo que intento, el tema del lenguaje es cuestión de buscar, probar, y echarle horas, y al final encuentras curiosidades del lenguaje que si no te los encuentras tu mismo nadie te los va a explicar, ayer por ejemplo estuve todo el santo día para escribir dos líneas de código porque había un cálculo en una división que no me daba el resultado que esperaba, llegando a pensar que era un bug de la plataforma, al final buscando en los foros rusos encontré un problema parecido y era que a veces se produce un residuo decimal que no podemos ver pero que está ahí y hay que hacer unas operaciones matemáticas para eliminarlos. Resumiendo que se trata de echarle horas.

Y también tener una mente abierta para creer que se puede hacer, jejejej.

:?: Puck te voy a poner una pregunta de examen de 8º de programación en Mql4, jejejjeje

Tienes que programar lo siguiente:

Primero dibuja manualmente una línea de tendencia en un gráfico y luego programa un experto que analice esa línea (o todas las que hayas dibujado) y que te dé un aviso sonoro cuando el precio toca y/o rebota en la línea y también la opción de abrir una operación.

1ª Pregunta: Se puede programar? :smt017

Un Saludo.

Publicado: 21 Mar 2009 15:44
por PucK
nstrader escribió:
Puck te voy a poner una pregunta de examen de 8º de programación en Mql4, jejejjeje

Tienes que programar lo siguiente:

Primero dibuja manualmente una línea de tendencia en un gráfico y luego programa un experto que analice esa línea (o todas las que hayas dibujado) y que te dé un aviso sonoro cuando el precio toca y/o rebota en la línea y también la opción de abrir una operación.

1ª Pregunta: Se puede programar? .
Yo creo que sí, tendrias que poner una opción a que cuando el precio llegase al nivel de la linea, te saliera una alerta y un recuadro con los datos del mercado en ese instante y la opción de entrar dependiendo del rebote, al alza o a la baja

voy por buen camino?

Publicado: 21 Mar 2009 17:16
por nstrader
Sí, pero eso que has puesto es lo mas fácil, yo no lo tengo programado, pero el proceso sería el siguiente:

1º Extraer los 4 datos de la linea de la tendencia que hayas dibujado, osea, dos precios y dos tiempos

2º Convertir los tiempos a nº de barra

3º Calcular con estos datos el precio de la linea en la barra en formación

4º Poner la opción al usuario la distancia en pips que quiera que le suene la alerta.

5º Validar esa linea como activada cuando la active el usuario (indicandolo por ejemplo con cambio de colores)
Aqui podriamos poner varios colores como que se cambie a verde si la activamos como aviso sonoro o como rojo si la activamos como aviso sonoro y apertura de operación.

6º La activación que se me ocurre podria ser cambiando el nombre de la linea en sus propiedades. Por ejemplo dibujas la linea le cambias su nombre a 'Sound' y el programa te hace el resto

7º Una vez activado que renombre la linea a Sound_1, 2, etc para diferenciarse de otras que tengas activadas

..... bueno la lista podría seguir, depende de la imaginación de cada uno/a.

Publicado: 22 Mar 2009 14:30
por PucK
si buscar el programa es de lo más fácil, eso ya me imagino, cada uno con su experiencia verá más o menos, en este caso tu has hecho el programa 1000 veces mejor que yo puesto que llevas tiempo y tiempo programando.

A mi me encanta programar cosas, fui profesor de autómatas programables y tal, lo malo es que el lenguaje con el que se escribe en MT no tengo ni idea

gracias ns :P

Publicado: 22 Mar 2009 18:42
por nstrader
Yo aprendí este lenguaje porque ví las posibilidades que tenía, si operas con MT te recomiendo que lo aprendas. Te puedes programar ayudas visuales para estudiar un mercado. Ahora mismo estoy programando pautas de cambio de tendencia con Candlestick para hacer estudios estadísticos para complementarlos a mis sistemas.

Se me amontona el trabajo!!! estoy pensando en buscar colaboradores que estén a mi cargo.

En la imagen ayudas Visuales para Candlestick (Velas Japonesas) que el programa dibuja automáticamente:

Engulfing Bearish, Engulfing Bullish, Long Upper Shadow, Engulfing Bullish (De momento, lo tengo en fase de desarrollo)

Imagen

Re: Depuración código

Publicado: 22 Mar 2009 21:28
por Fer137
nstrader escribió:En Sistemas con una programación compleja es necesario saber cuanto tarda nuestro EA en ejecutar un proceso o el Ea completo, esto muy importante para que los futuros testeos no tarden tanto en ejecutarse si el código no está optimizado.

:idea: Para ello hay que saber el tiempo en milisegundos de nuestro sistema operativo al inicio del EA y el tiempo en milisegundos al finalizar el EA, hacer la resta y sabremos en milisegundos cuanto ha tardado en ejecutarse.

De esta forma por ejemplo, pude optimizar un ea de unas 6000 lineas de código que tardaba 15 segundos en ejecutarse a que tardara medio segundo, simplemente mejorando la forma de hacer los calculos.

Adjunto la función que extrae los milisegundos de Windows. Espero que os sirva. Un saludo :smt117

Código: Seleccionar todo

#import "kernel32.dll"
void GetLocalTime(int& TimeArray[]);
#import

int TimeScript()
{
  GetLocalTime(TimeArray);
  int nHour=TimeArray[2]&0x0000FFFF;
  int nMin=TimeArray[2]>>16;
  int nSec=TimeArray[3]&0x0000FFFF;
  int nMilliSec=TimeArray[3]>>16;
  int MilliSec = nHour*60*60*1000+nMin*60*1000+nSec*1000+nMilliSec;
  return(MilliSec);
}
Con TimeCurrent() mas sencillo, aunque quizás menos exacto en alguna situación.

Código: Seleccionar todo

int start() {   int t0=TimeCurrent();
    ....  ....
    ....  ....
   Print( "milisegundos de un ciclo del EA: ", TimeCurrent() - t0);
}

Re: Depuración código

Publicado: 22 Mar 2009 23:20
por nstrader
Fer137 escribió: Con TimeCurrent() mas sencillo, aunque quizás menos exacto en alguna situación.

Código: Seleccionar todo

int start() {   int t0=TimeCurrent(); 
    ....  .... 
    ....  .... 
   Print( "milisegundos de un ciclo del EA: ", TimeCurrent() - t0); 
}
La Funcion TimeCurrent extrae el tiempo en segundos del servidor o de los tics o barras que tengamos guardados en caso de los test, osea que no sirve para calcular milisegundos de una ejecución. En el caso de una comprobación en tiempo real, si no se mueve el mercado te dará el mismo tiempo al iniciar que al terminar el Ea (Eso suponiendo que se pudiera ejecutar el Ea, que en tal caso no podría ser porque el ea lo inicia el movimiento del mercado).

Un saludo

Publicado: 23 Mar 2009 00:29
por Fer137
Timecurrent funciona tambien sin ticks, lo que pasa es que da el resultado en segundos, no en milisegundos como decía.

Esta otra si es del tiempo del ordenador y en milisegundos:
GetTickCount( )
Hace lo mismo que la que decías. Es la funcion a la que me quería referir en el otro post. El ejemplo que puse quedaría así:

Código: Seleccionar todo

int start() {   int t0=GetTickCount( ) ; 
    ....  .... 
    ....  .... 
   Print( "milisegundos de un ciclo del EA: ", GetTickCount( ) - t0); 
}
De todas formas gracias por poner esas cosas del kernel32 del windows.

Saludos.

Publicado: 23 Mar 2009 00:43
por Fer137
nstrader escribió:Sí, pero eso que has puesto es lo mas fácil, yo no lo tengo programado, pero el proceso sería el siguiente:

1º Extraer los 4 datos de la linea de la tendencia que hayas dibujado, osea, dos precios y dos tiempos

2º Convertir los tiempos a nº de barra

3º Calcular con estos datos el precio de la linea en la barra en formación
...
Cuando la linea está dibujada hay una funcion que hace todo eso:
ObjectGetValueByShift()

4º Poner la opción al usuario la distancia en pips que quiera que le suene la alerta.

5º Validar esa linea como activada cuando la active el usuario (indicandolo por ejemplo con cambio de colores)
Aqui podriamos poner varios colores como que se cambie a verde si la activamos como aviso sonoro o como rojo si la activamos como aviso sonoro y apertura de operación.

6º La activación que se me ocurre podria ser cambiando el nombre de la linea en sus propiedades. Por ejemplo dibujas la linea le cambias su nombre a 'Sound' y el programa te hace el resto

7º Una vez activado que renombre la linea a Sound_1, 2, etc para diferenciarse de otras que tengas activadas

..... bueno la lista podría seguir, depende de la imaginación de cada uno/a.
En el hilo 'metatrader' puse hace tiempo un EA así, toca un sonido, o compra y vende al llegar a determinadas lineas dibujadas, despues de activarlas las cambia de color,etc. (ahora no lo veo, son muchas paginas ese hilo)

Publicado: 23 Mar 2009 01:48
por PucK
nstrader escribió:Yo aprendí este lenguaje porque ví las posibilidades que tenía, si operas con MT te recomiendo que lo aprendas. Te puedes programar ayudas visuales para estudiar un mercado. Ahora mismo estoy programando pautas de cambio de tendencia con Candlestick para hacer estudios estadísticos para complementarlos a mis sistemas.

Se me amontona el trabajo!!! estoy pensando en buscar colaboradores que estén a mi cargo.

En la imagen ayudas Visuales para Candlestick (Velas Japonesas) que el programa dibuja automáticamente:

Engulfing Bearish, Engulfing Bullish, Long Upper Shadow, Engulfing Bullish (De momento, lo tengo en fase de desarrollo)

Imagen
interesante... yo te ayudaría encantado si supiera....

Publicado: 23 Mar 2009 02:15
por nstrader
Pues no me había fijado en esas dos funciones gracias Fer137 básicamente porque no me han echo falta, como ves me las he fabricado yo mismo, aunque a la de GetTickCount( ) le echaré un vistazo.

Programé una función al estilo de ObjectGetValueByShift() para calcular el punto de una coordenada sin necesidad de ningún objeto dibujado ya que la finalidad del ea es que pueda trabajar sin ninguna gráfica ni objeto, solo con datos numéricos y para eso la función ObjectGetValueByShift() no me sirve.

Mi forma de programar Expertos es que puedan funcionar en modo no visual pero que tambien puedan dibujar todos los datos en la gráfica automáticamente, soportes/resistencias, lineas de tendencia, fibo, patrones de velas, incluso el acceso al horario de noticias. Todo lo que hace el Ea tengo que verlo visualmente para optimizar el código, corregir errores, etc, tiene que hacer exactamente lo que quiero yo que haga. Cuando está todo bien lo paso al test no visual que es más rápido, para hacer otro tipo de estudios.

Lo de las ayudas sonoras solo era una idea por si alguien se lo quiere programar, si ya está echo mejor, a mi ea no le hacen falta ayudas visuales ni sonoras porque no puede ver ni oir (de momento), jejejeje


Fer137 me alegra tenerte por aquí, un saludo :smt023

Publicado: 23 Mar 2009 02:48
por nstrader
PucK escribió:
interesante... yo te ayudaría encantado si supiera....
No todo es programar, si necesito que me busques algo te lo haré saber.

Ayuda visual para fundamentales (esta idea la he sacado de otro foro) que tambien la integraré en mi ea de forma semiautomática

EURUSD:

Imagen

Publicado: 23 Mar 2009 04:35
por PucK
nstrader escribió:
PucK escribió:
interesante... yo te ayudaría encantado si supiera....
No todo es programar, si necesito que me busques algo te lo haré saber.

Ayuda visual para fundamentales (esta idea la he sacado de otro foro) que tambien la integraré en mi ea de forma semiautomática

EURUSD:

Imagen
para lo que necesites ya lo sabes, yo voy a intentar aprender, y cuando me empeño en algo normalmente suelo conseguirlo el 99% de las veces (como maño cabezón que soy)