实用例子

本章节提供一些实用例子,为了尽可能的缩减代码,这里会把所有代码尽量放在 on_start 函数中,格式类似于

def on_start(self) -> None:
    super().on_start()
    """示例代码开始"""
    xxxx
    xxxx
    """示例代码结束"""

这里只是提供一些调用方法的例子(所以可能不能直接复制到策略中运行),是为了防止你看了函数的文档还是不清楚实际中应该怎么写

同样我们不会定义不必要的参数,除非有特殊情况,这需要你有举一反三的能力

示例代码放在 on_start 是因为这个入口比较简单易懂,实际上这些代码你可以放在任何一个实例方法中,所以还是需要举一反三

始终记住,你是在写「Python」代码,不是在写「PythonGO」代码


利用 pythongo.core 获取最近的 10 根 1 分钟 K 线

from pythongo.core import MarketCenter
 
 
class Demo(...):
    def __init__(self) -> None:
        super().__init__()
        self.market_center = MarketCenter()
 
    def on_start(self) -> None:
        super().on_start()
 
        kline_data = self.market_center.get_kline_data(
            exchange="SHFE",
            instrument_id="ag2406",
            style="M1",
            count=-10
        )

利用 pythongo.core 获取 2024-01-31 14:302024-01-31 15:00 的 1 分钟 K 线

from datetime import datetime
 
from pythongo.core import MarketCenter
 
 
class Demo(...):
    def __init__(self) -> None:
        super().__init__()
        self.market_center = MarketCenter()
 
    def on_start(self) -> None:
        super().on_start()
 
        kline_data = self.market_center.get_kline_data(
            exchange="SHFE",
            instrument_id="ag2406",
            style="M1",
            start_time=datetime(2024, 1, 31, 14, 30),
            end_time=datetime(2024, 1, 31, 15)
        )

订阅 ag2406 合约行情,并输出行情信息

class Demo(...):
    def on_start(self) -> None:
        super().on_start()
 
        self.sub_market_data(
            exchange="SHFE",
            instrument_id="ag2406"
        )
 
    def on_stop(self):
        super().on_stop()
 
        self.unsub_market_data(
            exchange="SHFE",
            instrument_id="ag2406"
        )
 
    def on_tick(self, tick: TickData) -> None:
        self.output(tick)

定时器

参考 深入框架 - pythongo.utils - Scheduler


需要合成 K 线,但是不需要历史数据

class Demo(...):
    def on_start(self) -> None:
        self.kline_generator = KLineGenerator(
            real_time_callback=...,
            callback=...,
            exchange=...,
            instrument_id=...,
            style=...
        )
        # 不执行 `self.kline_generator.push_history_data()`
        super().on_start()

不需要合成 K 线,只需要 KLineProducer,然后计算历史数据指标

class Demo(...):
    def on_start(self) -> None:
        self.kline_producer = KLineProducer(
            exchange=...,
            instrument_id=...,
            style=...,
            callback=...,
        )
        self.kline_producer.worker()
 
        ma10 = self.kline_producer.sma(10)
        k, d, j = self.kline_producer.kdj()
 
        super().on_start()

自定义副图显示指标

定义 sub_indicator_data,然后传参给 self.widget.recv_kline

class Demo(...):
    @property
    def sub_indicator_data(self) -> dict[str, float]:
        """副图指标"""
        return {
            "K": ...,
            "D": ...,
            "J": ...,
        }
 
    def callback(self, kline: KLineData) -> None:
        """接受 K 线回调"""
        self.widget.recv_kline({
            "kline": ...,
            **self.sub_indicator_data
        })

合成标准套利合约 K 线

用法和 KLineGenerator 一致,只是需要手动订阅单腿合约

from pythongo.utils import KLineGeneratorArb
 
 
class Demo(...):
    def on_tick(self, tick: TickData) -> None:
        """收到行情 tick 推送"""
        super().on_tick(tick)
 
        self.kline_generator.tick_to_kline(tick)
 
    def on_start(self) -> None:
        self.kline_generator = KLineGeneratorArb(
            callback=...,
            exchange="CZCE",
            instrument_id="IPS AP405&SA405",
            style=...,
            real_time_callback=...
        )
        self.kline_generator.push_history_data()
 
        super().on_start()
 
        for instrument_id in self.kline_generator.instruments:
            """订阅单腿合约"""
            self.sub_market_data(
                exchange="CZCE",
                instrument_id=instrument_id
            )
 
    def on_stop(self) -> None:
        super().on_stop()
 
        for instrument_id in self.kline_generator.instruments:
            """取消订阅单腿合约"""
            self.unsub_market_data(
                exchange="CZCE",
                instrument_id=instrument_id
            )

查询 ag2406 的持仓

