freqtrade / freqtrade-strategies

Free trading strategies for Freqtrade bot
GNU General Public License v3.0
3.21k stars 1.1k forks source link

help me to solve issue about, generateTillsonT3() takes 4 positional arguments but 6 were given #208

Closed Nai-mul closed 3 years ago

Nai-mul commented 3 years ago

below is my code. i cant understand where is the problem.

import numpy as np  # noqa
import pandas as pd  # noqa
from pandas import DataFrame
import talib as ta
import matplotlib.pyplot as plt
from datetime import datetime
import sys
import math
from freqtrade.strategy.interface import IStrategy

import talib.abstract as ta
import freqtrade.vendor.qtpylib.indicators as qtpylib

class tillsont3(IStrategy):
    INTERFACE_VERSION = 2
    minimal_roi = {
        "0": 0.15,
    }

    stoploss = -0.045
    trailing_stop = True
    trailing_only_offset_is_reached = True
    trailing_stop_positive = 0.0001
    trailing_stop_positive_offset = 0.035

    timeframe = '1h'

    process_only_new_candles = False
    use_sell_signal = True
    sell_profit_only = False
    ignore_roi_if_buy_signal = False
    startup_candle_count: int = 30

    order_types = {
        'buy': 'limit',
        'sell': 'limit',
        'stoploss': 'market',
        'stoploss_on_exchange': False
    }
    order_time_in_force = {
        'buy': 'gtc',
        'sell': 'gtc'
    }

    plot_config = {
        # Main plot indicators (Moving averages, ...)
        'main_plot': {
            'T3': {'color': 'blue'},
        },
        'subplots': {
            # Subplots - each dict defines one additional plot
            "MACD": {
                'macd': {'color': 'blue'},
                'macdsignal': {'color': 'orange'},
            },
            "RSI": {
                'rsi': {'color': 'red'},
            }
        }
    } 

    def generateTillsonT3(self, dataframe, volume_factor, t3Length):  

        dataframe['ema_first_input'] = (dataframe['high'] + dataframe['low'] + 2 * dataframe['close']) / 4

        dataframe['e1'] = ta.EMA(dataframe['ema_first_input'], t3Length)

        dataframe['e2'] = ta.EMA(dataframe['e1'], t3Length)

        dataframe['e3'] = ta.EMA(dataframe['e2'], t3Length)

        dataframe['e4'] = ta.EMA(dataframe['e3'], t3Length)

        dataframe['e5'] = ta.EMA(dataframe['e5'], t3Length)

        dataframe['e6'] = ta.EMA(dataframe['e5'], t3Length)     

        c1 = -1 * volume_factor * volume_factor * volume_factor

        c2 = 3 * volume_factor * volume_factor + 3 * volume_factor * volume_factor * volume_factor

        c3 = -6 * volume_factor * volume_factor - 3 * volume_factor - 3 * volume_factor * volume_factor * volume_factor

        c4 = 1 + 3 * volume_factor + volume_factor * volume_factor * volume_factor + 3 * volume_factor * volume_factor

        dataframe['T3'] = c1 * dataframe['e6'] + c2 * dataframe['e5'] + c3 * dataframe['e4'] + c4 * dataframe['e3'] 

        return {'T3': dataframe['T3']}  

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:

        # Generate tillson T3 indicators

        volume_factor = 0.7

        t3length = 8

        tillsont3 = self.generateTillsonT3(dataframe['close'], dataframe['high'], dataframe['low'], volume_factor, t3length)

        dataframe['t3_last'] = tillsont3[-1]

        dataframe['t3_previous'] = tillsont3[-2]

        dataframe['t3_prev_previous'] = tillsont3[-3]

        return dataframe    

    def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                dataframe['t3_last'] > dataframe['t3_previous'] &
                dataframe['t3_previous'] < dataframe['t3_prev_previous']

            ),
            'buy'] = 1

        return dataframe

    def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                dataframe['t3_last'] < dataframe['t3_previous'] &
                dataframe['t3_previous'] > dataframe['t3_prev_previous']
            ),
            'sell'] = 1

        return dataframe
Nai-mul commented 3 years ago

