1 minute price action scalping strategy without indicators
1 minute price action scalping strategy without indicators
Hello scalpers,
from my point of view best 1 inute price action to scalp is go against market.
That means, if market goes down, buy, if goes up sell, but only after it allready moved like 70 percent of typical difference in high low.
Plus i like to use cost average effect, when i do not open only one trade at one time. So i scalp in some predefined range with mental stop loss.
What are your ideas?
from my point of view best 1 inute price action to scalp is go against market.
That means, if market goes down, buy, if goes up sell, but only after it allready moved like 70 percent of typical difference in high low.
Plus i like to use cost average effect, when i do not open only one trade at one time. So i scalp in some predefined range with mental stop loss.
What are your ideas?
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
-
LondonScalper
- Posts: 770
- Joined: Sat Sep 05, 2026 7:54 am
Re: 1 minute price action scalping strategy without indicators
Pure 1m PA works until it doesn’t — my edge is less “no indicators” and more context before the candle.
What I still use (not classic indicators):
- Session + prior day high/low
- Relative volume vs the last N bars
- A written invalidation (structure break), not a feeling
No-indicator doesn’t mean no filter. Blind engulfing on 1m is just noise with a story.
Anyone running truly naked charts on 1m live, or do you sneak in VWAP/session levels?
What’s your minimum R:R you’ll take on a 1m scalp before costs — be honest?
What I still use (not classic indicators):
- Session + prior day high/low
- Relative volume vs the last N bars
- A written invalidation (structure break), not a feeling
No-indicator doesn’t mean no filter. Blind engulfing on 1m is just noise with a story.
Anyone running truly naked charts on 1m live, or do you sneak in VWAP/session levels?
What’s your minimum R:R you’ll take on a 1m scalp before costs — be honest?
-
LondonScalper
- Posts: 770
- Joined: Sat Sep 05, 2026 7:54 am
Re: 1 minute price action scalping strategy without indicators
Mean-reversion after an extension is a real scalp style — fade the stretch, not the trend blindly.PTScalper wrote:best 1 inute price action to scalp is go against market. That means, if market goes down, buy, if goes up sell, but only after it allready moved like 70 percent of typical difference in high low.
The “70% of typical high-low” idea is basically a range-exhaustion filter. It can work in a well-behaved Asian or London range; it gets expensive when the day is a one-way news trend and “typical” range keeps expanding under you. Without a hard invalidation, you’re averaging into a freight train with poetry.
Desk version of the same thought:
- Define the reference range before the move (session OR prior day — pick one)
- Fade only at location + rejection, not mid-bar because % says so
- Skip when spread is wide or a release is due
How do you measure that “typical” range live — fixed lookback, or ATR?
-
PropScalpDesk
- Posts: 364
- Joined: Sat Sep 19, 2026 7:50 pm
Re: 1 minute price action scalping strategy without indicators
Price action without indicators still needs rules
No-indicator scalping is fine. “I just read price” without written triggers is not — it is discretion wearing a minimalist costume, and it usually fails the stranger test.
My bare-bones version from a Frankfurt morning desk:
Write the acceptance rule as a candle event, not a feeling. Example: close back through the level and hold for one print while spread stays inside the cap. If you need more poetry than that, the rule is not finished.
How do you define “acceptance” in a way that a stranger could execute without calling you mid-trade?
No-indicator scalping is fine. “I just read price” without written triggers is not — it is discretion wearing a minimalist costume, and it usually fails the stranger test.
My bare-bones version from a Frankfurt morning desk:
- Level: prior day high or low, or a level that already bounced once.
- Trigger: acceptance back beyond the level on my trigger timeframe, defined in advance.
- Stop: beyond the invalidation extreme — sized by constant R, not by comfort.
- Skip: news window, spread over cap, or daily soft stop already hit.
Write the acceptance rule as a candle event, not a feeling. Example: close back through the level and hold for one print while spread stays inside the cap. If you need more poetry than that, the rule is not finished.
How do you define “acceptance” in a way that a stranger could execute without calling you mid-trade?
Re: 1 minute price action scalping strategy without indicators
Hello PTscalper,PTScalper wrote: Wed Jul 22, 2026 9:19 pm Hello scalpers,
from my point of view best 1 inute price action to scalp is go against market.
That means, if market goes down, buy, if goes up sell, but only after it allready moved like 70 percent of typical difference in high low.
Plus i like to use cost average effect, when i do not open only one trade at one time. So i scalp in some predefined range with mental stop loss.
What are your ideas?
from my point of view is 1 minute chart too low, full of noise. But i tried to prepare something.
Your approach touches on a classic mean-reversion concept, but running this strictly on a 1-minute chart with mental stops leaves you highly exposed to prolonged trend days. A 70% exhaustion threshold of a typical daily range can work in a consolidating environment, but blindly cost-averaging (DCA) into a 1-minute counter-trend move without higher-timeframe context is how accounts get blown during fundamental news or heavy liquidity sweeps.
Instead of relying purely on the 1-minute range, frame your setups around the 15-minute or daily chart structure. Wait for a clear liquidity sweep of a major high or low on the 15m, and then look for your 1m counter-trend entry. If you are going to use a grid or cost-average approach, replace the mental stop loss with a hard equity drawdown stop. Mental stops vanish the moment the market moves aggressively against your position.
Re: 1 minute price action scalping strategy without indicators
Here is a Pine Script implementation of your strategy. It calculates a higher-timeframe Average True Range (ATR) to find that "typical difference," uses pyramiding to handle the cost-averaging, and includes a hard stop-loss parameter to protect the account.
Code: Select all
//@version=5
strategy("1m Counter-Trend Grid Scalper", overlay=true, pyramiding=5, margin_long=100, margin_short=100)
// Inputs
var GRP1 = "Range Settings"
atrPeriod = input.int(14, "ATR Period (Daily)", group=GRP1)
exhaustionPct = input.float(0.70, "Exhaustion Threshold (70%)", group=GRP1)
var GRP2 = "DCA & Risk Settings"
gridStep = input.float(10.0, "Grid Step (Points) for DCA", group=GRP2)
hardStopPct = input.float(2.0, "Hard Stop Loss (%)", group=GRP2)
// Get typical High-Low difference from the Daily timeframe (Daily ATR)
dailyATR = request.security(syminfo.tickerid, "D", ta.atr(atrPeriod))
// Baseline to measure the move against (using a 100-period SMA on 1m as the mean)
baseline = ta.sma(close, 100)
// Entry Conditions: Price moved 70% of the Daily ATR away from the baseline
longCondition = close < baseline - (dailyATR * exhaustionPct)
shortCondition = close > baseline + (dailyATR * exhaustionPct)
// Cost Averaging Logic (DCA)
// Only add to position if the price has moved 'gridStep' against the last entry
var float lastEntryPrice = na
if strategy.position_size == 0
lastEntryPrice := na
bool dcaLongReady = strategy.position_size > 0 and close < lastEntryPrice - gridStep
bool dcaShortReady = strategy.position_size < 0 and close > lastEntryPrice + gridStep
// Execute Trades
if (longCondition and strategy.position_size == 0) or dcaLongReady
strategy.entry("Buy", strategy.long)
lastEntryPrice := close
if (shortCondition and strategy.position_size == 0) or dcaShortReady
strategy.entry("Sell", strategy.short)
lastEntryPrice := close
// Exit Logic: Mean Reversion to Baseline or Hard Stop Loss
if strategy.position_size > 0
strategy.exit("Exit Long", "Buy", limit=baseline, stop=strategy.position_avg_price * (1 - hardStopPct/100))
if strategy.position_size < 0
strategy.exit("Exit Short", "Sell", limit=baseline, stop=strategy.position_avg_price * (1 + hardStopPct/100))
// Plotting for visual reference
plot(baseline, "Baseline", color=color.blue, linewidth=2)
plot(baseline - (dailyATR * exhaustionPct), "Lower Exhaustion (70%)", color=color.green, style=plot.style_cross)
plot(baseline + (dailyATR * exhaustionPct), "Upper Exhaustion (70%)", color=color.red, style=plot.style_cross)Re: 1 minute price action scalping strategy without indicators
To professionalize this approach, you need to combine your 1-minute entries with 15-minute or Daily structural context:
Trade Liquidity Sweeps, Not Just Distances: Don't just short because price is up 70%. Short because price pushed 70% into a major liquidity pool (like a Previous Day High or an Asian Session High), swept the stops resting above it, and immediately printed a structural rejection on the 1m or 5m chart.
Structural Invalidation over Mental Stops: Cost-averaging (DCA) is a valid institutional tool, but it requires a hard structural invalidation point. If you are fading a sweep of the daily high, your hard stop sits just above that sweep's extreme. If a 15-minute candle closes outside your sweep zone, the mean-reversion premise is dead. Cut the trade.
Dynamic Grid Sizing: Instead of scaling in at fixed point intervals, scale in based on real-time volatility (ATR). A 10-point grid might be too wide in the Asian session and far too tight during the New York open.
Trade Liquidity Sweeps, Not Just Distances: Don't just short because price is up 70%. Short because price pushed 70% into a major liquidity pool (like a Previous Day High or an Asian Session High), swept the stops resting above it, and immediately printed a structural rejection on the 1m or 5m chart.
Structural Invalidation over Mental Stops: Cost-averaging (DCA) is a valid institutional tool, but it requires a hard structural invalidation point. If you are fading a sweep of the daily high, your hard stop sits just above that sweep's extreme. If a 15-minute candle closes outside your sweep zone, the mean-reversion premise is dead. Cut the trade.
Dynamic Grid Sizing: Instead of scaling in at fixed point intervals, scale in based on real-time volatility (ATR). A 10-point grid might be too wide in the Asian session and far too tight during the New York open.
Re: 1 minute price action scalping strategy without indicators
The Pro Pine Script: Structure & Liquidity Sweep Scalper
This upgraded script discards lagging moving averages. Instead, it calculates the daily exhaustion zones (your 70% rule) and maps them against raw Previous Day High/Low (PDH/PDL) structure. It only takes a trade when 1-minute price action explicitly rejects these higher-timeframe liquidity zones.
It also replaces the rigid percentage stop with a dynamic ATR-based structural stop and scale-in logic.
This upgraded script discards lagging moving averages. Instead, it calculates the daily exhaustion zones (your 70% rule) and maps them against raw Previous Day High/Low (PDH/PDL) structure. It only takes a trade when 1-minute price action explicitly rejects these higher-timeframe liquidity zones.
It also replaces the rigid percentage stop with a dynamic ATR-based structural stop and scale-in logic.
Code: Select all
//@version=5
strategy("Pro Structure & Liquidity Sweep Scalper", overlay=true, pyramiding=3, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=2)
// ==========================================
// INPUTS
// ==========================================
var GRP1 = "HTF Structure & Range"
adrLength = input.int(14, "Average Daily Range Length", group=GRP1)
exhaustionThreshold = input.float(0.70, "ADR Exhaustion Threshold (%)", group=GRP1, tooltip="70% of typical daily range")
var GRP2 = "Dynamic DCA & Risk Management"
scaleInAtrMult = input.float(1.0, "Scale-in Distance (ATR Multiplier)", group=GRP2)
hardStopAtrMult = input.float(2.5, "Structural Hard Stop (ATR Multiplier)", group=GRP2)
profitTargetAtr = input.float(2.0, "Mean Reversion Target (ATR)", group=GRP2)
// ==========================================
// HIGHER TIMEFRAME LOGIC (Daily Structure)
// ==========================================
// Get Previous Day High/Low safely (no repainting)
pdh = request.security(syminfo.tickerid, "D", high[1])
pdl = request.security(syminfo.tickerid, "D", low[1])
// Calculate Average Daily Range (ADR)
dailyRange = request.security(syminfo.tickerid, "D", high[1] - low[1])
adr = ta.sma(dailyRange, adrLength)
dailyOpen = request.security(syminfo.tickerid, "D", open)
// Define Exhaustion Zones (Open +/- 70% of ADR)
upperExhaustion = dailyOpen + (adr * exhaustionThreshold)
lowerExhaustion = dailyOpen - (adr * exhaustionThreshold)
// ==========================================
// MICROSTRUCTURE ENTRY LOGIC (1m PA)
// ==========================================
// 1m Volatility for scaling and stops
m1Atr = ta.atr(14)
// Check if price is in a structural killzone (above 70% ADR OR sweeping PDH)
inPremiumZone = high >= upperExhaustion or high >= pdh
inDiscountZone = low <= lowerExhaustion or low <= pdl
// Raw Price Action Trigger: Engulfing / Rejection in the Killzone
bearishRejection = inPremiumZone and close < open and close < low[1]
bullishRejection = inDiscountZone and close > open and close > high[1]
// ==========================================
// EXECUTION & DCA (Cost Averaging)
// ==========================================
var float lastEntryPrice = na
var float currentStop = na
var float currentTarget = na
// Cost Averaging Logic: Only add if price moved against us by X ATR
bool dcaLongReady = strategy.position_size > 0 and close < (lastEntryPrice - (m1Atr * scaleInAtrMult))
bool dcaShortReady = strategy.position_size < 0 and close > (lastEntryPrice + (m1Atr * scaleInAtrMult))
if (bullishRejection and strategy.position_size == 0) or dcaLongReady
strategy.entry("Long Sweep", strategy.long)
lastEntryPrice := close
// Set structural stop and target on initial entry, maintain them during DCA
if strategy.position_size == 0
currentStop := close - (m1Atr * hardStopAtrMult)
currentTarget := close + (m1Atr * profitTargetAtr)
if (bearishRejection and strategy.position_size == 0) or dcaShortReady
strategy.entry("Short Sweep", strategy.short)
lastEntryPrice := close
if strategy.position_size == 0
currentStop := close + (m1Atr * hardStopAtrMult)
currentTarget := close - (m1Atr * profitTargetAtr)
// ==========================================
// EXIT LOGIC
// ==========================================
if strategy.position_size > 0
strategy.exit("Exit Long", "Long Sweep", limit=currentTarget, stop=currentStop)
if strategy.position_size < 0
strategy.exit("Exit Short", "Short Sweep", limit=currentTarget, stop=currentStop)
// ==========================================
// VISUALIZATION
// ==========================================
plot(upperExhaustion, "70% ADR Premium", color=color.new(color.red, 50), style=plot.style_linebr)
plot(lowerExhaustion, "70% ADR Discount", color=color.new(color.green, 50), style=plot.style_linebr)
plot(pdh, "Previous Day High", color=color.new(color.maroon, 0), style=plot.style_circles)
plot(pdl, "Previous Day Low", color=color.new(color.teal, 0), style=plot.style_circles)Re: 1 minute price action scalping strategy without indicators
To accurately trade absorption on a 1-minute chart in TradingView, we have to navigate a platform limitation: standard Pine Script does not natively expose bid/ask footprint delta (which is how you see true limit-order absorption on platforms like Sierra Chart or cTrader).
However, we can programmatically identify absorption using Volume Spread Analysis (Effort vs. Result). If the 1-minute candle pushes into your PDH or 70% ADR zone with an massive spike in volume (Effort), but leaves a long wick and fails to close above the level (Result), those aggressive market buy orders were absorbed by institutional passive limit sell orders.
Here is the updated script. It adds an Order Book Absorption module that measures volume climax against a moving average, combined with wick-rejection math to confirm the sweep was trapped.
However, we can programmatically identify absorption using Volume Spread Analysis (Effort vs. Result). If the 1-minute candle pushes into your PDH or 70% ADR zone with an massive spike in volume (Effort), but leaves a long wick and fails to close above the level (Result), those aggressive market buy orders were absorbed by institutional passive limit sell orders.
Here is the updated script. It adds an Order Book Absorption module that measures volume climax against a moving average, combined with wick-rejection math to confirm the sweep was trapped.
Code: Select all
//@version=5
strategy("Pro Liquidity Sweep & Absorption Scalper", overlay=true, pyramiding=3, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=2)
// ==========================================
// INPUTS
// ==========================================
var GRP1 = "HTF Structure & Range"
adrLength = input.int(14, "Average Daily Range", group=GRP1)
exhaustionThreshold = input.float(0.70, "ADR Exhaustion Threshold (%)", group=GRP1)
var GRP2 = "Absorption & Volume Microstructure"
volSmaLength = input.int(20, "Volume SMA Length", group=GRP2)
volSpikeMult = input.float(1.5, "Volume Climax Multiplier", group=GRP2, tooltip="Volume must be X times higher than average to show institutional participation.")
wickThreshold = input.float(0.50, "Wick Rejection %", group=GRP2, tooltip="Wick must be at least this % of the total candle range to confirm absorption.")
var GRP3 = "Dynamic DCA & Risk Management"
scaleInAtrMult = input.float(1.0, "Scale-in Distance (ATR)", group=GRP3)
hardStopAtrMult = input.float(2.5, "Structural Hard Stop (ATR)", group=GRP3)
profitTargetAtr = input.float(2.0, "Mean Reversion Target (ATR)", group=GRP3)
// ==========================================
// HIGHER TIMEFRAME LOGIC (Daily Structure)
// ==========================================
pdh = request.security(syminfo.tickerid, "D", high[1])
pdl = request.security(syminfo.tickerid, "D", low[1])
dailyRange = request.security(syminfo.tickerid, "D", high[1] - low[1])
adr = ta.sma(dailyRange, adrLength)
dailyOpen = request.security(syminfo.tickerid, "D", open)
upperExhaustion = dailyOpen + (adr * exhaustionThreshold)
lowerExhaustion = dailyOpen - (adr * exhaustionThreshold)
// ==========================================
// ABSORPTION LOGIC (Effort vs Result)
// ==========================================
// 1. Detect Volume Climax
avgVol = ta.sma(volume, volSmaLength)
isClimaxVolume = volume > (avgVol * volSpikeMult)
// 2. Detect Wick Rejection (Absorption footprint)
candleRange = high - low
// Prevent division by zero on flat candles
safeRange = candleRange == 0 ? syminfo.mintick : candleRange
upperWick = high - math.max(open, close)
lowerWick = math.min(open, close) - low
hasUpperWickRejection = (upperWick / safeRange) >= wickThreshold
hasLowerWickRejection = (lowerWick / safeRange) >= wickThreshold
// ==========================================
// MICROSTRUCTURE ENTRY LOGIC (1m PA)
// ==========================================
m1Atr = ta.atr(14)
inPremiumZone = high >= upperExhaustion or high >= pdh
inDiscountZone = low <= lowerExhaustion or low <= pdl
// Trigger requires: Killzone + Climax Volume + Wick Rejection + Bearish/Bullish Close
bearishAbsorption = inPremiumZone and isClimaxVolume and hasUpperWickRejection and close < open
bullishAbsorption = inDiscountZone and isClimaxVolume and hasLowerWickRejection and close > open
// ==========================================
// EXECUTION & DCA
// ==========================================
var float lastEntryPrice = na
var float currentStop = na
var float currentTarget = na
bool dcaLongReady = strategy.position_size > 0 and close < (lastEntryPrice - (m1Atr * scaleInAtrMult))
bool dcaShortReady = strategy.position_size < 0 and close > (lastEntryPrice + (m1Atr * scaleInAtrMult))
if (bullishAbsorption and strategy.position_size == 0) or dcaLongReady
strategy.entry("Long Sweep", strategy.long)
lastEntryPrice := close
if strategy.position_size == 0
currentStop := close - (m1Atr * hardStopAtrMult)
currentTarget := close + (m1Atr * profitTargetAtr)
if (bearishAbsorption and strategy.position_size == 0) or dcaShortReady
strategy.entry("Short Sweep", strategy.short)
lastEntryPrice := close
if strategy.position_size == 0
currentStop := close + (m1Atr * hardStopAtrMult)
currentTarget := close - (m1Atr * profitTargetAtr)
// ==========================================
// EXIT LOGIC
// ==========================================
if strategy.position_size > 0
strategy.exit("Exit Long", "Long Sweep", limit=currentTarget, stop=currentStop)
if strategy.position_size < 0
strategy.exit("Exit Short", "Short Sweep", limit=currentTarget, stop=currentStop)
// ==========================================
// VISUALIZATION
// ==========================================
plot(upperExhaustion, "70% ADR Premium", color=color.new(color.red, 50), style=plot.style_linebr)
plot(lowerExhaustion, "70% ADR Discount", color=color.new(color.green, 50), style=plot.style_linebr)
plot(pdh, "Previous Day High", color=color.new(color.maroon, 0), style=plot.style_circles)
plot(pdl, "Previous Day Low", color=color.new(color.teal, 0), style=plot.style_circles)
// Highlight exact absorption candles
plotshape(bearishAbsorption, title="Bearish Absorption Trap", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small)
plotshape(bullishAbsorption, title="Bullish Absorption Trap", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small)Re: 1 minute price action scalping strategy without indicators
By enforcing the wickThreshold, this script ensures you are not fading a full-bodied 1-minute momentum candle that is effortlessly slicing through your levels. You only enter when the market shows its hand that liquidity is failing to break structure.