ADX 条件太严格,很多时候不满足条件,无法形成网格
This commit is contained in:
parent
a772b42877
commit
cd1c26e6e4
@ -1,65 +1,60 @@
|
||||
# SmartBBGrid.py
|
||||
from freqtrade.strategy import IStrategy
|
||||
from pandas import DataFrame
|
||||
import talib.abstract as ta
|
||||
import freqtrade.vendor.qtpylib.indicators as qtpylib
|
||||
import numpy as np
|
||||
|
||||
class SmartBBGrid(IStrategy):
|
||||
INTERFACE_VERSION = 3
|
||||
timeframe = '4h'
|
||||
can_short = False
|
||||
|
||||
minimal_roi = {"0": 100}
|
||||
stoploss = -0.99
|
||||
startup_candle_count = 200
|
||||
startup_candle_count = 250
|
||||
use_exit_signal = True
|
||||
exit_profit_only = False
|
||||
ignore_roi_if_entry_signal = True
|
||||
position_adjustment_enable = True
|
||||
max_entry_position_adjustment = 1
|
||||
|
||||
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||
bb = ta.BBANDS(dataframe, timeperiod=20, nbdevup=2.3, nbdevdn=2.3)
|
||||
dataframe['bb_lower'] = bb['lowerband']
|
||||
dataframe['bb_upper'] = bb['upperband']
|
||||
dataframe['bb_mid'] = bb['middleband']
|
||||
dataframe['bb_width'] = (dataframe['bb_upper'] - dataframe['bb_lower']) / dataframe['bb_mid']
|
||||
# ADX & DI
|
||||
dataframe['adx'] = ta.ADX(dataframe, timeperiod=14)
|
||||
dataframe['plus_di'] = ta.PLUS_DI(dataframe, timeperiod=14)
|
||||
dataframe['minus_di'] = ta.MINUS_DI(dataframe, timeperiod=14)
|
||||
|
||||
# 动态布林带倍数:熊市宽一点,牛市窄一点
|
||||
dataframe['bb_mult'] = np.where(
|
||||
dataframe['minus_di'] > dataframe['plus_di'],
|
||||
2.4, # 熊市宽带
|
||||
2.1 # 牛/震荡窄带
|
||||
)
|
||||
|
||||
# qtpylib 动态布林带
|
||||
bollinger = qtpylib.bollinger_bands(
|
||||
qtpylib.typical_price(dataframe),
|
||||
window=20,
|
||||
stds=dataframe['bb_mult']
|
||||
)
|
||||
dataframe['bb_lower'] = bollinger['lower']
|
||||
dataframe['bb_upper'] = bollinger['upper']
|
||||
dataframe['bb_mid'] = bollinger['mid']
|
||||
|
||||
return dataframe
|
||||
|
||||
# ← 这里结束
|
||||
|
||||
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||
# 放宽入场条件:只要价格接近下轨就买入(形成网格)
|
||||
# 移除 ADX 的严格限制
|
||||
# 纯网格逻辑:只要价格接近下轨就买入
|
||||
dataframe['enter_long'] = (
|
||||
(dataframe['close'] <= dataframe['bb_lower'] * 1.010) & # 放宽到 1% 范围
|
||||
(dataframe['close'] <= dataframe['bb_lower'] * 1.02) & # 下轨附近 2% 范围
|
||||
(dataframe['volume'] > 0)
|
||||
)
|
||||
return dataframe
|
||||
|
||||
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||
# 保守出场:只要反弽 1% 就卖出
|
||||
# 纯网格逻辑:只要小幅反弹就卖出
|
||||
dataframe['exit_long'] = (
|
||||
(dataframe['close'] >= dataframe['bb_lower'] * 1.01) # 反弹 1% 就卖
|
||||
(dataframe['close'] >= dataframe['bb_lower'] * 1.005) # 反弹 0.5% 就卖
|
||||
)
|
||||
return dataframe
|
||||
|
||||
def custom_stake_amount(self, pair: str, current_time, current_rate,
|
||||
proposed_stake, min_stake, max_stake,
|
||||
entry_tag, **kwargs) -> float:
|
||||
"""每个币对保持 25-30 个订单的资金管理"""
|
||||
|
||||
# 每个币对的目标资金上限
|
||||
weights = {
|
||||
'BTC/USDT': 900, # 固定 $900 给 BTC
|
||||
'ETH/USDT': 900, # 固定 $900 给 ETH
|
||||
'SOL/USDT': 1200, # 固定 $1200 给 SOL
|
||||
}
|
||||
|
||||
# 每个币对的目标资金
|
||||
target_for_pair = weights.get(pair, 1000)
|
||||
|
||||
# 每笔固定投入 = 目标资金 / 27 (目标订单数)
|
||||
per_order_stake = target_for_pair / 27
|
||||
|
||||
# 不超过 proposed_stake,也不超过 max_stake
|
||||
stake = min(per_order_stake, proposed_stake, max_stake)
|
||||
stake = max(stake, min_stake * 2)
|
||||
|
||||
return stake
|
||||
File diff suppressed because it is too large
Load Diff
@ -175,13 +175,43 @@ if [[ "$current_branch" == *"dryrun"* ]]; then
|
||||
echo "✅ Git工作区已清理" >&2
|
||||
fi
|
||||
|
||||
# 设置默认远程币对列表URL,支持命令行参数覆盖
|
||||
# 设置默认远程币对列表URL
|
||||
DEFAULT_PAIR_REMOTE_URL="http://pairlist.xl.home/api/pairlist?mute=true&count=30"
|
||||
PAIR_REMOTE_LIST_URL="$DEFAULT_PAIR_REMOTE_URL"
|
||||
|
||||
# 解析命令行参数:如果提供则覆盖默认值
|
||||
# 初始化策略配置(从 .env 加载)
|
||||
STRATEGY_NAME=${STRATEGY_NAME:-TheForceV7}
|
||||
CONFIG_FILE=${CONFIG_FILE:-basic.json}
|
||||
|
||||
# 解析命令行参数:支持策略名、配置文件、币对列表
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--strategy=*)
|
||||
STRATEGY_NAME="${1#*=}"
|
||||
shift
|
||||
;;
|
||||
--strategy|-t)
|
||||
if [[ -n "$2" && "$2" != -* ]]; then
|
||||
STRATEGY_NAME="$2"
|
||||
shift 2
|
||||
else
|
||||
echo "错误:--strategy需要指定策略名" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
--config=*)
|
||||
CONFIG_FILE="${1#*=}"
|
||||
shift
|
||||
;;
|
||||
--config|-c)
|
||||
if [[ -n "$2" && "$2" != -* ]]; then
|
||||
CONFIG_FILE="$2"
|
||||
shift 2
|
||||
else
|
||||
echo "错误:--config需要指定配置文件" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
--pairRemoteList=*)
|
||||
PAIR_REMOTE_LIST_URL="${1#*=}"
|
||||
shift
|
||||
@ -201,15 +231,23 @@ while [[ $# -gt 0 ]]; do
|
||||
esac
|
||||
done
|
||||
|
||||
# 加载策略配置
|
||||
STRATEGY_NAME=${STRATEGY_NAME:-TheForceV7}
|
||||
CONFIG_FILE=${CONFIG_FILE:-basic.json}
|
||||
# 处理策略名称,自动匹配配置文件
|
||||
if [ -n "$STRATEGY_NAME" ]; then
|
||||
STRATEGY_CONFIG_LOWER="$(echo "$STRATEGY_NAME" | tr '[:upper:]' '[:lower:]').json"
|
||||
|
||||
# 如果没有明确指定配置文件,尝试自动匹配
|
||||
if [ "$CONFIG_FILE" = "basic.json" ] && [ -f "../freqtrade/templates/$STRATEGY_CONFIG_LOWER" ]; then
|
||||
CONFIG_FILE="$STRATEGY_CONFIG_LOWER"
|
||||
echo "自动匹配配置文件: $CONFIG_FILE" >&2
|
||||
fi
|
||||
fi
|
||||
|
||||
PARAMS_NAME=$(echo "$STRATEGY_NAME" | tr '[:upper:]' '[:lower:]')
|
||||
|
||||
echo "使用策略: $STRATEGY_NAME" >&2
|
||||
echo "使用配置: $CONFIG_FILE" >&2
|
||||
echo "测试分支: $TEST_BRANCH" >&2
|
||||
echo "远程币对列表URL: $PAIR_REMOTE_LIST_URL" >&2 # 显示当前使用的URL
|
||||
echo "✅ 使用策略: $STRATEGY_NAME" >&2
|
||||
echo "✅ 使用配置: $CONFIG_FILE" >&2
|
||||
echo "✅ dryrun分支: $DRYRUN_BRANCH" >&2
|
||||
echo "✅ 远程币对列表URL: $PAIR_REMOTE_LIST_URL" >&2
|
||||
|
||||
### 核心:处理币对列表 ###
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user