Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # --- Do not remove these libs ---
- from freqtrade.strategy.interface 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 hullmachop(IStrategy):
- __test__ = False # pytest expects to find tests here because of the name
- """
- This is a test strategy to inspire you.
- More information in https://github.com/freqtrade/freqtrade/blob/develop/docs/bot-optimization.md
- You can:
- :return: a Dataframe with all mandatory indicators for the strategies
- - 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_buy_trend,
- populate_sell_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 = {
- #"0": 0.15
- "0":0.15
- }
- # Optimal stoploss designed for the strategy
- # This attribute will be overridden if the config file contains "stoploss"
- stoploss = -0.1
- # trailing stoploss
- trailing_stop = False
- trailing_stop_positive = 0.10
- trailing_stop_positive_offset = 0.25 # Disabled / not configured
- trailing_only_offset_is_reached = True
- # Optimal ticker interval for the strategy
- ticker_interval = '12h'
- # run "populate_indicators" only for new candle
- process_only_new_candles = True
- # Experimental settings (configuration will overide these if set)
- use_sell_signal = True
- sell_profit_only = False
- ignore_roi_if_buy_signal = False
- # Optional order type mapping
- order_types = {
- 'buy': 'market',
- 'sell': 'market',
- 'stoploss': 'market',
- 'stoploss_on_exchange': False
- }
- # Optional order time in force
- order_time_in_force = {
- 'buy': 'gtc',
- 'sell': 'gtc'
- }
- def informative_pairs(self):
- """
- Define additional, informative pair/interval combinations to be cached from the exchange.
- These pair/interval combinations are non-tradeable, unless they are part
- of the whitelist as well.
- For more information, please consult the documentation
- :return: List of tuples in the format (pair, interval)
- Sample: return [("ETH/USDT", "5m"),
- ("BTC/USDT", "15m"),
- ]
- """
- return []
- 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.
- :param dataframe: Raw data from the exchange and parsed by parse_ticker_dataframe()
- :param metadata: Additional information, like the currently traded pair
- :return: a Dataframe with all mandatory indicators for the strategies
- """
- """dataframe['adx'] = ta.ADX(dataframe)
- # Chopiness
- """
- dataframe['chop'] = qtpylib.choppiness(dataframe)
- dataframe['hullma'] = qtpylib.hma(dataframe['close'],36)
- """
- # Awesome oscillator
- dataframe['ao'] = qtpylib.awesome_oscillator(dataframe)
- # Commodity Channel Index: values Oversold:<-100, Overbought:>100
- dataframe['cci'] = ta.CCI(dataframe)
- # MACD
- macd = ta.MACD(dataframe)
- dataframe['macd'] = macd['macd']
- dataframe['macdsignal'] = macd['macdsignal']
- dataframe['macdhist'] = macd['macdhist']
- # MFI
- dataframe['mfi'] = ta.MFI(dataframe)
- # Minus Directional Indicator / Movement
- dataframe['minus_dm'] = ta.MINUS_DM(dataframe)
- dataframe['minus_di'] = ta.MINUS_DI(dataframe)
- # Plus Directional Indicator / Movement
- dataframe['plus_dm'] = ta.PLUS_DM(dataframe)
- dataframe['plus_di'] = ta.PLUS_DI(dataframe)
- dataframe['minus_di'] = ta.MINUS_DI(dataframe)
- # ROC
- dataframe['roc'] = ta.ROC(dataframe)
- # RSI
- dataframe['rsi'] = ta.RSI(dataframe)
- # Inverse Fisher transform on RSI, values [-1.0, 1.0] (https://goo.gl/2JGGoy)
- rsi = 0.1 * (dataframe['rsi'] - 50)
- dataframe['fisher_rsi'] = (numpy.exp(2 * rsi) - 1) / (numpy.exp(2 * rsi) + 1)
- # Inverse Fisher transform on RSI normalized, value [0.0, 100.0] (https://goo.gl/2JGGoy)
- dataframe['fisher_rsi_norma'] = 50 * (dataframe['fisher_rsi'] + 1)
- # Stoch
- stoch = ta.STOCH(dataframe)
- dataframe['slowd'] = stoch['slowd']
- dataframe['slowk'] = stoch['slowk']
- # Stoch fast
- stoch_fast = ta.STOCHF(dataframe)
- dataframe['fastd'] = stoch_fast['fastd']
- dataframe['fastk'] = stoch_fast['fastk']
- # Stoch RSI
- stoch_rsi = ta.STOCHRSI(dataframe)
- dataframe['fastd_rsi'] = stoch_rsi['fastd']
- dataframe['fastk_rsi'] = stoch_rsi['fastk']
- # Overlap Studies
- # ------------------------------------
- # Bollinger bands
- bollinger = qtpylib.bollinger_bands(qtpylib.typical_price(dataframe), window=20, stds=2)
- dataframe['bb_lowerband'] = bollinger['lower']
- dataframe['bb_middleband'] = bollinger['mid']
- dataframe['bb_upperband'] = bollinger['upper']
- # EMA - Exponential Moving Average
- """
- dataframe['ema25'] = ta.EMA(dataframe, timeperiod=25)
- dataframe['ema7'] = ta.EMA(dataframe, timeperiod=7)
- """
- dataframe['ema10'] = ta.EMA(dataframe, timeperiod=10)
- dataframe['ema50'] = ta.EMA(dataframe, timeperiod=50)
- dataframe['ema100'] = ta.EMA(dataframe, timeperiod=100)
- # SAR Parabol
- dataframe['sar'] = ta.SAR(dataframe)
- # TEMA - Triple Exponential Moving Average
- dataframe['tema'] = ta.TEMA(dataframe, timeperiod=9)
- # Cycle Indicator
- # ------------------------------------
- # Hilbert Transform Indicator - SineWave
- hilbert = ta.HT_SINE(dataframe)
- dataframe['htsine'] = hilbert['sine']
- dataframe['htleadsine'] = hilbert['leadsine']
- # Pattern Recognition - Bullish candlestick patterns
- # ------------------------------------
- # Hammer: values [0, 100]
- dataframe['CDLHAMMER'] = ta.CDLHAMMER(dataframe)
- # Inverted Hammer: values [0, 100]
- dataframe['CDLINVERTEDHAMMER'] = ta.CDLINVERTEDHAMMER(dataframe)
- # Dragonfly Doji: values [0, 100]
- dataframe['CDLDRAGONFLYDOJI'] = ta.CDLDRAGONFLYDOJI(dataframe)
- # Piercing Line: values [0, 100]
- dataframe['CDLPIERCING'] = ta.CDLPIERCING(dataframe) # values [0, 100]
- # Morningstar: values [0, 100]
- dataframe['CDLMORNINGSTAR'] = ta.CDLMORNINGSTAR(dataframe) # values [0, 100]
- # Three White Soldiers: values [0, 100]
- dataframe['CDL3WHITESOLDIERS'] = ta.CDL3WHITESOLDIERS(dataframe) # values [0, 100]
- # Pattern Recognition - Bearish candlestick patterns
- # ------------------------------------
- # Hanging Man: values [0, 100]
- dataframe['CDLHANGINGMAN'] = ta.CDLHANGINGMAN(dataframe)
- # Shooting Star: values [0, 100]
- dataframe['CDLSHOOTINGSTAR'] = ta.CDLSHOOTINGSTAR(dataframe)
- # Gravestone Doji: values [0, 100]
- dataframe['CDLGRAVESTONEDOJI'] = ta.CDLGRAVESTONEDOJI(dataframe)
- # Dark Cloud Cover: values [0, 100]
- dataframe['CDLDARKCLOUDCOVER'] = ta.CDLDARKCLOUDCOVER(dataframe)
- # Evening Doji Star: values [0, 100]
- dataframe['CDLEVENINGDOJISTAR'] = ta.CDLEVENINGDOJISTAR(dataframe)
- # Evening Star: values [0, 100]
- dataframe['CDLEVENINGSTAR'] = ta.CDLEVENINGSTAR(dataframe)
- # Pattern Recognition - Bullish/Bearish candlestick patterns
- # ------------------------------------
- # Three Line Strike: values [0, -100, 100]
- dataframe['CDL3LINESTRIKE'] = ta.CDL3LINESTRIKE(dataframe)
- # Spinning Top: values [0, -100, 100]
- dataframe['CDLSPINNINGTOP'] = ta.CDLSPINNINGTOP(dataframe) # values [0, -100, 100]
- # Engulfing: values [0, -100, 100]
- dataframe['CDLENGULFING'] = ta.CDLENGULFING(dataframe) # values [0, -100, 100]
- # Harami: values [0, -100, 100]
- dataframe['CDLHARAMI'] = ta.CDLHARAMI(dataframe) # values [0, -100, 100]
- # Three Outside Up/Down: values [0, -100, 100]
- dataframe['CDL3OUTSIDE'] = ta.CDL3OUTSIDE(dataframe) # values [0, -100, 100]
- # Three Inside Up/Down: values [0, -100, 100]
- dataframe['CDL3INSIDE'] = ta.CDL3INSIDE(dataframe) # values [0, -100, 100]
- # Chart type
- # ------------------------------------
- # Heikinashi stategy
- heikinashi = qtpylib.heikinashi(dataframe)
- dataframe['ha_open'] = heikinashi['open']
- dataframe['ha_close'] = heikinashi['close']
- dataframe['ha_high'] = heikinashi['high']
- dataframe['ha_low'] = heikinashi['low']
- """
- return dataframe
- def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
- """
- Based on TA indicators, populates the buy signal for the given dataframe
- :param dataframe: DataFrame populated with indicators
- :param metadata: Additional information, like the currently traded pair
- :return: DataFrame with buy column
- """
- dataframe.loc[
- (
- (dataframe['close'].shift(1)<dataframe['hullma'].shift(1)) &
- (dataframe['close']>=dataframe['hullma']) &
- (dataframe['chop'] < 46 )
- ),
- 'buy'] = 1
- #print(dataframe.tail())
- return dataframe
- def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
- """
- Based on TA indicators, populates the sell signal for the given dataframe
- :param dataframe: DataFrame populated with indicators
- :param metadata: Additional information, like the currently traded pair
- :return: DataFrame with buy column
- """
- dataframe.loc[
- (
- ((dataframe['ema7'] < dataframe['ema25']) &
- (dataframe['ema7'].shift(1) >= dataframe['ema25'].shift(1)) &
- (dataframe['volume'] > 0))
- ),
- 'sell'] = 1
- return dataframe
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement