145 lines
5.1 KiB
MQL5
145 lines
5.1 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| EA_DearMQL5_Demo.mq5 |
| |||
//| Copyright 2026, DearMQL5 GUI Engine |
| |||
//| https://www.mql5.com |
| |||
//+------------------------------------------------------------------+
| |||
#property copyright "Copyright 2026, DearMQL5 GUI Engine"
| |||
#property link "https://www.mql5.com"
| |||
#property version "1.00"
| |||
| |||
#include "..\UI.mqh"
| |||
| |||
// State variables for Demo GUI
| |||
bool g_ui_open = true;
| |||
bool g_auto_trade = true;
| |||
bool g_news_filter = true;
| |||
bool g_trailing_active = false;
| |||
double g_risk_pct = 1.0;
| |||
double g_max_slippage_pts = 20.0;
| |||
int g_daily_loss_limit = 500;
| |||
int g_current_daily_loss = 160;
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Expert initialization function |
| |||
//+------------------------------------------------------------------+
| |||
int OnInit()
| |||
{
| |||
// Enable mouse movement messages on chart
| |||
ChartSetInteger(0, CHART_EVENT_MOUSE_MOVE, true);
| |||
| |||
// Initialize DearMQL5 Canvas GUI
| |||
if(!UI::Init(0, 0))
| |||
{
| |||
Print("[DearMQL5] Falha ao inicializar o Canvas da GUI.");
| |||
return(INIT_FAILED);
| |||
}
| |||
| |||
Print("[DearMQL5] Inicializado com sucesso.");
| |||
return(INIT_SUCCEEDED);
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Expert deinitialization function |
| |||
//+------------------------------------------------------------------+
| |||
void OnDeinit(const int reason)
| |||
{
| |||
UI::Shutdown();
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| ChartEvent function |
| |||
//+------------------------------------------------------------------+
| |||
void OnChartEvent(const int id,
| |||
const long &lparam,
| |||
const double &dparam,
| |||
const string &sparam)
| |||
{
| |||
// Feed input events into DearMQL5 pipeline
| |||
UI::OnChartEvent(id, lparam, dparam, sparam);
| |||
| |||
// Re-render frame immediately on mouse interaction for zero-latency response
| |||
if(id == CHARTEVENT_MOUSE_MOVE || id == CHARTEVENT_CLICK)
| |||
{
| |||
RenderGUI();
| |||
}
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| OnTick function |
| |||
//+------------------------------------------------------------------+
| |||
void OnTick()
| |||
{
| |||
// Update HUD on incoming market ticks
| |||
RenderGUI();
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Renders the immediate-mode HUD |
| |||
//+------------------------------------------------------------------+
| |||
void RenderGUI()
| |||
{
| |||
UI::NewFrame();
| |||
| |||
if(UI::Begin("PROP FIRM TERMINAL — DearMQL5", g_ui_open, 20, 30, 280, 420))
| |||
{
| |||
// --- Section 1: Prop Firm Account Metrics ---
| |||
double equity = AccountInfoDouble(ACCOUNT_EQUITY);
| |||
double balance = AccountInfoDouble(ACCOUNT_BALANCE);
| |||
double pnl = AccountInfoDouble(ACCOUNT_PROFIT);
| |||
| |||
UI::Text(StringFormat("Balance: $%.2f", balance));
| |||
UI::SameLine();
| |||
UI::Text(StringFormat("Equity: $%.2f", equity));
| |||
| |||
uint pnl_color = (pnl >= 0) ? 0xFF98C379 : 0xFFE06C75;
| |||
UI::TextColored(StringFormat("Floating PnL: $%.2f", pnl), pnl_color);
| |||
| |||
// Daily Drawdown Progress Bar
| |||
double dd_fraction = (double)g_current_daily_loss / (double)g_daily_loss_limit;
| |||
string dd_overlay = StringFormat("Daily Loss: $%d / $%d (%.0f%%)", g_current_daily_loss, g_daily_loss_limit, dd_fraction * 100.0);
| |||
UI::ProgressBar(dd_fraction, 0, 16, dd_overlay, true);
| |||
| |||
UI::Separator();
| |||
| |||
// --- Section 2: Trading Actions ---
| |||
UI::Text("Execução Rápida:");
| |||
if(UI::ButtonColor("BUY MARKET", 0xFF00A389, 126, 26))
| |||
{
| |||
Print(">> BOTÃO CLICADO: BUY MARKET");
| |||
}
| |||
UI::SameLine();
| |||
if(UI::ButtonColor("SELL MARKET", 0xFFD19A66, 126, 26))
| |||
{
| |||
Print(">> BOTÃO CLICADO: SELL MARKET");
| |||
}
| |||
| |||
if(UI::ButtonColor("PANIC CLOSE ALL", 0xFFE06C75, 260, 26))
| |||
{
| |||
Print(">> ALERTA: PANIC CLOSE ALL PRESSIONADO!");
| |||
}
| |||
| |||
UI::Separator();
| |||
| |||
// --- Section 3: Risk Controls ---
| |||
UI::Text("Controles de Risco & Slippage:");
| |||
UI::SliderFloat("Risco %", g_risk_pct, 0.25, 3.0, "%.2f%%");
| |||
UI::SliderFloat("Max Slip", g_max_slippage_pts, 5.0, 50.0, "%.0f pts");
| |||
| |||
UI::Toggle("Auto-Trading Ativo", g_auto_trade);
| |||
UI::Toggle("Filtro de Notícias", g_news_filter);
| |||
UI::Toggle("Trailing Stop Dinâmico", g_trailing_active);
| |||
| |||
// --- Section 4: Diagnostics Header ---
| |||
if(UI::CollapsingHeader("Diagnóstico do Motor GUI", false))
| |||
{
| |||
UI::Text(StringFormat("Tempo de Render: %.3f ms", UDiagnostics::GetLastFrameMs()));
| |||
UI::Text(StringFormat("Draw Calls: %u", UDiagnostics::GetDrawCallsCount()));
| |||
UI::Text(StringFormat("Mouse: (%d, %d)", UInputState::MouseX(), UInputState::MouseY()));
| |||
}
| |||
| |||
}
| |||
| |||
UI::End();
| |||
| |||
UI::Render();
| |||
}
|