用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()
问题已解决,谢谢