ICTLibraryEasy/Examples/Readme/Defines.mqh

191 lines
18 KiB
MQL5

2026-01-06 16:54:30 -05:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| 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<EFBFBD>mo yo, autor de la librer<EFBFBD>a, considero que se podr<EFBFBD>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<EFBFBD>s r<EFBFBD>pido y f<EFBFBD>cil trabajar
con archivos que est<EFBFBD>n dise<EFBFBD>ados "para cada tarea".
Este EA de ejemplo est<EFBFBD> dividido en 5 archivos:
- Global: En este archivo estar<EFBFBD>n todas las acciones que quiero que se inicien primero al momento de cargar el EA,
como iniciar la librer<EFBFBD>a ICT o configurar el Bar Manager. Este c<EFBFBD>digo siempre est<EFBFBD> por encima de los dem<EFBFBD>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<EFBFBD>tico
de Invalid Pointer).
- Defines: Aqu<EFBFBD> incluir<EFBFBD> todos los archivos necesarios y otras utilidades que hagan falta.
- Functions: Aqu<EFBFBD> coloco todas las funciones extra que utilizar<EFBFBD> la estrategia.
- Main: Aqu<EFBFBD> va la l<EFBFBD>gica del EA, la clase principal.
- EA: Por <EFBFBD>ltimo, aqu<EFBFBD> se incluye todo el c<EFBFBD>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<EFBFBD>s complejos, por ejemplo uno que requiera un panel, crear<EFBFBD>a otra carpeta llamada "Panel".
Y si requiere IA o modelos ONNX, crear<EFBFBD>a otra carpeta: una para la generaci<EFBFBD>n de datos y otra para los modelos ONNX.
Luego, todos esos archivos .mqh los incluir<EFBFBD>a en Defines.mqh. Ahora bien, este dise<EFBFBD>o no funciona con todos los EAs,
as<EFBFBD> que si desean sugerencias, escr<EFBFBD>banme por MQL5, Telegram o Discord. Les podr<EFBFBD>a dar recomendaciones sobre c<EFBFBD>mo estructurar
su proyecto.
Eso s<EFBFBD>, el archivo Global.mqh s<EFBFBD> o s<EFBFBD> les recomiendo que lo tengan, para evitar problemas con instancias globales
que ustedes podr<EFBFBD>an llegar a hacer en el c<EFBFBD>digo.
*/
//+------------------------------------------------------------------+
//| Include |
//+------------------------------------------------------------------+
// En esta secci<EFBFBD>n se ubicar<EFBFBD>n nuestros includes.
// Para este caso en concreto, como no trabajaremos con nada adicional, incluiremos directamente Global.
//
// Ahora ustedes se preguntar<EFBFBD>n: <EFBFBD>cu<EFBFBD>ndo incluir Global en el archivo Defines y cu<EFBFBD>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 <EFBFBD>nico lugar donde se incluir<EFBFBD>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<EFBFBD>:
#include "Global.mqh"
//---
// Luego, para trabajar con las estrategias de una forma m<EFBFBD>s f<EFBFBD>cil, usamos Strategy de MQLArticles
#include <TSN\\MQLArticles\\Strategy\\Main.mqh>
//+------------------------------------------------------------------+
//| Global variables |
//+------------------------------------------------------------------+
// En esta secci<EFBFBD>n se ubicar<EFBFBD>n todas las variables globales que usar<EFBFBD> nuestra estrategia.
// Usualmente suelo colocar aqu<EFBFBD> los conceptos (aunque tambi<EFBFBD>n es v<EFBFBD>lido ponerlos como miembros de la estrategia)
// y la gesti<EFBFBD>n de riesgo.
//
// La idea es definir variables que todos los archivos requieran (por ejemplo, si Functions necesita llamar
// una funci<EFBFBD>n de un concepto, entonces valdr<EFBFBD>a la pena hacerlo global).
//
// Para este EA, instanciaremos (como puntero) <EFBFBD>nicamente la gesti<EFBFBD>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<EFBFBD>mo nombrar sus variables; usen lo que les sea m<EFBFBD>s c<EFBFBD>modo
// y, sobre todo, f<EFBFBD>cil de entender y que les permita programar de manera r<EFBFBD>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<EFBFBD>n |
//+------------------------------------------------------------------+
// Por <EFBFBD>ltimo, agrego esta secci<EFBFBD>n para mencionar el estilo de programaci<EFBFBD>n que se usar<EFBFBD> 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<EFBFBD>digo uniforme
// y no tener diferentes estilos mezclados.
//
// A continuaci<EFBFBD>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<EFBFBD>metro | Prefijo Inp | Tipo: PascalCase
//
// Estilos:
// En la secci<EFBFBD>n Herramientas -> Opciones:
//
/* Para la secci<EFBFBD>n Estilizador:
- Estilo: MetaQuotes
- Sustituir tabulaci<EFBFBD>n por espacios: S<EFBFBD> (marcado)
- Eliminar l<EFBFBD>neas vac<EFBFBD>as: No (desmarcado)
- Insertar espacios luego de la coma y punto y coma: S<EFBFBD> (marcado)
- Insertar espacios alrededor de los operadores: S<EFBFBD> (marcado)
*/
/* Para la secci<EFBFBD>n General:
- Tabulaci<EFBFBD>n: 2 caracteres
- Insertar espacios (marcado)
- Insertar () y los de cierre } ) ] " ' (marcado)
- Resaltar par<EFBFBD>ntesis pareados (marcado)
- Resaltar l<EFBFBD>nea actual (marcado)
- Activar la historia del portapapeles (marcado)
- Lista de nombres tras: 2 caracteres
- Auto-lista de nombres (marcado)
- Sangr<EFBFBD>a autom<EFBFBD>tica (marcado)
- Par<EFBFBD>metros autom<EFBFBD>ticos (marcado)
- N<EFBFBD>meros de l<EFBFBD>neas (marcado)
Para estilizar el c<EFBFBD>digo sin tener que "presionar" en el icono especial, pueden usar
las siguientes teclas: (CTRL + ,)
*/
/* Extra:
- Siempre separo las secciones del c<EFBFBD>digo con "//---"
- Y los headers de funci<EFBFBD>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<EFBFBD>a de las veces s<EFBFBD>.
*/
/* Comentarios:
No siempre los coloco; solo para describir funciones o funcionalidades complejas.
Aqu<EFBFBD> dejo que cada uno decida lo que le parezca mejor.
Por mi parte, me inclino por "pocos, pero <00>tiles" comentarios en el c<EFBFBD>digo.
*/
/* Idioma:
Ciertamente no soy bueno en ingl<EFBFBD>s, as<EFBFBD> que ver<EFBFBD>n que mi c<EFBFBD>digo est<EFBFBD> algo mezclado.
Intento nombrar todo en ingl<EFBFBD>s, pero a veces no s<EFBFBD> la traducci<EFBFBD>n exacta de algo.
S<EFBFBD> que puedo usar el traductor, pero normalmente cuando programo pongo todo mi foco en el c<EFBFBD>digo
y no tengo otras aplicaciones abiertas.
Debido a esto, dejo a decisi<EFBFBD>n de cada uno c<EFBFBD>mo nombrar las variables.
Actualmente creo que me inclinar<EFBFBD>a m<EFBFBD>s por el espa<EFBFBD>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.
*/
//+------------------------------------------------------------------+