aventuras de un novato - página 10

 
niko:
Tus deseos son órdenes para mí (iba a decir 'high flyer', pero luego miré el diccionario en línea y aparentemente es un comentario grosero, no importa)

Vale, sólo he echado un vistazo rápido, ya que ahora estás siendo un poco demasiado aleatorio para mi gusto.

No has basado tus cambios en la última versión de mi código.

Por lo tanto, no tengo ni idea de si la última versión de mi código hacía lo que necesitabas, antes de que empezaras a añadir más cosas a la versión anterior.

Pero lo que sí he notado es que justo al comienzo de la función start() falta tu llave de apertura. Pensé que ya habíamos pasado por esto.

Necesitas ejercer algo de control. Si vas a cambiar algo - asegúrate de añadir tu cambio a la última versión. Y haznos saber cuál es tu cambio y por qué lo haces.


CB.

 
niko wrote >>

Tim,

Tengo el código hasta el punto en que no hay errores reportados cuando se compila (era sólo la fijación de algunos errores que se destacó), a pesar de que en la estrategia probador no hace ningún comercio todavía. Pero estoy desconcertado en algo: ...

Hola Nick,

Mirando tus comentarios aquí y algunos de los cambios que has hecho en el código, sospecho que tu "perplejidad" puede venir debido a la confusión entre las variables y los parámetros de la función. Ellos se ven y actúan de manera similar, pero en realidad son bastante diferentes bestias.


Tal vez el ejemplo de código comentado a continuación aclare un poco las cosas.


Me he tomado la libertad de ordenar un poco más el código de desarrollo y cambiar un poco los nombres de algunos parámetros de las funciones para intentar diferenciarlos de otras variables. También he movido todas las notas superfluas, comentarios, etc. a un "Apéndice" al final del archivo para que lo hagas como quieras.

El código se ve bien. Todavía hay algunas pequeñas cosas por hacer que he marcado en el archivo como TODO, pero la principal tarea que tienes por delante es la depuración y las pruebas.


Las pruebas son una parte muy importante del ciclo de desarrollo. En el caso de los sistemas de negociación, si no se realizan las pruebas adecuadas pueden surgir problemas sutiles que pueden causar estragos en su estrategia de negociación y, en última instancia, en su cuenta. La principal tarea de las pruebas es asegurarse de que el código hace lo que se espera que haga. Efectivamente, tiene que escribir o decirse a sí mismo: "En esta situación, espero este resultado". A continuación, hay que idear y llevar a cabo la prueba para ver si esto es lo que realmente sucede. Si no es así, hay que rectificar el problema. Se repite este proceso para todas las situaciones probables que se puedan prever y quizás también para algunas poco probables. Por supuesto, también está buscando errores de ejecución o fallos que pueden o no aparecer con los mensajes de error del sistema MetaTrader.


Con MT4, su principal herramienta de prueba será el Probador de Estrategias y los archivos de registro (bajo la pestaña de Diario), así como las facilidades de Resultados, Gráficos e Informes.


Con el archivo de registro a menudo me resulta más fácil abrir todo el archivo en el Bloc de notas de Microsoft en lugar de tratar de ver parte de ella a través del visor de Diario. No se olvide de borrar el archivo de registro/diario antes de cada ejecución o terminará buscando en un montón de información antigua, y quizás ya no relevante. Después de cada ejecución de la prueba en el probador de la estrategia, se examina el archivo de registro para ambos mensajes de declaraciones de depuración, así como los mensajes del sistema de Metatrader . Usted puede utilizar su documentación de MetaTrader onine para buscar ap códigos de error para obtener información adicional. También utilice las instalaciones de Resultados, Gráficos e Informes para ver lo que el programa está haciendo en cualquier conjunto particular de condiciones.


Sugerencia - Cuando haga sus pruebas iniciales, mantenga el período de prueba corto, para minimizar la cantidad de datos en el archivo de registro.


