 
// =====================================================
// Filters.mqh
// MARKET + EXECUTION FILTERS
// =====================================================

#ifndef FILTERS_MQH
#define FILTERS_MQH

// -----------------------------
// VOLUME FILTER
// -----------------------------
bool StrongVolume()
{
   double avg = 0;

   for(int i=1; i<=10; i++)
      avg += iVolume(_Symbol, PERIOD_CURRENT, i);

   avg /= 10.0;

   return iVolume(_Symbol, PERIOD_CURRENT, 0) > avg * 1.3;
}

// -----------------------------
// SPREAD FILTER
// -----------------------------
bool SpreadTooHigh(double atr, double limit)
{
   double spread = SymbolInfoInteger(_Symbol, SYMBOL_SPREAD) * _Point;

   return spread > (atr * limit);
}

// -----------------------------
// REGIME DETECTOR
// -----------------------------
int DetectRegime()
{
   double atr = ATR();

   bool trendUp =
      H4_H(1) > H4_H(2) &&
      H4_L(1) > H4_L(2);

   bool trendDown =
      H4_H(1) < H4_H(2) &&
      H4_L(1) < H4_L(2);

   double range = H(1) - L(1);

   double avgRange = 0;
   for(int i=1; i<=10; i++)
      avgRange += (H(i) - L(i));

   avgRange /= 10.0;

   bool lowVol = range < atr * 0.7;
   bool unstable = range < avgRange * 0.6;

   if(lowVol && unstable)
      return 0; // CHOP

   if(trendUp || trendDown)
      return 1; // TREND

   return 2; // TRANSITION
}

#endif
