# --- Do not remove these libs --- from freqtrade.strategy import IStrategy from typing import Dict, List from functools import reduce from pandas import DataFrame, pandas import freqtrade.vendor.qtpylib.indicators as qtpylib import sys import os #sys.setrecursionlimit(1000000) #例如这里设置为一百万 #sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) #sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from chanlun import ChanLun # -------------------------------- from technical.util import resample_to_interval, resampled_merge import talib.abstract as ta import freqtrade.vendor.qtpylib.indicators as qtpylib from datetime import datetime, timedelta, timezone from freqtrade.persistence import Trade, Order from typing import Optional from chanlun.analysis.ChanPY import ChanPY import logging logger = logging.getLogger(__name__) from openai import OpenAI ### Now you can use logger.info('asfd') to log # freqtrade trade -c ./user_data/Deepseek_BTC.json --strategy Deepseek_BTC --strategy-path ./user_data/strategies # freqtrade backtesting -c ./user_data/Deepseek_BTC.json --strategy Deepseek_BTC --strategy-path ./user_data/strategies --timerange=20250309- # freqtrade download-data -c ./user_data/Deepseek_BTC.json -t 1m --pairs BTC/USDT:USDT --timerange=20240101- # freqtrade hyperopt --hyperopt-loss SharpeHyperOptLossDaily --spaces roi stoploss --strategy Deepseek_BTC --strategy-path ./user_data/strategies -c ./user_data/Chan.json -e 200 --timerange=20250101-20250215 # sudo docker compose run --rm chan_btc backtesting -c ./user_data/Chan.json --strategy Deepseek_BTC --strategy-path ./user_data/strategies --timerange=20250101- # sudo docker compose run --rm chan_btc download-data -c ./user_data/Deepseek_BTC.json --pairs SOL/USDT:USDT -t 1m --timerange 20240101- # sudo docker compose run --rm chan_btc trade -c ./user_data/Chan.json --strategy Deepseek_BTC --strategy-path ./user_data/strategies def get_ai(): client = OpenAI(api_key="sk-d802019a175a4a34ac73c4690ce0a291", base_url="https://api.deepseek.com") return client class Deepseek_BTC(IStrategy): INTERFACE_VERSION: int = 3 # Minimal ROI designed for the strategy. # This attribute will be overridden if the config file contains "minimal_roi" minimal_roi = { "0": 0.253, "120": 0.159, "240": 0.052, "360": 0 } can_short = True # Optimal stoploss designed for the strategy # This attribute will be overridden if the config file contains "stoploss" stoploss = -0.21 trailing_stop = False trailing_stop_positive = 0.015 trailing_stop_positive_offset = 0.043 trailing_only_offset_is_reached = False # Optimal timeframe for the strategy # timeframe = '15m' startup_candle_count = 100 df_size = 0 state_list = [] last_time = datetime.now() client = get_ai() def get_ai_state(self, dataframe): # 获取账户数据、订单历史和当前订单 current_data = {} # 获取账户余额信息 current_data['balance'] = self.wallets.get_all_balances() # 获取交易历史 try: # 尝试新的API方式获取已关闭的交易 closed_trades = Trade.get_trades_proxy(is_open=False) trade_history = [] for trade in closed_trades: trade_history.append({ 'pair': trade.pair, 'open_date': str(trade.open_date), 'close_date': str(trade.close_date), 'open_rate': float(trade.open_rate), 'close_rate': float(trade.close_rate), 'stake_amount': float(trade.stake_amount), 'amount': float(trade.amount), 'profit_ratio': float(trade.profit_ratio) if trade.profit_ratio else 0, 'profit_abs': float(trade.profit_abs) if trade.profit_abs else 0, 'trade_duration': trade.close_date.timestamp() - trade.open_date.timestamp() if trade.close_date else 0, 'is_short': trade.is_short }) current_data['trade_history'] = trade_history except Exception as e: logger.error(f"获取交易历史时出错: {e}") current_data['trade_history'] = [] # 获取当前正在进行的订单 try: # 尝试新的API方式获取开放的交易 open_trades = Trade.get_trades_proxy(is_open=True) current_trades = [] for trade in open_trades: current_trades.append({ 'pair': trade.pair, 'open_date': str(trade.open_date), 'open_rate': float(trade.open_rate), 'stake_amount': float(trade.stake_amount), 'amount': float(trade.amount), 'current_rate': float(self.dp.get_ticker(trade.pair)['close']) if self.dp else 0, 'current_profit_ratio': float(trade.calc_profit_ratio(self.dp.get_ticker(trade.pair)['close'])) if self.dp else 0, 'trade_duration': datetime.now(timezone.utc).timestamp() - trade.open_date.timestamp(), 'is_short': trade.is_short, 'open_orders': [{'order_id': order.order_id, 'order_type': order.ft_order_side} for order in trade.orders] }) current_data['current_trades'] = current_trades except Exception as e: logger.error(f"获取当前订单时出错: {e}") current_data['current_trades'] = [] # 获取交易所限制和状态 if hasattr(self, 'exchange'): current_data['exchange_info'] = { 'name': self.exchange.name if hasattr(self.exchange, 'name') else '', 'trading_mode': self.config.get('trading_mode', ''), 'stake_currency': self.config.get('stake_currency', ''), 'dry_run': self.config.get('dry_run', True) } response = self.client.chat.completions.create( model="deepseek-reasoner", messages=[ {"role": "system", "content": "你是缠论高手"}, {"role": "user", "content": f"我们交易的是币安的比特币合约, 数据格式是json, 数据包括现有的持仓, 仓位历史, 账户余额, 你用缠论分析之后, 给出以下分析, 最近的一个中枢在哪里,现在的趋势是什么,现在是否是买卖点,如果是,是那一类买卖点,应该进行何种操作。交易数据: {current_data}\n图表数据: {dataframe}"}, ], stream=False ) res = response.choices[0].message.content print(res) return res def get_state(self, dataframe): if self.df_size == 0: for index in range(0, len(dataframe)): self.state_list.append('0') self.df_size = len(dataframe) elif self.df_size < len(dataframe): state = self.get_ai_state(dataframe) self.state_list.append('0') self.df_size = len(dataframe) dataframe['state'] = self.state_list #print(dataframe.tail(10)) return dataframe def informative_pairs(self): # get access to all pairs available in whitelist. pairs = self.dp.current_whitelist() # Assign tf to each pair so they can be downloaded and cached for strategy. informative_pairs = [(pair, '1h') for pair in pairs] # Optionally Add additional "static" pairs #informative_pairs += [("ETH/USDT:USDT", "5m"),("ETH/USDT:USDT", "15m"),] return informative_pairs def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe = self.get_state(dataframe) return dataframe # (1,1) = 1, (1,0) = 2, (-1,1) = 3, (-1, 0) = 4, (0,0) = 0 def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( (dataframe['state'] == "10") ), ['enter_long', 'enter_tag']] = (1, 'long_signal_chan') dataframe.loc[ ( (dataframe['state'] == "-10") ), ['enter_short', 'enter_tag']] = (1, 'short_signal_chan') return dataframe def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( (dataframe['state'] == "99") ), ['exit_long', 'exit_tag']] = (1, 'long_close_signal_chan') dataframe.loc[ ( (dataframe['state'] == "99") ), ['exit_short', 'exit_tag']] = (1, 'short_close_signal_chan') return dataframe def leverage(self, pair: str, current_time: datetime, current_rate: float, proposed_leverage: float, max_leverage: float, entry_tag: Optional[str], side: str, **kwargs) -> float: return 1.0 def get_ticker_indicator(self): return int(self.timeframe[:-1])