class Demo(...):
    def on_start(self) -> None:
        super().on_start()
 
        position = self.get_position("ag2406")
 
        # 总持仓
        position.position
 
        # 净持仓
        position.net_position
 
        # 多头总持仓
        position.long.position
 
        # 空头今持仓
        position.short.td_position_close
 
        # 空头昨持仓
        position.short.yd_position_close
 
        # 今日买开数量
        position.long.open_volume
 
        # 今日买平数量
        position.long.close_volume
 
        # 使用字符串仅获取空头持仓
        short_position = self.get_position("ag2406").get_single_position("short")
        short_position.position # 空头总持仓
 
        # 获取套保持仓
        position = self.get_position("ag2406", hedgeflag="3")
        position.long.position # 套保多头总持仓

使用麦语言通达信同花顺中常见的指标

先下载 转换指标库文件 (opens in a new tab),然后把文件放在和无限易安装目录中的 pyStrategy 目录中

      • MyTT.py
  • from MyTT import MA
     
     
    class Demo(...):
        def on_start(self) -> None:
            super().on_start()
     
            ma5 = MA(self.kline_generator.producer.close, 5) # 获取 5 日均线序列
            ma10 = MA(self.kline_generator.producer.close, 10) # 获取 10 日均线序列

    别的函数使用方法,请打开该文件自行查看(该指标转换算法来源于开源项目:MyTT (opens in a new tab),无限易和 PythonGO 不对指标计算差异所导致的任何损失负责!)


    从 K 线合成器中的 KLineProducer 中获取 K 线数据

    class Demo(...):
        def on_start(self) -> None:
            super().on_start()
     
            # 获取最后 1 个收盘价
            last_close_price = self.kline_generator.producer.close[-1]
     
            # 获取最后 10 个开盘价
            last_open_price = self.kline_generator.producer.open[-10:]

    多合约同周期

    注意填写交易所和合约代码时候需要按照以下格式(必须按顺序依次对应,且使用英文分号 ; 分隔):

    交易所:SHFE;SHFE;CZCE

    合约代码:ag2406;ag2405;AP405

    注意计算指标的时候使用正确的 kline_generator

    from pythongo.classdef import TickData
    from pythongo.utils import KLineGenerator
     
     
    class Demo(...):
        def __init__(self) -> None:
            self.kline_generators: dict[str, KLineGenerator] = {}
            """K 线合成器容器"""
     
        def on_start(self) -> None:
            for exchange, instrument_id in zip(self.exchange_list, self.instrument_list):
                kline_generator = KLineGenerator(
                    real_time_callback=self.real_time_callback,
                    callback=self.callback,
                    exchange=exchange,
                    instrument_id=instrument_id,
                    style=self.params_map.kline_style
                )
     
                kline_generator.push_history_data()
     
                self.kline_generators[instrument_id] = kline_generator
     
            super().on_start()
     
        def on_tick(self, tick: TickData) -> None:
            """收到行情 tick 推送"""
            super().on_tick(tick)
            if tick.instrument_id not in self.kline_generators:
                return
     
            self.kline_generators[tick.instrument_id].tick_to_kline(tick)
     
        def calc_indicator(self) -> None:
            """计算指标数据"""
     
            # 指定合约计算指标
            self.kline_generators["ag2406"].producer.sma()
     
            # 也可以根据合约顺序获取合成器来计算指标
            # 0 代表第一个合约
            self.kline_generators[self.instrument_list[0]].producer.sma()

    多合约不同周期

    注意填写交易所、合约代码、K 线周期时候需要按照以下格式(必须按顺序依次对应,且使用英文分号 ; 分隔):

    交易所:SHFE;SHFE;CZCE

    合约代码:ag2406;ag2405;AP405

    K 线周期:M1;M5;M10

    from pythongo.classdef import TickData
    from pythongo.core import KLineStyleType
    from pythongo.utils import KLineGenerator
     
     
    class Demo(...):
        def __init__(self) -> None:
            self.kline_generators: dict[str, dict[KLineStyleType, KLineGenerator]] = {}
            """K 线合成器容器"""
     
        @property
        def style_list(self) -> list[KLineStyleType]:
            """手动拆分 K 线周期"""
            return self.params_map.kline_style.split(";")
     
        def on_start(self) -> None:
            for exchange, instrument_id, style in zip(self.exchange_list, self.instrument_list, self.style_list):
                kline_generator = KLineGenerator(
                    real_time_callback=self.real_time_callback,
                    callback=self.callback,
                    exchange=exchange,
                    instrument_id=instrument_id,
                    style=style
                )
     
                kline_generator.push_history_data()
     
                self.kline_generators[instrument_id] = {style: kline_generator}
     
            super().on_start()
     
        def on_tick(self, tick: TickData) -> None:
            """收到行情 tick 推送"""
            super().on_tick(tick)
            if tick.instrument_id not in self.kline_generators:
                return
     
            style_container = self.kline_generators[tick.instrument_id]
     
            for kline_generator in style_container.values():
                kline_generator.tick_to_kline(tick)
     
        def calc_indicator(self) -> None:
            """计算指标数据"""
     
            # 指定合约和周期计算指标
            self.kline_generators["ag2406"]["M1"].producer.sma()
     
            # 也可以根据合约顺序获取合成器来计算指标
            # 0 代表第一个
            instrument_id = self.instrument_list[0]
            style = self.style_list[0]
     
            self.kline_generators[instrument_id][style].producer.sma()

    持续更新中...