Sorry matthias, did not see that you already committed something and did overwrite you.

Added your version to it instead of mine and pushed again (since it was already overwritten by me).
This commit is contained in:
hippocritical 2023-03-10 09:23:56 +01:00
parent 5f8202e1b5
commit a3988f56b2
2 changed files with 138 additions and 139 deletions

View File

@ -20,34 +20,31 @@ def start_strategy_update(args: Dict[str, Any]) -> None:
:return: None :return: None
""" """
if sys.version_info <= (3, 8): if sys.version_info == (3, 8): # pragma: no cover
print("This code requires Python 3.9 or higher. " sys.exit("Freqtrade strategy updater requires Python version >= 3.9")
"We cannot continue. "
"Please upgrade your python version to use this command.")
else: config = setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE)
config = setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE)
strategy_objs = StrategyResolver.search_all_objects( strategy_objs = StrategyResolver.search_all_objects(
config, enum_failed=False, recursive=config.get('recursive_strategy_search', False)) config, enum_failed=False, recursive=config.get('recursive_strategy_search', False))
filtered_strategy_objs = [] filtered_strategy_objs = []
if 'strategy_list' in args: if 'strategy_list' in args:
for args_strategy in args['strategy_list']: for args_strategy in args['strategy_list']:
for strategy_obj in strategy_objs:
if (strategy_obj['name'] == args_strategy
and strategy_obj not in filtered_strategy_objs):
filtered_strategy_objs.append(strategy_obj)
break
for filtered_strategy_obj in filtered_strategy_objs:
start_conversion(filtered_strategy_obj, config)
else:
processed_locations = set()
for strategy_obj in strategy_objs: for strategy_obj in strategy_objs:
if strategy_obj['location'] not in processed_locations: if (strategy_obj['name'] == args_strategy
processed_locations.add(strategy_obj['location']) and strategy_obj not in filtered_strategy_objs):
start_conversion(strategy_obj, config) filtered_strategy_objs.append(strategy_obj)
break
for filtered_strategy_obj in filtered_strategy_objs:
start_conversion(filtered_strategy_obj, config)
else:
processed_locations = set()
for strategy_obj in strategy_objs:
if strategy_obj['location'] not in processed_locations:
processed_locations.add(strategy_obj['location'])
start_conversion(strategy_obj, config)
def start_conversion(strategy_obj, config): def start_conversion(strategy_obj, config):

View File

