行情接口

行情是策略的燃料。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) 推送进来。tickTickData 对象,用 . 取属性:

属性类型含义
last_pricefloat最新价
open_price / high_price / low_pricefloat今开 / 最高 / 最低
volume / last_volumeint总成交量 / 最新成交量
pre_close_price / pre_settlement_pricefloat昨收 / 昨结算
open_interestint总持仓量
upper_limit_price / lower_limit_pricefloat涨 / 跌停板价
bid_price1~bid_price5float五档申买价
ask_price1~ask_price5float五档申卖价
bid_volume1~bid_volume5int五档申买量
ask_volume1~ask_volume5int五档申卖量
trading_day / update_timestr交易日 / 更新时间
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 线(高频用)
styleK 线周期,KLineStyle 枚举:M1M5M10M15M30M45H1H4D1
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_tickTickDataKLineGenerator.tick_to_kline 合成 K 线 → producer.sma/ema/macd 算指标。这是行情链路的全部。下一步学怎么下单平仓:交易接口