VeighNa量化社区
你的开源社区量化交易平台
jameslai's Avatar
Member
离线
36 帖子
声望: 0

也就是说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'

The short X.Y version

version = '2.0.3'

The full version, including alpha/beta/rc tags

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='')]

description

查询成功,但是“名称” 这个输入框里面还是没有内容啊
查询窗口里面也没有什么操作按钮,怎么才能添加到 “名称”呢?

看了下是这个contract为NULL。
合约已经订阅成功,请问为何这个contract为空呢?
description

已订阅。如图

description

我订阅了实时行情,在tws里面也可以看到ES的实时行情啊,还需要订阅什么其他的行情吗?

请问解决了吗?我跟你一样的问题。

© 2015-2022 微信 18391752892
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】