Skip to content
All library documents

ADX Momentum Strategy Using Directional Indicators and SAR

Code Freqtrade

Summary

This strategy uses hourly candles and technical indicators to identify directional momentum. It calculates ADX, positive and negative directional indicators, Parabolic SAR, and momentum. Long entries are signaled when ADX exceeds a threshold, momentum is positive, and positive directional strength is both sufficiently high and greater than negative strength.

The exit condition looks for strong ADX alongside negative momentum, sufficiently high negative directional strength, and negative strength exceeding positive strength. The code also specifies a minimal return-on-investment target and a stop-loss setting. These are configuration choices rather than reported results: the document includes no backtest, market selection, or performance evidence, so robustness and suitability remain unestablished.

Key ideas

  • The strategy calculates ADX, directional indicators, Parabolic SAR, and momentum.
  • A long entry requires strong ADX, positive momentum, and positive directional strength exceeding negative strength.
  • A long exit requires strong ADX, negative momentum, and negative directional strength dominating.
  • The implementation defines a profit target, stop loss, and hourly timeframe.
  • No performance results or evidence of robustness are provided.

Tags

Full text
# ADXMomentum.py


```py
# --- Do not remove these libs ---
from freqtrade.strategy import IStrategy
from pandas import DataFrame
import talib.abstract as ta


# --------------------------------


class ADXMomentum(IStrategy):
    """

    author@: Gert Wohlgemuth

    converted from:

        https://github.com/sthewissen/Mynt/blob/master/src/Mynt.Core/Strategies/AdxMomentum.cs

    """

    INTERFACE_VERSION: int = 3
    # Minimal ROI designed for the strategy.
    # adjust based on market conditions. We would recommend to keep it low for quick turn arounds
    # This attribute will be overridden if the config file contains "minimal_roi"
    minimal_roi = {
        "0": 0.01
    }

    # Optimal stoploss designed for the strategy
    stoploss = -0.25

    # Optimal timeframe for the strategy
    timeframe = '1h'

    # Number of candles the strategy requires before producing valid signals
    startup_candle_count: int = 20

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe['adx'] = ta.ADX(dataframe, timeperiod=14)
        dataframe['plus_di'] = ta.PLUS_DI(dataframe, timeperiod=25)
        dataframe['minus_di'] = ta.MINUS_DI(dataframe, timeperiod=25)
        dataframe['sar'] = ta.SAR(dataframe)
        dataframe['mom'] = ta.MOM(dataframe, timeperiod=14)

        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                    (dataframe['adx'] > 25) &
                    (dataframe['mom'] > 0) &
                    (dataframe['plus_di'] > 25) &
                    (dataframe['plus_di'] > dataframe['minus_di'])

            ),
            'enter_long'] = 1
        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                    (dataframe['adx'] > 25) &
                    (dataframe['mom'] < 0) &
                    (dataframe['minus_di'] > 25) &
                    (dataframe['plus_di'] < dataframe['minus_di'])

            ),
            '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.