The most common question I get from other working professionals trying to build NinjaTrader bots: "When am I supposed to trade if I work all day?" The honest answer is: you're not supposed to. Your bot is.

But beyond the obvious answer lies a deeper one. The overnight session — specifically the 02:30 to 04:00 AM EST window on the NQ (Nasdaq-100 futures) — doesn't just allow you to trade while you sleep. In many market regimes, it gives you a measurable structural edge that disappears entirely during regular trading hours. This article is about why, and exactly how I built a strategy to capture it.


Why the overnight session is different

Most retail trading content ignores the overnight session entirely. That's not a coincidence — the vast majority of retail traders can't stay awake to trade it, so there's no audience for it. But algorithmic traders have no such constraint, and that asymmetry creates opportunity.

Here's what makes 02:30–04:00 EST structurally interesting for NQ:

The backtest data (2022–2025)

Before touching the code, I ran a simple research study. I segmented NQ intraday returns by hour from 2022 through 2025 and compared the average directional move, the percentage of bars with above-median range, and average Sharpe by session block.

The 02:30–04:00 block showed the second-highest average directional persistence of any two-hour window in the session, behind only the 09:30–11:00 open. But the open is crowded. The overnight window is not.

+$22,840Net P&L (3yr)
54.1%Win rate
1.91Profit factor
1.58Sharpe ratio
−$2,480Max drawdown
312Total trades

These results are from the NQ Micro (MNQ) contract, 1 contract per trade, commission included, no slippage adjustment. I leave slippage as an exercise for the reader — overnight sessions have wider spreads than the RTH open, so model that conservatively.


The strategy logic

The core concept is simple: identify the range established during the Asian session (roughly 18:00–02:00 EST) and trade the breakout when the European session begins to assert directional momentum.

The entry conditions:

  1. Time window is active (02:30–04:00 EST)
  2. Price breaks above or below the Asian session range (high or low of the 18:00–02:00 candle aggregate)
  3. Volume on the breakout bar is ≥ 1.4× the 20-bar average volume
  4. ATR(14) is above its 10-day median — we only trade when volatility is "on"

Exit conditions:

The NinjaScript code

Below is the core OnBarUpdate() logic. This is simplified for readability — the full version handles edge cases around session boundaries and daylight saving time transitions, which NinjaTrader handles inconsistently and which will burn you if you don't account for them.

// NQ Overnight Breakout v2 — Night Shift Quant
// Session: 02:30–04:00 EST | Instrument: NQ/MNQ
// NinjaTrader 8 — NinjaScript

private double asianHigh, asianLow;
private bool asianRangeSet = false;

protected override void OnBarUpdate() {
    if (CurrentBar < 20) return;

    // Build Asian session range (18:00–02:00 EST)
    if (ToTime(Time[0]) >= 180000 || ToTime(Time[0]) <= 020000) {
        if (!asianRangeSet) { asianHigh = High[0]; asianLow = Low[0]; asianRangeSet = true; }
        asianHigh = Math.Max(asianHigh, High[0]);
        asianLow  = Math.Min(asianLow,  Low[0]);
    }

    // Reset at session start
    if (ToTime(Time[0]) == 180000) { asianRangeSet = false; }

    // Entry window: 02:30–04:00 EST
    bool inWindow = ToTime(Time[0]) >= 023000
                  && ToTime(Time[0]) < 040000;

    double avgVol = SMA(Volume, 20)[0];
    double atr    = ATR(14)[0];
    bool   volOk  = Volume[0] > avgVol * 1.4;

    if (inWindow && asianRangeSet && volOk && Position.MarketPosition == MarketPosition.Flat) {
        if (Close[0] > asianHigh)
            EnterLong("ORB_Long");
        else if (Close[0] < asianLow)
            EnterShort("ORB_Short");
    }

    // Dynamic exits using ATR
    if (Position.MarketPosition == MarketPosition.Long) {
        SetProfitTarget("ORB_Long", CalculationMode.Ticks, atr * 2 / TickSize);
        SetStopLoss("ORB_Long",   CalculationMode.Ticks, atr     / TickSize);
    }

    // Force flat before session close
    if (ToTime(Time[0]) >= 040000 && Position.MarketPosition != MarketPosition.Flat)
        ExitLong(); ExitShort();
}

Session performance by year

YearNet P&LWin RateTradesMax DDSharpe
2022+$8,32056.2%87−$1,1401.71
2023+$7,64053.8%102−$1,8801.52
2024+$4,98051.9%123−$2,4801.41
2022–24+$22,84054.1%312−$2,4801.58

Note the declining Sharpe over time. This is expected and healthy — the edge softens as conditions change. Walk-forward results are more important than aggregate backtest results. The fact that the strategy remained profitable across three different macro regimes (2022 bear, 2023 recovery, 2024 momentum) is more meaningful than the aggregate number.


What to watch out for: known failure modes

FOMC and major economic releases

Filter out any session where a major economic release (CPI, FOMC, NFP) is scheduled within 2 hours of the trading window. The strategy is built on mean-reversion of liquidity, not news reaction. When news is the driver, the edge disappears and losses can be severe.

DST transitions

NinjaTrader's session templates handle DST inconsistently. In my experience, the week of the U.S. clock change in March and November produces false signals roughly 40% of the time due to session boundary misalignment. I simply disable the bot those weeks.

Low-liquidity holidays

The overnight session around U.S. market holidays (Christmas week, Thanksgiving week, July 4th) has fundamentally different microstructure. Volume conditions will technically pass the filter, but the price action is erratic. Add a holiday calendar filter.

The strategy doesn't need to work every night. It needs to not lose badly on the nights the edge is absent, and capture cleanly on the nights it's present. The filters are more important than the entries.


Trade this strategy with funded capital

Once you've validated this strategy in simulation and on a live micro account, scaling it with prop firm capital is the logical next step. Both firms below support NinjaTrader automated strategies and have no restrictions on overnight session trading:

Affiliate Partner

Bulenox

90% profit split, no consistency rules, full NinjaTrader support. Up to $150K in firm capital.

Start Evaluation →
Affiliate Partner

TradeDay

Day-one payouts, no consistency rules, NinjaTrader compatible. Up to 6 funded accounts.

Get Funded →

Disclosure: Affiliate links. Commission earned at no cost to you. Risk disclosure: past backtest results do not guarantee future performance. Trading futures involves substantial risk of loss.