One-Minute Stochastic Pullback Scalping with EMA and ADX Filters
Summary
This one-minute long-only scalping strategy seeks frequent entries and small gains. Entry requires the open to be below a short EMA of lows, ADX to exceed a threshold, and the fast stochastic lines to be in a low region with the faster line crossing above the slower one. Exit signals occur when the open reaches the EMA of highs or either stochastic line rises through an upper level. The strategy also sets a small return-on-investment target and a fixed stop loss, while its description recommends relying on the return target for selling and maintaining many simultaneous trades to absorb unavoidable losses.
The source provides indicator rules and parameter settings but no market, backtest period, or performance evidence. Frequent parallel positions can compound exposure and costs, and the stated stop loss and small target make execution quality and fees important. The document does not explain how to select instruments, allocate capital across simultaneous trades, or validate the suggested trade count, so its recommendation should not be treated as empirically established.
Key ideas
- Entries combine a short EMA of lows, an ADX filter, and an oversold stochastic crossover.
- Exits are triggered by price reaching a short EMA of highs or stochastic lines crossing an upper level.
- The strategy uses a short timeframe, a small ROI target, and a fixed stop loss.
- Its author recommends many concurrent trades, but gives no evidence supporting that portfolio size.
- No backtest results or market-specific validation are provided, and costs may materially affect small-target trades.
Tags
Full text
# Scalp
# Scalp
this strategy is based around the idea of generating a lot of potentatils buys and make tiny profits on each trade
we recommend to have at least 60 parallel trades at any time to cover non avoidable losses.
Recommended is to only sell based on ROI for this strategy
## Source (GPL-3.0)
```python
# --- Do not remove these libs ---
from freqtrade.strategy import IStrategy
from typing import Dict, List
from functools import reduce
from pandas import DataFrame
# --------------------------------
import talib.abstract as ta
import freqtrade.vendor.qtpylib.indicators as qtpylib
class Scalp(IStrategy):
"""
this strategy is based around the idea of generating a lot of potentatils buys and make tiny profits on each trade
we recommend to have at least 60 parallel trades at any time to cover non avoidable losses.
Recommended is to only sell based on ROI for this strategy
"""
INTERFACE_VERSION: int = 3
# Minimal ROI designed for the strategy.
# This attribute will be overridden if the config file contains "minimal_roi"
minimal_roi = {
"0": 0.01
}
# Optimal stoploss designed for the strategy
# This attribute will be overridden if the config file contains "stoploss"
# should not be below 3% loss
stoploss = -0.04
# Optimal timeframe for the strategy
# the shorter the better
timeframe = '1m'
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe['ema_high'] = ta.EMA(dataframe, timeperiod=5, price='high')
dataframe['ema_close'] = ta.EMA(dataframe, timeperiod=5, price='close')
dataframe['ema_low'] = ta.EMA(dataframe, timeperiod=5, price='low')
stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0)
dataframe['fastd'] = stoch_fast['fastd']
dataframe['fastk'] = stoch_fast['fastk']
dataframe['adx'] = ta.ADX(dataframe)
# required for graphing
bollinger = qtpylib.bollinger_bands(dataframe['close'], window=20, stds=2)
dataframe['bb_lowerband'] = bollinger['lower']
dataframe['bb_upperband'] = bollinger['upper']
dataframe['bb_middleband'] = bollinger['mid']
return dataframe
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe.loc[
(
(dataframe['open'] < dataframe['ema_low']) &
(dataframe['adx'] > 30) &
(
(dataframe['fastk'] < 30) &
(dataframe['fastd'] < 30) &
(qtpylib.crossed_above(dataframe['fastk'], dataframe['fastd']))
)
),
'enter_long'] = 1
return dataframe
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe.loc[
(
(dataframe['open'] >= dataframe['ema_high'])
) |
(
(qtpylib.crossed_above(dataframe['fastk'], 70)) |
(qtpylib.crossed_above(dataframe['fastd'], 70))
),
'exit_long'] = 1
return dataframe
```Shown in full with attribution under the source's licence. Licence: GPL-3.0
This summary was written by Stratmill's research agent from the original; it is not a copy of the source.