Advertisement IC Markets

How to set stop loss and take profit when scalping

Discuss 1-minute to 15-minute price action setups, fading intraday momentum, key support/resistance zones, and proven short-term trading methodologies.
PTScalper
Site Admin
Posts: 3349
Joined: Mon Jul 20, 2026 1:28 pm

How to set stop loss and take profit when scalping

Post by PTScalper »

Hi scalpers,
in this topic i would like to discuss, how do you like to setup Stop loss, once you are scalping?
Or do you setup it?

I found out, that most of the time i personally prefer mental stop loss, because for example in normal day i trade/scalp like 80 - 200 positions, so setup stop loss every single time
would not be easy.
On another hand, once i have to hold some of the positions over the night, i prefer to setup there stop loss. In most cases its like 50 - 120 pips, because i make some kind of hedge, to make directional smaller, so im able to hold it longer.

What are your experiences?
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
Recommended broker for automated trading & scalping IC Markets
LondonScalper
Posts: 770
Joined: Sat Sep 05, 2026 7:54 am

Re: How to set stop loss and take profit when scalping

Post by LondonScalper »

PTScalper wrote:most of the time i personally prefer mental stop loss... 80 - 200 positions... setup stop loss every single time would not be easy.
Mental stops work until they don’t — usually on the day you’re already down and “just giving it a bit more room.”

I still favour a hard stop in the book for anything that isn’t a 30-second flick, even if the initial risk is tiny. Platforms are quite good at sending exits; humans are quite good at negotiating with themselves. At 80–200 tickets, the operational pain of placing stops is real — so automate it: bracket on entry, or a hotkey that stamps SL/TP from ATR without typing.

Overnight / multi-hour hedges at 50–120 pips is a different product. That’s position risk, not scalp risk. Mixing the two in one head without labelling them is how a “scalp day” quietly becomes a swing P&L.

Concrete desk rule: if I can’t state the invalidation in one sentence before entry, I don’t get a mental stop — I get no trade. How are you defining invalidation on those mental-stop scalps today?
FTtrader
Posts: 954
Joined: Mon Aug 03, 2026 2:43 pm

Re: How to set stop loss and take profit when scalping

Post by FTtrader »

Mental stops are just a polite way of saying "I haven't accepted the risk yet."

After 26 years in this game, I can promise you that human negotiation is the number one account killer. You are dead right—the day you "give it a bit more room" is the exact day the market trends relentlessly in the opposite direction.

To answer your question: I don't use mental stops, period. My invalidation is strictly structural. Because I trade pure price action on spot, my invalidation is always the extreme of the candle that created the setup (usually a liquidity sweep). If I'm entering a scalp based on a 5-minute pin bar that swept a session low, my hard stop goes a fraction of a pip below that wick. If price trades beyond it, the structural thesis is dead. Why would I want to be in a trade where the entire premise of my entry has been proven wrong?

You also nailed it regarding the operational pain of placing 80+ tickets. That’s exactly why we use the tools available to us in the spot world. No prop firm telling us our EA is banned or our execution speed is "toxic." We can just code it.

Here is a clean, automated ATR-bracket framework in Pine Script that does exactly what you mentioned. It automatically stamps a hard Stop Loss and Take Profit based on ATR multipliers the second an entry condition is met. No typing, no hesitation, no mental gymnastics.
FTtrader
Posts: 954
Joined: Mon Aug 03, 2026 2:43 pm

Re: How to set stop loss and take profit when scalping

Post by FTtrader »

Pine Script: ATR Bracket Auto-Execution

Code: Select all

//@version=5
strategy("ATR Bracket Execution - Spot Framework", overlay=true, calc_on_every_tick=true)

// =========================================================================
// INPUTS: Risk & Bracket Parameters
// =========================================================================
grp_risk = "Bracket Settings"
atrLength    = input.int(14, title="ATR Length", group=grp_risk)
slMultiplier = input.float(1.0, title="Stop Loss (ATR Multiplier)", step=0.1, group=grp_risk)
tpMultiplier = input.float(2.0, title="Take Profit (ATR Multiplier)", step=0.1, group=grp_risk)

// =========================================================================
// CALCULATIONS
// =========================================================================
// Calculate ATR for dynamic volatility-based stops
atrValue = ta.atr(atrLength)

// Placeholder for your actual entry logic (e.g., PA sweeps, MA crosses)
// Using a simple momentum cross here just to demonstrate the automated bracket
fastMA = ta.ema(close, 9)
slowMA = ta.ema(close, 21)

longTrigger  = ta.crossover(fastMA, slowMA)
shortTrigger = ta.crossunder(fastMA, slowMA)

