btc update

This commit is contained in:
crypto_rahino 2021-03-28 19:26:17 +03:00
parent ef354cb6b9
commit 153ecf2ab5
10 changed files with 420 additions and 583 deletions

View File

@ -15,18 +15,18 @@ import matplotlib
# # Initialize empty configuration object # # Initialize empty configuration object
from freqtrade.strategy import IStrategy from freqtrade.strategy import IStrategy
config = Configuration.from_files(["user_data/config_ltcusdt_1h.json"]) config = Configuration.from_files(["user_data/config_btcusdt_1m.json"])
# # Optionally, use existing configuration file # # Optionally, use existing configuration file
# config = Configuration.from_files(["config.json"]) # config = Configuration.from_files(["config.json"])
# #
# # Define some constants # # Define some constants
# config["timeframe"] = "1m" # config["timeframe"] = "1m"
# # Name of the strategy class # # Name of the strategy class
config["strategy"] = "ltcusdt_1h" config["strategy"] = "quick_btcusdt_1m"
# # Location of the data # # Location of the data
data_location = Path(config['user_data_dir'], 'data', 'binance') data_location = Path(config['user_data_dir'], 'data', 'binance')
# # Pair to analyze - Only use one pair here # # Pair to analyze - Only use one pair here
pair = "LTC/USDT" pair = "BTC/USDT"
# #
# # Load data using values set above # # Load data using values set above
# #
@ -102,7 +102,7 @@ def plot_db(path):
graph = generate_candlestick_graph(pair=pair, graph = generate_candlestick_graph(pair=pair,
data=data_red, data=data_red,
trades=trades_red, trades=trades_red,
indicators1=['tsf_mid'], indicators1=['tsf_mid', 'match_low'],
indicators2=['correl_tsf_mid_close', 'correl_angle_short_close', indicators2=['correl_tsf_mid_close', 'correl_angle_short_close',
'correl_angle_long_close', 'correl_hist_close'] 'correl_angle_long_close', 'correl_hist_close']
) )
@ -148,12 +148,12 @@ def plot_backtest(start_date, stop_date):
graph = generate_candlestick_graph(pair=pair, graph = generate_candlestick_graph(pair=pair,
data=data_red, data=data_red,
trades=trades, trades=trades,
indicators1=['sar', 'tsf_mid'], indicators1=['tsf_mid', 'fib', 'kama', 'fib_1h'],
indicators2=['sine', 'leadsine', 'angle_trend_mid', 'inphase', 'quadrature' ] indicators2=['macd', 'bop_1h', 'macdsignal', 'mode', 'period_1h', 'sine', 'leadsine', 'period']
) )
graph.show() graph.show()
plot_backtest(start_date='2020-01-01', stop_date='2021-03-18') plot_backtest(start_date='2021-03-01', stop_date='2021-03-26')

View File

