The rules at a glance
- Market: USDJPY on the 15-minute chart (other yen and Australian dollar pairs work too)
- Range: the high and low of the first two Tokyo hours, 9 to 11 a.m. Tokyo time (05:30 to 07:30 IST, all year: Japan doesn't change its clocks)
- Range size: between 0.15 and 0.5 times the daily ATR (14); skip the day otherwise
- Entry: from 11 a.m. to 2 p.m. Tokyo time (07:30 to 10:30 IST): a candle that reaches the range high (within 0.1 ATR) and closes back below it as a bearish candle; sell at that close (the mirror image at the range low)
- Stop loss: half an ATR beyond the range edge, or at the candle's high (low) if that's further
- Target: the middle of the range; skip the trade if that's less than 1R away
- Stand aside: after a close more than half an ATR outside the range: the market is trending; one trade a day, closed by 3 p.m. Tokyo time (11:30 IST)
Why the Asian session ranges
Most forex volume goes through London and New York. In the Tokyo hours, the euro and the pound are usually quiet, and even the yen often moves in a narrower band than later in the day. With fewer large orders pushing in one direction, prices tend to bounce between a high and a low. A range strategy tries to sell the top of that band and buy the bottom.
This is the opposite of the London breakout, which waits for the price to leave the Asian range at the London open. The two don't clash: this strategy is out of the market by 3 p.m. Tokyo time, before London opens.
The timings in IST
Japan uses Tokyo time all year, three and a half hours ahead of India, so these IST times don't change when Europe and the US move their clocks.
| Tokyo time | IST (all year) | |
|---|---|---|
| Tokyo session opens | 09:00 | 05:30 |
| Tokyo fix (Japanese banks set the day's customer rates) | 09:55 | 06:25 |
| End of the range | 11:00 | 07:30 |
| Trading window | 11:00–14:00 | 07:30–10:30 |
| Close any open trade | 15:00 | 11:30 |
| London opens (for reference) | 16:00 or 17:00 | 12:30 or 13:30 |
The Tokyo fix at 9:55 a.m. Tokyo time falls inside the range hours. Yen pairs can move around it, which is one reason the range is measured over two hours rather than one.
The rules, step by step
1. Mark the first two Tokyo hours
On a 15-minute USDJPY chart, mark the highest high and lowest low from 9 to 11 a.m. Tokyo time.
2. Check the range size
The range must be between 0.15 and 0.5 times the daily ATR. A tiny range leaves no room between the edge and the middle; a huge one suggests the day is already trending. The script reads the daily ATR up to yesterday.
3. Fade a touch of the edge
From 11 a.m. to 2 p.m. Tokyo time, wait for a candle that reaches the range high (within a tenth of the 15-minute ATR) and closes back below it as a bearish candle. Sell at that close. At the range low, it's the mirror image: a bullish candle that closes back above the low.
4. Stop beyond the edge, target the middle
The stop goes half an ATR above the range high, or at the candle's high if that's further. The target is the middle of the range. If the middle is less than 1R away, skip the trade.
5. Know when to stand aside
If a candle closes more than half an ATR outside the range, the range has broken and the day may be trending: no more fades. One trade a day, and anything still open at 3 p.m. Tokyo time (11:30 IST) is closed.
Worked example: USDJPY, 15-minute chart
The first two Tokyo hours run from 152.160 to 152.560, a range of 40 pips. With a daily ATR of 105 pips, that's inside the 0.15 to 0.5 band. After 11 a.m. the price drifts back up. The 12:00 Tokyo candle (08:30 IST) pokes up to 152.575, above the range high, and closes at 152.497, back inside and lower than it opened. Half the 13.9-pip ATR above the range high puts the stop at 152.629.
| USDJPY short | |
|---|---|
| Entry | 152.497 |
| Stop loss | 152.629, 13.2 pips away |
| Target (middle of the range) | 152.360, 13.7 pips away, just over 1R |
| Pip value | ¥1,000 a lot, about $6.56 at 152.50 |
| Lot size at 1% of $10,000 | $100 ÷ (13.2 pips × $6.56) = 1.155, rounded down to 1.15 lots |
| Loss if the stop is hit | about $100 |
| Profit at the target | ¥15,755, about $103 |
USDJPY slides back towards the middle and reaches it by 13:15 Tokyo time (09:45 IST). The reward here is only about 1R, which is typical of range fades: the target is close, so the strategy needs a high share of winners. On the days the range breaks instead, the stop-out comes quickly.
What breaks a range fade
- Japanese and Australian data. Releases in the Tokyo morning can push the price straight through the range. Check the economic calendar.
- Intervention and policy news. Yen pairs can jump on comments from Japanese officials or a Bank of Japan decision. Range rules don't protect you from that; the stop does.
- Trend days. When the previous New York session ended in a strong move, Tokyo often carries it on. The stand-aside rule is there for those days.
Risk management
- Size from the stop. On USDJPY one pip on one lot is ¥1,000, about $6 to $7 at recent levels, not $10.
- One trade a day. Fading the same range again after a stop-out usually means fading a breakout.
- Watch the spread. Early Tokyo spreads can still be wider than later in the day.
Common mistakes
- Fading every touch. Wait for the close back inside; a candle that closes outside is a breakout, not a fade.
- Holding into London. London's open often breaks the Asian range. Be out by 3 p.m. Tokyo time.
- Using a target past the middle. The far side of the range is reached less often. Test it before using it.
- Trading euro pairs in Tokyo with this method without testing first: they can be quieter still, with wider spreads relative to the range.
Backtest it yourself on TradingView
This page doesn't quote a win rate or a profit figure, and you should be wary of anyone who does without showing the test. Results change with the market, the dates, the data feed and the costs you put in. The honest way is to run the test yourself, and the free script below does the work in a couple of minutes.
- Open the chart. On TradingView, open USDJPY on the 15-minute chart.
- Add the script. Open the Pine Editor from the Pine icon in the panel on the right of the chart (older layouts have it as a tab under the chart), delete the code that's already there, paste this strategy's code and click "Add to chart".
- Put in your costs. Open the strategy's settings and go to Properties. Enter your broker's commission and a little slippage. A test without costs flatters every strategy, and short-term ones most of all.
- Read the Strategy Tester. The panel under the chart shows the net profit, the maximum drawdown, the profit factor, the number of trades and a list of every trade. Click a few trades and check on the chart that each one follows the rules. Trade sizes are shown in units rather than lots: 100,000 units is one lot.
- Change one setting at a time. Compare the range hours (one hour against two), the range size band, the stop distance beyond the edge, and the target at the middle against 0.75 of the way across. Then try AUDUSD and AUDJPY, which are also active in the Tokyo hours.
As a rough guide, don't trust a result with fewer than 100 trades, a profit factor under 1 once costs are in, or a drawdown you couldn't sit through with real money. Settings tuned to look good on one stretch of history often fail on the next, so check the same settings on dates you didn't tune them on, then demo trade the strategy for a few weeks. How much history you can test depends on your TradingView plan: the free plan loads 5,000 candles, which is a few months of 15-minute candles but years of daily ones.
The script sizes each trade from the stop loss and your risk percentage, starts with $10,000 and assumes 1:100 leverage (a 1% margin setting), so the tester doesn't flag margin calls on normal forex trade sizes. Change these under Properties to match your account. By default TradingView fills orders at the open of the candle after the signal, so the fill can differ a little from the signal candle's close.
Download the free Pine Script and PDF
The script is written in Pine Script version 6 for this guide and follows the rules above. It can't read the economic calendar, so skipping news days is up to you. It's free to use, change and share. The PDF is a one-page cheat sheet with the rules, the Tokyo and IST times, a worked example and a checklist, to keep next to your chart.
Show the code (Pine Script v6, 85 lines)
//@version=6
// Asian Session range strategy by PipLedger (https://pipledgerfx.com/asian-session-strategy)
// Marks the high and low of the first two hours of Tokyo trading (9 to 11 a.m. Tokyo time), then fades the edges of that range until 2 p.m. Tokyo time, aiming for the middle of the range.
// Free to use and change. For education and backtesting only; not financial advice.
strategy("PipLedger: Asian Session Range Fade", shorttitle="Asian Range", overlay=true, initial_capital=10000, pyramiding=0, default_qty_type=strategy.fixed, default_qty_value=1, margin_long=1, margin_short=1, currency=currency.USD)
// ---------- Inputs
tz = input.string("Asia/Tokyo", "Session time zone (Japan has no daylight saving)")
rangeSess = input.session("0900-1100", "Range: first two Tokyo hours (Tokyo time)")
tradeSess = input.session("1100-1400", "Trading window (Tokyo time)")
closeHour = input.int(15, "Close any open trade at (hour, Tokyo time)", minval=1, maxval=23)
minRangeD = input.float(0.15, "Skip if the range is narrower than (x daily ATR 14)", minval=0.0, step=0.05)
maxRangeD = input.float(0.5, "Skip if the range is wider than (x daily ATR 14)", minval=0.05, step=0.05)
touchAtr = input.float(0.1, "A touch counts within (x ATR 14) of the edge", minval=0.0, step=0.05)
stopAtr = input.float(0.5, "Stop at least this far beyond the edge (x ATR)", minval=0.0, step=0.1)
breakAtr = input.float(0.5, "No more trades today after a close this far outside the range (x ATR)", minval=0.1, step=0.1)
minRR = input.float(1.0, "Skip if the middle of the range is less than this many R away", minval=0.5, step=0.25)
riskPct = input.float(1.0, "Risk per trade (% of equity)", minval=0.1, maxval=5.0, step=0.1)
// ---------- Helpers
fx = strategy.convert_to_account(1.0) // one unit of the chart's quote currency in account currency (JPY on USDJPY, converted to USD)
calcQty(float entry, float stop) =>
float dist = math.abs(entry - stop)
dist > 0 and not na(fx) ? strategy.equity * riskPct / 100 / (dist * syminfo.pointvalue * fx) : 0.0
atr = ta.atr(14)
dAtr = request.security(syminfo.tickerid, "D", ta.atr(14)[1], lookahead=barmerge.lookahead_on) // daily ATR up to yesterday
inRange = not na(time(timeframe.period, rangeSess, tz))
inTrade = not na(time(timeframe.period, tradeSess, tz))
cutoff = timestamp(tz, year(time, tz), month(time, tz), dayofmonth(time, tz), closeHour, 0)
// ---------- Range
var float rHigh = na
var float rLow = na
var bool done = false
if inRange and not inRange[1]
rHigh := high
rLow := low
done := false
else if inRange
rHigh := math.max(rHigh, high)
rLow := math.min(rLow, low)
mid = (rHigh + rLow) / 2
rangeOk = not na(rHigh) and not na(dAtr) and rHigh - rLow >= minRangeD * dAtr and rHigh - rLow <= maxRangeD * dAtr
// a clear close outside the range means the market is trending today: stop fading it
if inTrade and not inRange and (close > rHigh + breakAtr * atr or close < rLow - breakAtr * atr)
done := true
// ---------- Signals: a touch of an edge, then a close back inside, against the edge
canTrade = inTrade and not inRange and not done and rangeOk and strategy.position_size == 0 and time_close < cutoff
shortSl = math.max(high, rHigh + stopAtr * atr)
longSl = math.min(low, rLow - stopAtr * atr)
shortSig = canTrade and high >= rHigh - touchAtr * atr and close < rHigh and close < open and close - mid >= minRR * (shortSl - close)
longSig = canTrade and low <= rLow + touchAtr * atr and close > rLow and close > open and mid - close >= minRR * (close - longSl)
// ---------- Orders
if shortSig
float q = calcQty(close, shortSl)
if q > 0
strategy.entry("Short", strategy.short, qty=q)
strategy.exit("Short exit", "Short", stop=shortSl, limit=mid)
done := true
if longSig
float q = calcQty(close, longSl)
if q > 0
strategy.entry("Long", strategy.long, qty=q)
strategy.exit("Long exit", "Long", stop=longSl, limit=mid)
done := true
// the candle that closes at the cut-off sends the order, so it fills at the cut-off time
if strategy.position_size != 0 and time_close >= cutoff
strategy.close_all(comment="Tokyo cut-off")
// ---------- Chart
plot(rHigh, "Range high", color=color.new(color.red, 0), linewidth=2, style=plot.style_linebr)
plot(rLow, "Range low", color=color.new(color.teal, 0), linewidth=2, style=plot.style_linebr)
plot(mid, "Range middle (target)", color=color.new(color.gray, 30), style=plot.style_linebr)
bgcolor(inRange ? color.new(color.gray, 90) : na, title="Range hours")
plotshape(shortSig, "Fade the high", shape.triangledown, location.abovebar, color.red, size=size.small)
plotshape(longSig, "Fade the low", shape.triangleup, location.belowbar, color.teal, size=size.small)Trading this from India
Residents can trade EURUSD, GBPUSD and USDJPY futures and options on NSE and BSE through a SEBI-registered broker. The contracts are quoted the same way as the spot pair, one lot is 1,000 units of the base currency, and they're cash-settled in rupees. They trade only from 9 a.m. to 7:30 p.m. IST, volumes are thin and not every broker offers them, so check the hours and the spread first. USDJPY futures trade on NSE and BSE, but only from 9 a.m. IST, after this range has formed and half the window has gone, so on an Indian exchange only the second half of the window, 9:00 to 10:30 IST, can be traded. Trading forex or CFDs with offshore online platforms isn't allowed for residents under FEMA, even if the app is easy to download. Details are in is forex trading legal in India.
Related strategies: London breakout, opening range breakout, ICT kill zones, previous day high and low, XAUUSD London session, XAUUSD New York session, New York opening range. All 40 strategies are compared on one page in forex trading strategies.