190 Zeilen
18 KiB
MQL4
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.
|
|
*/
|
|
//+------------------------------------------------------------------+
|