Page 1 of 2
Never Average Down on a Losing Scalp
Posted: Thu Aug 20, 2026 9:02 pm
by Fairman
Adding to a losing position in order to lower your average entry price is not a risk management strategy. It's hope, dressed up in trading terminology, and hope has never once moved a currency pair.
Here's why this is especially dangerous for scalpers. The entire premise of a short-timeframe trade is that the setup either works quickly, confirming your read on the market, or it doesn't — in which case the setup is invalidated and the correct response is to exit, not to add.
Averaging down turns one small, controlled loss into a much larger, uncontrolled one. What started as a defined risk of, say, 1% of your account can balloon into 2%, 3%, or more, entirely because you couldn't accept being wrong on the first entry. And the market doesn't care how much conviction you have — price does what price does, regardless of how many lots you've committed to being right.
If your original stop-loss gets hit, that's information. The setup didn't play out as expected. The correct move is to log it, review it later, and wait for the next legitimate setup — not to fight the market with more capital in the hope that it eventually agrees with you.
Re: Never Average Down on a Losing Scalp
Posted: Fri Sep 11, 2026 9:32 pm
by LondonScalper
Fairman wrote:Adding to a losing position in order to lower your average entry price is not a risk management strategy. It's hope, dressed up in trading terminology
Agreed. Averaging down on a scalp converts a defined −1R into an undefined problem.
Short-hold trades are binary by design: thesis confirms quickly, or it does not. Adding size because “it will come back” is just refusing the stop while pretending you are managing risk. I have seen more London mornings ruined by one doubled loser than by ten clean −1Rs.
Allowed exception on our desk is rare and written down: a
planned scale-in on a higher-timeframe level with separate risk budget — never an emotional add after the first ticket is underwater. If it is not in the plan before entry, it is revenge with better vocabulary.
When you catch yourself reaching for the second lot, do you flatten the first instead, or step away entirely for a few minutes?
Re: Never Average Down on a Losing Scalp
Posted: Sun Sep 20, 2026 9:13 pm
by PropScalpDesk
Averaging down a scalp is hope with leverage
Adding to a loser to improve average entry is not risk management on an M1 thesis. The premise of a scalp is quick confirmation or you are wrong. Averaging down converts a defined R into an undefined story.
Frankfurt rule: one entry, one invalidation. If I want more size, it is only on a fresh trigger after partial success — never into a position that already proved me wrong. I close, tag, and move on.
Prop daily loss and trailing DD punish averaging down efficiently. Better to learn from one R than to negotiate with a melting ticket.
If the broker UI makes “add to position” too easy, I remove the hotkey. Friction design is part of following the never-average rule.
I also forbid “hedge adds” that are averaging down with extra steps. Same risk, fancier language.
Have you fully banned averaging down, or is there still a written exception that keeps finding its way into live tickets?
Re: Never Average Down on a Losing Scalp
Posted: Sat Sep 26, 2026 6:38 pm
by PTScalper
Fairman wrote: Thu Aug 20, 2026 9:02 pm
Adding to a losing position in order to lower your average entry price is not a risk management strategy. It's hope, dressed up in trading terminology, and hope has never once moved a currency pair.
Here's why this is especially dangerous for scalpers. The entire premise of a short-timeframe trade is that the setup either works quickly, confirming your read on the market, or it doesn't — in which case the setup is invalidated and the correct response is to exit, not to add.
Averaging down turns one small, controlled loss into a much larger, uncontrolled one. What started as a defined risk of, say, 1% of your account can balloon into 2%, 3%, or more, entirely because you couldn't accept being wrong on the first entry. And the market doesn't care how much conviction you have — price does what price does, regardless of how many lots you've committed to being right.
If your original stop-loss gets hit, that's information. The setup didn't play out as expected. The correct move is to log it, review it later, and wait for the next legitimate setup — not to fight the market with more capital in the hope that it eventually agrees with you.
Hi Fairman,
You have articulated one of the most absolute, unforgiving truths of trading. Averaging down is the ultimate manifestation of ego—it is a refusal to admit the market has proven your initial hypothesis wrong.
For scalpers, your point about the timeframe is spot on. A scalp relies on momentum and immediate reaction at a specific level. If that reaction doesn't happen, the trade is dead. Adding to it doesn't improve your odds; it just increases your exposure to a thesis that has already been invalidated. A stop-loss isn't a punishment; it is exactly what you called it: information.
To translate this philosophy into code, we need a strategy that structurally forbids the behaviors you described.
Re: Never Average Down on a Losing Scalp
Posted: Sat Sep 26, 2026 6:38 pm
by PTScalper
The "No Hope" Scalping Strategy (Pine Script v5)
This Pine Script is built entirely around your text. It enforces the following rules:
Strictly No Averaging Down: The pyramiding = 0 setting and the isFlat condition mathematically prevent the script from adding to a losing (or winning) position.
Defined 1% Risk: It automatically calculates position size so that if your stop-loss is hit, you lose exactly 1% of your account equity—preventing the "ballooning" effect you mentioned.
Immediate Invalidation: The moment an entry is triggered, a hard Stop Loss and Take Profit are placed. The script will do nothing else until one of those two levels is hit.
Re: Never Average Down on a Losing Scalp
Posted: Sat Sep 26, 2026 6:39 pm
by PTScalper
Pine script version: 1.00
Code: Select all
//@version=5
strategy("Strict Risk Scalper - No Averaging Down", overlay=true, pyramiding=0, initial_capital=10000, commission_type=strategy.commission.cash_per_order, commission_value=1)
// =========================================================================
// 1. INPUTS & RISK MANAGEMENT PARAMETERS
// =========================================================================
// "What started as a defined risk of, say, 1% of your account..."
riskPct = input.float(1.0, title="Risk Per Trade (%)", step=0.1, group="Risk Management")
slAtrMult = input.float(1.5, title="Stop Loss ATR Multiplier", group="Risk Management")
rrRatio = input.float(2.0, title="Risk:Reward Ratio", group="Risk Management")
// Example Scalping Setup (9/21 EMA Crossover)
fastEmaLength = input.int(9, title="Fast EMA Length", group="Strategy Setup")
slowEmaLength = input.int(21, title="Slow EMA Length", group="Strategy Setup")
// =========================================================================
// 2. SETUP CONDITIONS
// =========================================================================
fastEma = ta.ema(close, fastEmaLength)
slowEma = ta.ema(close, slowEmaLength)
// "The correct response is to exit, not to add."
// We enforce this by ensuring we only take setups when we have ZERO open positions.
isFlat = strategy.position_size == 0
// Basic scalping triggers
longSetup = ta.crossover(fastEma, slowEma) and isFlat
shortSetup = ta.crossunder(fastEma, slowEma) and isFlat
// =========================================================================
// 3. POSITION SIZING & LEVELS (The Math of Acceptance)
// =========================================================================
// Calculate dynamic stop distance based on volatility (ATR)
atr = ta.atr(14)
slDistance = atr * slAtrMult
tpDistance = slDistance * rrRatio
// Calculate exact position size to risk only X% of equity
// (Equity * Risk%) / (Stop Distance * Point Value)
riskAmount = (strategy.equity * riskPct) / 100
tradeQty = slDistance > 0 ? riskAmount / (slDistance * syminfo.pointvalue) : 0
// Variables to store our hard exit levels
var float slPrice = na
var float tpPrice = na
// =========================================================================
// 4. EXECUTION
// =========================================================================
if longSetup and tradeQty > 0
// Define the exact invalidation and target points at the moment of entry
slPrice := close - slDistance
tpPrice := close + tpDistance
strategy.entry("Long Entry", strategy.long, qty=tradeQty)
strategy.exit("Exit Long", from_entry="Long Entry", stop=slPrice, limit=tpPrice)
if shortSetup and tradeQty > 0
// Define the exact invalidation and target points at the moment of entry
slPrice := close + slDistance
tpPrice := close - tpDistance
strategy.entry("Short Entry", strategy.short, qty=tradeQty)
strategy.exit("Exit Short", from_entry="Short Entry", stop=slPrice, limit=tpPrice)
// =========================================================================
// 5. VISUALS
// =========================================================================
plot(fastEma, color=color.blue, title="Fast EMA")
plot(slowEma, color=color.orange, title="Slow EMA")
// Plot the active Stop Loss and Take Profit levels when in a trade
plot(strategy.position_size != 0 ? slPrice : na, color=color.red, style=plot.style_linebr, linewidth=2, title="Stop Loss")
plot(strategy.position_size != 0 ? tpPrice : na, color=color.green, style=plot.style_linebr, linewidth=2, title="Take Profit")
Re: Never Average Down on a Losing Scalp
Posted: Sat Sep 26, 2026 6:39 pm
by PTScalper
How to use this template:
I used a basic 9/21 EMA crossover as the placeholder for the entry trigger. You can easily swap out the longSetup and shortSetup variables in section 2 with your own specific scalping criteria (e.g., order block touches, RSI divergence, or VWAP bounces).
No matter what entry logic you plug into it, the script will refuse to open a second position while one is active, scale your lots dynamically to lock in your 1% risk, and automatically place the exit brackets. It forces you to log the trade, review it, and wait for the next one—exactly as a professional should.
Re: Never Average Down on a Losing Scalp
Posted: Sat Sep 26, 2026 6:40 pm
by PTScalper
Here is the translation of that exact philosophy—and the Pine Script mechanics—into a cBot (C#) for cTrader.
cTrader is actually an excellent platform for this specific approach because its API allows for extremely precise volume-to-risk calculations natively.
This cBot enforces the same uncompromising rules: it calculates your exact position size based on 1% of your equity, places the order with hard Stop Loss and Take Profit levels instantly, and strictly forbids opening another position if one is already active.
Re: Never Average Down on a Losing Scalp
Posted: Sat Sep 26, 2026 6:40 pm
by PTScalper
The "No Hope" Scalping cBot (C#)
To use this, open cTrader Automate, click "New cBot", name it something like StrictRiskScalper, paste this code over the default template, and click "Build".
Code: Select all
using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
namespace cAlgo.Robots
{
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class StrictRiskScalper : Robot
{
// =========================================================================
// 1. INPUTS & RISK MANAGEMENT PARAMETERS
// =========================================================================
[Parameter("Risk Per Trade (%)", Group = "Risk Management", DefaultValue = 1.0, MinValue = 0.1, Step = 0.1)]
public double RiskPct { get; set; }
[Parameter("Stop Loss ATR Multiplier", Group = "Risk Management", DefaultValue = 1.5, MinValue = 0.1, Step = 0.1)]
public double SlAtrMult { get; set; }
[Parameter("Risk:Reward Ratio", Group = "Risk Management", DefaultValue = 2.0, MinValue = 0.1, Step = 0.1)]
public double RrRatio { get; set; }
[Parameter("Fast EMA Length", Group = "Strategy Setup", DefaultValue = 9)]
public int FastEmaLength { get; set; }
[Parameter("Slow EMA Length", Group = "Strategy Setup", DefaultValue = 21)]
public int SlowEmaLength { get; set; }
[Parameter("ATR Period", Group = "Strategy Setup", DefaultValue = 14)]
public int AtrPeriod { get; set; }
// =========================================================================
// 2. INDICATORS DECLARATION
// =========================================================================
private ExponentialMovingAverage _fastEma;
private ExponentialMovingAverage _slowEma;
private AverageTrueRange _atr;
private const string TradeLabel = "NoHopeScalper";
protected override void OnStart()
{
// Initialize indicators
_fastEma = Indicators.ExponentialMovingAverage(Bars.ClosePrices, FastEmaLength);
_slowEma = Indicators.ExponentialMovingAverage(Bars.ClosePrices, SlowEmaLength);
_atr = Indicators.AverageTrueRange(AtrPeriod, MovingAverageType.Simple);
}
protected override void OnBar()
{
// =========================================================================
// 3. ENFORCE "NO AVERAGING DOWN" RULE
// =========================================================================
// If we have ANY open positions with our label, we do nothing. The trade must play out.
bool isFlat = Positions.Count(p => p.SymbolName == SymbolName && p.Label == TradeLabel) == 0;
if (!isFlat)
return;
// =========================================================================
// 4. SETUP CONDITIONS (Wait for the close of the bar to confirm cross)
// =========================================================================
bool longSetup = _fastEma.Result.HasCrossedAbove(_slowEma.Result, 1);
bool shortSetup = _fastEma.Result.HasCrossedBelow(_slowEma.Result, 1);
if (!longSetup && !shortSetup)
return;
// =========================================================================
// 5. POSITION SIZING & LEVELS (The Math of Acceptance)
// =========================================================================
// Get ATR value of the last closed bar
double atrValue = _atr.Result.Last(1);
// cTrader takes SL and TP in Pips, so we convert the ATR distance to Pips
double slDistanceInPips = (atrValue * SlAtrMult) / Symbol.PipSize;
double tpDistanceInPips = slDistanceInPips * RrRatio;
// Calculate exact position size to risk X% of current equity
double riskAmount = Account.Equity * (RiskPct / 100.0);
// Symbol.PipValue is the value of 1 pip for 1 unit of volume.
// We divide our total risk by (pip distance * pip value per unit) to get exact units needed.
double exactVolume = riskAmount / (slDistanceInPips * Symbol.PipValue);
// Normalize volume to broker's acceptable lot sizes (Rounding Down to protect risk limit)
double volumeInUnits = Symbol.NormalizeVolumeInUnits(exactVolume, RoundingMode.Down);
// Safety check: ensure volume isn't smaller than broker minimum or 0
if (volumeInUnits < Symbol.VolumeInUnitsMin)
{
Print("Trade aborted: Calculated volume {0} is below broker minimum {1}.", volumeInUnits, Symbol.VolumeInUnitsMin);
return;
}
// =========================================================================
// 6. EXECUTION
// =========================================================================
if (longSetup)
{
// Execute Market Order with hard SL and TP attached instantly
ExecuteMarketOrder(TradeType.Buy, SymbolName, volumeInUnits, TradeLabel, slDistanceInPips, tpDistanceInPips);
}
else if (shortSetup)
{
// Execute Market Order with hard SL and TP attached instantly
ExecuteMarketOrder(TradeType.Sell, SymbolName, volumeInUnits, TradeLabel, slDistanceInPips, tpDistanceInPips);
}
}
}
}
Re: Never Average Down on a Losing Scalp
Posted: Sat Sep 26, 2026 6:40 pm
by PTScalper
How this cBot implements your logic:
The isFlat Guard: At the very beginning of the OnBar() logic, it asks cTrader to count all open positions for this symbol. If that number is anything other than 0, the cBot instantly halts execution for that candle (return;). It is blind to the market until the active trade resolves.
Dynamic Pip Calculation: Unlike MetaTrader, cTrader provides a native Symbol.PipValue property. This code uses it to perfectly translate your target Risk (e.g., 1%) into exact units (lots). If the ATR is wide (high volatility), your lot size automatically shrinks. If the ATR is tight, your lot size increases. You always lose exactly 1% if stopped out.
One-Shot Execution: The ExecuteMarketOrder() method in cTrader accepts the Stop Loss and Take Profit at the moment of entry. The broker holds these levels server-side immediately, leaving no room for manual tampering, emotional adjustments, or delays.
Entry Trigger: Just like the Pine Script version, this uses the 9/21 EMA crossover on the close of a bar (HasCrossedAbove / HasCrossedBelow) as the placeholder entry. You can replace this section with your actual scalping trigger.