ICTLibraryEasy/Examples/Readme/Defines.mqh
2026-01-06 16:54:30 -05:00

190 Zeilen
18 KiB
MQL4

//+------------------------------------------------------------------+
//| 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\\Strategy\\Main.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 fvg.
CRiskManagemet* g_risk;
CFvgBar g_fvg;
// 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.
*/
//+------------------------------------------------------------------+