ARV EA Toolkit
- Bibliotecas
-
Roman Amirov
I’ve been trading Forex for over 5 years. During this time, I’ve tested a lot of third‑party EAs and realized a simple thing: if you want something done right, do it yourself! That’s why, instead of endlessly searching for the “perfect” ready‑made solution, I started turning my own trading ideas - Versión: 1.0
- Activaciones: 5
Una biblioteca MQL5 sin dependencias, compuesta por módulos independientes, para
desarrolladores de Expert Advisors: dimensionamiento de posiciones basado en el riesgo,
, filtro de spread, registro de datos, persistencia de estado y una
máquina de estados de reintentos. Sin estrategia, no hay promesas de beneficios.
---
ARV EA Toolkit es una biblioteca sin dependencias que contiene
para desarrolladores de Asesores Expertos en MQL5. Utiliza solo lo que necesites;
los módulos no dependen unos de otros, salvo por un pequeño
. No contiene ninguna estrategia de trading ni hace ninguna
promesas de rendimiento: es la infraestructura adecuada para TU propia lógica.
Por qué existe
La mayoría de los errores de los EA no están en la señal, sino en la infraestructura:
cálculos erróneos de lotes, stops por debajo del mínimo del bróker, acumulación de posiciones,
no tener en cuenta el spread, pérdida de estado al recargar, lógica de cierre inestable. Esta
biblioteca te ofrece componentes probados precisamente para esas tareas.
Módulos (agrupados por área)
RIESGO Y EJECUCIÓN
* ARV_RiskSizer.mqh (CARVRiskSizer) cálculo del lote a partir del porcentaje de riesgo y del capital en riesgo.
* ARV_StopBuilder.mqh (CARVStopBuilder): crea y valida SL/TP, distancia mínima del bróker.
* ARV_SpreadFilter.mqh (CARVSpreadFilter): compara el spread actual con el límite.
* ARV_RiskToolkit.mqh (CARVRiskToolkit): interfaz que agrupa los tres anteriores + controles de posición.
* ARV_CloseRetry.mqh (CARVCloseRetry, IARVRetryableOperation) retroceso exponencial
y escalado para operaciones de cierre/orden.
DIAGNÓSTICOS Y ESTADO
* Logger.mqh (CARVLogger) registrador de consola/CSV de 4 niveles.
* ARV_Diagnostic.mqh (CARVDiagnostic) flujos CSV tipados (instantánea de la barra + eventos).
* StateStore.mqh (CARVStateStore) persistencia de clave/valor sobre el latido del propietario de GlobalVariable
+ señal de vida del propietario (protección de instancia única).
UTILIDADES DE MERCADO
* ARV_SymbolUtils.mqh (CARVSymbolUtils) especificaciones de símbolos almacenadas en caché + normalización de precios/volúmenes.
* ARV_TimeUtils.mqh (CARVTimeUtils) sesiones (GMT), ventana de fin de semana, nueva barra, tiempo de espera.
* RegimeGate.mqh (CARVRegimeGate) ATR + deriva de la SMA + sigma/mu + filtro de tiempo de espera.
NÚCLEO (compartido)
* ARV_Defines.mqh niveles de registro, códigos de resultado, prefijos, señal de vida.
Ejemplos incluidos (MQL5\Experts\ARV\)
* RiskToolkitDemo.mq5 - cálculo del riesgo, stop ATR, filtro de spread, protección de posición única.
* ARV_MinimalGrid.mq5 - Logger + StateStore + RiskToolkit + TimeUtils (lote fijo, stop de capital).
* ARV_Momentum.mq5 - RegimeGate + TimeUtils + RiskToolkit + CloseRetry + Diagnostic.
(los ejemplos son demostraciones del uso de la API, NO estrategias)
Ejemplo rápido
#include <ARV\ARV_RiskToolkit.mqh>
CARVRiskToolkit risk;
risk.Init(_Symbol, 30); // límite de spread, en puntos
double lot = risk.LotForRisk(_Symbol, 1.0, atr * 2.0);
double sl, tp;
risk.BuildStops(_Symbol, +1, ask, atr * 2.0, atr * 4.0, sl, tp);
if(!CARVRiskToolkit::HasPosition(_Symbol, InpMagic) && risk.SpreadOK())
trade.Buy(lot, _Symbol, 0.0, sl, tp, "comentario");
Referencia de la API (superficie pública; firmas abreviadas, declaraciones completas en los encabezados)
Enumeraciones:
enum ENUM_LOG_LEVEL; // LOG_ERROR, LOG_WARN, LOG_INFO, LOG_DEBUG
enum ENUM_ARV_RESULT; // ARV_OK, ARV_ERR_PARAM, ARV_ERR_INIT, ARV_ERR_IO, ARV_ERR_MARGIN, ARV_ERR_DUPLICATE
Clases:
CARVLogger; CARVStateStore; CARVRegimeGate;
CARVSymbolUtils; CARVRiskSizer; CARVStopBuilder; CARVSpreadFilter;
CARVRiskToolkit; CARVTimeUtils; CARVCloseRetry; CARVDiagnostic;
IARVRetryableOperation; struct ARVBarSnapshot;
Funciones clave:
// Riesgo y ejecución
static double CARVRiskSizer::ForPercentRisk(string symbol, double equity, double riskPct, double slDistance);
static double CARVRiskSizer::ForFixedLot(string símbolo, double lote);
static double CARVRiskSizer::LossPerLot(string symbol, double slDistance);
static double CARVStopBuilder::MinDistance(string symbol);
static bool CARVStopBuilder::BuildStops(string símbolo, int dirección, double precio de entrada, double distancia_stop_loss, double distancia_take_profit, double &stop_loss, double &take_profit);
static bool CARVStopBuilder::BuildATRStop(string símbolo, int dir, double entrada, double atr, double mult, double &sl);
static bool CARVStopBuilder::ValidateStop(string símbolo, double entrada, double stop, int dir);
bool CARVSpreadFilter::IsSpreadOK() const;
int CARVSpreadFilter::CurrentSpread() const;
// Fachada + controles de posición
void CARVRiskToolkit::Init(string símbolo, int puntos de spread máximos = 0);
double CARVRiskToolkit::LotForRisk(string symbol, double riskPct, double slDistance) const;
double CARVRiskToolkit::LotFixed(string símbolo, double lote) const;
bool CARVRiskToolkit::BuildStops(string símbolo, int dir, double entrada, double distancia_sl, double distancia_tp, double &sl, double &tp) const;
bool CARVRiskToolkit::StopsDistanceOk(string símbolo, int dir, double entrada, double sl, double tp) const;
static int CARVRiskToolkit::CountPositions(string símbolo, long magic);
static bool CARVRiskToolkit::HasPosition(string symbol, long magic);
// Especificaciones y normalización de símbolos (singleton)
static CARVSymbolUtils *CARVSymbolUtils::Instance(string symbol = "");
double CARVSymbolUtils::NormalizePrice(double price) const;
double CARVSymbolUtils::NormalizeLot(double lot) const;
bool CARVSymbolUtils::ValidateLot(double lot) const;
// Hora y sesiones (estático)
static datetime CARVTimeUtils::ToGMT(datetime serverTime = 0);
static int CARVTimeUtils::GMTHour(datetime serverTime = 0);
static bool CARVTimeUtils::IsAsianSession(datetime serverTime = 0);
static bool CARVTimeUtils::IsLondonSession(datetime serverTime = 0);
static bool CARVTimeUtils::IsNewYorkSession(datetime serverTime = 0);
static bool CARVTimeUtils::IsLondonNewYorkOverlap(datetime serverTime = 0);
static string CARVTimeUtils::SessionName(datetime serverTime = 0);
static bool CARVTimeUtils::IsWeekendWindow(int friCloseHour, int monResumeHour, datetime serverTime = 0);
static bool CARVTimeUtils::IsNewBar(string symbol, ENUM_TIMEFRAMES tf, datetime &lastBarTime);
static bool CARVTimeUtils::CooldownElapsed(datetime &lastEvent, int seconds);
static int CARVTimeUtils::SecondsUntilGMTHour(int gmtHour);
// Registro
void CARVLogger::Init(string tag = ARV_LOG_DEFAULT_PREFIX, ENUM_LOG_LEVEL minLevel = LOG_INFO, bool console = true);
bool CARVLogger::EnableCsv(string fileName, string header = "time,level,tag,message");
void CARVLogger::Log(ENUM_LOG_LEVEL nivel, string mensaje, string etiqueta = "");
void CARVLogger::Error(string mensaje, string etiqueta = "");
void CARVLogger::Warning(string mensaje, string etiqueta = "");
void CARVLogger::Info(string mensaje, string etiqueta = "");
void CARVLogger::Debug(string mensaje, string etiqueta = "");
void CARVLogger::Shutdown();
// Persistencia del estado + protección de instancia única
void CARVStateStore::Init(string nameSpace);
static string CARVStateStore::MakeNamespace(long login, string symbol, long magic);
void CARVStateStore::SetDouble(string nombre, double valor);
double CARVStateStore::GetDouble(string name, double def = 0.0) const;
void CARVStateStore::MarkAlive();
bool CARVStateStore::IsAlive(int maxAgeSec = ARV_INSTANCE_HEARTBEAT_SEC) const;
// Puerta de régimen
bool CARVRegimeGate::Init(string símbolo, ENUM_TIMEFRAMES tf, int atrPeriod, int maPeriod, int cooldownBars, string etiqueta);
bool CARVRegimeGate::IsFavorable(double referenceDistance, double minRatio, double maxRatio, double minSigmaMu, bool requireTrend);
double CARVRegimeGate::ATR();
// Máquina de estados de reintento
bool CARVCloseRetry::Run(IARVRetryableOperation *op, CARVLogger *log, bool &outEscalated);
bool CARVCloseRetry::Run(IARVRetryableOperation *op, CARVLogger *log = NULL);
// Diagnósticos (CSV)
void CARVDiagnostic::Init(string prefix, string symbol = "", bool immediateFlush = true);
void CARVDiagnostic::Bar(const ARVBarSnapshot &snap);
void CARVDiagnostic::Event(string tipo, string clave1, double val1, string clave2, double val2);
A quién va dirigido
* Desarrolladores de MQL5 que deseen una gestión de riesgos y una estructura técnica fiables sin tener que reescribirlas.
* Vendedores y estudiantes que deseen una implementación de referencia limpia.
Requisitos / compatibilidad
* MetaTrader 5, versión actual de MQL5. Solo incluye elementos estándar.
* Sin DLL, sin red, sin bibliotecas de terceros.
* Se incluye el código fuente completo (.mqh); los ejemplos utilizan únicamente <Trade\Trade.mqh>.
Lo que NO es
* NO es un asesor experto ni una estrategia de trading.
* No ofrece señales, no proporciona ventaja alguna y NO promete beneficios.
* Los resultados del EA de ejemplo son meramente ilustrativos.
Actualizaciones y asistencia
* Versión 1.00. Informes de errores y solicitudes de nuevas funciones a través de los mensajes del producto.
Previsto: solo pequeñas incorporaciones de funciones auxiliares.
