回馈老大和各位奉献者。
vnpy优点不必多讲,短板是在图表直观分析方面不足。当然我想本来的设计目标不在此。
现在鱼与熊掌想得兼,我考虑了一个思路:
- vnpy根据策略跑一个交易记录,保存为csv文件
- 用tbpy(交易开拓者的接口)把交易记录写入TBQuant
- TBQuant写指标读取上述数据,并根据它们交易
第2步代码:
import datetime
import csv
import tbpy
# 初始化
tbpy.init()
symbols = ['rb888.SHFE']
code = symbols[0]
freq = '5m'
# 下面读取csv文件
with open('c:\\trade.csv', 'r') as f:
reader = csv.reader(f)
# print(type(reader))
for row in reader:
if row[0] == "tradeid":
continue
r1 = row[4]
r2 = row[5]
r3 = row[6]
r4 = row[8][0:19]
if r1 == "多":
direction = 1
else:
direction = -1
if r2 == "开":
offset = 1
else:
offset = -1
price = float(r3)
time = datetime.datetime.strptime(r4, "%Y-%m-%d %H:%M:%S")
print(direction, offset, price, time)
tbpy.write_fundamental("direction", code, time, direction)
tbpy.write_fundamental("offset", code, time, offset)
tbpy.write_fundamental("price", code, time, price)
第3步代码:
Params
//此处添加参数
Vars
//此处添加变量
Dic<Integer> TBdirection("direction");
Dic<Integer> TBoffset("offset");
Dic<Numeric> TBprice("price");
Defs
//此处添加公式函数
Events
//此处实现事件函数
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
//只考察有效数据
if( TBdirection<>InvalidInteger && TBoffset<>InvalidInteger && TBprice<>InvalidNumeric && TBdirection[1]<>InvalidInteger )
{
if(TBdirection==1 && TBdirection[1]<>1)
{
if(TBoffset==1 )
buy(1,TBprice);
Else if(TBoffset==-1)
BuyToCover(1,TBprice);
}
Else if(TBdirection==-1 && TBdirection[1]<>-1)
{
if(TBoffset==1 )
SellShort(1,TBprice);
Else if(TBoffset==-1)
Sell(1,TBprice);
}
}
}