 
// =====================================================
// Risk.mqh
// RISK + POSITION MANAGEMENT
// =====================================================
#ifndef RISK_MQH
#define RISK_MQH

#include <Trade/Trade.mqh>
extern CTrade trade;

// -----------------------------
// DAILY STATE
// -----------------------------
extern double dayStartEquity;
extern int currentDay;

// -----------------------------
// RESET DAILY
// -----------------------------
void ResetDaily()
{
   MqlDateTime t;
   TimeToStruct(TimeCurrent(), t);

   if(currentDay != t.day)
   {
      currentDay = t.day;
      dayStartEquity = AccountInfoDouble(ACCOUNT_EQUITY);
   }
}

// -----------------------------
// DAILY LOSS CHECK
// -----------------------------
bool DailyLossHit(double limit)
{
   double eq = AccountInfoDouble(ACCOUNT_EQUITY);

   double dd = (dayStartEquity - eq) / dayStartEquity * 100.0;

   return dd >= limit;
}

// -----------------------------
// LOT NORMALIZATION
// -----------------------------
double NormalizeLot(double lot)
{
   double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
   double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
   double step   = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);

   lot = MathMax(minLot, MathMin(lot, maxLot));
   return MathFloor(lot / step) * step;
}

// -----------------------------
// LOT CALC (ATR RISK MODEL)
// -----------------------------
double CalcLot(double riskPercent)
{
   double balance = AccountInfoDouble(ACCOUNT_BALANCE);
   double riskMoney = balance * (riskPercent / 100.0);

   double atr = ATR();
   if(atr <= 0) return 0.01;

   double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
   double tickSize  = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);

   if(tickValue == 0 || tickSize == 0)
      return 0.01;

   double valuePerPoint = tickValue / tickSize;
   double lossPerLot = atr * valuePerPoint;

   if(lossPerLot <= 0)
      return 0.01;

   double lot = riskMoney / lossPerLot;

   return NormalizeLot(lot);
}

#endif
