ADX 条件太严格,很多时候不满足条件,无法形成网格

This commit is contained in:
zhangkun9038@dingtalk.com 2025-11-25 23:38:32 +08:00
parent a772b42877
commit cd1c26e6e4
3 changed files with 516 additions and 585 deletions

View File

@ -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

View File

@ -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
### 核心:处理币对列表 ###