This commit is contained in:
薇薇安 2026-05-05 22:32:53 +08:00
parent e46fa4b117
commit 5b0aac4e9d
4 changed files with 142 additions and 3 deletions

View File

@ -0,0 +1,23 @@
[
{
"key": "MIN_CHANGE_PERCENT",
"value": 1.0,
"type": "number",
"category": "scan",
"description": "稳妥增效一档24h涨跌幅绝对值门槛从2%降至1%,主流币更易进入候选池"
},
{
"key": "MIN_SIGNAL_STRENGTH",
"value": 7,
"type": "number",
"category": "strategy",
"description": "稳妥增效一档:最低信号强度 8→7略增机会"
},
{
"key": "ENTRY_SYMBOL_COOLDOWN_SEC",
"value": 1200,
"type": "number",
"category": "strategy",
"description": "稳妥增效一档:同币种开仓冷却 1800s→1200s20分钟"
}
]

View File

@ -0,0 +1,89 @@
#!/usr/bin/env python3
"""
仅应用 JSON 补丁中的配置项不与 DEFAULT_RECOMMENDED 合并
用于小幅改库避免误把 apply_recommended_config 内置批量默认值重新刷一遍
JSON 格式与 apply_recommended_config.py --from 相同数组或对象
"""
from __future__ import annotations
import argparse
import sys
from pathlib import Path
PROJECT_ROOT = Path(__file__).resolve().parent.parent
SCRIPTS_DIR = PROJECT_ROOT / "scripts"
BACKEND_DIR = PROJECT_ROOT / "backend"
for p in (SCRIPTS_DIR, BACKEND_DIR, PROJECT_ROOT):
if str(p) not in sys.path:
sys.path.insert(0, str(p))
from apply_recommended_config import infer_type, load_external_json
def main() -> None:
parser = argparse.ArgumentParser(description="仅应用补丁 JSON 中的全局策略配置(不合并内置默认)")
parser.add_argument("--from", dest="from_path", required=True, help="补丁 JSON 路径")
parser.add_argument("--dry-run", action="store_true", help="只打印,不落库")
parser.add_argument("--updated-by", default="apply_config_patch_only", help="写入 updated_by")
args = parser.parse_args()
from_path = Path(args.from_path)
if not from_path.is_absolute():
from_path = PROJECT_ROOT / from_path
if not from_path.is_file():
raise FileNotFoundError(f"未找到配置文件: {from_path}")
patch = load_external_json(from_path)
if not patch:
print("补丁为空,退出")
return
print(f"将应用 {len(patch)} 个配置项仅补丁dry_run={args.dry_run}")
for key in sorted(patch.keys()):
meta = patch[key]
print(f" - {key} = {meta.get('value')} [{meta.get('type')}/{meta.get('category')}]")
if args.dry_run:
return
from database.models import GlobalStrategyConfig
mgr = None
try:
import config_manager
if hasattr(config_manager, "GlobalStrategyConfigManager"):
mgr = config_manager.GlobalStrategyConfigManager()
except Exception:
mgr = None
ok, fail = 0, 0
for key, meta in patch.items():
try:
GlobalStrategyConfig.set(
key,
meta.get("value"),
meta.get("type") or infer_type(meta.get("value")),
meta.get("category") or "strategy",
meta.get("description"),
updated_by=args.updated_by,
)
if mgr is not None:
try:
mgr._set_to_redis(key, meta.get("value"))
mgr._cache[key] = meta.get("value")
except Exception:
pass
ok += 1
except Exception as e:
fail += 1
print(f"[失败] {key}: {e}")
print(f"\n完成:成功 {ok},失败 {fail}")
if fail > 0:
sys.exit(1)
if __name__ == "__main__":
main()

View File