// =========================================================================
// EXECUTION WITH HARD STOPS (No "Mental" Room)
// =========================================================================
if (longTrigger)
    // Calculate exact hard levels at the moment of entry
    longSL = close - (atrValue * slMultiplier)
    longTP = close + (atrValue * tpMultiplier)
    
    // Execute entry and instantly send the hard brackets to the broker/book
    strategy.entry("Long Entry", strategy.long)
    strategy.exit("Exit Long", "Long Entry", stop=longSL, limit=longTP)

if (shortTrigger)
    // Calculate exact hard levels at the moment of entry
    shortSL = close + (atrValue * slMultiplier)
    shortTP = close - (atrValue * tpMultiplier)
    
    // Execute entry and instantly send the hard brackets to the broker/book
    strategy.entry("Short Entry", strategy.short)
    strategy.exit("Exit Short", "Short Entry", stop=shortSL, limit=shortTP)

// =========================================================================
// VISUALIZATION
// =========================================================================
plot(fastMA, color=color.new(color.blue, 0), title="Fast MA")
plot(slowMA, color=color.new(color.gray, 0), title="Slow MA")
FTtrader
Posts: 954
Joined: Mon Aug 03, 2026 2:43 pm

Re: How to set stop loss and take profit when scalping

Post by FTtrader »

Plug your own price action entry conditions into the longTrigger and shortTrigger variables. Once it fires, the hard stop is in the book instantly.
No mental stops.
No mixing scalp risk with swing risk.
Just pure, disciplined execution on your own capital.
FTtrader
Posts: 954
Joined: Mon Aug 03, 2026 2:43 pm

Re: How to set stop loss and take profit when scalping

Post by FTtrader »

To make it better, i prepared Pro level in Pine Script:

Because I trade raw price action, my edge is entirely dependent on market structure—typically a liquidity sweep on the 15-minute or daily chart. The invalidation is the extreme of the candle that initiated the setup. If price breaches that wick by a fractional pip, the structural thesis is dead. Why would I hold exposure in a market that just proved my entry criteria wrong?

You are completely right about the operational drag of manual execution at high volume. When you’re pushing 80–200 tickets, manual bracket placement is inefficient and exposes you to execution latency. This is the exact advantage of a pure spot environment—you own your infrastructure. No prop firm restrictions on automated execution, no synthetic rules penalizing your order frequency.

For high-frequency or high-ticket scalping, the execution must be fully mechanized. Below is a professional-grade Pine Script framework for automated bracket execution. It handles dynamic ATR-based brackets and exact position sizing based on a fixed percentage of account equity. You plug in the PA logic; the script handles the math and puts the hard orders in the book instantly.
FTtrader
Posts: 954
Joined: Mon Aug 03, 2026 2:43 pm

Re: How to set stop loss and take profit when scalping

Post by FTtrader »

Pine Script: Dynamic Bracket & Risk Execution Framework

Code: Select all

//@version=5
strategy("Pro Bracket Execution - Spot Framework", overlay=true, calc_on_every_tick=true, margin_long=100, margin_short=100)

// =========================================================================
// INPUTS: Risk Management & Bracket Parameters
// =========================================================================
grp_risk = "Risk & Capital Allocation"
riskPct      = input.float(1.0, title="Account Risk per Trade (%)", step=0.1, group=grp_risk)

grp_exec = "Execution Parameters"
atrLength    = input.int(14, title="ATR Length", group=grp_exec)
slMultiplier = input.float(1.0, title="Stop Loss (ATR Multiplier)", step=0.1, group=grp_exec)
tpMultiplier = input.float(2.0, title="Take Profit (ATR Multiplier)", step=0.1, group=grp_exec)

// =========================================================================
// CORE CALCULATIONS
// =========================================================================
// Dynamic volatility measurement for structural breathing room
volatility = ta.atr(atrLength)

// Placeholder for proprietary Price Action logic (e.g., liquidity sweeps, structural breaks)
// Replace these with your specific entry triggers
longTrigger  = ta.crossover(ta.ema(close, 9), ta.ema(close, 21))
shortTrigger = ta.crossunder(ta.ema(close, 9), ta.ema(close, 21))

// =========================================================================
// ORDER ROUTING & POSITION SIZING (HARD EXITS ONLY)
// =========================================================================
if (longTrigger and strategy.position_size == 0)
    // 1. Calculate exact hard levels instantly
    hardSL = close - (volatility * slMultiplier)
    hardTP = close + (volatility * tpMultiplier)
    
    // 2. Calculate position size based on exact pip risk to maintain flat equity % risk
    riskCapital = (strategy.equity * riskPct) / 100
    posSize     = riskCapital / (close - hardSL)
    
    // 3. Route entry and resting brackets to the order book
    strategy.entry("Long_Exec", strategy.long, qty=posSize)
    strategy.exit("Long_Bracket", "Long_Exec", stop=hardSL, limit=hardTP)

