切换主题
05. K 线窗口与上下文工具:只看交易表,看不懂入场上下文
上一章练习参考答案
第一题,risk = 0 时不能继续除法。应该把这笔交易标记为风险计划异常,返回追问或数据错误,让用户补充有效止损。
第二题,空头交易方向相反。空头盈利来自价格下跌,所以实际收益应按 entryPrice - exitPrice 计算。
第三题,如果要做审计和历史对账,可以把当时的计算结果存库;如果交易字段可能被纠正,实时计算更灵活。训练产品早期可以实时计算,正式上线后建议保留快照。
新问题:数字对了,为什么还是看不懂
上一章我们能算风险了。但用户继续问:
“我知道这笔是 -0.8R,可到底是我乱追,还是市场本来就假突破?”
只看交易表回答不了。你必须看入场前后几根 K 线。
PA 复盘不是只看价格数字,它看的是行为和结构:突破前有没有压缩,突破后有没有回踩,入场时是不是追在情绪最高点,止损是不是放在结构外。
所以第五章引入 K 线窗口工具。
KlineBar 和 KlineWindowRepository
伴生工程里用一个简单模型表示 K 线:
java
public record KlineBar(
String time,
double open,
double high,
double low,
double close,
String note
) {
}仓库接口:
java
public interface KlineWindowRepository {
List<KlineBar> windowFor(String tradeId);
}现在先用内存数据模拟真实行情窗口。等你接真实系统时,可以换成行情库、ClickHouse、时序数据库或者第三方行情 API。
为什么要叫窗口
不要把整段行情都丢给复盘教练。
一是成本高。二是噪声大。三是模型容易被很远的走势带偏。
复盘一笔入场,通常先拿“入场前 N 根 + 入场后 M 根”的窗口就够了。窗口里每根 K 线可以带一个轻量备注,比如“突破”“回落”“测试前低”。
伴生工程里,includeKline=true 时会读取窗口:
java
List<KlineBar> klineWindow = request.includeKline()
? klineWindowRepository.windowFor(trade.tradeId())
: List.of();然后报告里会出现:
json
{
"sections": {
"klineContext": "突破后下一根 K 线快速回落,和截图备注互相印证。"
}
}本章怎么跑
带 K 线:
json
{
"tradeId": "T-1001",
"includeKline": true,
"question": "复盘这笔训练交易"
}不带 K 线:
json
{
"tradeId": "T-1001",
"includeKline": false,
"question": "先只复盘交易计划"
}这两个请求都能返回 REVIEWED,但报告上下文不同。带 K 线时,系统能解释入场附近结构;不带 K 线时,只能评价交易计划和执行字段。
这一章真正解决了什么
K 线窗口解决的是“交易上下文”。
没有 K 线,复盘容易变成数字点评。有了窗口,教练才知道用户是在突破前进、突破后追、回踩确认进,还是追在假突破末端。
练习题
- K 线窗口应该按交易发生时间实时读取,还是使用交易当时保存的快照?
- 如果用户只上传截图,没有结构化 K 线,你会怎么降级?
includeKline=false时,报告里应该隐瞒没读 K 线,还是明确说明上下文有限?