Ya hemos incorporado algunas funciones de depuración en el código, pero probablemente tendrá que ampliarlas. Desactive las declaraciones de depuración individuales según sea necesario para mantener la información en el archivo de registro condensada y relevante. Hay un ejemplo en el código de cómo hacer esto sin borrar o comentar las sentencias de depuración, lo que puede llevar bastante tiempo. Yo dejo mis principales declaraciones de depuración en el archivo del programa indefinidamente y simplemente las desactivo todas con la bandera DEBUG_ON en el programa una vez que he terminado las pruebas.


La gestión de los archivos de registro y las declaraciones de depuración de manera eficiente es, creo, la clave para una buena y eficiente prueba y depuración en el entorno de MetaTrader. He visto gente en este foro quejándose de la falta de facilidades de depuración en MetaTrader. Millones de líneas de código comercial han sido depuradas y probadas con éxito utilizando instalaciones no más sofisticadas que las que se encuentran en MetaTrader. Estas instalaciones pueden ser básicas, pero funcionan bien, siempre y cuando usted sabe cómo usarlos correctamente.


Otro punto que vale la pena señalar es que tratar de depurar un código desordenado o mal organizado puede llevar mucho tiempo y ser frustrante. Es a partir de este punto cuando realmente empezarás a cosechar los beneficios de tu código bien estructurado y comentado. Si alguna vez alguien más necesita trabajar con tu código, te agradecerá mucho tus esfuerzos en este sentido.


Nick, este viaje todavía tiene un camino que recorrer. Para mí, las pruebas, la depuración y la optimización, el "hacer que todo funcione" es la parte más interesante del trabajo, y a menudo la más desafiante. Te pasaré el código para que empieces con las pruebas y esperaré a que me contestes con las preguntas y/o problemas que encuentres.


Saludos

Tim



Un simple ejemplo de código para intentar demostrar la diferencia entre una variable global y un parámetro de función

//+------------------------------------------------------------------+
//| Hello Trader.mq4 |
//| Copyright © 2009, Your Name |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Your Name"
#property link ""


//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
stringMyGlobalVariable; // This global variable which holds a string i.e text value has been declared
// but as yet has no value in it. It is a 'container' which at this point in time holds
// only an empty or null string.

int init()

{

MyGlobalVariable = "Nick"; // Now we assign i.e put a value in the variable. Our 'container' which is named
// MyGlobalVariable now holds the string value of "Nick"

return(0);
}


//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{

return(0);
}


//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{

MyFunction(MyGlobalVariable); // This calls the function named MyFunction which is declared below
// This function requires one string parameter.

// In this case we have passed it our global variable as a parameter.

// MyFunction("Fred"); // We could also pass this function the literal string "Fred"

// MyFunction(12.739); // This would not work. The passed value must be a string because that is what we
// have declared the parameter as in the function declaration below.

// MyFunction(DoubleToStr(12.739,3)); // This would work because we have used an inbuilt MT4 function to convert the decimal
// number to a string i.e "12.739").
// We can also pass other functions as parameters as we have shown here, provided the
// function that we are using as a parameter returns the correct data type which in
// this case is a string.

return(0);
}


//+------------------------------------------------------------------+
//| A function with one parameter |
//+------------------------------------------------------------------+


void MyFunction(string MyFunctionParameter) // The function is declared with a parameter in the same way that a varible is declared
// but it is a function parameter not a variable. It can be used just like a variable
// but only inside the function. The big difference is that it can be passed a different value
// from outside the function whenever the function is called. This enables functions to
// be used as general purpose blocks or modules.
// Function parameters are also used in some circumstances to return values from the
// function to the outside world but that is another more complex story for another day!

{
Comment(MyFunctionParameter); // The value passed to 'MyFunctionParameter' will be displayed at the top, left hand
// corner of the screen

}

Archivos adjuntos:
 
hey CB, es extraño ya que siempre guardo el archivo mq4 como nuevo, con la última fecha para separar los otros archivos. la confusión se debe haber deslizado. el corchete lo quise incluir, pero pensé que en algún momento me pediste que lo quitara (era el último, pero sin el último, el start() estaría desequilibrado. por eso quité el primero también, pero lo volveré a poner).
 
