用Spyder运用官网的一个简单的高频交易策略时未得到tick数据
2023-06-27 10:19

用Spyder运用官网的一个简单的高频交易策略时未得到tick数据,,具体代码如下:

# -*- coding: utf-8 -*-
\"\"\"
Created on Sun Jun 25 10:31:14 2023

@author: huasan
\"\"\"

# encoding utf-8
import tbpy
import sys
import datetime
# 自定义策略,须继承 tbpy.IStrategy
class MyStrategy(tbpy.IStrategy):
#    print(888)
 #策略的初始化:传入最大持仓、撤单时间、账户 ID、合约代码
    def __init__(self, max_pos, interval_secs, account_id, symbol):
        super().__init__(\'MyStrategy\')
        self._side = 0
        self._max_pos = max_pos
        self._interval_secs = interval_secs
        self._account_id = account_id
        self._symbol = symbol
        self._account = None
        self._pos = None
        self._order_dict = {}
        self._time= None
        pass

    def __del__(self):
        pass

    # 初始化事件函数:订阅 TICK、订阅账户、设置定时器、读取初始仓位
    def on_init(self, context):
        ret = context.subscribe_tick(symbol=self._symbol)
        print(\'ret111\',ret)
        //这个数据为空

        if ret is not None:
            print(ret)
            tbpy.exit()
        self._account = context.subscribe_account(account_id=self._account_id)
        if self._account is None:
            print(tbpy.get_last_err())
            tbpy.exit()
        context.create_timer(interval_millsecs=2 * 100)
        self._pos = self._account.get_position(symbol=self._symbol)
        print(\'on_init success.\')

    # BAR 事件函数
    def on_bar(self, context, bars, symbol, flag):
        pass

    # TICK 事件函数:读取目前的持仓,根据规则发送委托。
    def on_tick(self, context, tick):
        print(\'tick11\',tick)
        if self._time is not None and (datetime.datetime.now() - self._time).seconds <= self._interval_secs:
            return

        l_up_pos = self._pos.l_current_volume + self._pos.l_active_volume -self._pos.l_active_close_volume
        s_up_pos = self._pos.s_current_volume + self._pos.s_active_volume -self._pos.s_active_close_volume
        if l_up_pos > self._max_pos:
            self._side = -1
        if s_up_pos > self._max_pos:
            self._side = 1
        if self._side > 0:
            if s_up_pos == 0:
                self.push_order_id(self._account.buy(symbol=tick.symbol,volume=1, price=tick.last))
            elif self._pos.s_current_volume > 0:
                self.push_order_id(self._account.buy2cover(symbol=tick.symbol,volume=1, price=tick.last))

        else:
            if l_up_pos == 0:
                self.push_order_id(self._account.sell2short(symbol=tick.symbol,volume=1, price=tick.last))
            elif self._pos.l_current_volume > 0:
                self.push_order_id(self._account.sell(symbol=tick.symbol,volume=1, price=tick.last))
            self._time = datetime.datetime.now()

    # 持仓事件函数;读取最新持仓
    def on_position(self, context, pos):
        print(pos)
        self._pos = pos

    # 委托事件函数:剔除已经处于完成状态的委托单编号,只留下未完成的委托单
    def on_order(self, context, order):
        print(order)
        if order.status == tbpy.OrderStatus.NewReject or order.status ==tbpy.OrderStatus.AllFill or \\
    order.status == tbpy.OrderStatus.Canceled or order.status == tbpy.OrderStatus.CanceledFill:
            self._order_dict.pop(order.order_id)

    # 成交事件函数:打印成交
    def on_fill(self, context, fill):
        print(fill)
        pass

    # 定时器事件函数:委托超时撤单
    def on_timer(self, context, id, millsecs):
        now_time = datetime.datetime.now()

        for key, value in self._order_dict.items():
            if (now_time - value).seconds >= self._interval_secs:
                self._account.cancel_order(order_id=key)

    # push_order_id:记录委托单的发送时间
    def push_order_id(self, order_id_list):
        send_time = datetime.datetime.now()
        for id in order_id_list:
            self._order_dict[id] = send_time


if __name__ == \'__main__\':
    # TBPY 模块初始化
    ret = tbpy.init()
#    print(888)
    if ret is False:
        print(\'init fail.\')
        sys.exit()
    rb_main = tbpy.get_main_instrument(underlying_symbol=\'rb.SHFE\')
    print(\'rb_main\',rb_main)
    print(\'rb_main.symbol\',rb_main.symbol)
#    rb2310.SHFE
    if rb_main is None:
        sys.exit()
    # 声明用户策略对象
    strategy = MyStrategy(5, 5, \'***\', rb_main.symbol)
    # 进入 tbpy 事件循环
    tbpy.exe()


评论区
Wucan2022

问题已解决,谢谢

2023-06-27 10:22
顶部