Traceback (most recent call last): File "/home/n/bot/freqtrade/main.py", line 37, in main return_code = args'func' File "/home/n/bot/freqtrade/commands/optimize_commands.py", line 54, in start_backtesting backtesting.start() File "/home/n/bot/freqtrade/optimize/backtesting.py", line 534, in start min_date, max_date = self.backtest_one_strategy(strat, data, timerange) File "/home/n/bot/freqtrade/optimize/backtesting.py", line 492, in backtest_one_strategy preprocessed = self.strategy.ohlcvdata_to_dataframe(data) File "/home/n/bot/freqtrade/strategy/interface.py", line 712, in ohlcvdata_to_dataframe return {pair: self.advise_indicators(pair_data.copy(), {'pair': pair}) File "/home/n/bot/freqtrade/strategy/interface.py", line 712, in return {pair: self.advise_indicators(pair_data.copy(), {'pair': pair}) File "/home/n/bot/freqtrade/strategy/interface.py", line 729, in advise_indicators return self.populate_indicators(dataframe, metadata) File "/home/n/bot/user_data/strategies/tillsont3.py", line 103, in populate_indicators tillsont3 = self.generateTillsonT3(dataframe['close'], dataframe['high'], dataframe['low'], volume_factor, t3length) TypeError: generateTillsonT3() takes 4 positional arguments but 6 were given

xmatthias commented 3 years ago

your definition of generateTillsonT3 is def generateTillsonT3(self, dataframe, volume_factor, t3Length):.

as such - you'll need to pass in the whole dataframe, not seperate close / high / low columns.

Nai-mul commented 3 years ago

Hi, can you copy and check this code? after your comment i remove dataframe['high'] and dataframe['low'] from populate_indicators.

tillsont3 = self.generateTillsonT3(dataframe['close'], dataframe['high'], dataframe['low'], volume_factor, t3length)

and edit that like below

tillsont3 = self.generateTillsonT3(dataframe['close'], volume_factor, t3length).

after adding It's, backtest was start but It's crash suddenly.

021-08-09 01:08:15,370 - freqtrade.optimize.backtesting - INFO - Loading data from 2021-07-26 12:00:00 up to 2021-07-30 00:00:00 (3 days). 2021-08-09 01:08:15,370 - freqtrade.optimize.backtesting - INFO - Dataload complete. Calculating indicators 2021-08-09 01:08:15,371 - freqtrade.optimize.backtesting - INFO - Running backtesting for Strategy tillsont3 2021-08-09 01:08:15,371 - freqtrade - ERROR - Fatal exception! Traceback (most recent call last): File "/home/n/bot/freqtrade/main.py", line 37, in main return_code = args'func' File "/home/n/bot/freqtrade/commands/optimize_commands.py", line 54, in start_backtesting backtesting.start() File "/home/n/bot/freqtrade/optimize/backtesting.py", line 534, in start min_date, max_date = self.backtest_one_strategy(strat, data, timerange) File "/home/n/bot/freqtrade/optimize/backtesting.py", line 492, in backtest_one_strategy preprocessed = self.strategy.ohlcvdata_to_dataframe(data) File "/home/n/bot/freqtrade/strategy/interface.py", line 712, in ohlcvdata_to_dataframe return {pair: self.advise_indicators(pair_data.copy(), {'pair': pair}) File "/home/n/bot/freqtrade/strategy/interface.py", line 712, in return {pair: self.advise_indicators(pair_data.copy(), {'pair': pair}) File "/home/n/bot/freqtrade/strategy/interface.py", line 729, in advise_indicators return self.populate_indicators(dataframe, metadata) File "/home/n/bot/user_data/strategies/tillsont3.py", line 103, in populate_indicators tillsont3 = self.generateTillsonT3(dataframe['close'], volume_factor, t3length) File "/home/n/bot/user_data/strategies/tillsont3.py", line 69, in generateTillsonT3 dataframe['ema_first_input'] = (dataframe['high'] + dataframe['low'] + 2 * dataframe['close']) / 4 File "/home/n/bot/.env/lib/python3.9/site-packages/pandas/core/series.py", line 853, in getitem return self._get_value(key) File "/home/n/bot/.env/lib/python3.9/site-packages/pandas/core/series.py", line 961, in _get_value loc = self.index.get_loc(label) File "/home/n/bot/.env/lib/python3.9/site-packages/pandas/core/indexes/range.py", line 354, in get_loc raise KeyError(key) KeyError: 'high'

xmatthias commented 3 years ago

Your call is wrong again.

tillsont3 = self.generateTillsonT3(dataframe['close'], volume_factor, t3length). should be tillsont3 = self.generateTillsonT3(dataframe, volume_factor, t3length).

What i don't understand - you seem to have written both methods - but you don't know how to call your method ?

Anyway - for this type of issues - best use the search engine of your preference. It's not relate to freqtrade directly, but to simple programming / pandas topics.