niko
hey CB, es extraño ya que siempre guardo el archivo mq4 como nuevo, con la última fecha para separar los otros archivos. la confusión se debe haber deslizado. el corchete lo quería incluir, pero pensé que en algún momento me pediste que lo quitara (era el último, pero sin el último, el start() estaría desequilibrado. por eso quité el primero también, pero lo volveré a poner).

No empecemos a añadir y quitar corchetes a discreción. Anteriormente había señalado que tenías un conjunto completamente superfluo, que podía ser eliminado.

Aquí está la última versión. Por favor, haga lo siguiente:

- Compílela primero y corrija cualquier error - así sabrá que cualquier error posterior se debe a los cambios que pueda hacer

- Hágame saber si hubo o no errores que tuvo que arreglar

- Pruébalo y comprueba si hace lo que necesitas

- Hágame saber cómo va - y hágame saber qué cambios cree que necesita hacer


CB

Archivos adjuntos:
 
Gracias CB. Me pondré a ello, lo siento si te he frustrado un poco
 

Gracias Tim,

Te agradezco mucho el esfuerzo que haces para explicarme estas cosas, es muy alentador. Parece que tengo "destellos" de conseguirlo y luego no conseguirlo en absoluto (con respecto a las funciones y las llamadas) a pesar de que debo haber leído la documentación sobre las funciones veinte veces ya. Le dedicaré más tiempo. En cuanto a las "pruebas y la depuración", ya lo he hecho en otro paquete (revisando todas las operaciones realizadas y asegurándome de que todo encaja), ya que creo que es esencial, incluso para las operaciones manuales(pruebas de estrategias). Procederé con su código y le informaré.

 
niko:
Gracias CB. Me pondré a ello, lo siento si te he frustrado un poco.

No te preocupes amigo. Sólo intento ir paso a paso.


CB

 

Hola CB,


Arreglé algunos errores en el código, principalmente faltaban paréntesis, está resaltado en el código. Ya no hay errores de sintaxis.

Ejecuto el código en el probador de estrategias, pero sólo hace operaciones de compra. No hay operaciones cortas en absoluto. Miré a través de los registros, que produce el error 130 (para hacer con las paradas) por lo que no arroja ninguna luz sobre nuestro problema.

Traté de ver si puedo averiguar dónde está el error (supongo que es en fnSHouldWeTrade o fnOrderDuplicate).

Adjunto la última versión del código, he añadido valores a TopFilter y BotFilter para que la estrategia pueda realizar operaciones.

ps: me di cuenta de por qué pegué el viejo código para usted antes, he reinstalado mt4 en una carpeta diferente (no hay errores de conexión) y el código era un duplicado de la vieja carpeta

Archivos adjuntos:
 
niko:

Hola CB,


He corregido algunos errores en el código, principalmente faltaban paréntesis, está resaltado en el código. Ya no hay errores de sintaxis.

Ejecuto el código en el probador de estrategias, pero sólo hace operaciones de compra. No hay operaciones cortas en absoluto. Miré a través de los registros, que produce el error 130 (para hacer con las paradas) por lo que no arroja ninguna luz sobre nuestro problema.

Traté de ver si puedo averiguar dónde está el error (supongo que es en fnSHouldWeTrade o fnOrderDuplicate).

Adjunto la última versión del código, he añadido valores a TopFilter y BotFilter para que la estrategia pueda realizar operaciones.

ps: me di cuenta de por qué pegué el viejo código para usted antes, he reinstalado mt4 en una carpeta diferente (no hay errores de conexión) y el código era un duplicado de la vieja carpeta


Cambio:

OrderSend(Symbol(),OP_SELL,Lots,Bid,5,0,Bid+TakeProfit*Point, "Nikos First EA",0,0,Red);

a:

OrderSend(Symbol(),OP_SELL,Lots,Bid,5,0,Ask-TakeProfit*Point, "Nikos First EA",0,0,Red);


CB

 
gracias CB, debería haberme dado cuenta, así que el error fue correcto al final (130).