-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
概述
为Strategy-21创建完整的配置文件模板,包含所有策略参数、风控设置、技术指标配置等,确保策略的可配置性和灵活性,便于不同市场环境下的参数调优。
目标
- 创建主配置文件模板(freqtrade配置)
- 创建策略专用参数配置
- 提供多种市场环境配置预设
- 建立配置文件验证机制
技术要求
核心功能
-
主配置文件
- Freqtrade框架配置
- 交易所连接配置
- 数据源和时间框架设置
- 基础交易参数
-
策略参数配置
- VATSM技术指标参数
- 信号系统配置
- 仓位管理参数
- 风控系统设置
-
环境预设配置
- 牛市配置模板
- 熊市配置模板
- 震荡市配置模板
- 保守模式配置
实现细节
主配置文件 (config_strategy21.json)
{
"trading_mode": "live",
"dry_run": false,
"dry_run_wallet": 1000,
"cancel_open_orders_on_exit": true,
"stake_currency": "USDT",
"stake_amount": "unlimited",
"tradable_balance_ratio": 0.99,
"fiat_display_currency": "USD",
"timeframe": "5m",
"startup_candle_count": 500,
"exchange": {
"name": "binance",
"key": "${EXCHANGE_API_KEY}",
"secret": "${EXCHANGE_SECRET}",
"ccxt_config": {
"enableRateLimit": true,
"rateLimit": 200
},
"ccxt_async_config": {
"enableRateLimit": true,
"rateLimit": 200
},
"pair_whitelist": [
"BTC/USDT",
"ETH/USDT",
"BNB/USDT",
"ADA/USDT",
"SOL/USDT",
"MATIC/USDT",
"DOT/USDT",
"AVAX/USDT",
"LINK/USDT",
"UNI/USDT"
],
"pair_blacklist": []
},
"entry_pricing": {
"price_side": "same",
"use_order_book": true,
"order_book_top": 1,
"price_last_balance": 0.0,
"check_depth_of_market": {
"enabled": false,
"bids_to_ask_delta": 1
}
},
"exit_pricing": {
"price_side": "same",
"use_order_book": true,
"order_book_top": 1
},
"order_types": {
"entry": "limit",
"exit": "limit",
"emergency_exit": "market",
"force_entry": "market",
"force_exit": "market",
"stoploss": "market",
"stoploss_on_exchange": true,
"stoploss_on_exchange_interval": 60,
"stoploss_on_exchange_market_ratio": 0.99
},
"order_time_in_force": {
"entry": "GTC",
"exit": "GTC"
},
"unfilledtimeout": {
"entry": 10,
"exit": 10,
"unit": "minutes"
},
"bid_strategy": {
"price_side": "bid",
"ask_last_balance": 0.0,
"use_order_book": true,
"order_book_top": 1,
"check_depth_of_market": {
"enabled": false,
"bids_to_ask_delta": 1
}
},
"ask_strategy": {
"price_side": "ask",
"use_order_book": true,
"order_book_top": 1
},
"pairlists": [
{
"method": "StaticPairList"
},
{
"method": "VolumePairList",
"number_assets": 20,
"sort_key": "quoteVolume",
"min_value": 0,
"refresh_period": 1800
}
],
"protections": [
{
"method": "StoplossGuard",
"lookback_period_candles": 60,
"trade_limit": 4,
"stop_duration_candles": 60,
"required_profit": -0.10,
"only_per_pair": false
},
{
"method": "MaxDrawdown",
"lookback_period_candles": 200,
"trade_limit": 20,
"stop_duration_candles": 100,
"max_allowed_drawdown": 0.20
},
{
"method": "LowProfitPairs",
"lookback_period_candles": 400,
"trade_limit": 2,
"stop_duration_candles": 60,
"required_profit": -0.05
}
],
"strategy": "Strategy21VATSM",
"strategy_path": "user_data/strategies/",
"db_url": "sqlite:///tradesv3.sqlite",
"user_data_dir": "user_data",
"log_level": "INFO",
"logfile": "logs/freqtrade.log",
"api_server": {
"enabled": true,
"listen_ip_address": "127.0.0.1",
"listen_port": 8080,
"verbosity": "error",
"enable_openapi": false,
"jwt_secret_key": "${JWT_SECRET}",
"CORS_origins": [],
"username": "${API_USERNAME}",
"password": "${API_PASSWORD}"
},
"bot_name": "Strategy21-VATSM",
"initial_state": "running",
"force_entry_enable": false,
"internals": {
"process_throttle_secs": 5
}
}策略参数配置 (strategy21_params.json)
{
"strategy_params": {
"version": "1.0.0",
"last_updated": "2025-09-06T05:48:55Z",
"vatsm_indicators": {
"volume_sma_period": 20,
"atr_period": 14,
"trend_sma_period": 50,
"trend_ema_period": 21,
"strength_rsi_period": 14,
"strength_macd_fast": 12,
"strength_macd_slow": 26,
"strength_macd_signal": 9,
"momentum_period": 14,
"momentum_smoothing": 3
},
"signal_system": {
"entry_signals": {
"volume_threshold": 1.5,
"atr_min_threshold": 0.001,
"trend_alignment_required": true,
"strength_min_score": 0.6,
"momentum_min_score": 0.5
},
"exit_signals": {
"profit_target_pct": 0.025,
"trend_reversal_sensitivity": 0.7,
"strength_weakness_threshold": 0.3,
"momentum_exhaustion_threshold": 0.2
},
"signal_weights": {
"volume_weight": 0.20,
"atr_weight": 0.15,
"trend_weight": 0.25,
"strength_weight": 0.25,
"momentum_weight": 0.15
},
"confirmation_candles": 2,
"signal_timeout_candles": 10
},
"position_management": {
"position_levels": {
"small": {
"min_pct": 0.01,
"max_pct": 0.02,
"signal_threshold_min": 0.0,
"signal_threshold_max": 0.4
},
"medium": {
"min_pct": 0.03,
"max_pct": 0.05,
"signal_threshold_min": 0.4,
"signal_threshold_max": 0.7
},
"large": {
"min_pct": 0.06,
"max_pct": 0.08,
"signal_threshold_min": 0.7,
"signal_threshold_max": 1.0
}
},
"risk_adjustment": {
"atr_risk_multiplier": 2.0,
"volatility_scaling": true,
"kelly_fraction": 0.25,
"max_portfolio_risk": 0.5
},
"position_limits": {
"max_single_position_pct": 0.1,
"max_total_positions": 10,
"max_correlation_positions": 3,
"min_position_spacing_hours": 1
}
},
"risk_management": {
"three_layer_stop_loss": {
"fixed_stop_pct": 0.02,
"trailing_stop_pct": 0.015,
"atr_multiplier": 2.0,
"min_profit_to_trail": 0.01
},
"drawdown_protection": {
"max_drawdown_pct": 0.15,
"warning_drawdown_pct": 0.10,
"recovery_threshold": 0.05,
"position_scaling_enabled": true,
"daily_peak_reset": true
},
"emergency_controls": {
"max_daily_loss_pct": 0.08,
"max_consecutive_losses": 5,
"volatility_threshold": 3.0,
"liquidity_threshold": 0.5,
"force_close_timeout_seconds": 300
}
},
"market_conditions": {
"trend_detection": {
"trend_strength_threshold": 0.6,
"sideways_range_pct": 0.02,
"trend_confirmation_candles": 5
},
"volatility_regimes": {
"low_volatility_threshold": 0.5,
"high_volatility_threshold": 2.0,
"volatility_lookback_periods": 50
},
"market_sessions": {
"asia_session": {
"start": "00:00",
"end": "08:00",
"timezone": "UTC",
"active": true
},
"europe_session": {
"start": "08:00",
"end": "16:00",
"timezone": "UTC",
"active": true
},
"america_session": {
"start": "16:00",
"end": "24:00",
"timezone": "UTC",
"active": true
}
}
}
},
"optimization_ranges": {
"vatsm_indicators": {
"volume_sma_period": [10, 30, 5],
"atr_period": [10, 20, 2],
"trend_sma_period": [30, 100, 10],
"strength_rsi_period": [10, 20, 2]
},
"signal_system": {
"volume_threshold": [1.2, 2.0, 0.1],
"trend_alignment_sensitivity": [0.5, 0.9, 0.1],
"signal_weights.volume_weight": [0.1, 0.3, 0.05]
},
"risk_management": {
"fixed_stop_pct": [0.015, 0.03, 0.005],
"max_drawdown_pct": [0.1, 0.2, 0.02]
}
}
}环境预设配置
牛市配置 (config_bullish.json)
{
"environment": "bullish",
"description": "优化的牛市参数配置",
"overrides": {
"position_management": {
"position_levels": {
"large": {
"min_pct": 0.08,
"max_pct": 0.12
}
},
"risk_adjustment": {
"kelly_fraction": 0.35
}
},
"risk_management": {
"three_layer_stop_loss": {
"fixed_stop_pct": 0.03,
"trailing_stop_pct": 0.02
},
"drawdown_protection": {
"max_drawdown_pct": 0.20
}
},
"signal_system": {
"entry_signals": {
"volume_threshold": 1.3,
"strength_min_score": 0.5
}
}
}
}熊市配置 (config_bearish.json)
{
"environment": "bearish",
"description": "保守的熊市参数配置",
"overrides": {
"position_management": {
"position_levels": {
"large": {
"min_pct": 0.04,
"max_pct": 0.06
}
},
"risk_adjustment": {
"kelly_fraction": 0.15
}
},
"risk_management": {
"three_layer_stop_loss": {
"fixed_stop_pct": 0.015,
"trailing_stop_pct": 0.01
},
"drawdown_protection": {
"max_drawdown_pct": 0.10
}
},
"signal_system": {
"entry_signals": {
"volume_threshold": 2.0,
"strength_min_score": 0.7
}
}
}
}震荡市配置 (config_sideways.json)
{
"environment": "sideways",
"description": "适应震荡市的参数配置",
"overrides": {
"position_management": {
"position_levels": {
"medium": {
"min_pct": 0.025,
"max_pct": 0.04
}
}
},
"signal_system": {
"entry_signals": {
"volume_threshold": 1.8,
"trend_alignment_required": false
},
"exit_signals": {
"profit_target_pct": 0.015
}
},
"risk_management": {
"three_layer_stop_loss": {
"fixed_stop_pct": 0.015
}
}
}
}配置验证脚本 (config_validator.py)
import json
import jsonschema
from typing import Dict, Any, List
from pathlib import Path
class ConfigValidator:
"""配置文件验证器"""
def __init__(self, schema_path: str):
self.schema = self.load_schema(schema_path)
def load_schema(self, schema_path: str) -> Dict[str, Any]:
"""加载JSON Schema"""
with open(schema_path, 'r') as f:
return json.load(f)
def validate_config(self, config_path: str) -> Dict[str, Any]:
"""验证配置文件"""
try:
with open(config_path, 'r') as f:
config = json.load(f)
# JSON Schema验证
jsonschema.validate(instance=config, schema=self.schema)
# 业务逻辑验证
validation_result = self.validate_business_logic(config)
return {
'valid': validation_result['valid'],
'errors': validation_result['errors'],
'warnings': validation_result['warnings']
}
except Exception as e:
return {
'valid': False,
'errors': [f"配置文件加载失败: {str(e)}"],
'warnings': []
}
def validate_business_logic(self, config: Dict[str, Any]) -> Dict[str, Any]:
"""验证业务逻辑"""
errors = []
warnings = []
# 检查参数范围
strategy_params = config.get('strategy_params', {})
# 仓位管理验证
position_mgmt = strategy_params.get('position_management', {})
self._validate_position_levels(position_mgmt, errors, warnings)
# 风险管理验证
risk_mgmt = strategy_params.get('risk_management', {})
self._validate_risk_parameters(risk_mgmt, errors, warnings)
# 信号系统验证
signal_system = strategy_params.get('signal_system', {})
self._validate_signal_weights(signal_system, errors, warnings)
return {
'valid': len(errors) == 0,
'errors': errors,
'warnings': warnings
}
def _validate_position_levels(self, position_mgmt: Dict[str, Any],
errors: List[str], warnings: List[str]):
"""验证仓位级别配置"""
levels = position_mgmt.get('position_levels', {})
for level_name, level_config in levels.items():
min_pct = level_config.get('min_pct', 0)
max_pct = level_config.get('max_pct', 0)
if min_pct >= max_pct:
errors.append(f"仓位级别 {level_name}: min_pct 必须小于 max_pct")
if max_pct > 0.15:
warnings.append(f"仓位级别 {level_name}: max_pct {max_pct} 可能过高")配置文件管理工具
配置合并工具 (config_merger.py)
class ConfigMerger:
"""配置文件合并工具"""
@staticmethod
def merge_configs(base_config: Dict[str, Any],
override_config: Dict[str, Any]) -> Dict[str, Any]:
"""深度合并配置文件"""
merged = base_config.copy()
for key, value in override_config.items():
if key in merged and isinstance(merged[key], dict) and isinstance(value, dict):
merged[key] = ConfigMerger.merge_configs(merged[key], value)
else:
merged[key] = value
return merged
@staticmethod
def apply_environment_preset(base_config_path: str,
preset_path: str) -> Dict[str, Any]:
"""应用环境预设配置"""
with open(base_config_path, 'r') as f:
base_config = json.load(f)
with open(preset_path, 'r') as f:
preset_config = json.load(f)
overrides = preset_config.get('overrides', {})
return ConfigMerger.merge_configs(base_config, overrides)验收标准
功能测试
-
配置文件完整性
- 主配置文件包含所有必需参数
- 策略参数配置覆盖所有模块
- 环境预设配置正确覆盖基础参数
- 优化范围定义合理
-
配置验证
- 配置验证器正确识别无效配置
- 业务逻辑验证捕获参数冲突
- JSON Schema验证结构正确性
-
配置管理
- 配置合并工具正确处理嵌套结构
- 环境预设正确应用到基础配置
- 参数优先级处理正确
兼容性测试
- Freqtrade兼容性
- 配置文件符合Freqtrade规范
- 策略能正确读取所有参数
- 交易所配置格式正确
实现计划
阶段1:基础配置文件 (1小时)
- 创建主配置文件模板
- 定义策略参数结构
- 设置基础交易参数
阶段2:环境预设配置 (0.5小时)
- 创建牛市配置预设
- 创建熊市配置预设
- 创建震荡市配置预设
阶段3:配置管理工具 (1小时)
- 实现配置验证器
- 创建配置合并工具
- 添加参数范围检查
阶段4:文档和示例 (0.5小时)
- 编写配置文件使用说明
- 提供参数调优指南
- 创建配置示例
依赖关系
- 前置依赖: 无(可独立开发)
- 并行执行: 可与其他任务并行进行
- 后续集成: 所有其他任务都将使用这些配置
风险与缓解
技术风险
-
配置格式兼容性
- 风险:配置格式与Freqtrade版本不兼容
- 缓解:参考最新官方文档,添加版本检查
-
参数范围设定
- 风险:参数范围过于宽泛或保守
- 缓解:基于历史回测数据设定合理范围
业务风险
- 默认参数不当
- 风险:默认配置导致策略表现不佳
- 缓解:基于backtesting选择经过验证的默认值
成功指标
- 配置完整性 - 覆盖所有策略模块参数
- 验证准确性 - 配置验证器准确率 > 95%
- 易用性 - 参数调整无需修改代码
- 灵活性 - 支持多种市场环境快速切换
- 兼容性 - 与Freqtrade完全兼容
交付物
-
配置文件
- config_strategy21.json (主配置)
- strategy21_params.json (策略参数)
- config_bullish.json (牛市预设)
- config_bearish.json (熊市预设)
- config_sideways.json (震荡市预设)
-
管理工具
- config_validator.py (配置验证器)
- config_merger.py (配置合并工具)
- config_schema.json (JSON Schema定义)
-
文档
- 配置文件使用指南
- 参数含义详细说明
- 环境预设使用说明
- 故障排除指南
Metadata
Metadata
Assignees
Labels
No labels