The HLHB ("Huck loves her bucks!") System simply aims to catch short-term forex trends. More information in https://www.babypips.com/trading/forex-hlhb-system-explained
Timeframe
4h
Direction
Long Only
Stoploss
-32.1%
Trailing Stop
Yes
ROI
0m: 62.3%, 703m: 21.9%, 2849m: 3.6%, 5520m: 0.0%
Interface Version
2
Startup Candles
N/A
Indicators
3
freqtrade/freqtrade-strategies
Strategy 003 author@: Gerald Lonlas github@: https://github.com/freqtrade/freqtrade-strategies
# pragma pylint: disable=missing-docstring, invalid-name, pointless-string-statement
import numpy as np # noqa
import pandas as pd # noqa
import talib.abstract as ta
from pandas import DataFrame
import coingro.vendor.qtpylib.indicators as qtpylib
from coingro.strategy import IStrategy
class hlhb(IStrategy):
"""
The HLHB ("Huck loves her bucks!") System simply aims to catch short-term forex trends.
More information in https://www.babypips.com/trading/forex-hlhb-system-explained
"""
INTERFACE_VERSION = 2
position_stacking = "True"
# Minimal ROI designed for the strategy.
# This attribute will be overridden if the config file contains "minimal_roi".
minimal_roi = {"0": 0.6225, "703": 0.2187, "2849": 0.0363, "5520": 0}
# Optimal stoploss designed for the strategy.
# This attribute will be overridden if the config file contains "stoploss".
stoploss = -0.3211
# Trailing stoploss
trailing_stop = True
trailing_stop_positive = 0.0117
trailing_stop_positive_offset = 0.0186
trailing_only_offset_is_reached = True
# Optimal timeframe for the strategy.
timeframe = "4h"
# Run "populate_indicators()" only for new candle.
process_only_new_candles = True
# These values can be overridden in the "ask_strategy" section in the config.
use_sell_signal = True
sell_profit_only = False
ignore_roi_if_buy_signal = True
# Number of candles the strategy requires before producing valid signals
startup_candle_count: int = 30
# Optional order type mapping.
order_types = {
"buy": "limit",
"sell": "limit",
"stoploss": "market",
"stoploss_on_exchange": False,
}
# Optional order time in force.
order_time_in_force = {"buy": "gtc", "sell": "gtc"}
plot_config = {
# Main plot indicators (Moving averages, ...)
"main_plot": {
"ema5": {},
"ema10": {},
},
"subplots": {
# Subplots - each dict defines one additional plot
"RSI": {
"rsi": {"color": "red"},
},
"ADX": {
"adx": {},
},
},
}
def informative_pairs(self):
return []
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe["hl2"] = (dataframe["close"] + dataframe["open"]) / 2
# Momentum Indicators
# ------------------------------------
# RSI
dataframe["rsi"] = ta.RSI(dataframe, timeperiod=10, price="hl2")
# # EMA - Exponential Moving Average
dataframe["ema5"] = ta.EMA(dataframe, timeperiod=5)
dataframe["ema10"] = ta.EMA(dataframe, timeperiod=10)
# ADX
dataframe["adx"] = ta.ADX(dataframe)
return dataframe
def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe.loc[
(
(qtpylib.crossed_above(dataframe["rsi"], 50))
& (qtpylib.crossed_above(dataframe["ema5"], dataframe["ema10"]))
& (dataframe["adx"] > 25)
& (dataframe["volume"] > 0) # Make sure Volume is not 0
),
"buy",
] = 1
return dataframe
def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe.loc[
(
(qtpylib.crossed_below(dataframe["rsi"], 50))
& (qtpylib.crossed_below(dataframe["ema5"], dataframe["ema10"]))
& (dataframe["adx"] > 25)
& (dataframe["volume"] > 0) # Make sure Volume is not 0
),
"sell",
] = 1
return dataframe