行情接口
行情是策略的燃料。PythonGo 的行情体系分三层:Tick 订阅 → K 线合成 → 指标计算。本章按这个顺序讲清楚每个接口怎么用。
一、订阅与取消订阅
父类 on_start 会自动订阅 params_map 里的合约,你也可以手动订阅额外合约:
| 方法 | 含义 |
|---|---|
sub_market_data(exchange=None, instrument_id=None) | 订阅行情;两者留空则订阅 params_map 里的全部合约 |
unsub_market_data(exchange=None, instrument_id=None) | 取消订阅 |
def on_start(self) -> None:
super().on_start()
# 额外订阅一个合约(比如跨品种对冲)
self.sub_market_data(exchange="DCE", instrument_id="m2605")
params_map.exchange支持分号分隔多合约:"SHFE;DCE",框架会自动拆成self.exchange_list。
二、TickData 行情字段
订阅后,每个行情切片通过 on_tick(tick) 推送进来。tick 是 TickData 对象,用 . 取属性:
| 属性 | 类型 | 含义 |
|---|---|---|
last_price | float | 最新价 |
open_price / high_price / low_price | float | 今开 / 最高 / 最低 |
volume / last_volume | int | 总成交量 / 最新成交量 |
pre_close_price / pre_settlement_price | float | 昨收 / 昨结算 |
open_interest | int | 总持仓量 |
upper_limit_price / lower_limit_price | float | 涨 / 跌停板价 |
bid_price1~bid_price5 | float | 五档申买价 |
ask_price1~ask_price5 | float | 五档申卖价 |
bid_volume1~bid_volume5 | int | 五档申买量 |
ask_volume1~ask_volume5 | int | 五档申卖量 |
trading_day / update_time | str | 交易日 / 更新时间 |
def on_tick(self, tick: TickData) -> None:
super().on_tick(tick)
# 最简单的逻辑:最新价突破昨结算就输出
if tick.last_price > tick.pre_settlement_price:
self.output(f"突破昨结算: {tick.last_price}")
三、K 线合成器 KLineGenerator
Tick 频率太高,多数策略在 K 线上做判断。KLineGenerator 把 Tick 合成成指定周期的 K 线:
from pythongo.utils import KLineGenerator
from pythongo.core import KLineStyleType
def on_start(self) -> None:
self.kline_generator = KLineGenerator(
real_time_callback=self.real_time_callback, # 实时回调(每个 tick 触发)
callback=self.callback, # 成型 K 线回调(一根走完触发)
exchange=self.params_map.exchange,
instrument_id=self.params_map.instrument_id,
style=self.params_map.kline_style # 如 "M1"、"M5"、"H1"、"D1"
)
self.kline_generator.push_history_data() # 推送历史 K 线
super().on_start()
| 参数 | 含义 |
|---|---|
callback | 一根 K 线周期结束成型时触发,传入 KLineData |
real_time_callback | 每个 tick 都触发,传入实时更新的 K 线(高频用) |
style | K 线周期,KLineStyle 枚举:M1M5、M10、M15、M30、M45、H1H4、D1 |
push_history_data() | 启动时推送历史 K 线到 callback,不需要历史就不调用 |
历史推送代码要写在
super().on_start()前面,避免父类把trading设为True后历史数据误触发报单。
然后在 on_tick 里把 tick 喂给合成器:
def on_tick(self, tick: TickData) -> None:
super().on_tick(tick)
self.kline_generator.tick_to_kline(tick)
KLineData 字段
callback(kline: KLineData) 收到的对象:open / close / high / low / volume / open_interest / datetime。
四、KLineProducer 与技术指标
合成器的 producer 属性(KLineProducer)维护了 OHLCV 序列,并继承了 Indicators 指标类(基于 talib),可直接算指标:
def calc_indicator(self) -> None:
# sma 默认返回最新值;array=True 返回整条序列
slow = self.kline_generator.producer.sma(timeperiod=20, array=True)
fast = self.kline_generator.producer.sma(timeperiod=5, array=True)
self.pre_slow_ma, self.slow_ma = slow[-2:] # 取最后两根判断交叉
常用指标方法
| 方法 | 含义 |
|---|---|
sma(timeperiod=N) | 简单移动平均 |
ema(timeperiod=N) | 指数移动平均 |
macd(fast=12, slow=26, signal=9) | MACD |
kdj() | 随机指标 KDJ |
boll(timeperiod=20, nbdevup=2) | 布林带 |
atr(timeperiod=14) | 真实波幅均值 |
rsi(timeperiod=14) | 相对强弱 |
cci(timeperiod=14) | 顺势指标 |
adx(timeperiod=14) | 平均趋向 |
std(timeperiod=N) | 标准差 |
donchian() / keltner() / sar() | 唐奇安 / 肯特纳 / 抛物线 |
指标默认带好周期参数可直接调用;
array=True返回整条序列便于求交叉、取历史。完整列表见pythongo.indicator。
小结
sub_market_data 订阅 → on_tick 收 TickData → KLineGenerator.tick_to_kline 合成 K 线 →
producer.sma/ema/macd 算指标。这是行情链路的全部。下一步学怎么下单平仓:交易接口。