How do you handle range-based EAs during low volatility periods?

 
Hello everyone,

I am testing a range-based Expert Advisor on a few instruments.
The EA avoids overtrading and stays inactive during low-volatility conditions.

During holiday periods or very quiet sessions, I prefer to keep the EA attached
and let it follow its internal rules rather than interfere manually.

I would like to hear how experienced traders here manage such periods.
Do you keep your EAs running or do you detach them during low volatility?

Thank you for your guidance.
 
Forex Journey:
The EA avoids overtrading and stays inactive during low-volatility conditions.

Add a volume indicator as a filter:

Code Base

Volume Average

Mladen Rakic, 2018.03.12 10:21

Long known volume analysis method.

or a volatility indicator as a filter:

Code Base

ATR Cycles

Ryan L Johnson, 2025.11.08 14:29

A volatility filter based on 3 ATR's: a fast ATR, a middle ATR, and a slow ATR
And regarding holidays...
Forex Journey:
During holiday periods or very quiet sessions, I prefer to keep the EA attached
and let it follow its internal rules rather than interfere manually.

You seem to have already diagnosed the problem with trading the holiday season--low liquidity and extraordinarily erratic price movements. Institutional traders generally thin out starting on the week of U.S. Thanksgiving and don't return until after New Year's Day. A time filter applied from Thanksgiving week through January 31st might do well in your case.

Accurate backtesting can generate a valuable Report that will show you the specific hours, days, and months that are winners versus losers.
 
I agree with adding a volume filter - don't allow a trade if the volume is below the average. Maybe you can also use trend strength filter instead of a volume filter. I don't know which is better.
 

range = (highest - lowest)

if (range > threshold) signal()

 
Conor Mcnamara #:
I agree with adding a volume filter - don't allow a trade if the volume is below the average. Maybe you can also use trend strength filter instead of a volume filter. I don't know which is better.

Code Base

Brooky Trend Strength for MT5

Ryan L Johnson, 2025.04.29 19:52

This indicator calls 3 other subwindow indicators. All files go in your Indicators folder.

 

So as not to leave the time filter implementation like a sea of question marks...

Forum on trading, automated trading systems and testing trading strategies

Issues with TimeHour Error when Coding EA

Ryan L Johnson, 2025.01.30 15:16

Inputs:

input group "---------------------------------------";
input group "Turn trading time filter on/off";
input bool UseTimer = true;
input group "---------------------------------------";
input group "Use personal computer time to filter? ==> if false, broker time is used";
input bool UsePCtime = true;
input group "---------------------------------------";
input group "Set time to enable trading ==> Intraday and overnight are supported";
input string StartTime = "21:00";
input group "---------------------------------------";
input group "Set time to disable trading";
input string StopTime = "16:00";
input group "---------------------------------------";

Variables on global scope:

datetime dLocalTime, dStartTime, dStopTime;
ulong uLocalTime, uStartTime, uStopTime,

In OnTick():

   dStartTime = StringToTime(StartTime);
   uStartTime = ulong(dStartTime);
   
   dStopTime = StringToTime(StopTime);
   uStopTime = ulong(dStopTime);
   
   if(UsePCtime == true)
    {   
     dLocalTime = TimeLocal();
    }
   else
    {
     dLocalTime = TimeCurrent();
    }
    
   uLocalTime = ulong(dLocalTime);

   if(uStartTime < uStopTime) // intraday start trading time is earlier than intraday stop trading time
    {
     if(UseTimer == true)
      {
       if(uLocalTime >= uStartTime
        && uLocalTime < uStopTime)
         {
          runBot = true;
        
          if(timerPrinted != 1)
           {
            Print("Timer is ON. Current time is within set trading times. Bot is ON.");
            timerPrinted = 1;
           }
         }
       else
         {
          runBot = false;
        
          if(timerPrinted != 2)
           {
            Print("Timer is ON. Current time is outside of set trading times. Bot is OFF.");
            CancelOrder();
            timerPrinted = 2;
           }
         }
      }
    }
   
   if(uStartTime > uStopTime) // intraday start trading time is later than intraday stop trading time
    {
     if(UseTimer == true)
      {
       if(uLocalTime >= uStopTime
        && uLocalTime < uStartTime)
         {
          runBot = false;

          if(timerPrinted != 2)
           {
            Print("Timer is ON. Current time is outside of set trading times. Bot is OFF.");
            timerPrinted = 2;
           }
         }
       else
         {
          runBot = true;

          if(timerPrinted != 1)
           {
            Print("Timer is ON. Current time is within set trading times. Bot is ON.");
            timerPrinted = 1;
           }
         }
      }
    }
   
   if(UseTimer == false) 
    {
     runBot = true;
     
     if(timerPrinted != 3)
      {
       Print("Timer is OFF. Bot is ON.");
       timerPrinted = 3;
      }
    }

And then put your trading code inside:

   if(runBot == true)
    {


    //all of your trading code


    }
(I prefer to leave trade exits code outside of the time filter).