forked from sngyai/Sequoia-X
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
108 lines (87 loc) · 3.86 KB
/
Copy pathmain.py
File metadata and controls
108 lines (87 loc) · 3.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
"""Sequoia-X V2 主程序入口。
两种运行模式:
python main.py # 日常模式:8进程增量补数据 + 跑策略 + 飞书推送(2~3分钟)
python main.py --backfill # 回填模式:baostock 拉全市场历史K线(首次/补数据用,约12分钟)
"""
import argparse
import sys
from dotenv import load_dotenv
load_dotenv()
from datetime import date
import socket
socket.setdefaulttimeout(10.0)
from sequoia_x.core.config import get_settings
from sequoia_x.core.logger import get_logger
from sequoia_x.data.engine import DataEngine
from sequoia_x.notify.feishu import FeishuNotifier
from sequoia_x.strategy.base import BaseStrategy
from sequoia_x.strategy.high_tight_flag import HighTightFlagStrategy
from sequoia_x.strategy.limit_up_shakeout import LimitUpShakeoutStrategy
from sequoia_x.strategy.ma_volume import MaVolumeStrategy
from sequoia_x.strategy.turtle_trade import TurtleTradeStrategy
from sequoia_x.strategy.uptrend_limit_down import UptrendLimitDownStrategy
from sequoia_x.strategy.rps_breakout import RpsBreakoutStrategy
from sequoia_x.strategy.private_placement import PrivatePlacementStrategy
def main() -> None:
parser = argparse.ArgumentParser(description="Sequoia-X V2 选股系统")
parser.add_argument(
"--backfill",
action="store_true",
help="回填模式:通过 baostock 拉取全市场历史 K 线(约12分钟)",
)
args = parser.parse_args()
try:
# 1. 初始化配置
settings = get_settings()
# 2. 初始化日志
logger = get_logger(__name__)
logger.info("Sequoia-X V2 启动")
# 3. 初始化数据引擎
engine = DataEngine(settings)
if args.backfill:
# ── 回填模式:单线程保守拉历史 K 线,自动多轮重跑 ──
logger.info("进入回填模式...")
all_symbols = engine.get_all_symbols()
engine.backfill(all_symbols)
logger.info("Sequoia-X V2 回填模式运行完成")
return
# ── 日常模式:单次 API 补今天 + 策略 + 推送 ──
logger.info("开始拉取最新快照...")
count = engine.sync_today_bulk()
logger.info(f"快照同步完成,写入 {count} 只股票")
# 4. 策略列表(新增策略在此追加即可)
strategies: list[BaseStrategy] = [
MaVolumeStrategy(engine=engine, settings=settings),
TurtleTradeStrategy(engine=engine, settings=settings),
HighTightFlagStrategy(engine=engine, settings=settings),
LimitUpShakeoutStrategy(engine=engine, settings=settings),
UptrendLimitDownStrategy(engine=engine, settings=settings),
RpsBreakoutStrategy(engine=engine, settings=settings),
PrivatePlacementStrategy(engine=engine, settings=settings),
]
notifier = FeishuNotifier(settings)
# 5. 遍历策略,有结果则推送至对应机器人
for strategy in strategies:
strategy_name = type(strategy).__name__
logger.info(f"执行策略:{strategy_name}")
selected: list[str] = strategy.run()
logger.info(f"{strategy_name} 选出 {len(selected)} 只股票")
if selected:
notifier.send(
symbols=selected,
strategy_name=strategy_name,
webhook_key=strategy.webhook_key,
)
else:
logger.info(f"{strategy_name} 无选股结果,跳过推送")
except Exception:
try:
_logger = get_logger(__name__)
_logger.exception("主流程发生未捕获异常,程序终止")
except Exception:
import traceback
traceback.print_exc()
sys.exit(1)
logger.info("Sequoia-X V2 运行完成")
if __name__ == "__main__":
main()