也就是说self.short(bar.close_price, 1)执行之后, 不会导致仓位变化
比如onbar函数里面条件满足的,以close价格(假如为10块)买入一首合约;
但是下一根K线开始的开盘价是12块,收盘价是13块,那么这个买入动作就会失败。这个时候怎么处理?
因为下一根K线也就只有open,close,high,low四个价格,如果之前onbar里面买入的时候使用的close价格没有在这四个价格之间,那回测也是买入失败,仓位不会增加。
而且未来也不能保证买入成功。
这对于开仓还好说,大不了不开仓了。但是对于平仓来讲,如果下单不成功,那这个回测似乎没啥意义了?
请各位老司机指点。
请问怎么解决的?我加了debug,发现也是这个self.trading不对:
def send_order(
self,
direction: Direction,
offset: Offset,
price: float,
volume: float,
stop: bool = False,
lock: bool = False
):
"""
Send a new order.
"""
if self.trading:
vt_orderids = self.cta_engine.send_order(
self, direction, offset, price, volume, stop, lock
)
return vt_orderids
else:
** print("[!!!]: not trading")
** return []
用的就是最新的版本
昨天在官网下载的版本也不行:
比如这一段是双均线里面打印出来的:
bar cross below. 2020-07-06 21:30:00+08:00 3143.0 3111.4 3106.8 3112.35 3106.7
bar cross over. 2020-07-06 23:00:00+08:00 3152.75 3128.25 3117.3 3121.925 3118.65
bar cross below. 2020-07-07 23:00:00+08:00 3154.0 3150.85 3150.6 3151.475 3150.375
bar cross over. 2020-07-08 03:00:00+08:00 3154.0 3154.0 3151.6 3152.3 3152.175
bar cross below. 2020-07-09 22:00:00+08:00 3111.25 3143.35 3151.9 3147.475 3151.625
bar cross over. 2020-07-10 22:00:00+08:00 3121.75 3120.35 3119.1 3119.45 3122.675
bar cross below. 2020-07-14 21:30:00+08:00 3132.5 3175.3 3188.2 3183.075 3184.225
bar cross over. 2020-07-15 04:30:00+08:00 3163.5 3156.5 3153.1 3152.475 3154.725
bar cross below. 2020-07-16 22:00:00+08:00 3177.5 3190.1 3194.7 3190.5 3193.7
bar cross over. 2020-07-17 21:30:00+08:00 3193.25 3178.65 3176.0 3178.325 3178.85
bar cross below. 2020-07-23 21:30:00+08:00 3258.0 3246.2 3244.1 3246.25 3243.25
这一段是trades list (删除了一些没用的字符串):
orderid='1', tradeid='1', '空'>'开'>, price=3149.5, (2020, 7, 6, 22, 0, ))
orderid='2', tradeid='2', '多''平'>, price=3152.75, (2020, 7, 7, 0, 0, ))
orderid='3', tradeid='3', '多'>'开'>, price=3152.75, (2020, 7, 7, 0, 0, ))
orderid='4', tradeid='4', '空''平'>, price=3154.0, (2020, 7, 8, 0, 0, ))
orderid='5', tradeid='5', '空'>'开'>, price=3154.0, (2020, 7, 8, 0, 0, ))
orderid='6', tradeid='6', '多''平'>, price=3154.0, (2020, 7, 8, 4, 0, ))
orderid='7', tradeid='7', '多'>'开'>, price=3154.0, (2020, 7, 8, 4, 0, ))
orderid='8', tradeid='8', '空''平'>, price=3111.25, (2020, 7, 9, 23, 0, ))
orderid='9', tradeid='9', '空'>'开'>, price=3111.25, (2020, 7, 9, 23, 0, ))
orderid='10', tradeid='10', '多''平'>, price=3121.75, (2020, 7, 10, 23, 0, ))
orderid='11', tradeid='11', '多'>'开'>, price=3121.75, (2020, 7, 10, 23, 0, ))
orderid='12', tradeid='12', '空''平'>, price=3132.5, (2020, 7, 14, 23, 0, ))
orderid='13', tradeid='13', '空'>'开'>, price=3132.5, (2020, 7, 14, 23, 0, ))
orderid='16', tradeid='14', '多''平'>, price=3183.5, (2020, 7, 17, 22, 0, ))
orderid='17', tradeid='15', '多'>'开'>, price=3183.5, (2020, 7, 17, 22, 0, ))
可以看到7月16日bar cross below的交易在trades list里面没有
这个版本
project = 'vnpy'
copyright = '2019, vn.py Team'
author = 'vn.py Team'
version = '2.0.3'
release = '2.0.3'
如题,测试双均线策略的时候,onbar函数的cross over和cross below的时候打印出交易记录。
if cross_over:
print(">>> bar cross over.", bar.datetime, bar.close_price, self.fast_ma0, self.fast_ma1, self.slow_ma0, self.slow_ma1)
if self.pos == 0:
self.buy(bar.close_price, 1)
elif self.pos < 0:
self.cover(bar.close_price, 1)
self.buy(bar.close_price, 1)
elif cross_below:
print(">>> bar cross below.", bar.datetime, bar.close_price, self.fast_ma0, self.fast_ma1, self.slow_ma0, self.slow_ma1)
在回测的时候,发现在上一步骤打印出的交易记录和回测K线图上的交易箭头指示不匹配。
随后我就在class CandleChartDialog(QtWidgets.QDialog)的如下函数打印出来trade记录, 发现和第一步走打印出的交易记录不匹配。这个trade list里面的记录少了一些。请问是怎么回事呢?
def generate_trade_pairs(trades: list) -> list:
""""""
long_trades = []
short_trades = []
trade_pairs = []
idx = 0
for trade in trades:
trade = copy(trade)
idx += 1
print(">>>trade[",idx,"]:", trade) //加日志打印出trade记录。
求 “加入主图均线” 代码,谢谢。。。
好像ES这个品种不行。我试了试EUR-USD,没有找不到合约的错误,报下面这个日期格式错误。
ES这个品种有啥特殊的么?
Traceback (most recent call last):
File "E:\james\vn\vnpy-master\vnpy\app\data_manager\ui\widget.py", line 590, in download
count = self.engine.download_bar_data(symbol, exchange, interval, start)
File "E:\james\vn\vnpy-master\vnpy\app\data_manager\engine.py", line 217, in download_bar_data
req, contract.gateway_name
File "E:\james\vn\vnpy-master\vnpy\trader\engine.py", line 216, in query_history
return gateway.query_history(req)
File "E:\james\vn\vnpy-master\vnpy\gateway\ib\ib_gateway.py", line 219, in query_history
return self.api.query_history(req)
File "E:\james\vn\vnpy-master\vnpy\gateway\ib\ib_gateway.py", line 766, in query_history
delta = end - req.start
TypeError: can't subtract offset-naive and offset-aware datetimes
代码中看到contracts是又这个合约的。但是没有看到代码去更新到主界面这个“名称” 输入框啊。
另外,我看到代码中是用这个文件ib_contract_data.db来保存合约的,但是 我在C:\Users\jameslai.vntrader下面没有看到这个文件
jameslai: show all contracts
[ContractData(gateway_name='IB', symbol='ES-20210319-USD-FUT', exchange=<Exchange.GLOBEX: 'GLOBEX'>, name='E-\xc3\xd4\xc4\xe3\xb1\xea\xc6\xd5500ָ\xca\xfd-E-mini S&P 500', product=<Product.FUTURES: '期货'>, size='50', pricetick=0.25, min_volume=1, stop_supported=True, net_position=True, history_data=True, option_strike=0, option_underlying='', option_type=None, option_expiry=None, option_portfolio='', option_index='')]
查询成功,但是“名称” 这个输入框里面还是没有内容啊
查询窗口里面也没有什么操作按钮,怎么才能添加到 “名称”呢?
看了下是这个contract为NULL。
合约已经订阅成功,请问为何这个contract为空呢?
已订阅。如图
我订阅了实时行情,在tws里面也可以看到ES的实时行情啊,还需要订阅什么其他的行情吗?
请问解决了吗?我跟你一样的问题。