DISCLAIMER
The codes in this post is just for educational purpose, and not to be used on live trading
There are some technical libraries available for use, such as ta-lib, pandas-ta and finta. They have implemented most of publicly-known indicators so you don’t have to code them yourself. These libraries are installed in Freqtrade by default
One thing you must know is each of them has different way of input and output format, even within the same library. Let’s take ta-lib for example. If you see previous example, I calculated rsi as ta.RSI(dataframe, 14)
. If you look at ta-lib’s documentation, I should have give it the close column instead of the whole dataframe, but it has been coded internally to deal with it. But then if I’m going to calculate cci
for example, I can’t just write ta.CCI(dataframe, 14)
. I have to write it the proper way as ta.CCI(dataframe['high'], dataframe['low'], dataframe['close'], 14)
.
So just for the sake of clarity and following the proper format, the code from previous post would look like this
from freqtrade.strategy import IStrategy, informative from pandas import DataFrame import freqtrade.vendor.qtpylib.indicators as qtpylib import talib.abstract as ta from freqtrade.persistence import Trade from datetime import datetime, timedelta from typing import Optional, Union class strat_template (IStrategy): def version(self) -> str: return "template-v1" INTERFACE_VERSION = 3 minimal_roi = { "0": 0.05 } stoploss = -0.05 timeframe = '15m' process_only_new_candles = True startup_candle_count = 999 use_custom_stoploss = True def custom_stoploss(self, pair: str, trade: 'Trade', current_time: datetime, current_rate: float, current_profit: float, **kwargs) -> float: sl_new = 1 if (current_time - timedelta(minutes=15) >= trade.open_date_utc): dataframe, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe) current_candle = dataframe.iloc[-1].squeeze() current_profit = trade.calc_profit_ratio(current_candle['close']) if (current_profit >= 0.03): sl_new = 0.01 return sl_new def custom_exit(self, pair: str, trade: Trade, current_time: datetime, current_rate: float, current_profit: float, **kwargs) -> Optional[Union[str, bool]]: if ((current_time - timedelta(minutes=15)) >= trade.open_date_utc): dataframe, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe) current_candle = dataframe.iloc[-1].squeeze() current_profit = trade.calc_profit_ratio(current_candle['close']) if (current_profit >= 0): if (current_candle['rsi'] >= 70): return "rsi_overbought" @informative('30m') def populate_indicators_inf1(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe['rsi'] = ta.RSI(dataframe['close'], 14) return dataframe @informative('1h') def populate_indicators_inf2(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe['rsi'] = ta.RSI(dataframe['close'], 14) return dataframe def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe['ema_9'] = ta.EMA(dataframe['close'], 9) dataframe['ema_20'] = ta.EMA(dataframe['close'], 20) dataframe['rsi'] = ta.RSI(dataframe['close'], 14) return dataframe def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ qtpylib.crossed_above(dataframe['ema_9'], dataframe['ema_20']) & (dataframe['rsi_30m'] < 50) & (dataframe['rsi_1h'] < 30) & (dataframe['volume'] > 0) , ['enter_long', 'enter_tag'] ] = (1, 'golden cross') return dataframe def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ qtpylib.crossed_below(dataframe['ema_9'], dataframe['ema_20']) & (dataframe['volume'] > 0) , ['exit_long', 'exit_tag'] ] = (1, 'death cross') return dataframe
[…] Previous – Custom exit Next – Technical libraries […]
[…] Previous – Technical libraries Next […]
[…] Technical libraries […]