看底层接口恒生UFT,没有UFT测试,申请个模拟etf期权账户,如何进行穿透测试,ctp穿透有专门的ctp测试哦
另外,申请etf期权表格有点难填啊,订单申报峰值,笔/每秒,笔/每天怎么填呢?行情来源,是米筐,还是?
用Python的交易员 wrote:
ATR指标计算时,唯一用到的参数是这个窗口数,用到的数据包括close high low的数组,我们把技术指标的计算封装到ArrayManager组件里面了,所以只要一个参数就能很方便计算
看了下如果要合成日线,计算日线ATR:
1.on_init中 load_bar只有10天,而Arraymanager 初始化需要100根日线,是不是意味着无法初始化Arraymanager
2.如果Arraymanager传入小于10的参数,合成10日内ATR,DAYBargenerator(on_day_bar),假设在on_day_bar里面计算atrvalue = am.atr(5),得出的atrvalue是不包括今天的,过去5个交易日的ATR吧,感觉只能在今日行情走完on_day_bar才能接受到今日日k推送
xiaohe wrote:
根据策略逻辑加个过滤极端情况的条件如何
搞定了,多谢提醒
单子入场,例如多头入场,立即发出limit 止盈单,和stop止损单,这时候limit 单直接发送到交易所服务器,但stop止损单在本地挂着;如果价格先去止损单方向,因为limit止盈单已经发到服务器,止损单触发也会因为可用仓位不足,而不能止损;如果价格先去止盈单,则不会出现上述状况;
1.那么如何处理第一种情况,因为limit单占用坑位导致仓位不足无法止损?加个bar.high_price >= long_tp判断在发单似乎可以;
2.如果获取真实入场价格trade.price,long_sl = trade.price - X,仓位大于0时候发出止损单,今天却遇到因为trade_price 还没有返回即为0时,直接发出了stop止损单,报价为—X,直接止损了;这种情况如何处理?
xiaohe wrote:
可参考https://www.vnpy.com/docs/cn/rpc_service.html
RPC怎么看起来,是一个账户在服务器端登陆,共享了其数据,用户端通过连接服务器端获取数据,但用户端不用登陆账户,这样岂不是一个账户,多人共用;好像没有实现多个账户多用户,但共享服务器端数据的效果
xiaohe wrote:
请在cmd中用python -m vnstation启动,看看cmd是否有任何报错
vnstation 更新遇到相同情况,上述方法,显示没有vnstation模块;系统环境变量D:\vnstudio\Scripts,D:\vnstudio\这儿也没问题
重装vnstation?
能否不卸载,重装?vnstation装了很多python的其他库
今天登陆Vnstation,点击更新,部分没有更新成功,显示pip需要更新到最新版本;退出后用pip install --upgrade pip 升级失败,然后点击vnstation完全没有反应了,但可以通过run.py登陆vnTrader;在cmd命令下,pip找不到了,检查环境变量没问题,直接切换到vnstudio——scripts目录powershell也找不到pip模块(pip.exe在改目录下能看到);尝试卸载不行,直接在上述scripts目录下运行esay_install.exe安装也没成功。需要如何处理?
算法里面看到grid_algo网格算法,有没有向ctastrategy一样,写个gridstrategy模板,研究在vnpy上实现etf,价差,或者其它标的的网格策略实盘以及回测,自己写了下网格策略,成交总会出问题,有个模板学习就方便了
多谢!
把里面遇到的细节记录下:
在F盘创建了trader文件夹,然后按照https://www.vnpy.com/forum/topic/1467-vnpyke-yi-duo-zhang-hu-yun-xing-ma,创建了.vntrader,放入run.py
1.其中每个目录下放一个run.py,其中包含你要使用的底层接口和上层应用,这块要看清楚些,在vnpy—example——vn_trader里面复制的run.py,有很多底层接口,和上层应用加了#注释,需要哪个去掉#;不然打开vntrader ui后,点击功能按钮是无内容的
2.上述完成后,在trader文件夹下powershell运行run.py,就打开了新的vntrader,且工作目录换成了F:/trader,点击系统----连接ctp,添加参数后,发现只能连接行情服务器;直接复制原来工作目录.vntrader(c:/user/电脑名字/.vntrader)下内容到F:/trader/.vntrader即可;
3.发现新工作区无法共享strategy,把原工作目录下strategy直接copy到f:/trader下即可
试了下,在默认的启动位置,打开vnstation两次,输入不同的账号,账号是公用了策略,不同账户资金好像只是默认了一个账户资金
期货公司CTP端口还没开,等会儿就好了
1.有没什么方法可以同时启动多个vntrader?
以前挂stop单成交,都是第一根k线走完才能发出单子,要实现开盘第一k符合条件就立即入场,止损后依然可以在on_bar中挂stop单入场,研究了下细粒度挂撤单操作,思路是在on_bar中产生信号,接着在on_tick中限价委托成交;
on_bar中:
if self.pos == 0:
if bar.datetime.minute == self.start_time.minute:
if bar.high_price >= self.buy_break:
self.target_pos = self.fixed_size
elif not self.long_vt_orderids :(疑问:on_tick中限价买单,要求只成交一次,且没有记录orderid,不清楚on_tick里的buy会不会影响到这个long_vt_orderids,实盘中第1k入场,止损后,就不在发出单子了,需要如何解决?)
self.long_vt_orderids = self.buy(stop=true)
self.vt_orderids.extend(self.long_vt_orderids)
on_tick中:
volume = self.target_pos -self.pos
if volume > 0:
if not self.long_entered:
self.buy(stop=False)
1.如果有仓位,止损为stop单,on_bar里面,在挂止损单之前判断有无止损委托if not self.sell_vt_orderids: 然后挂止损self.sell_vt_orderids = self.sell(……), self.vt_orderids.extend(self.sell_vt_orderdis); 同时在on_trade里面if self.pos == 0: 遍历self.sell_vt_orderids,如果在vt_orderids,就remove;这个操作是不是就实现了止损单不用美分钟挂扯单,只有在有单子入场挂止损,不触发止损就不用撤止损单了
2.按照这种方法,就可以不用self.cancel_all()了吧?在on_bar里:self.pos == 0 时候,if not self.long_vt_orderids :就发单self.long_vt_orderids = self.buy(……);同时在on_trade里面,self.pos >0遍历self.long_vt_orderids并remove
1.vnpy.app新建user_tools文件夹trading_hour.py放入user_tools
trading_hour.py如下:
from datetime import datetime,time,timedelta
import json
class TRADINGHOUR(object):
PATH = "***.vntrader/trading_hour.json" #PATH填trading_hour.json在电脑的绝对路径,trading_hour.json放入在vntrader目录下,如:c:/users/电脑名/vntrader/trading_hour.json
time_switch = 0
start_time = ""
end_time = ""
def get_trading_time(self,symbol): #读取存入json中的标的开收盘时间
with open(self.PATH,"r",encoding="utf_8") as f:
trading_hour = json.load(f)
for key_symbol in trading_hour:
if key_symbol == symbol:
start = trading_hour[symbol][0]
end = trading_hour[symbol][1]
break
self.start_time = datetime.strptime(start,"%H:%M:%S") #datetime对象,后面比较时候要转换成time对象
self.end_time = datetime.strptime(end,"%H:%M:%S")
return self.start_time,self.end_time
def day_night_switch(self): #time_switch = 0 白盘标的,1为夜盘0:00前收盘的标的(如:rb),2为0:00后收盘的标的(如:ag,cu)
if self.start_time.time() < time(hour=20,minute=0):
self.time_switch = 0
elif self.end_time.time() > time(hour=3,minute=0):
self.time_switch = 1
else:
self.time_switch = 2
return self.time_switch
def trading_period(self,bar): #判断标的日内交易时间
DAY_START = time(hour=9,minute=0)
DAY_END = time(hour=14,minute=57)
if self.day_night_switch() == 0:
return bar.datetime.time() < (self.end_time + timedelta(minutes=-3)).time()
elif self.day_night_switch() == 1:
return bar.datetime.time() >= self.start_time.time() and bar.datetime.time() < (self.end_time + timedelta(minutes=-3)).time() \
or (bar.datetime.time() >= DAY_START and bar.datetime.time() < DAY_END )
else:
return bar.datetime.time() >= self.start_time.time() or bar.datetime.time() < (self.end_time + timedelta(minutes=-3)).time() \
or (bar.datetime.time() >= DAY_START and bar.datetime.time() < DAY_END )
2.trading_hour.json如下: #记录了期货白盘期货标的开收盘时间,夜盘标的夜盘开盘以及夜盘收盘时间,遇到特殊日子(比如疫情期间,ag没有夜盘了,那时间要修正“AG”:["9:30:00","15:00:00"]),直接过来修改开收盘时间即可
{
"IF":["9:30:00","15:00:00"],
"IC":["9:30:00","15:00:00"],
"IH":["9:30:00","15:00:00"],
"T":["9:30:00","15:15:00"],
"AU":["21:00:00","2:30:00"],
"AG":["21:00:00","2:30:00"],
"CU":["21:00:00","1:00:00"],
"AL":["21:00:00","1:00:00"],
"ZN":["21:00:00","1:00:00"],
"PB":["21:00:00","1:00:00"],
"NI":["21:00:00","1:00:00"],
"SN":["21:00:00","1:00:00"],
"RB":["21:00:00","23:00:00"],
"I":["21:00:00","23:00:00"],
"HC":["21:00:00","23:00:00"],
"SS":["21:00:00","1:00:00"],
"SF":["9:00:00","15:00:00"],
"SM":["9:00:00","15:00:00"],
"JM":["21:00:00","23:00:00"],
"J":["21:00:00","23:00:00"],
"ZC":["21:00:00","23:00:00"],
"FG":["21:00:00","23:00:00"],
"SP":["21:00:00","23:00:00"],
"FU":["21:00:00","23:00:00"],
"LU":["21:00:00","23:00:00"],
"SC":["21:00:00","2:30:00"],
"BU":["21:00:00","23:00:00"],
"PG":["21:00:00","23:00:00"],
"RU":["21:00:00","23:00:00"],
"NR":["21:00:00","23:00:00"],
"L":["21:00:00","23:00:00"],
"TA":["21:00:00","23:00:00"],
"V":["21:00:00","23:00:00"],
"EG":["21:00:00","23:00:00"],
"MA":["21:00:00","23:00:00"],
"PP":["21:00:00","23:00:00"],
"EB":["21:00:00","23:00:00"],
"UR":["9:00:00","15:00:00"],
"SA":["21:00:00","23:00:00"],
"C":["21:00:00","23:00:00"],
"A":["21:00:00","23:00:00"],
"CS":["21:00:00","23:00:00"],
"B":["21:00:00","23:00:00"],
"M":["21:00:00","23:00:00"],
"Y":["21:00:00","23:00:00"],
"RM":["21:00:00","23:00:00"],
"OI":["21:00:00","23:00:00"],
"P":["21:00:00","23:00:00"],
"CF":["21:00:00","23:00:00"],
"SR":["21:00:00","23:00:00"],
"JD":["9:00:00","15:00:00"],
"AP":["9:00:00","15:00:00"],
"CJ":["9:00:00","15:00:00"]
}
3.在自己的策略中import TRADINHOUR from vnpy.app.user_tools.trading_hour import TRADINGHOUR 同时import re
def --init--():加入
self.tradingtime = TRADINGHOUR()
self.symbol = "".join(re.findall(r"\D+",self.get_data()["vt_symbol"].split(".")[0])).upper() #获取标的代码
self.start_time,self.end_time = self.tradingtime.get_trading_time(self.symbol)
这些完成后,就可以在你的on_bar函数里面调用self.tradingtime.trading_period(bar)获取标的日内交易时段了
例如:def on_bar(self, bar: BarData):
###
###
if self.tradingtime.trading_period(bar): #获取当下交易标的日内交易时段,平仓时间设置为收盘前3min
if self.pos == 0:
###****
if self.pos > 0:
### ****
if self.pos < 0:
###*****
else: #收盘平仓
if self.pos > 0:
self.sell(bar.close_price *0.99, abs(self.pos))
elif self.pos < 0:
self.cover(bar.close_price*1.01, abs(self.pos))
模拟盘测试了下,有时候能够启动,打印有夜盘,白盘不同标的也没问题,但有时候启动不了,启动按钮是卡死的状况;会不会是同一策略跑不同标的,线程太多,早盘开启时候出现有的线程启动不了呢?
今天情况是这样,比如策略class TestStrategy ,昨晚用这个class 创建了ag,cu,al,昨晚启动了,发单没问题;今天早晨开盘前用这个class 创建了fg,sm策略;同时启动了ag,cu,al,fg,sm,只有昨晚ag,cu,al挂出单子,今天加的fg,sm都没发出单子;
1.策略命名都是TestStrategy_symbol,不会重复;2早晨开盘前,特意开了白盘,夜盘的标的sm,fg,开盘后几分钟都没发出单子;3.策略发单不需要条件判断,开盘就挂单;4.删除了新增的sm,fg,换成其他策略开启,比如bollStrategy_fg,能够启动;5.半小时左右,重新用TestStrategy开启fg,sm又都能启动;
on_init反正启动策略都会运行一次,获取start_time 需要运行一次就可以;今天早晨好像把self.start_time,self.end_time = self.tradingtime.get_trading_time(self.symbol)放在def_init里面,启动半小时都没挂出单子,策略应该是开盘一分钟后就发出stop单的
实例是不会重名的,实例命名方式是策略名_symbol
start_time没问题,都针对不同开收盘标的打印过
策略本身没问题,跑单一标的几天都没出错