117 lines
3.3 KiB
Python
117 lines
3.3 KiB
Python
import simplejson as json
|
|
from base64 import urlsafe_b64encode
|
|
import freqtrade.aws.strategy as aws
|
|
|
|
|
|
def test_strategy(lambda_context):
|
|
content = """# --- Do not remove these libs ---
|
|
from freqtrade.strategy.interface import IStrategy
|
|
from typing import Dict, List
|
|
from hyperopt import hp
|
|
from functools import reduce
|
|
from pandas import DataFrame
|
|
# --------------------------------
|
|
|
|
import talib.abstract as ta
|
|
import freqtrade.vendor.qtpylib.indicators as qtpylib
|
|
|
|
class TestStrategy(IStrategy):
|
|
minimal_roi = {
|
|
"0": 0.5
|
|
}
|
|
stoploss = -0.2
|
|
ticker_interval = '5m'
|
|
|
|
def populate_indicators(self, dataframe: DataFrame) -> DataFrame:
|
|
macd = ta.MACD(dataframe)
|
|
dataframe['maShort'] = ta.EMA(dataframe, timeperiod=8)
|
|
dataframe['maMedium'] = ta.EMA(dataframe, timeperiod=21)
|
|
return dataframe
|
|
|
|
def populate_buy_trend(self, dataframe: DataFrame) -> DataFrame:
|
|
dataframe.loc[
|
|
(
|
|
qtpylib.crossed_above(dataframe['maShort'], dataframe['maMedium'])
|
|
),
|
|
'buy'] = 1
|
|
|
|
return dataframe
|
|
|
|
def populate_sell_trend(self, dataframe: DataFrame) -> DataFrame:
|
|
dataframe.loc[
|
|
(
|
|
qtpylib.crossed_above(dataframe['maMedium'], dataframe['maShort'])
|
|
),
|
|
'sell'] = 1
|
|
return dataframe
|
|
|
|
|
|
"""
|
|
|
|
request = {
|
|
"user": "GCU4LW2XXZW3A3FM2XZJTEJHNWHTWDKY2DIJLCZJ5ULVZ4K7LZ7D23TG",
|
|
"description": "simple test strategy",
|
|
"name": "TestStrategy",
|
|
"content": urlsafe_b64encode(content.encode('utf-8')),
|
|
"public": False
|
|
}
|
|
|
|
# db should be empty
|
|
assert (len(json.loads(aws.names({}, {})['body'])) == 0)
|
|
# now we add an entry
|
|
aws.submit({
|
|
"body": json.dumps(request)
|
|
}, {})
|
|
|
|
# now we should have items
|
|
assert (len(json.loads(aws.names({}, {})['body'])) == 1)
|
|
|
|
# able to add a second strategy with the sample name, but different user
|
|
|
|
request = {
|
|
"user": "GCU4LW2XXZW3A3FM2XZJTEJHNWHTWDKY2DIJLCZJ5ULVZ4K7LZ7D23TH",
|
|
"description": "simple test strategy",
|
|
"name": "TestStrategy",
|
|
"content": urlsafe_b64encode(content.encode('utf-8')),
|
|
"public": True
|
|
}
|
|
|
|
aws.submit({
|
|
"body": json.dumps(request)
|
|
}, {})
|
|
|
|
assert (len(json.loads(aws.names({}, {})['body'])) == 2)
|
|
|
|
# able to add a duplicated strategy, which should overwrite the existing strategy
|
|
|
|
request = {
|
|
"user": "GCU4LW2XXZW3A3FM2XZJTEJHNWHTWDKY2DIJLCZJ5ULVZ4K7LZ7D23TH",
|
|
"description": "simple test strategy",
|
|
"name": "TestStrategy",
|
|
"content": urlsafe_b64encode(content.encode('utf-8')),
|
|
"public": True
|
|
}
|
|
|
|
aws.submit({
|
|
"body": json.dumps(request)
|
|
}, {})
|
|
|
|
assert (len(json.loads(aws.names({}, {})['body'])) == 2)
|
|
|
|
# we need to be able to get the code of the strategy
|
|
code = aws.code({'pathParameters': {
|
|
"name": "TestStrategy",
|
|
"user": "GCU4LW2XXZW3A3FM2XZJTEJHNWHTWDKY2DIJLCZJ5ULVZ4K7LZ7D23TH"
|
|
}}, {})
|
|
|
|
# code should equal our initial content
|
|
assert code == content
|
|
|
|
# we need to be able to get a strategy ( code cannot be included )
|
|
strategy = json.loads(aws.get({}, {}))
|
|
assert "content" not in strategy
|
|
assert "user" in strategy
|
|
assert "name" in strategy
|
|
assert "description" in strategy
|
|
assert "public" in strategy
|