ARV EA Toolkit
- Bibliotheken
-
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 - Version: 1.0
- Aktivierungen: 5
Eine abhängigkeitsfreie MQL5-Bibliothek mit unabhängigen Bausteinen für
Entwickler von Expert Advisors: risikobasierte Positionsgrößenbestimmung, Stop-
, Spread-Filter, Protokollierung, Zustandspermanenz und eine
Zustandsmaschine für Wiederholungsversuche. Keine Strategie, keine Gewinnversprechen.
---
Das ARV EA Toolkit ist eine abhängigkeitsfreie Bibliothek mit unabhängigen
Module für MQL5-Expert-Advisor-Entwickler. Verwenden Sie nur das, was Sie benötigen;
die Module sind bis auf einen winzigen gemeinsamen
Header-Datei. Es enthält keine Handelsstrategie und macht keine
Leistungsversprechen – es ist die richtige Grundlage für IHRE eigene Logik.
Warum es existiert
Die meisten EA-Fehler liegen nicht im Signal – sie liegen in der Infrastruktur:
falsche Lot-Berechnung, Stopps unterhalb des Broker-Minimums, Stapelung von Positionen,
das Ignorieren des Spreads, der Verlust des Status beim Neuladen, eine instabile Logik beim Schließen von Positionen. Diese
Bibliothek bietet Ihnen getestete Bausteine genau für diese Aufgaben.
Module (nach Bereichen gruppiert)
RISIKO & AUSFÜHRUNG
* ARV_RiskSizer.mqh (CARVRiskSizer) Lot-Größe basierend auf Risiko-Prozent und Money-at-Risk.
* ARV_StopBuilder.mqh (CARVStopBuilder) SL/TP erstellen/validieren, Mindestabstand beim Broker.
* ARV_SpreadFilter.mqh (CARVSpreadFilter): Aktueller Spread im Vergleich zum Limit.
* ARV_RiskToolkit.mqh (CARVRiskToolkit) Fassade über die drei oben genannten Module + Positionsüberwachung.
* ARV_CloseRetry.mqh (CARVCloseRetry, IARVRetryableOperation) Exponentieller Backoff
Wiederholungsversuch + Eskalation für Schluss- und Ordervorgänge.
DIAGNOSE & STATUS
* Logger.mqh (CARVLogger) 4-stufiger Konsolen-/CSV-Logger.
* ARV_Diagnostic.mqh (CARVDiagnostic) typisierte CSV-Streams (Bar-Snapshot + Ereignisse).
* StateStore.mqh (CARVStateStore) Schlüssel/Wert-Persistenz über GlobalVariable
+ Eigentümer-Heartbeat (Einzelinstanz-Schutz).
MARKT-HILFSPROGRAMME
* ARV_SymbolUtils.mqh (CARVSymbolUtils) zwischengespeicherte Symbolspezifikationen + Preis-/Volumen-Normalisierung.
* ARV_TimeUtils.mqh (CARVTimeUtils) Sitzungen (GMT), Wochenendfenster, neue Kerze, Abkühlphase.
* RegimeGate.mqh (CARVRegimeGate) ATR + SMA-Drift + Sigma/Mu + Cooldown-Filter.
CORE (gemeinsam genutzt)
* ARV_Defines.mqh Protokollstufen, Ergebniscodes, Präfixe, Heartbeat.
Enthaltene Beispiele (MQL5\Experts\ARV\)
* RiskToolkitDemo.mq5 – Risikobegrenzung, ATR-Stop, Spread-Filter, Single-Position-Guard.
* ARV_MinimalGrid.mq5 – Logger + StateStore + RiskToolkit + TimeUtils (festes Lot, Equity-Stop).
* ARV_Momentum.mq5 – RegimeGate + TimeUtils + RiskToolkit + CloseRetry + Diagnostic.
(Die Beispiele sind Demos zur API-Nutzung, KEINE Strategien)
Kurzes Beispiel
#include <ARV\ARV_RiskToolkit.mqh>
CARVRiskToolkit risk;
risk.Init(_Symbol, 30); // Spread-Limit, Punkte
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, "comment");
API-Referenz (öffentliche Schnittstelle; abgekürzte Signaturen, vollständige Deklarationen in den Headern)
Aufzählungen:
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
Klassen:
CARVLogger; CARVStateStore; CARVRegimeGate;
CARVSymbolUtils; CARVRiskSizer; CARVStopBuilder; CARVSpreadFilter;
CARVRiskToolkit; CARVTimeUtils; CARVCloseRetry; CARVDiagnostic;
IARVRetryableOperation; struct ARVBarSnapshot;
Wichtige Funktionen:
// Risiko & Ausführung
static double CARVRiskSizer::ForPercentRisk(string symbol, double equity, double riskPct, double slDistance);
static double CARVRiskSizer::ForFixedLot(string symbol, double lot);
static double CARVRiskSizer::LossPerLot(string symbol, double slDistance);
static double CARVStopBuilder::MinDistance(string symbol);
static bool CARVStopBuilder::BuildStops(string symbol, int dir, double entry, double slDistance, double tpDistance, double &sl, double &tp);
static bool CARVStopBuilder::BuildATRStop(string symbol, int dir, double entry, double atr, double mult, double &sl);
static bool CARVStopBuilder::ValidateStop(string symbol, double entry, double stop, int dir);
bool CARVSpreadFilter::IsSpreadOK() const;
int CARVSpreadFilter::CurrentSpread() const;
// Fassade + Positionssicherungen
void CARVRiskToolkit::Init(string symbol, int maxSpreadPoints = 0);
double CARVRiskToolkit::LotForRisk(string symbol, double riskPct, double slDistance) const;
double CARVRiskToolkit::LotFixed(string symbol, double lot) const;
bool CARVRiskToolkit::BuildStops(string symbol, int dir, double entry, double slDistance, double tpDistance, double &sl, double &tp) const;
bool CARVRiskToolkit::StopsDistanceOk(string symbol, int dir, double entry, double sl, double tp) const;
static int CARVRiskToolkit::CountPositions(string symbol, long magic);
static bool CARVRiskToolkit::HasPosition(string symbol, long magic);
// Symbolspezifikationen und Normalisierung (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;
// Zeit und Handelssitzungen (statisch)
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);
// Protokollierung
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 level, string message, string tag = "");
void CARVLogger::Error(string message, string tag = "");
void CARVLogger::Warning(string message, string tag = "");
void CARVLogger::Info(string message, string tag = "");
void CARVLogger::Debug(string message, string tag = "");
void CARVLogger::Shutdown();
// Zustandserhaltung + Schutz vor Mehrfachinstanzen
void CARVStateStore::Init(string nameSpace);
static string CARVStateStore::MakeNamespace(long login, string symbol, long magic);
void CARVStateStore::SetDouble(string name, double value);
double CARVStateStore::GetDouble(string name, double def = 0.0) const;
void CARVStateStore::MarkAlive();
bool CARVStateStore::IsAlive(int maxAgeSec = ARV_INSTANCE_HEARTBEAT_SEC) const;
// Regime-Gate
bool CARVRegimeGate::Init(string symbol, ENUM_TIMEFRAMES tf, int atrPeriod, int maPeriod, int cooldownBars, string tag);
bool CARVRegimeGate::IsFavorable(double referenceDistance, double minRatio, double maxRatio, double minSigmaMu, bool requireTrend);
double CARVRegimeGate::ATR();
// Zustandsmaschine für Wiederholungsversuche
bool CARVCloseRetry::Run(IARVRetryableOperation *op, CARVLogger *log, bool &outEscalated);
bool CARVCloseRetry::Run(IARVRetryableOperation *op, CARVLogger *log = NULL);
// Diagnose (CSV)
void CARVDiagnostic::Init(string prefix, string symbol = "", bool immediateFlush = true);
void CARVDiagnostic::Bar(const ARVBarSnapshot &snap);
void CARVDiagnostic::Event(string type, string key1, double val1, string key2, double val2);
Für wen ist es gedacht
* MQL5-Entwickler, die eine zuverlässige Risiko-/Plumbing-Implementierung wünschen, ohne diese neu schreiben zu müssen.
* Anbieter/Studierende, die eine saubere Referenzimplementierung wünschen.
Anforderungen / Kompatibilität
* MetaTrader 5, aktuelle MQL5-Version. Nur Standardfunktionen.
* Keine DLLs, kein Netzwerk, keine Bibliotheken von Drittanbietern.
* Vollständiger Quellcode (.mqh) enthalten; Beispiele verwenden ausschließlich <Trade\Trade.mqh>.
Was es NICHT ist
* KEIN Expert Advisor und KEINE Handelsstrategie.
* Keine Signale, kein Vorteil und KEINE Gewinnversprechen.
* Die Ergebnisse der Beispiel-EAs dienen lediglich der Veranschaulichung.
Updates & Support
* Version 1.00. Fehlermeldungen und Feature-Anfragen bitte über die Produktnachrichten.
Geplant: ausschließlich kleinere Ergänzungen von Hilfsfunktionen.