@ -2,134 +2,136 @@
import sys import sys
import pytest
from freqtrade.strategy.strategyupdater import StrategyUpdater from freqtrade.strategy.strategyupdater import StrategyUpdater
def test_strategy_updater(default_conf, caplog) -> None: def test_strategy_updater(default_conf, caplog) -> None:
if sys.version_info <= (3, 8): if sys.version_info < (3, 9):
print("skipped tests since python version is 3.8 or lower.") pytest.skip("StrategyUpdater is not compatible with Python 3.8", allow_module_level=True)
else:
instance_strategy_updater = StrategyUpdater() instance_strategy_updater = StrategyUpdater()
modified_code1 = instance_strategy_updater.update_code(""" modified_code1 = instance_strategy_updater.update_code("""
class testClass(IStrategy): class testClass(IStrategy):
def populate_buy_trend(): def populate_buy_trend():
pass
def populate_sell_trend():
pass
def check_buy_timeout():
pass
def check_sell_timeout():
pass
def custom_sell():
pass
""")
modified_code2 = instance_strategy_updater.update_code("""
ticker_interval = '15m'
buy_some_parameter = IntParameter(space='buy')
sell_some_parameter = IntParameter(space='sell')
""")
modified_code3 = instance_strategy_updater.update_code("""
use_sell_signal = True
sell_profit_only = True
sell_profit_offset = True
ignore_roi_if_buy_signal = True
forcebuy_enable = True
""")
modified_code4 = instance_strategy_updater.update_code("""
dataframe.loc[reduce(lambda x, y: x & y, conditions), ["buy", "buy_tag"]] = (1, "buy_signal_1")
dataframe.loc[reduce(lambda x, y: x & y, conditions), 'sell'] = 1
""")
modified_code5 = instance_strategy_updater.update_code("""
def confirm_trade_exit(sell_reason: str):
pass pass
""") def populate_sell_trend():
modified_code6 = instance_strategy_updater.update_code(""" pass
order_time_in_force = { def check_buy_timeout():
'buy': 'gtc', pass
'sell': 'ioc' def check_sell_timeout():
pass
def custom_sell():
pass
""")
modified_code2 = instance_strategy_updater.update_code("""
ticker_interval = '15m'
buy_some_parameter = IntParameter(space='buy')
sell_some_parameter = IntParameter(space='sell')
""")
modified_code3 = instance_strategy_updater.update_code("""
use_sell_signal = True
sell_profit_only = True
sell_profit_offset = True
ignore_roi_if_buy_signal = True
forcebuy_enable = True
""")
modified_code4 = instance_strategy_updater.update_code("""
dataframe.loc[reduce(lambda x, y: x & y, conditions), ["buy", "buy_tag"]] = (1, "buy_signal_1")
dataframe.loc[reduce(lambda x, y: x & y, conditions), 'sell'] = 1
""")
modified_code5 = instance_strategy_updater.update_code("""
def confirm_trade_exit(sell_reason: str):
pass
""")
modified_code6 = instance_strategy_updater.update_code("""
order_time_in_force = {
'buy': 'gtc',
'sell': 'ioc'
}
order_types = {
'buy': 'limit',
'sell': 'market',
'stoploss': 'market',
'stoploss_on_exchange': False
}
unfilledtimeout = {
'buy': 1,
'sell': 2
}
""")
modified_code7 = instance_strategy_updater.update_code("""
def confirm_trade_exit(sell_reason):
if (sell_reason == 'stop_loss'):
pass
""")
modified_code8 = instance_strategy_updater.update_code("""
sell_reason == 'sell_signal'
sell_reason == 'force_sell'
sell_reason == 'emergency_sell'
""")
modified_code9 = instance_strategy_updater.update_code("""
# This is the 1st comment
import talib.abstract as ta
# This is the 2nd comment
import freqtrade.vendor.qtpylib.indicators as qtpylib
class someStrategy(IStrategy):
# This is the 3rd comment
# This attribute will be overridden if the config file contains "minimal_roi"
minimal_roi = {
"0": 0.50
} }
order_types = {
'buy': 'limit',
'sell': 'market',
'stoploss': 'market',
'stoploss_on_exchange': False
}
unfilledtimeout = {
'buy': 1,
'sell': 2
}
""")
modified_code7 = instance_strategy_updater.update_code(""" # This is the 4th comment
def confirm_trade_exit(sell_reason): stoploss = -0.1
if (sell_reason == 'stop_loss'): """)
pass # currently still missing:
""") # Webhook terminology, Telegram notification settings, Strategy/Config settings
modified_code8 = instance_strategy_updater.update_code("""
sell_reason == 'sell_signal'
sell_reason == 'force_sell'
sell_reason == 'emergency_sell'
""")
modified_code9 = instance_strategy_updater.update_code("""
# This is the 1st comment
import talib.abstract as ta
# This is the 2nd comment
import freqtrade.vendor.qtpylib.indicators as qtpylib
assert "populate_entry_trend" in modified_code1
assert "populate_exit_trend" in modified_code1
assert "check_entry_timeout" in modified_code1
assert "check_exit_timeout" in modified_code1
assert "custom_exit" in modified_code1
assert "INTERFACE_VERSION = 3" in modified_code1
class someStrategy(IStrategy): assert "timeframe" in modified_code2
# This is the 3rd comment # check for not editing hyperopt spaces
# This attribute will be overridden if the config file contains "minimal_roi" assert "space='buy'" in modified_code2
minimal_roi = { assert "space='sell'" in modified_code2
"0": 0.50
}
# This is the 4th comment assert "use_exit_signal" in modified_code3
stoploss = -0.1 assert "exit_profit_only" in modified_code3
""") assert "exit_profit_offset" in modified_code3
# currently still missing: assert "ignore_roi_if_entry_signal" in modified_code3
# Webhook terminology, Telegram notification settings, Strategy/Config settings assert "force_entry_enable" in modified_code3
assert "populate_entry_trend" in modified_code1 assert "enter_long" in modified_code4
assert "populate_exit_trend" in modified_code1 assert "exit_long" in modified_code4
assert "check_entry_timeout" in modified_code1 assert "enter_tag" in modified_code4
assert "check_exit_timeout" in modified_code1
assert "custom_exit" in modified_code1
assert "INTERFACE_VERSION = 3" in modified_code1
assert "timeframe" in modified_code2 assert "exit_reason" in modified_code5
# check for not editing hyperopt spaces
assert "space='buy'" in modified_code2
assert "space='sell'" in modified_code2
assert "use_exit_signal" in modified_code3 assert "'entry': 'gtc'" in modified_code6
assert "exit_profit_only" in modified_code3 assert "'exit': 'ioc'" in modified_code6
assert "exit_profit_offset" in modified_code3 assert "'entry': 'limit'" in modified_code6
assert "ignore_roi_if_entry_signal" in modified_code3 assert "'exit': 'market'" in modified_code6
assert "force_entry_enable" in modified_code3 assert "'entry': 1" in modified_code6
assert "'exit': 2" in modified_code6
assert "enter_long" in modified_code4 assert "exit_reason" in modified_code7
assert "exit_long" in modified_code4 assert "exit_reason == 'stop_loss'" in modified_code7
assert "enter_tag" in modified_code4
assert "exit_reason" in modified_code5 # those tests currently don't work, next in line.
assert "exit_signal" in modified_code8
assert "exit_reason" in modified_code8
assert "force_exit" in modified_code8
assert "emergency_exit" in modified_code8
assert "'entry': 'gtc'" in modified_code6 assert "This is the 1st comment" in modified_code9
assert "'exit': 'ioc'" in modified_code6 assert "This is the 2nd comment" in modified_code9
assert "'entry': 'limit'" in modified_code6 assert "This is the 3rd comment" in modified_code9
assert "'exit': 'market'" in modified_code6
assert "'entry': 1" in modified_code6
assert "'exit': 2" in modified_code6
assert "exit_reason" in modified_code7
assert "exit_reason == 'stop_loss'" in modified_code7
# those tests currently don't work, next in line.
assert "exit_signal" in modified_code8
assert "exit_reason" in modified_code8
assert "force_exit" in modified_code8
assert "emergency_exit" in modified_code8
assert "This is the 1st comment" in modified_code9
assert "This is the 2nd comment" in modified_code9
assert "This is the 3rd comment" in modified_code9