CCI, MFI, and CMO Threshold Rules for Long Entries and Exits
Summary
This Freqtrade example defines a long-only strategy using three technical indicators: Commodity Channel Index, Money Flow Index, and Chande Momentum Oscillator. It enters when the prior bar has all three indicators in oversold territory, using thresholds of CCI below -100, MFI below 20, and CMO below -50. It exits when the prior bar has all three in the opposite, elevated ranges: CCI above 100, MFI above 80, and CMO above 50.
The sample sets a 15-minute timeframe, a five percent stop loss, and a tiered minimum return-on-investment schedule that becomes less demanding as a trade ages. It supplies no backtest results or evidence that the indicator combination performs well. The entry and exit conditions rely on simultaneous thresholds, and the example does not explain pair selection, trading costs, position sizing, or safeguards beyond the configured stop and ROI settings.
Key ideas
- The strategy opens long positions when prior-bar CCI, MFI, and CMO readings all cross specified low thresholds.
- It exits when all three indicators cross specified high thresholds on the prior bar.
- The example uses a 15-minute timeframe and configures a stop loss and age-dependent ROI targets.
- No performance results, instrument selection rules, or transaction-cost assumptions are supplied.
Tags
Full text
# CMCWinner.py
```py
# --- Do not remove these libs ---
from freqtrade.strategy import IStrategy
from pandas import DataFrame
# --------------------------------
# Add your lib to import here
import talib.abstract as ta
import freqtrade.vendor.qtpylib.indicators as qtpylib
import numpy # noqa
# This class is a sample. Feel free to customize it.
class CMCWinner(IStrategy):
"""
This is a test strategy to inspire you.
More information in https://github.com/freqtrade/freqtrade/blob/develop/docs/bot-optimization.md
You can:
- Rename the class name (Do not forget to update class_name)
- Add any methods you want to build your strategy
- Add any lib you need to build your strategy
You must keep:
- the lib in the section "Do not remove these libs"
- the prototype for the methods: minimal_roi, stoploss, populate_indicators, populate_entry_trend,
populate_exit_trend, hyperopt_space, buy_strategy_generator
"""
# Minimal ROI designed for the strategy.
# This attribute will be overridden if the config file contains "minimal_roi"
minimal_roi = {
"40": 0.0,
"30": 0.02,
"20": 0.03,
"0": 0.05
}
# Optimal stoploss designed for the strategy
# This attribute will be overridden if the config file contains "stoploss"
stoploss = -0.05
# Optimal timeframe for the strategy
timeframe = '15m'
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
"""
Adds several different TA indicators to the given DataFrame
Performance Note: For the best performance be frugal on the number of indicators
you are using. Let uncomment only the indicator you are using in your strategies
or your hyperopt configuration, otherwise you will waste your memory and CPU usage.
"""
# Commodity Channel Index: values Oversold:<-100, Overbought:>100
dataframe['cci'] = ta.CCI(dataframe)
# MFI
dataframe['mfi'] = ta.MFI(dataframe)
# CMO
dataframe['cmo'] = ta.CMO(dataframe)
return dataframe
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
"""
Based on TA indicators, populates the buy signal for the given dataframe
:param dataframe: DataFrame
:return: DataFrame with buy column
"""
dataframe.loc[
(
(dataframe['cci'].shift(1) < -100) &
(dataframe['mfi'].shift(1) < 20) &
(dataframe['cmo'].shift(1) < -50)
),
'enter_long'] = 1
return dataframe
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
"""
Based on TA indicators, populates the sell signal for the given dataframe
:param dataframe: DataFrame
:return: DataFrame with buy column
"""
dataframe.loc[
(
(dataframe['cci'].shift(1) > 100) &
(dataframe['mfi'].shift(1) > 80) &
(dataframe['cmo'].shift(1) > 50)
),
'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.