| //+------------------------------------------------------------------+
|
| //| Defines.mqh |
|
| //| Copyright 2025, Niquel Mendoza. |
|
| //| https://www.mql5.com/es/users/nique_372 |
|
| //+------------------------------------------------------------------+
|
| #property copyright "Copyright 2025, Niquel Mendoza."
|
| #property link "https://www.mql5.com/es/users/nique_372"
|
| #property strict
|
|
|
| //+------------------------------------------------------------------+
|
| //| |
|
| //+------------------------------------------------------------------+
|
| /*
|
| Hola...
|
|
|
| Este EA (y todos sus archivos) contienen una base de cómo yo, autor de la librería, considero que se podría
|
| trabajar con ella. Es un estilo personal.
|
|
|
| Normalmente suelo dividir la complejidad de los EAs en varios archivos, dado que pienso que es más rápido y fácil trabajar
|
| con archivos que están diseñados "para cada tarea".
|
|
|
| Este EA de ejemplo está dividido en 5 archivos:
|
|
|
| - Global: En este archivo estarán todas las acciones que quiero que se inicien primero al momento de cargar el EA,
|
| como iniciar la librería ICT o configurar el Bar Manager. Este código siempre está por encima de los demás,
|
| ya que debe ejecutarse primero para evitar errores (por ejemplo, si el usuario instancia un CFvg dentro de una clase
|
| que se instancia globalmente y crea un FVG, al no tener la clase configurado el Bar Manager, se produce un error crítico
|
| de Invalid Pointer).
|
|
|
| - Defines: Aquí incluiré todos los archivos necesarios y otras utilidades que hagan falta.
|
|
|
| - Functions: Aquí coloco todas las funciones extra que utilizará la estrategia.
|
|
|
| - Main: Aquí va la lógica del EA, la clase principal.
|
|
|
| - EA: Por último, aquí se incluye todo el código anterior y se define cada evento del EA.
|
|
|
| Ciertamente, esta estructura es para un EA "algo simple" o "medianamente complejo".
|
| Pero para EAs más complejos, por ejemplo uno que requiera un panel, crearía otra carpeta llamada "Panel".
|
| Y si requiere IA o modelos ONNX, crearía otra carpeta: una para la generación de datos y otra para los modelos ONNX.
|
|
|
| Luego, todos esos archivos .mqh los incluiría en Defines.mqh. Ahora bien, este diseño no funciona con todos los EAs,
|
| así que si desean sugerencias, escríbanme por MQL5, Telegram o Discord. Les podría dar recomendaciones sobre cómo estructurar
|
| su proyecto.
|
|
|
| Eso sí, el archivo Global.mqh sí o sí les recomiendo que lo tengan, para evitar problemas con instancias globales
|
| que ustedes podrían llegar a hacer en el código.
|
| */
|
|
|
| //+------------------------------------------------------------------+
|
| //| Include |
|
| //+------------------------------------------------------------------+
|
| // En esta sección se ubicarán nuestros includes.
|
| // Para este caso en concreto, como no trabajaremos con nada adicional, incluiremos directamente Global.
|
| //
|
| // Ahora ustedes se preguntarán: ¿cuándo incluir Global en el archivo Defines y cuándo no?
|
| // 1. Incluiremos Global en Defines si:
|
| // - Estamos seguros de que no incluiremos otros archivos como EA.mq5, Main.mqh o Functions.mqh.
|
| // - En caso de que nuestra estrategia requiera trabajar con otros timeframes
|
| // (en este caso incluiremos Global otra vez en EA.mq5, y SIEMPRE PRIMERO).
|
| // 2. No incluiremos Global en Defines si:
|
| // - No planeamos que Defines sea el único lugar donde se incluirán archivos, ademas en este caso tambien deberemos de incluir
|
| // Global, como primer include, en el bot o indicador.
|
| //
|
| // En este caso, como no necesitamos incluir otros archivos, podemos incluir Global directamente aquí:
|
| #include "Global.mqh"
|
|
|
| //---
|
| // Luego, para trabajar con las estrategias de una forma más fácil, usamos Strategy de MQLArticles
|
| #include <TSN\\MQLArticles\\RM\\RiskManagement.mqh>
|
| #include <TSN\\MQLArticles\\Strategy\\Main.mqh>
|
| #include <TSN\\Std\\Basics\\Try.mqh>
|
|
|
| //+------------------------------------------------------------------+
|
| //| Global variables |
|
| //+------------------------------------------------------------------+
|
| // En esta sección se ubicarán todas las variables globales que usará nuestra estrategia.
|
| // Usualmente suelo colocar aquí los conceptos (aunque también es válido ponerlos como miembros de la estrategia)
|
| // y la gestión de riesgo.
|
| //
|
| // La idea es definir variables que todos los archivos requieran (por ejemplo, si Functions necesita llamar
|
| // una función de un concepto, entonces valdría la pena hacerlo global).
|
| //
|
| // Para este EA, instanciaremos (como puntero) únicamente la gestión de riesgo y un Order Block.
|
| TSN::CRiskManagemet* g_risk;
|
| COrderBlockTick g_ob;
|
|
|
| // Les recomiendo siempre poner prefijos a las variables globales para poder distinguirlas de otras.
|
| // En mi caso, uso como estilo snake_case y como prefijo g_.
|
| // Ciertamente, cada uno es libre de decidir cómo nombrar sus variables; usen lo que les sea más cómodo
|
| // y, sobre todo, fácil de entender y que les permita programar de manera rápida y fluida.
|
| //
|
| // Existen otras formas de nombrar variables globales, como usar directamente PascalCase,
|
| // o utilizar el prefijo Ext + PascalCase, por ejemplo: ExtMiVariable.
|
|
|
| //+------------------------------------------------------------------+
|
| //| Estilo de programación |
|
| //+------------------------------------------------------------------+
|
| // Por último, agrego esta sección para mencionar el estilo de programación que se usará en esta estrategia.
|
| //
|
| // La idea es que, si ustedes trabajan en equipo (con otros desarrolladores MQL) o tienen su propio programador,
|
| // sea crucial definir un "estilo" que todos sigan, con el objetivo de mantener un código uniforme
|
| // y no tener diferentes estilos mezclados.
|
| //
|
| // A continuación defino el estilo que uso, una mezcla personal junto con el estilo de MQL5:
|
| //
|
| // ## Nombramiento:
|
| // Clases | Prefijo C_ | Tipo: PascalCase
|
| // Interfaces | Prefijo I_ | Tipo: PascalCase
|
| // Estructuras | Sin prefijo | Tipo: PascalCase
|
| // Uniones | Sin prefijo | Tipo: PascalCase
|
| // Funciones | Sin prefijo | Tipo: PascalCase
|
| // Variables miembro | Prefijo m_ | Tipo: snake_case
|
| // Variables globales | Prefijo g_ | Tipo: snake_case
|
| // Variables locales | Sin prefijo | Tipo: snake_case
|
| // Variables parámetro | Prefijo Inp | Tipo: PascalCase
|
| //
|
| // ## Estilos:
|
| // En la sección Herramientas -> Opciones:
|
| //
|
| // Para la sección Estilizador:
|
| // - Estilo: MetaQuotes
|
| // - Sustituir tabulación por espacios: Sí (marcado)
|
| // - Eliminar líneas vacías: No (desmarcado)
|
| // - Insertar espacios luego de la coma y punto y coma: Sí (marcado)
|
| // - Insertar espacios alrededor de los operadores: Sí (marcado)
|
| // Para la sección General:
|
| // - Tabulación: 2 caracteres
|
| // - Insertar espacios (marcado)
|
| // - Insertar () y los de cierre } ) ] " ' (marcado)
|
| // - Resaltar paréntesis pareados (marcado)
|
| // - Resaltar línea actual (marcado)
|
| // - Activar la historia del portapapeles (marcado)
|
| // - Lista de nombres tras: 2 caracteres
|
| // - Auto-lista de nombres (marcado)
|
| // - Sangría automática (marcado)
|
| // - Parámetros automáticos (marcado)
|
| // - Números de líneas (marcado)
|
|
|
| // Para estilizar el código sin tener que "presionar" en el icono especial, pueden usar
|
| // las siguientes teclas: (CTRL + ,)
|
|
|
|
|
| // ## Extra:
|
| // - Siempre separo las secciones del código con "//---"
|
| //- Y los headers de función/clases/interfaces con:
|
| //+------------------------------------------------------------------+
|
| //| |
|
| //+------------------------------------------------------------------+
|
| // (CTRL + .)
|
|
|
| // - Tambien suelo usar // pero como "sub-division" del //---
|
| // Por ejemplo:
|
| // >>>>>>>>>>>>>
|
| //---
|
| // int a = 10;
|
| // int b = 10;
|
|
|
| // Suma
|
| // int c = a + b;
|
|
|
| // Imprimir
|
| // Print("Resultado = ", c)
|
| //>>>>>>>>>>>>>
|
|
|
| // Ciertamente no siempre lo hago, pero la mayoría de las veces sí.
|
|
|
|
|
| // ## Comentarios:
|
| // No siempre los coloco; solo para describir funciones o funcionalidades complejas.
|
| // Aquí dejo que cada uno decida lo que le parezca mejor.
|
| // Por mi parte, me inclino por "pocos, pero útiles" comentarios en el código.
|
|
|
| // ## Idioma:
|
| // Ciertamente no soy bueno en inglés, así que verán que mi código está algo mezclado.
|
| // Intento nombrar todo en inglés, pero a veces no sé la traducción exacta de algo.
|
| // Sé que puedo usar el traductor, pero normalmente cuando programo pongo todo mi foco en el código
|
| // y no tengo otras aplicaciones abiertas.
|
| // Debido a esto, dejo a decisión de cada uno cómo nombrar las variables.
|
| // Actualmente creo que me inclinaría más por el español.
|
|
|
|
|
| // Nota final: Ciertamente no todo el codigo que he escrito sigue las convenciones mencionadas, y eso se debe que SOLO en los ultimos meses he estado aplicando eso
|
| // Anteriormente NO programaba con convenciones... por eso veran que el codigo de MQLArticles y de otros repos.. no siguen EXACTAMENTE todas las convenciones mencionadas
|
| // Algunos las siguien pero al 70-50& y otros codigo no, depende de su ANTIGUEDAD.
|
| //+------------------------------------------------------------------+
|