added checks for python3.8 or lower since ast_comments.unparse() needs python 3.9 or higher.
testing with python 3.8 would make the build fail tests, skipping it there.
This commit is contained in:
parent
1bb697e58c
commit
bfc7f48f17
@ -1,4 +1,5 @@
|
|||||||
import logging
|
import logging
|
||||||
|
import sys
|
||||||
import time
|
import time
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any, Dict
|
from typing import Any, Dict
|
||||||
@ -19,28 +20,34 @@ def start_strategy_update(args: Dict[str, Any]) -> None:
|
|||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
|
|
||||||
config = setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE)
|
if sys.version_info <= (3, 8):
|
||||||
|
print("This code requires Python 3.9 or higher. "
|
||||||
|
"We cannot continue. "
|
||||||
|
"Please upgrade your python version to use this command.")
|
||||||
|
|
||||||
strategy_objs = StrategyResolver.search_all_objects(
|
|
||||||
config, enum_failed=False, recursive=config.get('recursive_strategy_search', False))
|
|
||||||
|
|
||||||
filtered_strategy_objs = []
|
|
||||||
if 'strategy_list' in args:
|
|
||||||
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:
|
else:
|
||||||
processed_locations = set()
|
config = setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE)
|
||||||
for strategy_obj in strategy_objs:
|
|
||||||
if strategy_obj['location'] not in processed_locations:
|
strategy_objs = StrategyResolver.search_all_objects(
|
||||||
processed_locations.add(strategy_obj['location'])
|
config, enum_failed=False, recursive=config.get('recursive_strategy_search', False))
|
||||||
start_conversion(strategy_obj, config)
|
|
||||||
|
filtered_strategy_objs = []
|
||||||
|
if 'strategy_list' in args:
|
||||||
|
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:
|
||||||
|
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):
|
||||||
|
@ -1,130 +1,135 @@
|
|||||||
# pragma pylint: disable=missing-docstring, protected-access, invalid-name
|
# pragma pylint: disable=missing-docstring, protected-access, invalid-name
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
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:
|
||||||
instance_strategy_updater = StrategyUpdater()
|
if sys.version_info <= (3, 8):
|
||||||
modified_code1 = instance_strategy_updater.update_code("""
|
print("skipped tests since python version is 3.8 or lower.")
|
||||||
class testClass(IStrategy):
|
else:
|
||||||
def populate_buy_trend():
|
instance_strategy_updater = StrategyUpdater()
|
||||||
pass
|
modified_code1 = instance_strategy_updater.update_code("""
|
||||||
def populate_sell_trend():
|
class testClass(IStrategy):
|
||||||
pass
|
def populate_buy_trend():
|
||||||
def check_buy_timeout():
|
pass
|
||||||
pass
|
def populate_sell_trend():
|
||||||
def check_sell_timeout():
|
pass
|
||||||
pass
|
def check_buy_timeout():
|
||||||
def custom_sell():
|
pass
|
||||||
pass
|
def check_sell_timeout():
|
||||||
""")
|
pass
|
||||||
modified_code2 = instance_strategy_updater.update_code("""
|
def custom_sell():
|
||||||
ticker_interval = '15m'
|
pass
|
||||||
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("""
|
modified_code2 = instance_strategy_updater.update_code("""
|
||||||
order_time_in_force = {
|
ticker_interval = '15m'
|
||||||
'buy': 'gtc',
|
buy_some_parameter = IntParameter(space='buy')
|
||||||
'sell': 'ioc'
|
sell_some_parameter = IntParameter(space='sell')
|
||||||
}
|
""")
|
||||||
order_types = {
|
modified_code3 = instance_strategy_updater.update_code("""
|
||||||
'buy': 'limit',
|
use_sell_signal = True
|
||||||
'sell': 'market',
|
sell_profit_only = True
|
||||||
'stoploss': 'market',
|
sell_profit_offset = True
|
||||||
'stoploss_on_exchange': False
|
ignore_roi_if_buy_signal = True
|
||||||
}
|
forcebuy_enable = True
|
||||||
unfilledtimeout = {
|
""")
|
||||||
'buy': 1,
|
modified_code4 = instance_strategy_updater.update_code("""
|
||||||
'sell': 2
|
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("""
|
||||||
modified_code7 = instance_strategy_updater.update_code("""
|
def confirm_trade_exit(sell_reason: str):
|
||||||
def confirm_trade_exit(sell_reason):
|
|
||||||
if (sell_reason == 'stop_loss'):
|
|
||||||
pass
|
pass
|
||||||
""")
|
""")
|
||||||
modified_code8 = instance_strategy_updater.update_code("""
|
modified_code6 = instance_strategy_updater.update_code("""
|
||||||
sell_reason == 'sell_signal'
|
order_time_in_force = {
|
||||||
sell_reason == 'force_sell'
|
'buy': 'gtc',
|
||||||
sell_reason == 'emergency_sell'
|
'sell': 'ioc'
|
||||||
""")
|
|
||||||
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
|
||||||
|
}
|
||||||
|
""")
|
||||||
|
|
||||||
# This is the 4th comment
|
modified_code7 = instance_strategy_updater.update_code("""
|
||||||
stoploss = -0.1
|
def confirm_trade_exit(sell_reason):
|
||||||
""")
|
if (sell_reason == 'stop_loss'):
|
||||||
# currently still missing:
|
pass
|
||||||
# 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
|
|
||||||
|
|
||||||
assert "timeframe" in modified_code2
|
class someStrategy(IStrategy):
|
||||||
# check for not editing hyperopt spaces
|
# This is the 3rd comment
|
||||||
assert "space='buy'" in modified_code2
|
# This attribute will be overridden if the config file contains "minimal_roi"
|
||||||
assert "space='sell'" in modified_code2
|
minimal_roi = {
|
||||||
|
"0": 0.50
|
||||||
|
}
|
||||||
|
|
||||||
assert "use_exit_signal" in modified_code3
|
# This is the 4th comment
|
||||||
assert "exit_profit_only" in modified_code3
|
stoploss = -0.1
|
||||||
assert "exit_profit_offset" in modified_code3
|
""")
|
||||||
assert "ignore_roi_if_entry_signal" in modified_code3
|
# currently still missing:
|
||||||
assert "force_entry_enable" in modified_code3
|
# Webhook terminology, Telegram notification settings, Strategy/Config settings
|
||||||
|
|
||||||
assert "enter_long" in modified_code4
|
assert "populate_entry_trend" in modified_code1
|
||||||
assert "exit_long" in modified_code4
|
assert "populate_exit_trend" in modified_code1
|
||||||
assert "enter_tag" in modified_code4
|
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
|
||||||
|
|
||||||
assert "exit_reason" in modified_code5
|
assert "timeframe" in modified_code2
|
||||||
|
# check for not editing hyperopt spaces
|
||||||
|
assert "space='buy'" in modified_code2
|
||||||
|
assert "space='sell'" in modified_code2
|
||||||
|
|
||||||
assert "'entry': 'gtc'" in modified_code6
|
assert "use_exit_signal" in modified_code3
|
||||||
assert "'exit': 'ioc'" in modified_code6
|
assert "exit_profit_only" in modified_code3
|
||||||
assert "'entry': 'limit'" in modified_code6
|
assert "exit_profit_offset" in modified_code3
|
||||||
assert "'exit': 'market'" in modified_code6
|
assert "ignore_roi_if_entry_signal" in modified_code3
|
||||||
assert "'entry': 1" in modified_code6
|
assert "force_entry_enable" in modified_code3
|
||||||
assert "'exit': 2" in modified_code6
|
|
||||||
|
|
||||||
assert "exit_reason" in modified_code7
|
assert "enter_long" in modified_code4
|
||||||
assert "exit_reason == 'stop_loss'" in modified_code7
|
assert "exit_long" in modified_code4
|
||||||
|
assert "enter_tag" in modified_code4
|
||||||
|
|
||||||
# those tests currently don't work, next in line.
|
assert "exit_reason" in modified_code5
|
||||||
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 "'entry': 'gtc'" in modified_code6
|
||||||
assert "This is the 2nd comment" in modified_code9
|
assert "'exit': 'ioc'" in modified_code6
|
||||||
assert "This is the 3rd comment" in modified_code9
|
assert "'entry': 'limit'" in modified_code6
|
||||||
|
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
|
||||||
|
Loading…
Reference in New Issue
Block a user