Skip to content

任务6: 配置文件模板 #7

@realm520

Description

@realm520

概述

为Strategy-21创建完整的配置文件模板,包含所有策略参数、风控设置、技术指标配置等,确保策略的可配置性和灵活性,便于不同市场环境下的参数调优。

目标

  • 创建主配置文件模板(freqtrade配置)
  • 创建策略专用参数配置
  • 提供多种市场环境配置预设
  • 建立配置文件验证机制

技术要求

核心功能

  1. 主配置文件

    • Freqtrade框架配置
    • 交易所连接配置
    • 数据源和时间框架设置
    • 基础交易参数
  2. 策略参数配置

    • VATSM技术指标参数
    • 信号系统配置
    • 仓位管理参数
    • 风控系统设置
  3. 环境预设配置

    • 牛市配置模板
    • 熊市配置模板
    • 震荡市配置模板
    • 保守模式配置

实现细节

主配置文件 (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)

验收标准

功能测试

  1. 配置文件完整性

    • 主配置文件包含所有必需参数
    • 策略参数配置覆盖所有模块
    • 环境预设配置正确覆盖基础参数
    • 优化范围定义合理
  2. 配置验证

    • 配置验证器正确识别无效配置
    • 业务逻辑验证捕获参数冲突
    • JSON Schema验证结构正确性
  3. 配置管理

    • 配置合并工具正确处理嵌套结构
    • 环境预设正确应用到基础配置
    • 参数优先级处理正确

兼容性测试

  1. Freqtrade兼容性
    • 配置文件符合Freqtrade规范
    • 策略能正确读取所有参数
    • 交易所配置格式正确

实现计划

阶段1:基础配置文件 (1小时)

  • 创建主配置文件模板
  • 定义策略参数结构
  • 设置基础交易参数

阶段2:环境预设配置 (0.5小时)

  • 创建牛市配置预设
  • 创建熊市配置预设
  • 创建震荡市配置预设

阶段3:配置管理工具 (1小时)

  • 实现配置验证器
  • 创建配置合并工具
  • 添加参数范围检查

阶段4:文档和示例 (0.5小时)

  • 编写配置文件使用说明
  • 提供参数调优指南
  • 创建配置示例

依赖关系

  • 前置依赖: 无(可独立开发)
  • 并行执行: 可与其他任务并行进行
  • 后续集成: 所有其他任务都将使用这些配置

风险与缓解

技术风险

  1. 配置格式兼容性

    • 风险:配置格式与Freqtrade版本不兼容
    • 缓解:参考最新官方文档,添加版本检查
  2. 参数范围设定

    • 风险:参数范围过于宽泛或保守
    • 缓解:基于历史回测数据设定合理范围

业务风险

  1. 默认参数不当
    • 风险:默认配置导致策略表现不佳
    • 缓解:基于backtesting选择经过验证的默认值

成功指标

  1. 配置完整性 - 覆盖所有策略模块参数
  2. 验证准确性 - 配置验证器准确率 > 95%
  3. 易用性 - 参数调整无需修改代码
  4. 灵活性 - 支持多种市场环境快速切换
  5. 兼容性 - 与Freqtrade完全兼容

交付物

  1. 配置文件

    • config_strategy21.json (主配置)
    • strategy21_params.json (策略参数)
    • config_bullish.json (牛市预设)
    • config_bearish.json (熊市预设)
    • config_sideways.json (震荡市预设)
  2. 管理工具

    • config_validator.py (配置验证器)
    • config_merger.py (配置合并工具)
    • config_schema.json (JSON Schema定义)
  3. 文档

    • 配置文件使用指南
    • 参数含义详细说明
    • 环境预设使用说明
    • 故障排除指南

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions