Add config and strategies to the repo
This commit is contained in:
@@ -0,0 +1,196 @@
|
||||
# --- 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.abspath("/freqtrade/user_data/Chan"))
|
||||
sys.path.append(os.path.abspath("/Users/jack/Project/freqtrade/user_data/Chan"))
|
||||
#sys.path.append(os.path.abspath("/Users/jack/Documents/GitHub/freqtrade/user_data/Chan"))
|
||||
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 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])
|
||||
Reference in New Issue
Block a user