58e9c8f85e
Coach context previously omitted options_snapshot details; also inject a short 执行手册 summary each turn. Co-authored-by: Cursor <cursoragent@cursor.com>
98 lines
3.3 KiB
Python
98 lines
3.3 KiB
Python
"""hub_ai:期权持仓进教练上下文 + 执行手册摘要."""
|
|
from __future__ import annotations
|
|
|
|
import unittest
|
|
|
|
from hub_ai.context import (
|
|
format_chat_context_for_chat,
|
|
format_chat_context_slim,
|
|
format_chat_position_overview,
|
|
)
|
|
from hub_ai.playbook_brief import format_playbook_brief_for_chat
|
|
from hub_ai.prompts import build_chat_user_prompt
|
|
|
|
|
|
def _sample_payload():
|
|
return {
|
|
"totals": {
|
|
"trading_day": "2026-07-22",
|
|
"total_pnl_u": 0,
|
|
"closed_count": 0,
|
|
"win_count": 0,
|
|
"loss_count": 0,
|
|
"float_pnl_u": 1.25,
|
|
"open_position_count": 1,
|
|
"options_open_position_count": 1,
|
|
"perpetual_open_position_count": 0,
|
|
},
|
|
"accounts": [
|
|
{
|
|
"name": "OKX_趋势",
|
|
"key": "okx",
|
|
"status": "已监控",
|
|
"open_position_count": 1,
|
|
"options_open_position_count": 1,
|
|
"float_pnl_u": 1.25,
|
|
"funding_usdt": 100,
|
|
"trading_usdt": 50,
|
|
"trade_stats": {"total_pnl_u": 0, "closed_count": 0, "win_count": 0, "loss_count": 0},
|
|
"positions": [],
|
|
"trades": [],
|
|
"monitor_lines": {},
|
|
"options_snapshot": {
|
|
"ok": True,
|
|
"enabled": True,
|
|
"positions": [
|
|
{
|
|
"inst_id": "ETH-USD-260723-3500-C",
|
|
"opt_type": "C",
|
|
"pos": 1,
|
|
"premium_paid": 8.5,
|
|
"source_label": "纯期权",
|
|
"source": "option",
|
|
"upl": 1.25,
|
|
"target_monitor_text": "目标 3600",
|
|
}
|
|
],
|
|
},
|
|
}
|
|
],
|
|
}
|
|
|
|
|
|
class HubAiOptionsPlaybookTests(unittest.TestCase):
|
|
def test_chat_slim_includes_options_line(self):
|
|
text = format_chat_context_slim(_sample_payload())
|
|
self.assertIn("期权 ETH-USD-260723-3500-C Call", text)
|
|
self.assertIn("永续0/期权1", text)
|
|
self.assertIn("权利金8.5U", text)
|
|
|
|
def test_overview_lists_options(self):
|
|
text = format_chat_position_overview(_sample_payload())
|
|
self.assertIn("期权1", text)
|
|
self.assertIn("ETH-USD-260723-3500-C", text)
|
|
|
|
def test_chat_bundle_keeps_options(self):
|
|
text = format_chat_context_for_chat(_sample_payload(), max_chars=8000)
|
|
self.assertIn("ETH-USD-260723-3500-C", text)
|
|
self.assertIn("期权", text)
|
|
|
|
def test_playbook_brief_injected(self):
|
|
brief = format_playbook_brief_for_chat()
|
|
self.assertIn("执行手册", brief)
|
|
self.assertIn("OKX", brief)
|
|
self.assertIn("不手动平仓", brief)
|
|
prompt = build_chat_user_prompt(
|
|
context_text="快照",
|
|
trading_day="2026-07-22",
|
|
summary_excerpt="",
|
|
user_message="今天怎么样",
|
|
playbook_brief=brief,
|
|
)
|
|
self.assertIn("用户策略执行手册", prompt)
|
|
self.assertIn("不手动平仓", prompt)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|