Análisis Técnico y Codificación MQL4

Foro dedicado a todo lo relacionado con la versión 4 de la plataforma de Metaquotes.
Avatar de Usuario
nstrader
Mensajes: 257
Registrado: 24 Mar 2007 19:33

Depuración código

Mensaje 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);
}
Avatar de Usuario
PucK
Mensajes: 377
Registrado: 21 Nov 2007 11:36

Mensaje 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
constancia, paciencia y respeto
Avatar de Usuario
nstrader
Mensajes: 257
Registrado: 24 Mar 2007 19:33

Mensaje 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.
Avatar de Usuario
PucK
Mensajes: 377
Registrado: 21 Nov 2007 11:36

Mensaje 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?
Avatar de Usuario
nstrader
Mensajes: 257
Registrado: 24 Mar 2007 19:33

Mensaje 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.

Avatar de Usuario
PucK
Mensajes: 377
Registrado: 21 Nov 2007 11:36

Mensaje 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
constancia, paciencia y respeto
Avatar de Usuario
nstrader
Mensajes: 257
Registrado: 24 Mar 2007 19:33

Mensaje 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
Avatar de Usuario
Fer137
Mensajes: 1371
Registrado: 12 Nov 2007 18:43

Re: Depuración código

Mensaje 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);
}
Avatar de Usuario
nstrader
Mensajes: 257
Registrado: 24 Mar 2007 19:33

Re: Depuración código

Mensaje 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
Avatar de Usuario
Fer137
Mensajes: 1371
Registrado: 12 Nov 2007 18:43

Mensaje 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.
Última edición por Fer137 el 23 Mar 2009 01:41, editado 1 vez en total.
Avatar de Usuario
Fer137
Mensajes: 1371
Registrado: 12 Nov 2007 18:43

Mensaje 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)
Avatar de Usuario
PucK
Mensajes: 377
Registrado: 21 Nov 2007 11:36

Mensaje 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....
Avatar de Usuario
nstrader
Mensajes: 257
Registrado: 24 Mar 2007 19:33

Mensaje 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
Avatar de Usuario
nstrader
Mensajes: 257
Registrado: 24 Mar 2007 19:33

Mensaje 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
Avatar de Usuario
PucK
Mensajes: 377
Registrado: 21 Nov 2007 11:36

Mensaje 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)
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “Metatrader 4”