xiaowei-system/scripts/stock_dual_scan.py

96 lines
3.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
多空 + 全球市场统一扫描执行 — 2026-08-02
============================================
每天收盘后扫描两个新系统,有信号自动执行:
1. 做空系统stock_short.py弱势行业死叉→开空 / 金叉→平空
2. 全球市场stock_global.py港股/美股 金叉→建仓 / 死叉→卖出buyhold 忽略)
用法:
python3 stock_dual_scan.py # 扫描 + 自动执行(写账户)
python3 stock_dual_scan.py --dry-run # 只扫描预览,不落盘
python3 stock_dual_scan.py --report # 汇总报告
"""
import json, sys
from datetime import datetime
from pathlib import Path
HOME = Path.home()
sys.path.insert(0, str(HOME / ".hermes" / "scripts"))
import stock_short as ss
import stock_global as sg
def scan_short(dry_run):
"""做空系统扫描 + 执行"""
lines = []
signals = ss.scan_signals()
for s in signals:
ind = s["industry"]
sig = s["signal"]
if sig == "DATA_ERR":
lines.append(f"{ind}: 数据获取失败")
continue
if sig in ("SHORT_OPEN", "SHORT_CLOSE"):
action, detail = ss.execute_short({"industry": ind, "signal": sig, "close": s["close"]}, dry_run)
mark = "🔴开空" if sig == "SHORT_OPEN" else "🟢平空"
lines.append(f" {mark} {ind}({s.get('name','')}): {detail}")
else:
lines.append(f"{ind}: 持有(无信号)")
return lines
def scan_global(dry_run):
"""全球市场扫描 + 执行"""
lines = []
signals = sg.scan_signals()
for s in signals:
key = s["key"]
if s["signal"] == "DATA_ERR":
lines.append(f"{s['market']}·{s['name']}: 数据获取失败")
continue
if s["signal"] in ("BUY", "SELL"):
action, detail = sg.execute_signal({"market": s["market"], "code": s["code"],
"signal": s["signal"], "close": s["close"]}, dry_run)
mark = "🟢金叉买入" if s["signal"] == "BUY" else "🔴死叉卖出"
lines.append(f" {mark} {s['market']}·{s['name']}: {detail}")
else:
mark = "🟢持仓中" if s["dev"] > 0 else "⚪观望"
lines.append(f" {mark} {s['market']}·{s['name']}: 偏离{s['dev']:+.2f}%")
return lines
def main():
args = sys.argv[1:]
dry_run = "--dry-run" in args
if "--report" in args:
# 汇总报告模式
print(f"📊 多空+全球日报 {datetime.now().strftime('%Y-%m-%d')}")
print("\n【做空账户】")
ss.cmd_report()
print("\n【全球账户】")
sg.cmd_report()
return
mode = "预览" if dry_run else "执行"
print(f"🔄 多空+全球扫描({mode}{datetime.now().strftime('%Y-%m-%d %H:%M')}")
print("=" * 46)
print("\n🔴 做空系统(弱势行业死叉→开空)")
short_lines = scan_short(dry_run)
for l in short_lines:
print(l)
print("\n🌐 全球市场(港股/美股 金叉→建仓)")
global_lines = scan_global(dry_run)
for l in global_lines:
print(l)
print("\n" + "=" * 46)
if dry_run:
print("(预览模式,未落盘)")
if __name__ == "__main__":
main()