trae优化交易

This commit is contained in:
薇薇安 2026-02-13 08:11:45 +08:00
parent 73f148a120
commit 8154508c82
6 changed files with 183 additions and 1959 deletions

View File

@ -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%)。配合止损距离计算仓位,风险可控。"},
]

View File

@ -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.5ATR
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.5ATR
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.5ATR
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.5ATR
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.5ATR
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.5ATR
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 24x
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.5ATR
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

View File

@ -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
View 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}")

View File

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