@ -0,0 +1,27 @@
#!/usr/bin/env bash
# 稳妥增效一档:写入 global_strategy_config + Redis 缓存(与前端「保存配置」同路径)
#
# 变更内容(见 config/my_batch_steady_lift_tier1.json
# MIN_CHANGE_PERCENT 2% → 1% 24h 涨跌绝对值门槛)
# MIN_SIGNAL_STRENGTH 8 → 7
# ENTRY_SYMBOL_COOLDOWN_SEC 1800 → 1200
#
# 用法(在项目根目录):
# chmod +x scripts/apply_steady_lift_tier1.sh
# ./scripts/apply_steady_lift_tier1.sh
# ./scripts/apply_steady_lift_tier1.sh --dry-run
#
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$ROOT"
DRY_RUN=()
if [[ "${1:-}" == "--dry-run" ]]; then
DRY_RUN=(--dry-run)
fi
# 使用 apply_config_patch_only只写本 JSON 中的键,不合并 apply_recommended_config 内置批量默认
exec python3 "$ROOT/scripts/apply_config_patch_only.py" \
--from "$ROOT/config/my_batch_steady_lift_tier1.json" \
--updated-by "steady_lift_tier1" \
"${DRY_RUN[@]}"

View File

@ -216,7 +216,7 @@ DEFAULT_TRADING_CONFIG = {
'MAX_TOTAL_POSITION_PERCENT': 0.80, # 总仓位80%(避免满仓,留有余地)
'MIN_POSITION_PERCENT': 0.01, # 最小仓位1%
'MIN_MARGIN_USDT': 2.0, # 最小保证金2美元降低门槛允许高杠杆小资金交易避免被 risk_manager 拦截)
'MIN_CHANGE_PERCENT': 0.5, # 最小价格变动0.5%
'MIN_CHANGE_PERCENT': 1.0, # 最小24h涨跌幅绝对值%与稳妥增效一档对齐缺省略宽于0.5以利主流币入池
'TOP_N_SYMBOLS': 8, # 主流币模式:缩小候选池,提高信号质量
'SCAN_EXTRA_SYMBOLS_FOR_SUPPLEMENT': 20, # 智能补单候选增加
'MAX_SCAN_SYMBOLS': 120, # 主流币模式:减少扫描面,降低噪声与计算负载
@ -267,7 +267,7 @@ DEFAULT_TRADING_CONFIG = {
'MIN_VOLUME_24H': 30000000, # 24小时成交额≥3000万美元过滤垃圾币
'MIN_VOLUME_24H_STRICT': 50000000, # 严格过滤≥5000万美元
'MIN_VOLATILITY': 0.03, # 最小波动率3%,过滤死币
'MIN_SIGNAL_STRENGTH': 8, # 主流币模式:提高信号门槛,减少低质量入场
'MIN_SIGNAL_STRENGTH': 7, # 稳妥增效一档略降门槛以增加机会原为8
# ===== 资金费率过滤(开仓前)=====
'FUNDING_RATE_FILTER_ENABLED': True, # 开仓前检查资金费率,避免在费率极端不利于己方时进场
'MAX_FUNDING_RATE_FOR_LONG': 0.001, # 做多时 lastFundingRate 超过此值则跳过0.1%=多头付费高)
@ -393,7 +393,7 @@ DEFAULT_TRADING_CONFIG = {
# 根治方案:默认关闭。关闭后回归“纯限价单模式”(不追价/不市价兜底/未成交撤单跳过)
'SMART_ENTRY_ENABLED': True, # 开启智能入场,提高成交率
'SMART_ENTRY_STRONG_SIGNAL': 7, # 强信号阈值(与 MIN_SIGNAL_STRENGTH 一致,便于智能入场触发)
'ENTRY_SYMBOL_COOLDOWN_SEC': 1800, # 同一币种冷却30分钟1800秒快速验证模式缩短冷却以增加交易频率
'ENTRY_SYMBOL_COOLDOWN_SEC': 1200, # 稳妥增效一档同一币种冷却20分钟1200秒
# ===== 同一交易对连续亏损过滤(避免连续亏损后继续交易)=====
'SYMBOL_LOSS_COOLDOWN_ENABLED': True, # 是否启用同一交易对连续亏损后的冷却