96 lines
3.3 KiB
Python
96 lines
3.3 KiB
Python
#!/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()
|