trae优化交易
This commit is contained in:
parent
73f148a120
commit
8154508c82
|
|
@ -42,6 +42,10 @@ DEFAULTS_TO_SYNC = [
|
|||
"description": "大盘共振阈值(比例,如 -0.005 表示 -0.5%)。"},
|
||||
{"config_key": "POSITION_SCALE_FACTOR", "config_value": "1.0", "config_type": "number", "category": "risk",
|
||||
"description": "仓位放大系数:1.0=正常,1.2=+20%,上限2.0。盈利时适度调高可扩大收益。"},
|
||||
{"config_key": "USE_FIXED_RISK_SIZING", "config_value": "true", "config_type": "boolean", "category": "risk",
|
||||
"description": "是否启用固定风险仓位计算(推荐)。若启用,则忽略 MAX_POSITION_PERCENT,改用 FIXED_RISK_PERCENT 计算仓位。"},
|
||||
{"config_key": "FIXED_RISK_PERCENT", "config_value": "0.025", "config_type": "number", "category": "risk",
|
||||
"description": "每笔交易风险占总账户的百分比(如 0.025=2.5%)。配合止损距离计算仓位,风险可控。"},
|
||||
]
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -233,13 +233,15 @@ const GlobalConfig = () => {
|
|||
MIN_POSITION_PERCENT: 0.0,
|
||||
MIN_SIGNAL_STRENGTH: 8,
|
||||
USE_TRAILING_STOP: false,
|
||||
ATR_STOP_LOSS_MULTIPLIER: 2.5, // 放宽止损至2.5倍ATR,提升胜率
|
||||
ATR_STOP_LOSS_MULTIPLIER: 2.5,
|
||||
ATR_TAKE_PROFIT_MULTIPLIER: 1.5,
|
||||
RISK_REWARD_RATIO: 1.5, // 配合止盈倍数
|
||||
RISK_REWARD_RATIO: 1.5,
|
||||
TAKE_PROFIT_PERCENT: 25.0,
|
||||
MIN_HOLD_TIME_SEC: 1800,
|
||||
SMART_ENTRY_ENABLED: false,
|
||||
USE_DYNAMIC_ATR_MULTIPLIER: false, // 关闭动态调整,使用固定2.5倍
|
||||
USE_DYNAMIC_ATR_MULTIPLIER: false,
|
||||
USE_FIXED_RISK_SIZING: true,
|
||||
FIXED_RISK_PERCENT: 0.03, // 3% 风险
|
||||
},
|
||||
},
|
||||
fill: {
|
||||
|
|
@ -260,12 +262,14 @@ const GlobalConfig = () => {
|
|||
ENTRY_MAX_DRIFT_PCT_TRENDING: 0.3,
|
||||
ENTRY_MAX_DRIFT_PCT_RANGING: 0.15,
|
||||
USE_TRAILING_STOP: false,
|
||||
ATR_STOP_LOSS_MULTIPLIER: 2.5, // 放宽止损至2.5倍ATR,提升胜率
|
||||
ATR_STOP_LOSS_MULTIPLIER: 2.5,
|
||||
ATR_TAKE_PROFIT_MULTIPLIER: 1.5,
|
||||
RISK_REWARD_RATIO: 1.5, // 配合止盈倍数
|
||||
RISK_REWARD_RATIO: 1.5,
|
||||
TAKE_PROFIT_PERCENT: 25.0,
|
||||
MIN_HOLD_TIME_SEC: 1800,
|
||||
USE_DYNAMIC_ATR_MULTIPLIER: false, // 关闭动态调整,使用固定2.5倍
|
||||
USE_DYNAMIC_ATR_MULTIPLIER: false,
|
||||
USE_FIXED_RISK_SIZING: true,
|
||||
FIXED_RISK_PERCENT: 0.025, // 2.5% 风险
|
||||
},
|
||||
},
|
||||
strict: {
|
||||
|
|
@ -283,12 +287,14 @@ const GlobalConfig = () => {
|
|||
LIMIT_ORDER_OFFSET_PCT: 0.1,
|
||||
ENTRY_CONFIRM_TIMEOUT_SEC: 180,
|
||||
USE_TRAILING_STOP: false,
|
||||
ATR_STOP_LOSS_MULTIPLIER: 2.5, // 放宽止损至2.5倍ATR,提升胜率
|
||||
ATR_STOP_LOSS_MULTIPLIER: 2.5,
|
||||
ATR_TAKE_PROFIT_MULTIPLIER: 1.5,
|
||||
RISK_REWARD_RATIO: 1.5, // 配合止盈倍数
|
||||
RISK_REWARD_RATIO: 1.5,
|
||||
TAKE_PROFIT_PERCENT: 25.0,
|
||||
MIN_HOLD_TIME_SEC: 1800,
|
||||
USE_DYNAMIC_ATR_MULTIPLIER: false, // 关闭动态调整,使用固定2.5倍
|
||||
USE_DYNAMIC_ATR_MULTIPLIER: false,
|
||||
USE_FIXED_RISK_SIZING: true,
|
||||
FIXED_RISK_PERCENT: 0.03, // 3% 风险
|
||||
},
|
||||
},
|
||||
steady: {
|
||||
|
|
@ -309,12 +315,14 @@ const GlobalConfig = () => {
|
|||
ENTRY_MAX_DRIFT_PCT_TRENDING: 0.4,
|
||||
ENTRY_MAX_DRIFT_PCT_RANGING: 0.2,
|
||||
USE_TRAILING_STOP: false,
|
||||
ATR_STOP_LOSS_MULTIPLIER: 2.5, // 放宽止损至2.5倍ATR,提升胜率
|
||||
ATR_STOP_LOSS_MULTIPLIER: 2.5,
|
||||
ATR_TAKE_PROFIT_MULTIPLIER: 1.5,
|
||||
RISK_REWARD_RATIO: 1.5, // 配合止盈倍数
|
||||
RISK_REWARD_RATIO: 1.5,
|
||||
TAKE_PROFIT_PERCENT: 25.0,
|
||||
MIN_HOLD_TIME_SEC: 1800,
|
||||
USE_DYNAMIC_ATR_MULTIPLIER: false, // 关闭动态调整,使用固定2.5倍
|
||||
USE_DYNAMIC_ATR_MULTIPLIER: false,
|
||||
USE_FIXED_RISK_SIZING: true,
|
||||
FIXED_RISK_PERCENT: 0.025, // 2.5% 风险
|
||||
},
|
||||
},
|
||||
conservative: {
|
||||
|
|
@ -334,11 +342,13 @@ const GlobalConfig = () => {
|
|||
MIN_STOP_LOSS_PRICE_PCT: 2.0,
|
||||
MIN_TAKE_PROFIT_PRICE_PCT: 3.0,
|
||||
USE_TRAILING_STOP: false,
|
||||
ATR_STOP_LOSS_MULTIPLIER: 2.5, // 放宽止损至2.5倍ATR,提升胜率
|
||||
ATR_STOP_LOSS_MULTIPLIER: 2.5,
|
||||
ATR_TAKE_PROFIT_MULTIPLIER: 1.5,
|
||||
RISK_REWARD_RATIO: 1.5, // 配合止盈倍数
|
||||
RISK_REWARD_RATIO: 1.5,
|
||||
MIN_HOLD_TIME_SEC: 1800,
|
||||
USE_DYNAMIC_ATR_MULTIPLIER: false, // 关闭动态调整,使用固定2.5倍
|
||||
USE_DYNAMIC_ATR_MULTIPLIER: false,
|
||||
USE_FIXED_RISK_SIZING: true,
|
||||
FIXED_RISK_PERCENT: 0.015, // 1.5% 风险
|
||||
}
|
||||
},
|
||||
balanced: {
|
||||
|
|
@ -356,41 +366,43 @@ const GlobalConfig = () => {
|
|||
MIN_STOP_LOSS_PRICE_PCT: 2.0,
|
||||
MIN_TAKE_PROFIT_PRICE_PCT: 3.0,
|
||||
USE_TRAILING_STOP: false,
|
||||
ATR_STOP_LOSS_MULTIPLIER: 2.5, // 放宽止损至2.5倍ATR,提升胜率
|
||||
ATR_STOP_LOSS_MULTIPLIER: 2.5,
|
||||
ATR_TAKE_PROFIT_MULTIPLIER: 1.5,
|
||||
RISK_REWARD_RATIO: 1.5, // 配合止盈倍数
|
||||
RISK_REWARD_RATIO: 1.5,
|
||||
MIN_HOLD_TIME_SEC: 1800,
|
||||
USE_DYNAMIC_ATR_MULTIPLIER: false, // 关闭动态调整,使用固定2.5倍
|
||||
USE_DYNAMIC_ATR_MULTIPLIER: false,
|
||||
USE_FIXED_RISK_SIZING: true,
|
||||
FIXED_RISK_PERCENT: 0.025, // 2.5% 风险
|
||||
}
|
||||
},
|
||||
altcoin: {
|
||||
name: '山寨币策略(当前推荐)',
|
||||
desc: '与 2026-02-12 策略一致:4H 中性不自动交易、做多 RSI≤65、第一目标止盈 20%、止损 3×ATR、盈亏比 3:1、同品种连亏冷却。',
|
||||
name: '山寨币策略(推荐)',
|
||||
desc: '2026-02-13 优化:针对高胜率低盈亏比进行调整。提高单笔风险至5%,收紧止损至2.5倍ATR,优先保证盈利积累。',
|
||||
configs: {
|
||||
// 风险与止盈止损(与当前全局默认一致)
|
||||
ATR_STOP_LOSS_MULTIPLIER: 3.0, // 3×ATR 减少噪音止损
|
||||
STOP_LOSS_PERCENT: 0.12,
|
||||
RISK_REWARD_RATIO: 3.0, // 盈亏比 3:1
|
||||
TAKE_PROFIT_1_PERCENT: 0.2, // 第一目标止盈 20%
|
||||
TAKE_PROFIT_PERCENT: 0.30, // 第二目标 30%
|
||||
MIN_RR_FOR_TP1: 1.5, // 第一目标至少 1.5 倍止损距离
|
||||
// 风险与止盈止损
|
||||
ATR_STOP_LOSS_MULTIPLIER: 2.5, // 3.0 -> 2.5 收紧止损,允许更大仓位
|
||||
STOP_LOSS_PERCENT: 0.10, // 12% -> 10%
|
||||
RISK_REWARD_RATIO: 2.0, // 3.0 -> 2.0 稍微降低盈亏比要求,更容易止盈
|
||||
TAKE_PROFIT_1_PERCENT: 0.2,
|
||||
TAKE_PROFIT_PERCENT: 0.30,
|
||||
MIN_RR_FOR_TP1: 1.2, // 降低TP1门槛,确保更早落袋为安
|
||||
MIN_HOLD_TIME_SEC: 1800,
|
||||
USE_FIXED_RISK_SIZING: true,
|
||||
FIXED_RISK_PERCENT: 0.02, // 每笔风险 2%
|
||||
FIXED_RISK_PERCENT: 0.05, // 0.02 -> 0.05 提高每笔风险至5%(针对小资金账户)
|
||||
USE_DYNAMIC_ATR_MULTIPLIER: false,
|
||||
|
||||
USE_TRAILING_STOP: true,
|
||||
TRAILING_STOP_ACTIVATION: 0.20,
|
||||
TRAILING_STOP_PROTECT: 0.10,
|
||||
TRAILING_STOP_ACTIVATION: 0.15, // 20% -> 15% 更早激活移动止损
|
||||
TRAILING_STOP_PROTECT: 0.05, // 10% -> 5% 更紧的保护
|
||||
|
||||
MAX_POSITION_PERCENT: 0.12, // 单笔最大 12% 可用资金,加大单笔盈利空间
|
||||
MAX_TOTAL_POSITION_PERCENT: 0.45,
|
||||
MAX_DAILY_ENTRIES: 8,
|
||||
MAX_OPEN_POSITIONS: 4,
|
||||
MAX_POSITION_PERCENT: 0.20, // 0.12 -> 0.20 允许单笔最大20%仓位
|
||||
MAX_TOTAL_POSITION_PERCENT: 0.80, // 允许总仓位更高
|
||||
MAX_DAILY_ENTRIES: 10,
|
||||
MAX_OPEN_POSITIONS: 5,
|
||||
LEVERAGE: 10,
|
||||
MAX_LEVERAGE: 20, // 动态杠杆上限 20,配合单笔仓位提高收益
|
||||
MIN_LEVERAGE: 8, // 动态杠杆下限 8,与之前盈利阶段一致,避免被压到 2–4x
|
||||
MAX_LEVERAGE_SMALL_CAP: 8, // 高波动币也允许 8x,与之前一致
|
||||
MAX_LEVERAGE: 20,
|
||||
MIN_LEVERAGE: 8,
|
||||
MAX_LEVERAGE_SMALL_CAP: 8,
|
||||
USE_DYNAMIC_LEVERAGE: true,
|
||||
|
||||
MIN_VOLUME_24H: 10000000,
|
||||
|
|
@ -407,8 +419,8 @@ const GlobalConfig = () => {
|
|||
CONFIRM_INTERVAL: '4h',
|
||||
|
||||
AUTO_TRADE_ONLY_TRENDING: true,
|
||||
AUTO_TRADE_ALLOW_4H_NEUTRAL: false, // 4H 中性不自动交易,提升质量
|
||||
MAX_RSI_FOR_LONG: 65, // 做多不追高
|
||||
AUTO_TRADE_ALLOW_4H_NEUTRAL: false,
|
||||
MAX_RSI_FOR_LONG: 65,
|
||||
MIN_RSI_FOR_SHORT: 30,
|
||||
MAX_CHANGE_PERCENT_FOR_LONG: 25,
|
||||
MAX_CHANGE_PERCENT_FOR_SHORT: 10,
|
||||
|
|
@ -423,6 +435,39 @@ const GlobalConfig = () => {
|
|||
MAX_TREND_MOVE_BEFORE_ENTRY: 0.05,
|
||||
},
|
||||
},
|
||||
high_growth: {
|
||||
name: '高收益激进策略',
|
||||
desc: '针对小资金快速翻仓:8%风险/单,2倍ATR紧止损,盈亏比1.5:1快进快出。注意:回撤风险较高。',
|
||||
configs: {
|
||||
ATR_STOP_LOSS_MULTIPLIER: 2.0,
|
||||
STOP_LOSS_PERCENT: 0.08,
|
||||
RISK_REWARD_RATIO: 1.5,
|
||||
TAKE_PROFIT_1_PERCENT: 0.15,
|
||||
TAKE_PROFIT_PERCENT: 0.25,
|
||||
MIN_RR_FOR_TP1: 1.0,
|
||||
MIN_HOLD_TIME_SEC: 900,
|
||||
USE_FIXED_RISK_SIZING: true,
|
||||
FIXED_RISK_PERCENT: 0.08, // 8% 风险
|
||||
|
||||
USE_TRAILING_STOP: true,
|
||||
TRAILING_STOP_ACTIVATION: 0.10,
|
||||
TRAILING_STOP_PROTECT: 0.03,
|
||||
|
||||
MAX_POSITION_PERCENT: 0.30,
|
||||
MAX_TOTAL_POSITION_PERCENT: 0.90,
|
||||
LEVERAGE: 12,
|
||||
MAX_LEVERAGE: 25,
|
||||
MIN_LEVERAGE: 10,
|
||||
USE_DYNAMIC_LEVERAGE: true,
|
||||
|
||||
MIN_VOLUME_24H: 5000000,
|
||||
MIN_VOLATILITY: 0.025,
|
||||
TOP_N_SYMBOLS: 15,
|
||||
|
||||
AUTO_TRADE_ONLY_TRENDING: false,
|
||||
AUTO_TRADE_ALLOW_4H_NEUTRAL: true,
|
||||
}
|
||||
},
|
||||
more_opportunities: {
|
||||
name: '增加机会(放宽过滤)',
|
||||
desc: '放宽过滤条件以增加下单机会:允许 4H 中性、大盘共振阈值放宽到 -1%、做多 RSI≤70、做空 RSI≥25。适合想要更多交易机会时使用。',
|
||||
|
|
@ -540,11 +585,13 @@ const GlobalConfig = () => {
|
|||
MIN_STOP_LOSS_PRICE_PCT: 1.5,
|
||||
MIN_TAKE_PROFIT_PRICE_PCT: 2.0,
|
||||
USE_TRAILING_STOP: false,
|
||||
ATR_STOP_LOSS_MULTIPLIER: 2.5, // 放宽止损至2.5倍ATR,提升胜率
|
||||
ATR_STOP_LOSS_MULTIPLIER: 2.5,
|
||||
ATR_TAKE_PROFIT_MULTIPLIER: 1.5,
|
||||
RISK_REWARD_RATIO: 1.5, // 配合止盈倍数
|
||||
RISK_REWARD_RATIO: 1.5,
|
||||
MIN_HOLD_TIME_SEC: 1800,
|
||||
USE_DYNAMIC_ATR_MULTIPLIER: false, // 关闭动态调整,使用固定2.5倍
|
||||
USE_DYNAMIC_ATR_MULTIPLIER: false,
|
||||
USE_FIXED_RISK_SIZING: true,
|
||||
FIXED_RISK_PERCENT: 0.04, // 4% 风险
|
||||
}
|
||||
},
|
||||
script_v1: {
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -8,8 +8,9 @@ from datetime import datetime, timedelta
|
|||
from decimal import Decimal
|
||||
from typing import List, Dict, Any, Optional
|
||||
|
||||
# Add project root to path
|
||||
# Add project root and backend to path
|
||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
sys.path.append(os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'backend'))
|
||||
|
||||
from backend.database.connection import db
|
||||
from backend.database.models import Trade, Account
|
||||
|
|
@ -173,13 +174,30 @@ async def backfill_commissions(client, account_id):
|
|||
try:
|
||||
# Fetch user trades (fills) after entry time
|
||||
start_time_ms = int(entry_time * 1000)
|
||||
fills = await client.client.futures_account_trades(
|
||||
symbol=symbol,
|
||||
startTime=start_time_ms,
|
||||
limit=100
|
||||
)
|
||||
|
||||
if not fills:
|
||||
# Add retry logic for get_my_trades
|
||||
max_retries = 3
|
||||
fills = None
|
||||
for attempt in range(max_retries):
|
||||
try:
|
||||
# Use asyncio.wait_for to enforce timeout
|
||||
fills = await asyncio.wait_for(
|
||||
client.client.futures_account_trades(
|
||||
symbol=symbol,
|
||||
startTime=start_time_ms,
|
||||
limit=100
|
||||
),
|
||||
timeout=10.0
|
||||
)
|
||||
break
|
||||
except Exception as e:
|
||||
if attempt == max_retries - 1:
|
||||
logger.error(f" ❌ Failed to fetch fills for {symbol} after {max_retries} attempts: {e}")
|
||||
break
|
||||
logger.warning(f" ⚠️ Error fetching fills for {symbol} (Attempt {attempt+1}/{max_retries}): {e}, retrying...")
|
||||
await asyncio.sleep(2)
|
||||
|
||||
if fills is None:
|
||||
continue
|
||||
|
||||
# Filter for closing trades (approximate logic: matches trade direction)
|
||||
|
|
|
|||
42
scripts/inspect_config.py
Normal file
42
scripts/inspect_config.py
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
|
||||
import sys
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
# Add backend to path
|
||||
sys.path.append('/Users/vivian/work/python/auto_trade_sys/backend')
|
||||
|
||||
try:
|
||||
from database.connection import db
|
||||
|
||||
print("Connecting to database...")
|
||||
with db.get_connection() as conn:
|
||||
with conn.cursor() as cursor:
|
||||
print("Fetching trading config...")
|
||||
cursor.execute("SELECT `config_key`, `config_value` FROM trading_config")
|
||||
results = cursor.fetchall()
|
||||
print("\n=== Current Trading Config ===")
|
||||
for row in results:
|
||||
# Handle DictCursor (returns dict) or normal cursor (returns tuple)
|
||||
if isinstance(row, dict):
|
||||
print(f"{row.get('config_key')}: {row.get('config_value')}")
|
||||
else:
|
||||
print(f"{row[0]}: {row[1]}")
|
||||
print("==============================\n")
|
||||
|
||||
print("Fetching global strategy config...")
|
||||
try:
|
||||
cursor.execute("SELECT `config_key`, `config_value` FROM global_strategy_config")
|
||||
results = cursor.fetchall()
|
||||
print("\n=== Global Strategy Config ===")
|
||||
for row in results:
|
||||
if isinstance(row, dict):
|
||||
print(f"{row.get('config_key')}: {row.get('config_value')}")
|
||||
else:
|
||||
print(f"{row[0]}: {row[1]}")
|
||||
print("==============================\n")
|
||||
except Exception as e:
|
||||
print(f"Global strategy config fetch failed (might be empty or table missing): {e}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error: {e}")
|
||||
|
|
@ -548,15 +548,30 @@ class RiskManager:
|
|||
|
||||
# 检查是否超过最大仓位限制
|
||||
max_position_percent = config.TRADING_CONFIG['MAX_POSITION_PERCENT']
|
||||
max_margin_value = available_balance * max_position_percent
|
||||
|
||||
if margin_value > max_margin_value:
|
||||
# 如果超过最大仓位,使用最大仓位
|
||||
logger.warning(f" ⚠️ 固定风险计算的保证金 {margin_value:.4f} USDT > 最大限制 {max_margin_value:.2f} USDT")
|
||||
logger.info(f" ✓ 调整为最大仓位限制: {max_margin_value:.2f} USDT")
|
||||
margin_value = max_margin_value
|
||||
notional_value = margin_value * actual_leverage
|
||||
quantity = notional_value / entry_price if entry_price > 0 else None
|
||||
# ⚠️ 如果启用了固定风险模型,且计算出的仓位合理(风险可控),则放宽 MAX_POSITION_PERCENT 限制
|
||||
# 因为固定风险模型的核心是控制亏损额,而不是仓位大小
|
||||
if use_fixed_risk:
|
||||
# 在固定风险模式下,允许使用高达 95% 的可用余额作为保证金(只要风险金额符合设定)
|
||||
max_margin_value = available_balance * 0.95
|
||||
if margin_value > max_margin_value:
|
||||
logger.warning(f" ⚠️ 固定风险计算的保证金 {margin_value:.4f} USDT 超过账户可用余额 95%")
|
||||
logger.info(f" ✓ 调整为最大可用余额限制: {max_margin_value:.2f} USDT")
|
||||
margin_value = max_margin_value
|
||||
notional_value = margin_value * actual_leverage
|
||||
quantity = notional_value / entry_price if entry_price > 0 else None
|
||||
else:
|
||||
if margin_value > (available_balance * max_position_percent):
|
||||
logger.info(f" ℹ️ 固定风险模式:突破单仓位限制 ({max_position_percent*100:.1f}%) -> 使用计算值 {margin_value/available_balance*100:.1f}%")
|
||||
else:
|
||||
max_margin_value = available_balance * max_position_percent
|
||||
if margin_value > max_margin_value:
|
||||
# 如果超过最大仓位,使用最大仓位
|
||||
logger.warning(f" ⚠️ 固定风险计算的保证金 {margin_value:.4f} USDT > 最大限制 {max_margin_value:.2f} USDT")
|
||||
logger.info(f" ✓ 调整为最大仓位限制: {max_margin_value:.2f} USDT")
|
||||
margin_value = max_margin_value
|
||||
notional_value = margin_value * actual_leverage
|
||||
quantity = notional_value / entry_price if entry_price > 0 else None
|
||||
else:
|
||||
logger.warning(f" ⚠️ 止损距离无效 (stop_distance={stop_distance:.4f}),将使用传统方法计算仓位")
|
||||
else:
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user