2026-06-09 05:44:15 +02:00 | | | //+------------------------------------------------------------------+
|
| | | //| Motivated |
|
| | | //| Copyright 2025, MetaQuotes Ltd. |
|
| | | //| https://www.mql5.com |
|
| | | //+------------------------------------------------------------------+
|
| | | #include "_includeEa.mqh"
|
2026-06-10 18:31:08 +02:00 | | | #include "Graphics/VisualSystem.mqh"
|
| | | #include "Systems/EventBus.mqh"
|
| | | #include "Graphics/VisualLevels.mqh"
|
| | |
|
| | | #include "ListenersBoot.mqh"
|
| | |
|
| | | EventBus bus;
|
| | | VisualSystem *g_visuals = NULL;
|
| | | ListenersBoot *listenersBoot = NULL;
|
2026-06-09 05:44:15 +02:00 | | |
|
| | | EAConfig config;
|
| | | _includeEa *ea;
|
| | |
|
| | | //--- Inputs
|
| | | input group " "
|
| | | input int TradeCount = 1; // Trades Count
|
| | | input int TradeDuration = 3; // Trade Duration
|
| | | input double Lots = 0.001; // Lot Size
|
| | | input int Stop_Loss = 100000; // Stop Loss (points)
|
| | | input int Take_Profit = 400000; // Take Profit (points)
|
| | | input ulong MagicNumber = 123456; // Magic Number
|
| | |
|
| | | //--- Trade Direction Control
|
| | | //input group "Trade Direction Control"
|
| | | input bool Allow_Buy = true; // Allow Buy Trades
|
| | | input bool Allow_Sell = true; // Allow Sell Trades
|
| | |
|
| | | //--- Risk Management
|
| | | //input group " "
|
| | | input bool UseMM = true; // Use Money Management
|
| | | input double RiskPercent = 5; // Risk Percentage
|
| | | input group " "
|
| | | //+------------------------------------------------------------------+
|
| | | //| Expert initialization function |
|
| | | //+------------------------------------------------------------------+
|
| | | int OnInit()
|
| | | {
|
| | | ObjectsDeleteAll(0);
|
| | | SetAetherNoirTheme(); // dark, muted, alien
|
| | |
|
| | | config.name = _Symbol;
|
| | | config.enabled = true;
|
| | | config.tradeDuration = TradeDuration;
|
| | | config.tradeCount = TradeCount;
|
| | | config.lotSize = Lots;
|
| | | config.stopLoss = Stop_Loss;
|
| | | config.takeProfit = Take_Profit;
|
| | | config.magicNumber = MagicNumber;
|
| | | config.allowBuy = Allow_Buy;
|
| | | config.allowSell = Allow_Sell;
|
| | | config.useMM = UseMM;
|
| | | config.riskPercent = RiskPercent;
|
| | | config.hidden = false;
|
| | | config.timeframe = PERIOD_CURRENT;
|
| | |
|
| | | ea = new _includeEa(config);
|
2026-06-10 18:31:08 +02:00 | | |
|
2026-06-10 23:03:10 +02:00 | | | g_visuals = new VisualSystem();
|
2026-06-10 18:31:08 +02:00 | | | g_visuals.SetMinZoomForTexts(2); // Hide text if zoomed out too far (0-5 scale)
|
| | | g_visuals.SetAutoUpdate(true); // Automatically recalculate view bounds on render
|
| | |
|
2026-06-10 23:03:10 +02:00 | | | listenersBoot = new ListenersBoot(bus, g_visuals);
|
2026-06-09 05:44:15 +02:00 | | | //---
|
| | | return(ea.OnInit());
|
| | | }
|
| | | //+------------------------------------------------------------------+
|
| | | //| Expert deinitialization function |
|
| | | //+------------------------------------------------------------------+
|
| | | void OnDeinit(const int reason)
|
| | | {
|
| | | delete ea;
|
2026-06-10 18:31:08 +02:00 | | | delete g_visuals;
|
2026-06-10 23:03:10 +02:00 | | | delete listenersBoot;
|
2026-06-10 18:31:08 +02:00 | | | // Force a chart redraw to clear the visual objects immediately
|
| | | ChartRedraw();
|
2026-06-09 05:44:15 +02:00 | | | }
|
| | | //+------------------------------------------------------------------+
|
| | | //| Expert tick function |
|
| | | //+------------------------------------------------------------------+
|
| | | void OnTick()
|
| | | {
|
| | | ea.OnTick();
|
2026-06-10 23:03:10 +02:00 | | | // g_visuals.Render();
|
2026-06-10 18:31:08 +02:00 | | | }
|
| | | //+------------------------------------------------------------------+
|
| | | //| ChartEvent function |
|
| | | //+------------------------------------------------------------------+
|
| | | void OnChartEvent(const int id,
|
| | | const long &lparam,
|
| | | const double &dparam,
|
| | | const string &sparam)
|
| | | {
|
| | |
|
| | | // Pass the event to the visual system so it can update its bounds if the user zooms or scrolls
|
| | | g_visuals.OnChartEvent(id, lparam, dparam, sparam);
|
2026-06-09 05:44:15 +02:00 | | | }
|
| | | //+------------------------------------------------------------------+
|
| | | //| ÆTHER NOIR THEME – dark, muted, powdery alien luxury |
|
| | | //+------------------------------------------------------------------+
|
| | | void SetAetherNoirTheme(color bg = C'38,36,34') // warm charcoal dust
|
| | | {
|
| | | const long cid = 0;
|
| | |
|
| | | // --- Muted dark palette: no glow, only soft dusty whispers ---
|
| | | color panel = bg; // 38,36,34
|
| | | color gridSoft = C'52,50,48'; // barely visible grid
|
| | | color fg = C'185,180,175'; // soft limestone text (not white)
|
| | | color fgMuted = C'130,125,120'; // warm stone grey
|
| | | color bull = C'130,148,138'; // muted sage-grey (not green)
|
| | | color bear = C'165,140,145'; // dusty rose-mauve (not pink)
|
| | | color bidLine = C'140,145,155'; // faded steel blue-grey
|
| | | color askLine = C'160,150,160'; // ash lavender
|
| | | color stopLevel = C'120,130,140'; // muted slate
|
| | | color lastLine = C'180,165,150'; // soft blush-beige
|
| | |
|
| | | // --- Chart background / foreground ---
|
| | | ChartSetInteger(cid, CHART_COLOR_BACKGROUND, panel);
|
| | | ChartSetInteger(cid, CHART_COLOR_FOREGROUND, fg);
|
| | | ChartSetInteger(cid, CHART_COLOR_GRID, clrNONE);
|
| | | ChartSetInteger(cid, CHART_COLOR_CHART_LINE, fgMuted);
|
| | |
|
| | | // --- Candles / bars ---
|
| | | ChartSetInteger(cid, CHART_COLOR_CANDLE_BULL, bull);
|
| | | ChartSetInteger(cid, CHART_COLOR_CANDLE_BEAR, bear);
|
| | | ChartSetInteger(cid, CHART_COLOR_CHART_UP, bull);
|
| | | ChartSetInteger(cid, CHART_COLOR_CHART_DOWN, bear);
|
| | |
|
| | | // --- Market lines ---
|
| | | ChartSetInteger(cid, CHART_COLOR_BID, bidLine);
|
| | | ChartSetInteger(cid, CHART_COLOR_ASK, askLine);
|
| | | ChartSetInteger(cid, CHART_COLOR_LAST, lastLine);
|
| | | ChartSetInteger(cid, CHART_COLOR_STOP_LEVEL, stopLevel);
|
| | |
|
| | | // --- Volumes (hidden by default) ---
|
| | | ChartSetInteger(cid, CHART_COLOR_VOLUME, C'90,95,90');
|
| | |
|
| | | // --- Clean, silent interface ---
|
| | | ChartSetInteger(cid, CHART_SHOW_GRID, false);
|
| | | ChartSetInteger(cid, CHART_SHOW_VOLUMES, CHART_VOLUME_HIDE);
|
| | | ChartSetInteger(cid, CHART_SHOW_ONE_CLICK, false);
|
| | | ChartSetInteger(cid, CHART_SHOW_TICKER, false);
|
| | | ChartSetInteger(cid, CHART_SHOW_PERIOD_SEP, false);
|
| | |
|
2026-06-23 21:44:37 +02:00 | | | ChartSetInteger(cid, CHART_SCALE, 2);
|
| | | // ChartSetInteger(cid, CHART_AUTOSCROLL, true);
|
| | | // ChartSetInteger(cid, CHART_SHIFT, true);
|
2026-06-09 05:44:15 +02:00 | | | ChartSetInteger(cid, CHART_SCALEFIX, false);
|
| | |
|
| | | ChartRedraw(cid);
|
| | |
|
| | | // Alien signature – muted and deliberate
|
| | | AetherNoirTag(cid, C'155,150,148'); // soft grey-taupe
|
| | | }
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| Æther Noir HUD Tag – "I whisper in the dark" |
|
| | | //+------------------------------------------------------------------+
|
| | | void AetherNoirTag(const long cid, color textColor)
|
| | | {
|
| | | const string name = "AETHER_NOIR_TAG";
|
| | |
|
| | | if(ObjectFind(cid, name) < 0)
|
| | | {
|
| | | ObjectCreate(cid, name, OBJ_LABEL, 0, 0, 0);
|
| | | ObjectSetInteger(cid, name, OBJPROP_CORNER, CORNER_LEFT_LOWER);
|
| | | ObjectSetInteger(cid, name, OBJPROP_XDISTANCE, 16);
|
| | | ObjectSetInteger(cid, name, OBJPROP_YDISTANCE, 16);
|
| | | ObjectSetInteger(cid, name, OBJPROP_SELECTABLE, false);
|
| | | ObjectSetInteger(cid, name, OBJPROP_HIDDEN, true);
|
| | | ObjectSetInteger(cid, name, OBJPROP_ZORDER, 500);
|
| | | }
|
| | |
|
| | | // Refined, light font – no harshness
|
| | | ObjectSetString(cid, name, OBJPROP_FONT, "Segoe UI Semilight");
|
| | | ObjectSetInteger(cid, name, OBJPROP_FONTSIZE, 11);
|
| | | ObjectSetInteger(cid, name, OBJPROP_COLOR, textColor);
|
| | |
|
| | | // Tagline: dark, muted, structural alien
|
| | | ObjectSetString(cid, name, OBJPROP_TEXT,
|
2026-06-23 21:44:37 +02:00 | | | "◈ ÆTHER NOIR • muted:structure");
|
2026-06-09 05:44:15 +02:00 | | |
|
| | | ChartRedraw(cid);
|
| | | }
|
| | | //+------------------------------------------------------------------+
|
| | | //+------------------------------------------------------------------+
|