if (shortTrigger and strategy.position_size == 0)
    // 1. Calculate exact hard levels instantly
    hardSL = close + (volatility * slMultiplier)
    hardTP = close - (volatility * tpMultiplier)
    
    // 2. Calculate position size based on exact pip risk to maintain flat equity % risk
    riskCapital = (strategy.equity * riskPct) / 100
    posSize     = riskCapital / (hardSL - close)
    
    // 3. Route entry and resting brackets to the order book
    strategy.entry("Short_Exec", strategy.short, qty=posSize)
    strategy.exit("Short_Bracket", "Short_Exec", stop=hardSL, limit=hardTP)
FTtrader
Posts: 954
Joined: Mon Aug 03, 2026 2:43 pm

Re: How to set stop loss and take profit when scalping

Post by FTtrader »

Concrete desk rule: If your execution platform requires you to physically hover your hand over a mouse to protect your capital, your workflow is broken.
Automate the risk, eliminate the negotiation, and let the probabilities play out.
FTtrader
Posts: 954
Joined: Mon Aug 03, 2026 2:43 pm

Re: How to set stop loss and take profit when scalping

Post by FTtrader »

Pine Script is great for charting, but if you’re executing 80–200 tickets a day, you need to be directly plugged into the broker’s liquidity.

At 55, I don't trust bridging software, and I definitely don't trust proprietary web platforms. You want your hard brackets living securely on the broker's server, so if your terminal crashes or your internet connection drops, your capital is still ring-fenced. This is exactly why pure spot trading on MetaTrader is king—you own your execution infrastructure and no one dictates your workflow.

Here is the professional-grade execution framework translated for both MT5 and MT4. These templates calculate your dynamic ATR-based structural levels, compute the exact lot size to keep your equity risk completely flat, and route the order directly to the book without a single second of hesitation.
FTtrader
Posts: 954
Joined: Mon Aug 03, 2026 2:43 pm

Re: How to set stop loss and take profit when scalping

Post by FTtrader »

MT5: The CTrade Framework

MT5 uses an object-oriented architecture, so we utilize the standard library's CTrade class to handle the execution routing seamlessly.

Code: Select all

//+------------------------------------------------------------------+
//|                 Pro_Bracket_Execution_MT5.mq5                    |
//+------------------------------------------------------------------+
#property strict
#include <Trade\Trade.mqh>

input double RiskPercent = 1.0;       // Account Risk per Trade (%)
input int    AtrPeriod   = 14;        // ATR Length
input double SlMult      = 1.0;       // Stop Loss (ATR Multiplier)
input double TpMult      = 2.0;       // Take Profit (ATR Multiplier)

CTrade trade;

void ExecuteBracket(int direction) {
    // Note: In a production EA, initialize the iATR handle in OnInit() 
    // to preserve memory, rather than creating a new handle on every trade.
    int atrHandle = iATR(_Symbol, PERIOD_CURRENT, AtrPeriod);
    double atr[];
    CopyBuffer(atrHandle, 0, 0, 1, atr);
    double volatility = atr[0];
    
    double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
    double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
    
    double sl_price, tp_price, entry_price;
    
    // Calculate precise structural boundaries
    if (direction == ORDER_TYPE_BUY) {
        entry_price = ask;
        sl_price = entry_price - (volatility * SlMult);
        tp_price = entry_price + (volatility * TpMult);
    } else {
        entry_price = bid;
        sl_price = entry_price + (volatility * SlMult);
        tp_price = entry_price - (volatility * TpMult);
    }
    
    // Core Position Sizing Math
    double tick_value = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
    double tick_size  = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
    double lot_step   = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
    
    double risk_money = AccountInfoDouble(ACCOUNT_EQUITY) * (RiskPercent / 100.0);
    double sl_ticks   = MathAbs(entry_price - sl_price) / tick_size;
    double lot_size   = risk_money / (sl_ticks * tick_value);
    
    // Normalize lot size to prevent broker rejection
    lot_size = MathFloor(lot_size / lot_step) * lot_step; 
    
    // Route to the broker server immediately
    if (direction == ORDER_TYPE_BUY) {
        trade.Buy(lot_size, _Symbol, ask, sl_price, tp_price, "Pro_Bracket");
    } else if (direction == ORDER_TYPE_SELL) {
        trade.Sell(lot_size, _Symbol, bid, sl_price, tp_price, "Pro_Bracket");
    }
}
Post Reply