Keltner EMA Scalp Spot Trading Strategy
Keltner EMA Scalp is a spot breakout strategy. It buys when price reaches or crosses above the upper Keltner Channel while an EMA filter confirms the move.

The Keltner Channel adapts to volatility: its middle is an EMA of typical price, and its width is based on ATR. Wider volatility produces wider bands and requires a larger move to reach the upper channel.
warning
An upper-channel break can be the start of a trend or the end of a short spike. Keltner EMA Scalp has no volume or higher-timeframe confirmation, so test breakout follow-through carefully.
Trading behavior
Entry
With the default settings, a buy signal requires:
- Current close is at or above the upper Keltner Channel.
- Current close is at or above the EMA filter.
When KES_REQUIRE_BAND_CROSS is enabled, the previous close must have been below the previous upper channel. This requires a fresh cross instead of accepting price that is already outside the band.
KES_USE_LITERAL_EMA_FILTER reverses the EMA comparison. When enabled, the EMA must be above current price. This is a specialized interpretation and can make upper-channel entries rare or contradictory. Leave it disabled unless a backtest shows a specific reason to use it.
The strategy also checks spread, news block, cooldown, balance, and order minimums. It places one buy and does not DCA.
tip
Use KES_REQUIRE_BAND_CROSS when the strategy enters too late into candles that have remained above the upper channel. It changes the condition from “price is outside” to “price just moved outside.”
Target
In percentage mode, the target is KES_TARGET_PCT above average entry.
In pip mode, KES_TARGET_PIPS is used after being constrained by KES_TARGET_PIPS_MIN and KES_TARGET_PIPS_MAX. For example, a requested value of 15 with the default maximum of 12 results in a 12-pip target.
The final target also covers estimated round-trip fees plus KES_MIN_NET_GAIN_PCT.
Opposite Keltner exit
The bearish signal requires price at or below the lower Keltner Channel and the corresponding bearish EMA condition. With fresh-cross mode enabled, the previous close must have been above the lower band.
KES_EXIT_ON_SHORT_SIGNAL allows this signal to sell only at or above break-even. It does not close a losing position.
Protection and middle-band stop
With KES_USE_PROTECTION enabled, the strategy can sell below break-even.
The normal stop is:
KES_STOP_PCTbelow average entry in percentage mode.KES_STOP_PIPS × KES_PIP_SIZEbelow entry in pip mode.
When KES_USE_MIDDLE_BAND_STOP is enabled, the current Keltner middle line is also considered. The strategy uses the closer valid stop, so the middle band can tighten protection as it moves.
Without protection enabled, the stop settings are informational.
News block and cooldown
The manual news block pauses new entries but not open-position management. The strategy also waits for open orders to clear and observes KES_COOLDOWN_MS between live actions.
Good market conditions
Keltner EMA Scalp is best suited to:
- Liquid markets breaking out with sustained directional pressure.
- Volatility expansion after a compact range.
- Price clearly above its short EMA.
- Small spreads relative to the target.
It is weaker during:
- False breakouts that quickly return inside the channel.
- Sideways markets with frequent band touches.
- Thin markets where a wick crosses the band without tradable follow-through.
- Extremely volatile candles where entry occurs far from the middle line.
The default five-minute period balances responsiveness and noise. One-minute use requires excellent liquidity; longer periods make the 40-candle channel represent a much broader market window.
How to create the strategy
- Create a new spot strategy in the advanced strategy editor.
- Select
keltneremascalpas both buy and sell method. - Start on the default five-minute period.
- Align the general and KES trading-limit values.
- Confirm spread and exchange minimums.
- Leave literal EMA filter disabled initially.
- Compare continuous-above-band entry with fresh-cross mode.
- Test protection during failed breakouts.
A practical tuning workflow
Start with the channel:
- Increase Keltner length for a slower baseline.
- Increase ATR multiplier for wider bands and fewer breakouts.
- Decrease either value for faster, more frequent signals.
Then tune the EMA. A shorter EMA follows price closely and passes more entries; a longer EMA demands stronger separation from the recent trend.
Choose fresh-cross mode based on the behavior you want. It reduces entries when price is already outside the channel but can miss a continuation after strategy restart.
Tune target and stop last. In pip mode, ensure the min/max range actually contains the target you intend to use.
Core settings
| Label | Config parameter | Default | Description |
|---|---|---|---|
| Buy enabled | BUY_ENABLED | true | Allows upper-channel entries. |
| Sell enabled | SELL_ENABLED | true | Allows targets, bearish signals, and protective stops. |
| Period | PERIOD | 5 | Candle period in minutes. |
| Trading limit | TRADING_LIMIT | 100 | Compatibility fallback only. It is ignored while the strategy-specific trading limit is positive; the two values do not need to match. For USDT-BTC, this value is in USDT. |
| Funds reserve | FUNDS_RESERVE | 0 | For USDT-BTC, the amount of USDT the bot must leave unused. |
| Amount retained from sells | KEEP_QUOTE | 0 | For USDT-BTC, the amount of BTC the strategy must not sell. |
| Min volume to buy | MIN_VOLUME_TO_BUY | 10 | General minimum buy value. Keep it aligned with KES_MIN_ORDER_VALUE. For USDT-BTC, this value is in USDT. |
| Min volume to sell | MIN_VOLUME_TO_SELL | 10 | General minimum sell value. Keep it aligned with KES_MIN_SELL_VALUE. For USDT-BTC, this value is in USDT. |
| Gain | GAIN | 0.3 | General target value. Keep the intended target explicit in KES_TARGET_PCT. |
Execution and signal settings
| Label | Config parameter | Default | Description |
|---|---|---|---|
| KES trading limit | KES_TRADING_LIMIT | 100 | For USDT-BTC, the amount of USDT used for the single buy. |
| KES min order value | KES_MIN_ORDER_VALUE | 10 | Minimum value required for a buy. For USDT-BTC, this value is in USDT. |
| KES min sell value | KES_MIN_SELL_VALUE | 10 | Minimum position value required for a sell. For USDT-BTC, this value is in USDT. |
| KES cooldown ms | KES_COOLDOWN_MS | 30000 | Minimum milliseconds between live actions. |
| KES max spread % | KES_MAX_SPREAD_PCT | 0.06 | Maximum spread as a percentage of midpoint. |
| KES max spread absolute | KES_MAX_SPREAD_ABSOLUTE | 0 | Optional spread maximum in pair price units. 0 disables it. For USDT-BTC, this value is in USDT. |
| Keltner length | KES_KELTNER_LENGTH | 40 | EMA and ATR lookback used to build the channel. |
| Keltner ATR multiplier | KES_KELTNER_ATR_MULTIPLIER | 1.5 | ATR multiple between middle and outer bands. Higher values widen the channel. |
| EMA length | KES_EMA_LENGTH | 8 | Price-trend EMA used for entry and opposite signals. |
| Require band cross | KES_REQUIRE_BAND_CROSS | false | Requires a fresh close across an outer channel rather than simply being outside it. |
| Use literal EMA filter | KES_USE_LITERAL_EMA_FILTER | false | Reverses the normal EMA comparison. This is restrictive and should be enabled only after dedicated testing. |
| Exit on short signal | KES_EXIT_ON_SHORT_SIGNAL | true | Allows a lower-channel bearish signal to sell at or above break-even. |
Target and stop settings
| Label | Config parameter | Default | Description |
|---|---|---|---|
| Use pips | KES_USE_PIPS | false | Uses pip target and stop distances instead of percentages. |
| Pip size | KES_PIP_SIZE | 0.0001 | Pair-price value of one pip. For USDT-BTC, this value is in USDT. |
| Target pips | KES_TARGET_PIPS | 8 | Requested pip target, constrained by min and max. |
| Target pips min | KES_TARGET_PIPS_MIN | 5 | Smallest allowed pip target. |
| Target pips max | KES_TARGET_PIPS_MAX | 12 | Largest allowed pip target. |
| Target % | KES_TARGET_PCT | 0.5 | Profit distance above entry in percentage mode. |
| Minimum net gain % | KES_MIN_NET_GAIN_PCT | 0.1 | Minimum gain above estimated fee-adjusted break-even. |
| Stop pips | KES_STOP_PIPS | 9 | Protective distance in pip mode. |
| Stop % | KES_STOP_PCT | 0.4 | Protective distance below entry in percentage mode. |
| Use middle band stop | KES_USE_MIDDLE_BAND_STOP | false | Adds the moving Keltner middle line and uses the closer valid stop. |
| Use protection | KES_USE_PROTECTION | false | Allows the configured stop to close below break-even. |
News and backtesting
| Label | Config parameter | Default | Description |
|---|---|---|---|
| News block | KES_NEWS_BLOCK | false | Manually pauses new entries. |
| News block until | KES_NEWS_BLOCK_UNTIL | 0 | Timestamp until which entries remain blocked. |
| Backtest since | BF_SINCE | 0 | Optional backtest start boundary. |
| Backtest until | BF_UNTIL | 0 | Optional backtest end boundary. |
| Deep testing | DEEP_TESTING | false | Enables deeper backtesting without changing live signals. |
Important limitations
- The strategy opens one position and does not DCA.
- It has no volume or higher-timeframe filter.
- Opposite signals never realize a loss.
- Only enabled protection activates the stop.
- Literal EMA mode reverses the normal filter and can suppress most entries.
- The news block is manual.
The important question is not whether price can touch the upper Keltner Channel; it is whether the pair normally follows through far enough to cover execution costs and the requested target.