@ -1,10 +1,10 @@
{ {
"max_open_trades": 3, "max_open_trades": 10,
"stake_currency": "USDT", "stake_currency": "USDT",
"stake_amount": 0.05, "stake_amount": 100,
"tradable_balance_ratio": 0.99, "tradable_balance_ratio": 0.99,
"fiat_display_currency": "USD", "fiat_display_currency": "USD",
"timeframe": "1m", "timeframe": "1h",
"dry_run": true, "dry_run": true,
"cancel_open_orders_on_exit": false, "cancel_open_orders_on_exit": false,
"unfilledtimeout": { "unfilledtimeout": {
@ -44,7 +44,7 @@
"DOGE/USDT", "DOGE/USDT",
"BTC/USDT", "BTC/USDT",
"ADA/USDT", "ADA/USDT",
"TRX/XRP" "LTC/USDT"
], ],
"pair_blacklist": [ "pair_blacklist": [
"BNB/BTC" "BNB/BTC"

View File

@ -1,18 +1,19 @@
{ {
"max_open_trades": 3, "max_open_trades": 3,
"stake_currency": "USDT", "stake_currency": "USDT",
"stake_amount": 1000.0, "stake_amount": 990.0,
"tradable_balance_ratio": 0.99, "tradable_balance_ratio": 0.99,
"fiat_display_currency": "USD", "fiat_display_currency": "USD",
"timeframe": "1m", "timeframe": "1m",
"dry_run": true, "dry_run": true,
"position_stacking": true, "position_stacking": false,
"cancel_open_orders_on_exit": true, "cancel_open_orders_on_exit": true,
"unfilledtimeout": { "unfilledtimeout": {
"buy": 10, "buy": 10,
"sell": 30 "sell": 30
}, },
"bid_strategy": { "bid_strategy": {
"price_side": "ask",
"use_order_book": false, "use_order_book": false,
"ask_last_balance": 0.0, "ask_last_balance": 0.0,
"order_book_top": 1, "order_book_top": 1,
@ -22,6 +23,7 @@
} }
}, },
"ask_strategy":{ "ask_strategy":{
"price_side": "bid",
"use_order_book": false, "use_order_book": false,
"order_book_min": 1, "order_book_min": 1,
"order_book_max": 1, "order_book_max": 1,

View File

@ -13,6 +13,7 @@
"sell": 30 "sell": 30
}, },
"bid_strategy": { "bid_strategy": {
"price_side": "ask",
"use_order_book": false, "use_order_book": false,
"ask_last_balance": 0.0, "ask_last_balance": 0.0,
"order_book_top": 1, "order_book_top": 1,
@ -22,6 +23,7 @@
} }
}, },
"ask_strategy":{ "ask_strategy":{
"price_side": "bid",
"use_order_book": false, "use_order_book": false,
"order_book_min": 1, "order_book_min": 1,
"order_book_max": 1, "order_book_max": 1,

View File

@ -1,18 +1,19 @@
{ {
"max_open_trades": 3, "max_open_trades": 2,
"stake_currency": "USDT", "stake_currency": "USDT",
"stake_amount": 100.0, "stake_amount": 990,
"tradable_balance_ratio": 0.99, "tradable_balance_ratio": 0.99,
"fiat_display_currency": "USD", "fiat_display_currency": "USD",
"timeframe": "1h", "timeframe": "1h",
"dry_run": true, "dry_run": true,
"position_stacking": true, "position_stacking": false,
"cancel_open_orders_on_exit": false, "cancel_open_orders_on_exit": false,
"unfilledtimeout": { "unfilledtimeout": {
"buy": 10, "buy": 10,
"sell": 30 "sell": 30
}, },
"bid_strategy": { "bid_strategy": {
"price_side": "ask",
"use_order_book": false, "use_order_book": false,
"ask_last_balance": 0.0, "ask_last_balance": 0.0,
"order_book_top": 1, "order_book_top": 1,
@ -22,12 +23,13 @@
} }
}, },
"ask_strategy":{ "ask_strategy":{
"use_order_book": true, "price_side": "bid",
"use_order_book": false,
"order_book_min": 1, "order_book_min": 1,
"order_book_max": 1, "order_book_max": 1,
"use_sell_signal": true, "use_sell_signal": true,
"sell_profit_only": true, "sell_profit_only": false,
"ignore_roi_if_buy_signal": true "ignore_roi_if_buy_signal": false
}, },
"exchange": { "exchange": {
"name": "binance", "name": "binance",
@ -40,6 +42,7 @@
}, },
"pair_whitelist": [ "pair_whitelist": [
"LTC/USDT" "LTC/USDT"
], ],
"pair_blacklist": [ "pair_blacklist": [
"BNB/BTC" "BNB/BTC"
@ -49,22 +52,22 @@
{"method": "StaticPairList"} {"method": "StaticPairList"}
], ],
"edge": { "edge": {
"enabled": false, "enabled": true,
"process_throttle_secs": 3600, "process_throttle_secs": 3600,
"calculate_since_number_of_days": 7, "calculate_since_number_of_days": 14,
"allowed_risk": 0.01, "allowed_risk": 0.02,
"stoploss_range_min": -0.01, "stoploss_range_min": -0.01,
"stoploss_range_max": -0.1, "stoploss_range_max": -0.1,
"stoploss_range_step": -0.01, "stoploss_range_step": -0.01,
"minimum_winrate": 0.60, "minimum_winrate": 0.60,
"minimum_expectancy": 0.20, "minimum_expectancy": 0.20,
"min_trade_number": 10, "min_trade_number": 10,
"max_trade_duration_minute": 1440, "max_trade_duration_minute": 14400,
"remove_pumps": false "remove_pumps": false
}, },
"telegram": { "telegram": {
"enabled": false, "enabled": false,
"token": "1661670711:AAEjHFL_wnvc-hN0V8NKe0G53mzrz9rWnzk", "token": "1725064196:AAGvqiJEC_uv8THpsZG1F_Or7T2dGYRFuqU",
"chat_id": "1288347675", "chat_id": "1288347675",
"keyboard": [ "keyboard": [
["/daily", "/stats", "/balance", "/profit"], ["/daily", "/stats", "/balance", "/profit"],

View File

@ -53,13 +53,29 @@ class hyper_ltcusdt_1h(IHyperOpt):
# GUARDS AND TRENDS # GUARDS AND TRENDS
if params.get('ao-enabled'): if params.get('ao-enabled'):
conditions.append(dataframe['ao'] > params['ao1-value']) conditions.append(dataframe['ao'] > params['ao-value'])
conditions.append(dataframe['ao'] < params['ao2-value']) if params.get('uo-enabled'):
conditions.append(dataframe['uo'] > params['uo-value'])
if params.get('sar_close-enabled'):
conditions.append(dataframe['sar_close'] < params['sar_close-value'])
if params.get('natr-enabled'):
conditions.append(dataframe['natr'] > params['natr-value'])
if params.get('angle_tsf_mid-enabled'): if params.get('angle_tsf_mid-enabled'):
conditions.append(dataframe['angle_tsf_mid'] < params['angle_tsf_mid-value']) conditions.append(dataframe['angle_tsf_mid'] < params['angle_tsf_mid-value'])
if params.get('rsi-enabled'): if params.get('angle_trend_mid-enabled'):
conditions.append(params['rsi1-value'] < dataframe['rsi']) conditions.append(dataframe['angle_trend_mid'] < params['angle_trend_mid-value'])
conditions.append(params['rsi2-value'] > dataframe['rsi']) if params.get('mfi-enabled'):
conditions.append(params['mfi-value'] < dataframe['mfi'])
if params.get('angle-enabled'):
conditions.append(params['angle-value'] < dataframe['angle'])
if params.get('angle_macdsignal-enabled'):
conditions.append(params['angle_macdsignal-value'] < dataframe['angle_macdsignal'])
if params.get('macdhist-enabled'):
conditions.append(params['macdhist-value'] < dataframe['macdhist'])
if params.get('macdsignal-enabled'):
conditions.append(params['macdsignal-value'] < dataframe['macdsignal'])
if params.get('macd-enabled'):
conditions.append(params['macd-value'] < (dataframe['macd'] - dataframe['macdsignal']))
# TRIGGERS # TRIGGERS
if 'trigger' in params: if 'trigger' in params:
@ -71,6 +87,14 @@ class hyper_ltcusdt_1h(IHyperOpt):
conditions.append(qtpylib.crossed_above( conditions.append(qtpylib.crossed_above(
dataframe['leadsine'], dataframe['sine'] dataframe['leadsine'], dataframe['sine']
)) ))
if params['trigger'] == 'phase':
conditions.append(qtpylib.crossed_above(
dataframe['quadrature'], dataframe['inphase']
))
if params['trigger'] == 'angle_tsf_mid':
conditions.append(qtpylib.crossed_above(
dataframe['angle_tsf_mid'], 0
))
if conditions: if conditions:
dataframe.loc[ dataframe.loc[
@ -87,15 +111,31 @@ class hyper_ltcusdt_1h(IHyperOpt):
Define your Hyperopt space for searching buy strategy parameters. Define your Hyperopt space for searching buy strategy parameters.
""" """
return [ return [
Integer(-50, 50, name='ao1-value'), Integer(-50, 35, name='ao-value'),
Integer(-50, 50, name='ao2-value'), Integer(-86, 70, name='sar_close-value'),
Integer(-87, 85, name='angle_tsf_mid-value'), Integer(-75, 72, name='angle_tsf_mid-value'),
Integer(8, 92, name='rsi1-value'), Integer(-73, 68, name='angle_trend_mid-value'),
Integer(8, 92, name='rsi2-value'), Integer(-2, 80, name='uo-value'),
Real(0.36, 11, name='natr-value'),
Integer(0, 100, name='mfi-value'),
Integer(-81, 78, name='angle-value'),
Integer(-38, 50, name='angle_macdsignal-value'),
Real(-4, 5.3, name='macdhist-value'),
Integer(-15, 11, name='macdsignal-value'),
Real(-4, 5, name='macd-value'),
Categorical([True, False], name='ao-enabled'), Categorical([True, False], name='ao-enabled'),
Categorical([True, False], name='angle_tsf_mid-enabled'), Categorical([True, False], name='angle_tsf_mid-enabled'),
Categorical([True, False], name='rsi-enabled'), Categorical([True, False], name='sar_close-enabled'),
Categorical(['sar', 'sine'], name='trigger') Categorical([True, False], name='angle_trend_mid-enabled'),
Categorical([True, False], name='uo-enabled'),
Categorical([True, False], name='natr-enabled'),
Categorical([True, False], name='mfi-enabled'),
Categorical([True, False], name='angle-enabled'),
Categorical([True, False], name='angle_macdsignal-enabled'),
Categorical([True, False], name='macdhist-enabled'),
Categorical([True, False], name='macdsignal-enabled'),
Categorical([True, False], name='macd-enabled'),
Categorical(['sar', 'sine', 'angle_tsf_mid', 'angle_trend_mid', 'phase'], name='trigger')
] ]
@staticmethod @staticmethod
@ -112,13 +152,29 @@ class hyper_ltcusdt_1h(IHyperOpt):
# GUARDS AND TRENDS # GUARDS AND TRENDS
if params.get('ao-enabled'): if params.get('ao-enabled'):
conditions.append(dataframe['ao'] > params['ao1-value_sell']) conditions.append(dataframe['ao'] > params['ao-value_sell'])
conditions.append(dataframe['ao'] < params['ao2-value_sell']) if params.get('uo-enabled'):
conditions.append(dataframe['uo'] > params['uo-value_sell'])
if params.get('sar_close-enabled'):
conditions.append(dataframe['sar_close'] < params['sar_close-value_sell'])
if params.get('natr-enabled'):
conditions.append(dataframe['natr'] > params['natr-value_sell'])
if params.get('angle_tsf_mid-enabled'): if params.get('angle_tsf_mid-enabled'):
conditions.append(dataframe['angle_tsf_mid'] > params['angle_tsf_mid-value_sell']) conditions.append(dataframe['angle_tsf_mid'] < params['angle_tsf_mid-value_sell'])
if params.get('rsi-enabled'): if params.get('angle_trend_mid-enabled'):
conditions.append(params['rsi1-value_sell'] < dataframe['rsi']) conditions.append(dataframe['angle_trend_mid'] < params['angle_trend_mid-value_sell'])
conditions.append(params['rsi2-value_sell'] > dataframe['rsi']) if params.get('mfi-enabled'):
conditions.append(params['mfi-value_sell'] < dataframe['mfi'])
if params.get('angle-enabled'):
conditions.append(params['angle-value_sell'] < dataframe['angle'])
if params.get('angle_macdsignal-enabled'):
conditions.append(params['angle_macdsignal-value_sell'] < dataframe['angle_macdsignal'])
if params.get('macdhist-enabled'):
conditions.append(params['macdhist-value_sell'] < dataframe['macdhist'])
if params.get('macdsignal-enabled'):
conditions.append(params['macdsignal-value_sell'] < dataframe['macdsignal'])
if params.get('macd-enabled'):
conditions.append(params['macd-value_sell'] < (dataframe['macd'] - dataframe['macdsignal']))
# TRIGGERS # TRIGGERS
if 'trigger' in params: if 'trigger' in params:
@ -130,6 +186,18 @@ class hyper_ltcusdt_1h(IHyperOpt):
conditions.append(qtpylib.crossed_below( conditions.append(qtpylib.crossed_below(
dataframe['leadsine'], dataframe['sine'] dataframe['leadsine'], dataframe['sine']
)) ))
if params['trigger'] == 'phase':
conditions.append(qtpylib.crossed_below(
dataframe['quadrature'], dataframe['inphase']
))
if params['trigger'] == 'angle_trend_mid':
conditions.append(qtpylib.crossed_below(
dataframe['angle_trend_mid'], 0
))
if params['trigger'] == 'angle_tsf_mid':
conditions.append(qtpylib.crossed_below(
dataframe['angle_tsf_mid'], 0
))
if conditions: if conditions:
@ -147,15 +215,31 @@ class hyper_ltcusdt_1h(IHyperOpt):
Define your Hyperopt space for searching sell strategy parameters. Define your Hyperopt space for searching sell strategy parameters.
""" """
return [ return [
Integer(-50, 50, name='ao1-value_sell'), Integer(-50, 35, name='ao-value_sell'),
Integer(-50, 50, name='ao2-value_sell'), Integer(-86, 70, name='sar_close-value_sell'),
Integer(-87, 85, name='angle_tsf_mid-value_sell'), Integer(-75, 72, name='angle_tsf_mid-value_sell'),
Integer(8, 92, name='rsi1-value_sell'), Integer(-73, 68, name='angle_trend_mid-value_sell'),
Integer(8, 92, name='rsi2-value_sell'), Integer(-2, 80, name='uo-value_sell'),
Real(0.36, 11, name='natr-value_sell'),
Integer(0, 100, name='mfi-value_sell'),
Integer(-81, 78, name='angle-value_sell'),
Integer(-38, 50, name='angle_macdsignal-value_sell'),
Real(-4, 5.3, name='macdhist-value_sell'),
Integer(-15, 11, name='macdsignal-value_sell'),
Real(-4, 5, name='macd-value_sell'),
Categorical([True, False], name='ao-enabled'), Categorical([True, False], name='ao-enabled'),
Categorical([True, False], name='angle_tsf_mid-enabled'), Categorical([True, False], name='angle_tsf_mid-enabled'),
Categorical([True, False], name='rsi-enabled'), Categorical([True, False], name='sar_close-enabled'),
Categorical(['sar', 'sine'], name='trigger') Categorical([True, False], name='angle_trend_mid-enabled'),
Categorical([True, False], name='uo-enabled'),
Categorical([True, False], name='natr-enabled'),
Categorical([True, False], name='mfi-enabled'),
Categorical([True, False], name='angle-enabled'),
Categorical([True, False], name='angle_macdsignal-enabled'),
Categorical([True, False], name='macdhist-enabled'),
Categorical([True, False], name='macdsignal-enabled'),
Categorical([True, False], name='macd-enabled'),
Categorical(['sar', 'sine', 'angle_tsf_mid', 'angle_trend_mid', 'phase'], name='trigger')
] ]
@staticmethod @staticmethod
@ -208,7 +292,7 @@ class hyper_ltcusdt_1h(IHyperOpt):
'stoploss' optimization hyperspace. 'stoploss' optimization hyperspace.
""" """
return [ return [
Real(-0.25, -0.02, name='stoploss'), Real(-0.3, -0.02, name='stoploss'),
] ]
@staticmethod @staticmethod

View File

@ -1,240 +0,0 @@
# pragma pylint: disable=missing-docstring, invalid-name, pointless-string-statement
# --- Do not remove these libs ---
from functools import reduce
from typing import Any, Callable, Dict, List
import numpy as np # noqa
import pandas as pd # noqa
from pandas import DataFrame
from skopt.space import Categorical, Dimension, Integer, Real # noqa
from freqtrade.optimize.hyperopt_interface import IHyperOpt
# --------------------------------
# Add your lib to import here
import talib.abstract as ta # noqa
import freqtrade.vendor.qtpylib.indicators as qtpylib
class hyper_ethusdt2(IHyperOpt):
"""
This is a Hyperopt template to get you started.
More information in the documentation: https://www.freqtrade.io/en/latest/hyperopt/
You should:
- Add any lib you need to build your hyperopt.
You must keep:
- The prototypes for the methods: populate_indicators, indicator_space, buy_strategy_generator.
The methods roi_space, generate_roi_table and stoploss_space are not required
and are provided by default.
However, you may override them if you need 'roi' and 'stoploss' spaces that
differ from the defaults offered by Freqtrade.
Sample implementation of these methods will be copied to `user_data/hyperopts` when
creating the user-data directory using `freqtrade create-userdir --userdir user_data`,
or is available online under the following URL:
https://github.com/freqtrade/freqtrade/blob/develop/freqtrade/templates/sample_hyperopt_advanced.py.
"""
@staticmethod
def buy_strategy_generator(params: Dict[str, Any]) -> Callable:
"""
Define the buy strategy parameters to be used by Hyperopt.
"""
def populate_buy_trend(dataframe: DataFrame, metadata: dict) -> DataFrame:
"""
Buy strategy Hyperopt will build and use.
"""
conditions = []
# GUARDS AND TRENDS
if params.get('ao-enabled'):
conditions.append(dataframe['ao'] > params['ao1-value'])
conditions.append(dataframe['ao'] < params['ao2-value'])
if params.get('angle_tsf_mid-enabled'):
conditions.append(dataframe['angle_tsf_mid'] < params['angle_tsf_mid-value'])
if params.get('rsi-enabled'):
conditions.append(params['rsi1-value'] < dataframe['rsi'])
conditions.append(params['rsi2-value'] > dataframe['rsi'])
# TRIGGERS
if 'trigger' in params:
if params['trigger'] == 'ao_cross':
conditions.append(qtpylib.crossed_above(
dataframe['ao'], 0
))
if params['trigger'] == 'angle_tsf_mid_cross_up':
conditions.append(qtpylib.crossed_above(
dataframe['angle_tsf_mid'], -50
))
if conditions:
dataframe.loc[
reduce(lambda x, y: x & y, conditions),
'buy'] = 1
return dataframe
return populate_buy_trend
@staticmethod
def indicator_space() -> List[Dimension]:
"""
Define your Hyperopt space for searching buy strategy parameters.
"""
return [
Integer(-50, 50, name='ao1-value'),
Integer(-50, 50, name='ao2-value'),
Integer(-87, 85, name='angle_tsf_mid-value'),
Integer(8, 92, name='rsi1-value'),
Integer(8, 92, name='rsi2-value'),
Categorical([True, False], name='ao-enabled'),
Categorical([True, False], name='angle_tsf_mid-enabled'),
Categorical([True, False], name='rsi-enabled'),
Categorical(['ao_cross', 'angle_tsf_mid_cross_up'], name='trigger')
]
@staticmethod
def sell_strategy_generator(params: Dict[str, Any]) -> Callable:
"""
Define the sell strategy parameters to be used by Hyperopt.
"""
def populate_sell_trend(dataframe: DataFrame, metadata: dict) -> DataFrame:
"""
Sell strategy Hyperopt will build and use.
"""
conditions = []
# GUARDS AND TRENDS
if params.get('ao-enabled'):
conditions.append(dataframe['ao'] > params['ao1-value_sell'])
conditions.append(dataframe['ao'] < params['ao2-value_sell'])
if params.get('angle_tsf_mid-enabled'):
conditions.append(dataframe['angle_tsf_mid'] > params['angle_tsf_mid-value_sell'])
if params.get('rsi-enabled'):
conditions.append(params['rsi1-value_sell'] < dataframe['rsi'])
conditions.append(params['rsi2-value_sell'] > dataframe['rsi'])
# TRIGGERS
if 'trigger' in params:
if params['trigger'] == 'ao_cross_dw':
conditions.append(qtpylib.crossed_below(
dataframe['ao'], 0
))
if params['trigger'] == 'angle_tsf_mid_cross_dw':
conditions.append(qtpylib.crossed_below(
dataframe['angle_tsf_mid'], 50
))
if conditions:
dataframe.loc[
reduce(lambda x, y: x & y, conditions),
'sell'] = 1
return dataframe
return populate_sell_trend
@staticmethod
def sell_indicator_space() -> List[Dimension]:
"""
Define your Hyperopt space for searching sell strategy parameters.
"""
return [
Integer(-50, 50, name='ao1-value_sell'),
Integer(-50, 50, name='ao2-value_sell'),
Integer(-87, 85, name='angle_tsf_mid-value_sell'),
Integer(8, 92, name='rsi1-value_sell'),
Integer(8, 92, name='rsi2-value_sell'),
Categorical([True, False], name='ao-enabled'),
Categorical([True, False], name='angle_tsf_mid-enabled'),
Categorical([True, False], name='rsi-enabled'),
Categorical(['angle_tsf_mid_cross_dw', 'ao_cross_dw'], name='trigger')
]
@staticmethod
def generate_roi_table(params: Dict) -> Dict[int, float]:
"""
Generate the ROI table that will be used by Hyperopt
This implementation generates the default legacy Freqtrade ROI tables.
Change it if you need different number of steps in the generated
ROI tables or other structure of the ROI tables.
Please keep it aligned with parameters in the 'roi' optimization
hyperspace defined by the roi_space method.
"""
roi_table = {}
roi_table[0] = params['roi_p1'] + params['roi_p2'] + params['roi_p3']
roi_table[params['roi_t3']] = params['roi_p1'] + params['roi_p2']
roi_table[params['roi_t3'] + params['roi_t2']] = params['roi_p1']
roi_table[params['roi_t3'] + params['roi_t2'] + params['roi_t1']] = 0
return roi_table
@staticmethod
def roi_space() -> List[Dimension]:
"""
Values to search for each ROI steps
Override it if you need some different ranges for the parameters in the
'roi' optimization hyperspace.
Please keep it aligned with the implementation of the
generate_roi_table method.
"""
return [
Integer(60, 600, name='roi_t1'),
Integer(300, 1000, name='roi_t2'),
Integer(500, 1500, name='roi_t3'),
Real(0.01, 0.04, name='roi_p1'),
Real(0.01, 0.07, name='roi_p2'),
Real(0.01, 0.20, name='roi_p3'),
]
@staticmethod
def stoploss_space() -> List[Dimension]:
"""
Stoploss Value to search
Override it if you need some different range for the parameter in the
'stoploss' optimization hyperspace.
"""
return [
Real(-0.25, -0.02, name='stoploss'),
]
@staticmethod
def trailing_space() -> List[Dimension]:
"""
Create a trailing stoploss space.
You may override it in your custom Hyperopt class.
"""
return [
# It was decided to always set trailing_stop is to True if the 'trailing' hyperspace
# is used. Otherwise hyperopt will vary other parameters that won't have effect if
# trailing_stop is set False.
# This parameter is included into the hyperspace dimensions rather than assigning
# it explicitly in the code in order to have it printed in the results along with
# other 'trailing' hyperspace parameters.
Categorical([True], name='trailing_stop'),
Real(0.01, 0.35, name='trailing_stop_positive'),
# 'trailing_stop_positive_offset' should be greater than 'trailing_stop_positive',
# so this intermediate parameter is used as the value of the difference between
# them. The value of the 'trailing_stop_positive_offset' is constructed in the
# generate_trailing_params() method.
# This is similar to the hyperspace dimensions used for constructing the ROI tables.
Real(0.001, 0.1, name='trailing_stop_positive_offset_p1'),
Categorical([True, False], name='trailing_only_offset_is_reached'),
]

View File

@ -1,208 +0,0 @@
# pragma pylint: disable=missing-docstring, invalid-name, pointless-string-statement
# isort: skip_file
# --- Do not remove these libs ---
import numpy as np # noqa
import pandas as pd # noqa
from pandas import DataFrame
from talib._ta_lib import ULTOSC, MACD, LINEARREG_ANGLE, TSF, MFI, EMA, MA, BBANDS, CORREL, MAX, MIN, SAR, CCI, \
HT_TRENDLINE, HT_DCPERIOD, HT_TRENDMODE, HT_SINE, RSI
from freqtrade.strategy import merge_informative_pair
from freqtrade.strategy.interface import IStrategy
# --------------------------------
# Add your lib to import here
import freqtrade.vendor.qtpylib.indicators as qtpylib
"""
"""
# This class is a sample. Feel free to customize it.
class strg2_ETHUSDT_1h_prod1(IStrategy):
"""
This is a sample 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
"""
# Strategy interface version - allow new iterations of the strategy interface.
# Check the documentation or the Sample strategy to get the latest version.
INTERFACE_VERSION = 2
# Minimal ROI designed for the strategy.
# This attribute will be overridden if the config file contains "minimal_roi".
minimal_roi = {
"0": 0.07371,
"9817": 0.0461,
"14487": 0.0254,
"15960": 0
}
order_types = {
'buy': 'market',
'sell': 'market',
'stoploss': 'market',
'stoploss_on_exchange': False
}
# Optimal stoploss designed for the strategy.
# This attribute will be overridden if the config file contains "stoploss".
stoploss = -0.23371
# Trailing stop:
trailing_stop = True
trailing_stop_positive = 0.11193
trailing_stop_positive_offset = 0.20381
trailing_only_offset_is_reached = True
plot_config = {
'main_plot': {
'upperband': {'upperband': 'green'},
'middleband': {'color': 'green'},
'lowerband': {'color': 'green'},
'tsf_mid': {'color': 'white'},
'ema': {'color': 'white'},
},
'subplots': {
"corr": {
'correl_h_l': {'color': 'black'},
},
"correl_tsf_mid_close": {
'correl_tsf_mid_close': {'color': 'grey'},
},
"correl_angle_short_close": {
'correl_angle_short_close': {'color': 'blue'},
},
"correl_angle_long_close": {
'correl_angle_long_close': {'color': 'red'},
},
"correl_mfi_close": {
'correl_mfi_close': {'color': 'black'},
},
"correl_hist_close": {
'correl_tsf_mid_close': {'color': 'red'},
},
"mfi": {
'mfi': {'color': 'yellow'},
},
}
}
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 [("ETH/USDT", "1d")]
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: Dataframe with data from the exchange
:param metadata: Additional information, like the currently traded pair
:return: a Dataframe with all mandatory indicators for the strategies
"""
# dataframe['macd'], dataframe['macdsignal'], dataframe['macdhist'] = MACD(dataframe['close'], fastperiod=12,
# slowperiod=26, signalperiod=7)
# dataframe['cci'] = CCI(dataframe['high'], dataframe['low'], dataframe['close'], timeperiod=30)
dataframe['ao'] = qtpylib.awesome_oscillator(dataframe, weighted=False, fast=5, slow=34)
# dataframe['vwap'] = qtpylib.vwap(dataframe)
# dataframe['vwap'] = qtpylib.rolling_vwap(dataframe)
dataframe['rsi'] = RSI(dataframe['close'], timeperiod=14)
# dataframe['tsf_long'] = TSF(dataframe['close'], timeperiod=200)
# dataframe['tsf_short'] = TSF(dataframe['close'], timeperiod=7)
dataframe['tsf_mid'] = TSF(dataframe['close'], timeperiod=50)
dataframe['angle_tsf_mid'] = LINEARREG_ANGLE(dataframe['tsf_mid'], timeperiod=10)
# dataframe['angle'] = LINEARREG_ANGLE(dataframe['close'], timeperiod=50)
# dataframe['tsf_max'] = MAX(dataframe['tsf_mid'], timeperiod=30)
# dataframe['tsf_min'] = MIN(dataframe['tsf_mid'], timeperiod=30)
# dataframe['sar'] = SAR(dataframe['high'], dataframe['low'])
# dataframe['sine'], dataframe['leadsine'] = HT_SINE(dataframe['close'])
# dataframe['trend'] = HT_TRENDLINE(dataframe['close'])
# dataframe['mfi'] = MFI(dataframe['high'], dataframe['low'], dataframe['close'], dataframe['volume'],
# timeperiod=5)
# dataframe['angle_trend_mid'] = LINEARREG_ANGLE(dataframe['trend'], timeperiod=10)
# dataframe['upperband'], dataframe['middleband'], dataframe['lowerband'] = BBANDS(dataframe['close'],
# timeperiod=30, nbdevup=2,
# nbdevdn=2, matype=0)
# if not self.dp:
# # Don't do anything if DataProvider is not available.
# return dataframe
# # Get the informative pair
# informative = self.dp.get_pair_dataframe(pair=metadata['pair'], timeframe='1d')
# informative['trend'] = HT_TRENDLINE(informative['close'])
# informative['period'] = HT_DCPERIOD(informative['close'])
# informative['mode'] = HT_TRENDMODE(informative['close'])
# # informative['sine'], informative['leadsine'] = HT_SINE(informative['close'])
# informative['angle_trend'] = LINEARREG_ANGLE(informative['trend'], timeperiod=5)
# # informative['sar'] = SAR(informative['high'], informative['low'])
# dataframe = merge_informative_pair(dataframe, informative, self.timeframe, '1d', ffill=True)
# return dataframe.set_index('date')['2021-01-01':].reset_index()
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[
(
(qtpylib.crossed_above(dataframe['angle_tsf_mid'], -50)) &
# (dataframe['sine_1h'] < dataframe['leadsine_1h']) &
# (dataframe['tsf_mid'] > dataframe['close']) &
# (dataframe['ao'] > -5) &
# (dataframe['rsi'] < 36) &
(dataframe['rsi'] > 14) &
(dataframe['volume'] > 0) # Make sure Volume is not 0
),
'buy'] = 1
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[
(
(qtpylib.crossed_below(dataframe['angle_tsf_mid'], 50)) &
# (dataframe['sine_1h'] > dataframe['leadsine_1h']) &
# (dataframe['sar_1d'] < dataframe['close']) &
# (dataframe['tsf_mid'] < dataframe['close']) &
(dataframe['rsi'] > 50) &
(dataframe['ao'] < -10) &
(dataframe['volume'] > 0) # Make sure Volume is not 0
),
'sell'] = 1
return dataframe

View File

@ -43,10 +43,11 @@ class ltcusdt_1h(IStrategy):
# Minimal ROI designed for the strategy. # Minimal ROI designed for the strategy.
# This attribute will be overridden if the config file contains "minimal_roi". # This attribute will be overridden if the config file contains "minimal_roi".
minimal_roi = { minimal_roi = {
"0": 0.04371, "0": 0.11465,
"300": 0.0461, "607": 0.08395,
"14487": 0.0254, "1517": 0.01583,
"15960": 0 "1780": 0
} }
order_types = { order_types = {
'buy': 'market', 'buy': 'market',
@ -56,14 +57,15 @@ class ltcusdt_1h(IStrategy):
} }
# Optimal stoploss designed for the strategy. # Optimal stoploss designed for the strategy.
# This attribute will be overridden if the config file contains "stoploss". # This attribute will be overridden if the config file contains "stoploss".
stoploss = -0.23 stoploss = -0.23987
# Trailing stop: # Trailing stop:
trailing_stop = True trailing_stop = True
trailing_stop_positive = 0.11193 trailing_stop_positive = 0.29213
trailing_stop_positive_offset = 0.20381 trailing_stop_positive_offset = 0.3379
trailing_only_offset_is_reached = True trailing_only_offset_is_reached = True
plot_config = { plot_config = {
'main_plot': { 'main_plot': {
'upperband': {'upperband': 'green'}, 'upperband': {'upperband': 'green'},
@ -123,26 +125,30 @@ class ltcusdt_1h(IStrategy):
""" """
dataframe['macd'], dataframe['macdsignal'], dataframe['macdhist'] = MACD(dataframe['close'], fastperiod=12, dataframe['macd'], dataframe['macdsignal'], dataframe['macdhist'] = MACD(dataframe['close'], fastperiod=12,
slowperiod=26, signalperiod=7) slowperiod=24, signalperiod=7)
dataframe['mfi'] = MFI(dataframe['high'], dataframe['low'], dataframe['close'], dataframe['volume'], dataframe['mfi'] = MFI(dataframe['high'], dataframe['low'], dataframe['close'], dataframe['volume'],
timeperiod=14) timeperiod=12)
dataframe['ao'] = qtpylib.awesome_oscillator(dataframe, weighted=False, fast=5, slow=34) dataframe['uo'] = ULTOSC(dataframe['high'], dataframe['low'], dataframe['close'], timeperiod1=7, timeperiod2=12,
timeperiod3=24)
dataframe['ao'] = qtpylib.awesome_oscillator(dataframe, weighted=False, fast=5, slow=36)
dataframe['tsf_mid'] = TSF(dataframe['close'], timeperiod=48) dataframe['tsf_mid'] = TSF(dataframe['close'], timeperiod=48)
dataframe['sar'] = SAR(dataframe['high'], dataframe['low']) dataframe['sar'] = SAR(dataframe['high'], dataframe['low'])
dataframe['sar_close'] = dataframe['sar'] - dataframe['close']
dataframe['natr'] = NATR(dataframe['high'], dataframe['low'], dataframe['close'], timeperiod=14) dataframe['natr'] = NATR(dataframe['high'], dataframe['low'], dataframe['close'], timeperiod=14)
dataframe['angle_tsf_mid'] = LINEARREG_ANGLE(dataframe['tsf_mid'], timeperiod=10) dataframe['angle_tsf_mid'] = LINEARREG_ANGLE(dataframe['tsf_mid'], timeperiod=14)
dataframe['sine'], dataframe['leadsine'] = HT_SINE(dataframe['close']) dataframe['sine'], dataframe['leadsine'] = HT_SINE(dataframe['close'])
dataframe['sine'] = dataframe['sine'].multiply(10)
dataframe['leadsine'] = dataframe['leadsine'].multiply(10)
dataframe['trend'] = HT_TRENDLINE(dataframe['close']) dataframe['trend'] = HT_TRENDLINE(dataframe['close'])
dataframe['mode'] = HT_TRENDMODE(dataframe['close'])
dataframe['inphase'], dataframe['quadrature'] = HT_PHASOR(dataframe['close']) dataframe['inphase'], dataframe['quadrature'] = HT_PHASOR(dataframe['close'])
dataframe['angle_trend_mid'] = LINEARREG_ANGLE(dataframe['trend'], timeperiod=10) dataframe['angle_trend_mid'] = LINEARREG_ANGLE(dataframe['trend'], timeperiod=12)
dataframe['angle'] = LINEARREG_ANGLE(dataframe['close'], timeperiod=12) dataframe['angle'] = LINEARREG_ANGLE(dataframe['close'], timeperiod=12)
dataframe['angle_macdsignal'] = LINEARREG_ANGLE(dataframe['macdsignal'], timeperiod=15) dataframe['angle_min'] = MIN(dataframe['angle_trend_mid'], timeperiod=7)
dataframe['angle_min_lead'] = MIN(dataframe['angle_trend_mid'], timeperiod=3)
dataframe['angle_max_lead'] = MAX(dataframe['angle_trend_mid'], timeperiod=3)
dataframe['angle_max'] = MAX(dataframe['angle_trend_mid'], timeperiod=7)
dataframe['angle_macdsignal'] = LINEARREG_ANGLE(dataframe['macdsignal'], timeperiod=12)
return dataframe return dataframe
@ -155,12 +161,12 @@ class ltcusdt_1h(IStrategy):
""" """
dataframe.loc[ dataframe.loc[
( (
(qtpylib.crossed_above(dataframe['leadsine'], dataframe['sine'])) & (qtpylib.crossed_above(dataframe['angle_trend_mid'], 0)) &
(dataframe['angle'] > -48) &
# (dataframe['sine_1h'] < dataframe['leadsine_1h']) & (-21 < dataframe['angle_macdsignal']) &
# (dataframe['tsf_mid'] > dataframe['close']) & (dataframe['uo'] > 9) &
(dataframe['ao'] > -5) & (-0.90098 < (dataframe['macd'] - dataframe['macdsignal'])) &
(dataframe['angle_tsf_mid'] > -3) & (-50 < dataframe['ao']) &
(dataframe['volume'] > 0) # Make sure Volume is not 0 (dataframe['volume'] > 0) # Make sure Volume is not 0
), ),
@ -177,13 +183,114 @@ class ltcusdt_1h(IStrategy):
""" """
dataframe.loc[ dataframe.loc[
( (
(qtpylib.crossed_below(dataframe['leadsine'], dataframe['sine'])) & (qtpylib.crossed_below(dataframe['angle_trend_mid'], 0)) &
# (dataframe['sine_1h'] > dataframe['leadsine_1h']) & (dataframe['uo'] > 10) &
# (dataframe['sar_1d'] < dataframe['close']) & (dataframe['angle'] > 58) &
# (dataframe['tsf_mid'] < dataframe['close']) & (10 < dataframe['ao']) &
# (dataframe['natr'] > 2.5) &
(dataframe['angle_tsf_mid'] < 5) & (-3.60339 < (dataframe['macd'] - dataframe['macdsignal'])) &
(10 > dataframe['angle_trend_mid']) &
(dataframe['volume'] > 0) # Make sure Volume is not 0 (dataframe['volume'] > 0) # Make sure Volume is not 0
), ),
'sell'] = 1 'sell'] = 1
return dataframe return dataframe
"""
freqtrade hyperopt --config user_data/config_ltcusdt_1h.json --hyperopt hyper_ltcusdt_1h --hyperopt-loss OnlyProfitHyperOptLoss --strategy ltcusdt_1h -e 500 --spaces all --timerange 20200601-
+--------+---------+----------+------------------+--------------+-------------------------------+----------------+-------------+
| Best | Epoch | Trades | Win Draw Loss | Avg profit | Profit | Avg duration | Objective |
|--------+---------+----------+------------------+--------------+-------------------------------+----------------+-------------|
| * Best | 8/500 | 1 | 1 0 0 | 17.74% | 17.75689174 USDT (17.74%) | 660.0 m | 0.94087 |
| * Best | 24/500 | 71 | 43 25 3 | 1.30% | 92.24310471 USDT (92.15%) | 1,950.4 m | 0.69283 |
| Best | 98/500 | 52 | 34 15 3 | 2.56% | 133.14323340 USDT (133.01%) | 2,576.5 m | 0.55663 |
| Best | 134/500 | 119 | 61 52 6 | 1.19% | 141.48585752 USDT (141.34%) | 2,884.5 m | 0.52885 |
| Best | 149/500 | 120 | 63 48 9 | 1.22% | 146.96457805 USDT (146.82%) | 3,091.5 m | 0.51061 |
| Best | 163/500 | 56 | 38 18 0 | 3.21% | 180.15476192 USDT (179.97%) | 4,530.0 m | 0.40008 |
[Epoch 500 of 500 (100%)] || | [Time: 0:24:40, Elapsed Time: 0:24:40]
2021-03-20 23:04:51,078 - freqtrade.optimize.hyperopt - INFO - 500 epochs saved to '/home/crypto_rahino/freqtrade/user_data/hyperopt_results/strategy_ltcusdt_1h_hyperopt_results_2021-03-20_22-40-07.pickle'.
Best result:
163/500: 56 trades. 38/18/0 Wins/Draws/Losses. Avg profit 3.21%. Median profit 1.58%. Total profit 180.15476192 USDT ( 179.97Σ%). Avg duration 4530.0 min. Objective: 0.40008
# Buy hyperspace params:
buy_params = {
'angle-enabled': True,
'angle-value': -48,
'angle_macdsignal-enabled': True,
'angle_macdsignal-value': -21,
'angle_trend_mid-enabled': False,
'angle_trend_mid-value': -9,
'angle_tsf_mid-enabled': False,
'angle_tsf_mid-value': -18,
'ao-enabled': True,
'ao-value': -50,
'macd-enabled': True,
'macd-value': -0.90098,
'macdhist-enabled': False,
'macdhist-value': 1.44126,
'macdsignal-enabled': False,
'macdsignal-value': 10,
'mfi-enabled': False,
'mfi-value': 63,
'natr-enabled': False,
'natr-value': 1.38067,
'sar_close-enabled': False,
'sar_close-value': -3,
'trigger': 'angle_trend_mid',
'uo-enabled': True,
'uo-value': 9
}
# Sell hyperspace params:
sell_params = {
'angle-enabled': True,
'angle-value_sell': 58,
'angle_macdsignal-enabled': True,
'angle_macdsignal-value_sell': -14,
'angle_trend_mid-enabled': False,
'angle_trend_mid-value_sell': -73,
'angle_tsf_mid-enabled': False,
'angle_tsf_mid-value_sell': -11,
'ao-enabled': True,
'ao-value_sell': 10,
'macd-enabled': True,
'macd-value_sell': -3.60339,
'macdhist-enabled': False,
'macdhist-value_sell': 4.06627,
'macdsignal-enabled': False,
'macdsignal-value_sell': -1,
'mfi-enabled': False,
'mfi-value_sell': 13,
'natr-enabled': False,
'natr-value_sell': 7.852,
'sar_close-enabled': False,
'sar_close-value_sell': 17,
'trigger': 'angle_trend_mid',
'uo-enabled': True,
'uo-value_sell': 10
}
# ROI table:
minimal_roi = {
"0": 0.11465,
"607": 0.08395,
"1517": 0.01583,
"1780": 0
}
# Stoploss:
stoploss = -0.20987
# Trailing stop:
trailing_stop = True
trailing_stop_positive = 0.29213
trailing_stop_positive_offset = 0.3379
trailing_only_offset_is_reached = True
"""

View File

@ -4,8 +4,10 @@
import numpy as np # noqa import numpy as np # noqa
import pandas as pd # noqa import pandas as pd # noqa
from pandas import DataFrame from pandas import DataFrame
from talib._ta_lib import ULTOSC, MACD, SAR, LINEARREG_ANGLE, TEMA, STOCHRSI, STOCH, STOCHF, RSI from talib._ta_lib import ULTOSC, MACD, SAR, LINEARREG_ANGLE, TEMA, TSF, CCI, ATR, CORREL, \
BOP, WMA, KAMA, HT_DCPERIOD, HT_TRENDMODE, HT_SINE
from freqtrade.strategy import merge_informative_pair
from freqtrade.strategy.interface import IStrategy from freqtrade.strategy.interface import IStrategy
# -------------------------------- # --------------------------------
@ -33,38 +35,36 @@ class quick_btcusdt_1m(IStrategy):
""" """
# Strategy interface version - allow new iterations of the strategy interface. # Strategy interface version - allow new iterations of the strategy interface.
# Check the documentation or the Sample strategy to get the latest version. # Check the documentation or the Sample strategy to get the latest version.
INTERFACE_VERSION = 1 INTERFACE_VERSION = 2
# Minimal ROI designed for the strategy. # Minimal ROI designed for the strategy.
# This attribute will be overridden if the config file contains "minimal_roi". # This attribute will be overridden if the config file contains "minimal_roi".
minimal_roi = { minimal_roi = {
"0": 0.07186329732926479, "0": 0.06443,
"6": 0.03610260437996321, "360": 0.06597,
"14": 0.014117594921808408, "1790": 0.0108,
"23": 0 "2116": 0
} }
# Optimal stoploss designed for the strategy. # Optimal stoploss designed for the strategy.
# This attribute will be overridden if the config file contains "stoploss". # This attribute will be overridden if the config file contains "stoploss".
stoploss = -0.073946396013718 # Stoploss:
stoploss = -0.15825
# Trailing stoploss # Trailing stop:
trailing_stop = True trailing_stop = True
trailing_stop_positive = 0.11645094244761 trailing_stop_positive = 0.3274
trailing_stop_positive_offset = 0.20201226976340847 trailing_stop_positive_offset = 0.38967
trailing_only_offset_is_reached = True trailing_only_offset_is_reached = True
# Optimal ticker interval for the strategy. # Optimal ticker interval for the strategy.
timeframe = '1m' timeframe = '1m'
# Run "populate_indicators()" only for new candle. # Run "populate_indicators()" only for new candle.
process_only_new_candles = False process_only_new_candles = False
# These values can be overridden in the "ask_strategy" section in the config.
use_sell_signal = True
sell_profit_only = True
ignore_roi_if_buy_signal = False
# Number of candles the strategy requires before producing valid signals # Number of candles the strategy requires before producing valid signals
startup_candle_count: int = 30 startup_candle_count: int = 30
@ -78,8 +78,8 @@ class quick_btcusdt_1m(IStrategy):
# Optional order time in force. # Optional order time in force.
order_time_in_force = { order_time_in_force = {
'buy': 'gtc', 'buy': 'fok',
'sell': 'gtc' 'sell': 'fok'
} }
plot_config = { plot_config = {
@ -109,7 +109,7 @@ class quick_btcusdt_1m(IStrategy):
("BTC/USDT", "15m"), ("BTC/USDT", "15m"),
] ]
""" """
return [("BTC/USDT", "1m")] return [("BTC/USDT", "1h")]
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
""" """
@ -122,38 +122,39 @@ class quick_btcusdt_1m(IStrategy):
:return: a Dataframe with all mandatory indicators for the strategies :return: a Dataframe with all mandatory indicators for the strategies
""" """
# MACD dataframe['period'] = HT_DCPERIOD(dataframe['close'])
dataframe['macd'], dataframe['macdsignal'], dataframe['macdhist'] = MACD(dataframe['close'], fastperiod=12, dataframe['macd'], dataframe['macdsignal'], dataframe['macdhist'] = MACD(dataframe['close'], fastperiod=12,
slowperiod=26, signalperiod=9) slowperiod=26, signalperiod=9)
dataframe['macd_angle'] = LINEARREG_ANGLE(dataframe['macd'], timeperiod=3) dataframe['cci'] = CCI(dataframe['high'], dataframe['low'], dataframe['close'], timeperiod=30)
dataframe['macdhist_angle'] = LINEARREG_ANGLE(dataframe['macd'], timeperiod=3) dataframe['sar'] = SAR(dataframe['high'], dataframe['low'])
dataframe['wma'] = WMA(dataframe['close'], timeperiod=30)
dataframe['wma_ratio'] = (dataframe['close'] - dataframe['wma'])
dataframe['kama'] = KAMA(dataframe['close'], timeperiod=30)
dataframe['angle_kama'] = LINEARREG_ANGLE(dataframe['kama'], timeperiod=10)
dataframe['tsf_mid'] = TSF(dataframe['close'], timeperiod=30)
dataframe['angle_tsf_mid'] = LINEARREG_ANGLE(dataframe['tsf_mid'], timeperiod=10)
dataframe['atr'] = ATR(dataframe['high'], dataframe['low'], dataframe['close'], timeperiod=30)
dataframe['uo'] = ULTOSC(dataframe['high'], dataframe['low'], dataframe['close'], timeperiod1=7, timeperiod2=14,
timeperiod3=28)
dataframe['tema'] = TEMA(dataframe['close'], timeperiod=50)
dataframe['macd_ratio'] = (dataframe['macd'] - dataframe['macdsignal'])
dataframe['tsf_ratio'] = (dataframe['tsf_mid'] - dataframe['close'])
dataframe['correl_h_l'] = CORREL(dataframe['high'], dataframe['low'], timeperiod=30)
dataframe['correl_tsf_mid_close'] = CORREL(dataframe['tsf_mid'], dataframe['close'], timeperiod=12)
dataframe['bop'] = BOP(dataframe['open'], dataframe['high'], dataframe['low'], dataframe['close'])
# Linear angle if not self.dp:
dataframe['angle'] = LINEARREG_ANGLE(dataframe['close'], timeperiod=14) # Don't do anything if DataProvider is not available.
return dataframe
# Get the informative pair
informative = self.dp.get_pair_dataframe(pair=metadata['pair'], timeframe='1h')
informative['bop'] = BOP(informative['open'], informative['high'], informative['low'], informative['close'])
informative['period'] = HT_DCPERIOD(informative['close'])
informative['mode'] = HT_TRENDMODE(informative['close'])
informative['sine'], informative['leadsine'] = HT_SINE(informative['close'])
dataframe['tema'] = TEMA(dataframe['close'], timeperiod=30) dataframe = merge_informative_pair(dataframe, informative, self.timeframe, '1h', ffill=True)
dataframe['sr_fastk'], dataframe['sr_fastd'] = STOCHRSI(dataframe['close'], timeperiod=14, fastk_period=5,
fastd_period=3, fastd_matype=0)
dataframe['sr_fastd_angle'] = LINEARREG_ANGLE(dataframe['sr_fastd'], timeperiod=4)
dataframe['slowk'], dataframe['slowd'] = STOCH(dataframe['high'], dataframe['low'], dataframe['close'],
fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3,
slowd_matype=0)
dataframe['slowd_angle'] = LINEARREG_ANGLE(dataframe['slowd'], timeperiod=3)
dataframe['sf_fastk'], dataframe['sf_fastd'] = STOCHF(dataframe['high'], dataframe['low'], dataframe['close'], fastk_period=5, fastd_period=3, fastd_matype=0)
dataframe['sf_fastd_angle'] = LINEARREG_ANGLE(dataframe['sf_fastd'], timeperiod=3)
dataframe['rsi'] = RSI(dataframe['close'], timeperiod=14)
dataframe['rsi_angle'] = LINEARREG_ANGLE(dataframe['rsi'], timeperiod=5)
# # first check if dataprovider is available
# if self.dp:
# if self.dp.runmode in ('live', 'dry_run'):
# ob = self.dp.orderbook(metadata['pair'], 1)
# dataframe['best_bid'] = ob['bids'][0][0]
# dataframe['best_ask'] = ob['asks'][0][0]
#
return dataframe return dataframe
def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
@ -165,12 +166,8 @@ class quick_btcusdt_1m(IStrategy):
""" """
dataframe.loc[ dataframe.loc[
( (
(qtpylib.crossed_above(dataframe['macd'], dataframe['macdsignal'])) & (qtpylib.crossed_above(dataframe['low'], dataframe['tsf_mid']))
(dataframe['sr_fastd_angle'] > -39) &
(dataframe['sf_fastk'] > 33) &
(dataframe['sf_fastd_angle'] > -80) &
(dataframe['rsi_angle'] > 24) &
(dataframe['volume'] > 0) # Make sure Volume is not 0
), ),
'buy'] = 1 'buy'] = 1
@ -185,12 +182,102 @@ class quick_btcusdt_1m(IStrategy):
""" """
dataframe.loc[ dataframe.loc[
( (
((dataframe['macdhist']) < 0.000241872676925719) & (qtpylib.crossed_below(dataframe['high'], dataframe['tsf_mid']))
(dataframe['sr_fastd_angle'] > 71) &
(dataframe['sf_fastd_angle'] < 21) &
(dataframe['rsi_angle'] < 1) &
(dataframe['volume'] > 0) # Make sure Volume is not 0
), ),
'sell'] = 1 'sell'] = 1
return dataframe return dataframe
"""
freqtrade hyperopt --config user_data/config_btcusdt_1m.json --hyperopt hyper_btcusdt_1m --hyperopt-loss OnlyProfitHyperOptLoss --strategy quick_btcusdt_1m -e 500 --spaces all
+--------+---------+----------+------------------+--------------+-------------------------------+----------------+-------------+
| Best | Epoch | Trades | Win Draw Loss | Avg profit | Profit | Avg duration | Objective |
|--------+---------+----------+------------------+--------------+-------------------------------+----------------+-------------|
| * Best | 1/500 | 2 | 1 0 1 | -3.39% | -67.10930706 USDT (-6.77%) | 4,154.0 m | 1.02257 |
| * Best | 2/500 | 2 | 1 0 1 | 0.08% | 1.60699817 USDT (0.16%) | 1,156.5 m | 0.99946 |
| * Best | 8/500 | 4 | 4 0 0 | 3.59% | 142.17731149 USDT (14.35%) | 981.5 m | 0.95218 |
| Best | 39/500 | 13 | 11 0 2 | 3.80% | 489.61841267 USDT (49.41%) | 736.2 m | 0.83531 |
| Best | 70/500 | 25 | 19 4 2 | 2.99% | 740.67168932 USDT (74.74%) | 1,597.7 m | 0.75086 |
| Best | 106/500 | 52 | 35 12 5 | 1.82% | 937.66182441 USDT (94.62%) | 1,666.9 m | 0.6846 |
| Best | 427/500 | 52 | 32 17 3 | 2.83% | 1,460.67464976 USDT (147.40%) | 2,592.9 m | 0.50868 |
| Best | 439/500 | 179 | 101 57 21 | 0.83% | 1,480.44117660 USDT (149.39%) | 3,457.9 m | 0.50203 |
[Epoch 500 of 500 (100%)] || | [Time: 1:22:09, Elapsed Time: 1:22:09]
2021-03-26 22:31:08,615 - freqtrade.optimize.hyperopt - INFO - 500 epochs saved to '/home/crypto_rahino/freqtrade/user_data/hyperopt_results/strategy_quick_btcusdt_1m_hyperopt_results_2021-03-26_21-08-16.pickle'.
Best result:
439/500: 179 trades. 101/57/21 Wins/Draws/Losses. Avg profit 0.83%. Median profit 0.82%. Total profit 1480.44117660 USDT ( 149.39Σ%). Avg duration 3457.9 min. Objective: 0.50203
# Buy hyperspace params:
buy_params = {
'angle_tsf_mid-enabled': False,
'angle_tsf_mid-value': 9,
'atr-enabled': False,
'atr-value': 180,
'bop-value': 0.7274,
'cci-enabled': False,
'cci-value': 57,
'correl_h_l-enabled': True,
'correl_h_l-value': -0.5389,
'correl_tsf_mid_close-enabled': False,
'correl_tsf_mid_close-value': -0.8364,
'macd_ratio-enabled': False,
'macd_ratio-value': 101,
'macdhist-enabled': True,
'macdhist-value': 22,
'macdsignal-enabled': False,
'macdsignal-value': -478,
'trigger': 'macd',
'tsf_ratio-enabled': False,
'tsf_ratio-value': -1323,
'uo-enabled': False,
'uo-value': 33.5021
}
# Sell hyperspace params:
sell_params = {
'angle_tsf_mid-enabled': False,
'angle_tsf_mid-value': 9,
'atr-enabled': False,
'atr-value': 180,
'cci-enabled': False,
'cci-value': 57,
'correl_h_l-enabled': True,
'correl_h_l-value': -0.5389,
'correl_tsf_mid_close-enabled': False,
'correl_tsf_mid_close-value': -0.8364,
'macd_ratio-enabled': False,
'macd_ratio-value': 101,
'macdhist-enabled': True,
'macdhist-value': 22,
'macdsignal-enabled': False,
'macdsignal-value': -478,
'trigger': 'macd',
'tsf_ratio-enabled': False,
'tsf_ratio-value': -1323,
'uo-enabled': False,
'uo-value': 33.5021
}
# ROI table:
minimal_roi = {
"0": 0.16344,
"793": 0.05931,
"1121": 0.03143,
"1474": 0
}
# Stoploss:
stoploss = -0.2884
# Trailing stop:
trailing_stop = True
trailing_stop_positive = 0.21554
trailing_stop_positive_offset = 0.23749
trailing_only_offset_is_reached = False
"""