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

yuanhuei wrote:

on_trade是交易所告诉你你的单子成交了,on_bar只是VNPY里面合成了一个bar之后的回调函数。send_order之后不是说就能成交,要等on_trade被调用才知道的
那需要自己更新 self.pos么?

导致回测非常不准 因为有很多没有交易量的数据 k线都是完全一样的
我这里用的是美国西部时间, 按道理讲 2021-09-16 13:00:00-00:00 应该是09-16那天最后一根k线。 但是这里一直找到了盘后交易都收盘的数据。 而且ib_gate里已经默认使用了只用常规交易时间段的数据 (倒数第三个参数)

self.client.reqHistoricalData(
            self.reqid,
            ib_contract,
            end_str,
            duration,
            bar_size,
            bar_type,
            0,
            1,
            False,
            []
        )

参考https://www.vnpy.com/forum/topic/6097-guan-yu-ying-tou-jie-kou-de-zhong-da-wen-ti-fan-kui?page=1#pid21592

description

合约手数

具体的order 下单数量不是在on_bar里已经写好了么?为什么这里还好传送一个size呢? 求解

btengine.set_parameters(
    vt_symbol=vt_symbol,
    interval="1m",
    start=test_start,
    end=test_end,
    rate = 0,
    slippage=slippage,
    size=1,
    pricetick=pricetick,
    capital=capital,
)

hxxjava wrote:

问题解决啦,步骤如下!

(注:本人原来使用的是SQLite数据库。)

1 增加全局设置:

如上图把关于datafeed的
datafeed.name 为 rqdata
datafeed.username 为 米筐用户名称
datafeed.password 为 米筐用户密码
保存设置后退出vnpy软件。

2. 修改数据名称

进入个人目录,修改其中的.trader\database.db,为.trader\database-old.db。系统重新启动的时候会出现创建新的database.db,如果你database-old.db中还有你不能割舍的数据,日后再想办法重新编程序迁移数据。

3. 修改vnpy_ctastrategy\engine.py中第151行,这里有错误,修改如下:

    def query_bar_from_datafeed(
        self, symbol: str, exchange: Exchange, interval: Interval, start: datetime, end: datetime
    ):
        """
        Query bar data from datafeed.
        """
        req = HistoryRequest(
            symbol=symbol,
            exchange=exchange,
            interval=interval,
            start=start,
            end=end
        )
        # data = self.datafeed.query_history(req) # hxxjava
        data = self.datafeed.query_bar_history(req)   
        return data

4. 重新启动vnpy,下面的几个问题就解决了:

  1. 数据管理模块无法下载合约数据的问题
  2. CTA Backtester模块无法下载数据的问题
  3. CTA Strategy模块无法初始化和启动策略的问题

其他模块是否有问题还未可知!

赞lz大神 这个错误能merge到代码库么

这样比较好分析策略失败的原因

刚刚看到 原来是def run_backtesting(self): 里面用前面几天的数据inited的

只是不太理解 为什么不根据inited了多少根bar来决定是不是break 而是要用days呢?

if self.datetime and data.datetime.day != self.datetime.day:
                day_count += 1
                if day_count >= self.days:
                    break

而且里面的high low值都为0.

这一部分没怎么看懂 请教一下 这是期望看到的么?
description

另外 在BacktestingEngine里
看到这个load_bar并没有做任何事情啊! 他不是应该调用call_back函数么?

    def load_bar(
        self,
        vt_symbol: str,
        days: int,
        interval: Interval,
        callback: Callable,
        use_database: bool
    ):
        """"""
        self.days = days
        self.callback = callback

望指教 谢谢!

judge-lin wrote:

我觉得可能不用这么复杂,现在BarGenerator是默认生成1min的k,可以试试改成自动生成X秒的k,当然代价就是无法使用window_bar了

自己加一个一秒钟的interval应该就可以了吧? 添加一个sec_window_bar? 理论上不需要1m吧? 60sec window_bar?

而且TWS里没有任何成交记录

description

xiaohe wrote:

可以去github拉取一下dev分支最新的代码再试试看

我用的是最新的分支 , IB paper trading, 但是挂的单一直处于 提交中, 而且TWS里面也没任何记录

description

description

选择的是 EUR-USD-CASH.IDEALPRO,

xiaohe wrote:

你qapp = create_qapp()这行代码用了两次,会报错的。去掉多余的代码后我这边可以打开,可以试着加载其他的app看看能否成功,如果不可以可能是环境配置问题,如果可以就请查看一下vnpy包里algo_trading的代码是否有缺失,可能是安装不完全导致的

谢谢回复! 我还是有这个错误 我看了vnpy那个文件夹 文件都在啊 很奇怪为什么会找不到.algos自文件。 另外我是通过

sys.path.insert(0, ".")
sys.path.insert(0, os.path.join("..", "vnpy"))

来调用vnpy的。没有安装 不知道是不是这个原因?但是感觉这个错误不合理啊

 trade_bot $ python main_window.py 
找不到数据服务驱动vnpy_,使用默认的RQData数据服务
Traceback (most recent call last):
  File "main_window.py", line 127, in <module>
    main()
  File "main_window.py", line 51, in main
    main_engine.add_app(AlgoTradingApp)
  File "../vnpy/vnpy/trader/engine.py", line 99, in add_app
  File "../vnpy/vnpy/trader/engine.py", line 74, in add_engine
  File "../vnpy/vnpy/app/algo_trading/engine.py", line 34, in __init__
  File "../vnpy/vnpy/app/algo_trading/engine.py", line 48, in load_algo_template
ModuleNotFoundError: No module named 'vnpy.app.algo_trading.algos'

ModuleNotFoundError: No module named 'vnpy.app.algo_trading.algos'

import os, sys

sys.path.insert(0, ".")
sys.path.insert(0, os.path.join("..", "vnpy"))

from vnpy.event import EventEngine

from vnpy.trader.engine import MainEngine
from vnpy.trader.ui import MainWindow, create_qapp

# from vnpy.ctp import CtpGateway
# from vnpy.ctptest import CtptestGateway

from vnpy.gateway.ib import IbGateway
# from vnpy.gateway.tiger import TigerGateway
# from vnpy.gateway.tap import TapGateway
# from vnpy.gateway.da import DaGateway


# from howtrader.app.cta_strategy import CtaStrategyApp
# from howtrader.app.data_manager import DataManagerApp
# from howtrader.app.data_recorder import DataRecorderApp
# from howtrader.app.algo_trading import AlgoTradingApp
# from howtrader.app.cta_backtester import CtaBacktesterApp
# from howtrader.app.risk_manager import RiskManagerApp
# from howtrader.app.spread_trading import SpreadTradingApp


from vnpy.app.cta_strategy import CtaStrategyApp

from vnpy.app.cta_backtester import CtaBacktesterApp
from vnpy.app.spread_trading import SpreadTradingApp
from vnpy.app.algo_trading import AlgoTradingApp
# from vnpy.app.option_master import OptionMasterApp
from vnpy.app.portfolio_strategy import PortfolioStrategyApp
from vnpy.app.script_trader import ScriptTraderApp
# from vnpy.app.market_radar import MarketRadarApp
# from vnpy.chartwizard import ChartWizardApp
# from vnpy.app.rpc_service import RpcServiceApp
# from vnpy.app.excel_rtd import ExcelRtdApp
from vnpy.app.data_manager  import DataManagerApp
from vnpy.app.data_recorder import DataRecorderApp
from vnpy.app.risk_manager import RiskManagerApp
from vnpy.app.spread_trading import SpreadTradingApp

from vnpy.app.web_trader import WebTraderApp
from vnpy.app.portfolio_manager import PortfolioManagerApp
from vnpy.app.paper_account import PaperAccountApp


def main():
    """"""
    qapp = create_qapp()
    qapp = create_qapp()

    event_engine = EventEngine()

    main_engine = MainEngine(event_engine)

    main_engine.add_gateway(IbGateway)
    main_engine.add_app(CtaStrategyApp)
    main_engine.add_app(CtaBacktesterApp)
    main_engine.add_app(DataManagerApp)
    main_engine.add_app(AlgoTradingApp)
    main_engine.add_app(DataRecorderApp)
    main_engine.add_app(RiskManagerApp)
    main_engine.add_app(SpreadTradingApp)

    main_window = MainWindow(main_engine, event_engine)
    main_window.showMaximized()


    # main_engine.add_gateway(CtptestGateway)
    # main_engine.add_gateway(MiniGateway)
    # main_engine.add_gateway(MinitestGateway)
    # main_engine.add_gateway(FemasGateway)
    # main_engine.add_gateway(SoptGateway)
    # main_engine.add_gateway(SopttestGateway)
    # main_engine.add_gateway(SecGateway)    
    # main_engine.add_gateway(UftGateway)
    # main_engine.add_gateway(EsunnyGateway)
    # main_engine.add_gateway(HsoptionGateway)
    # main_engine.add_gateway(XtpGateway)
    # main_engine.add_gateway(ToraStockGateway)
    # main_engine.add_gateway(ToraOptionGateway)
    # main_engine.add_gateway(OesGateway)
    # main_engine.add_gateway(ComstarGateway)
    # main_engine.add_gateway(FutuGateway)
    # main_engine.add_gateway(IbGateway)
    # main_engine.add_gateway(TigerGateway)
    # main_engine.add_gateway(TapGateway)
    # main_engine.add_gateway(DaGateway)

    # main_engine.add_app(CtaStrategyApp)
    # main_engine.add_app(CtaBacktesterApp)
    # main_engine.add_app(SpreadTradingApp)
    # main_engine.add_app(AlgoTradingApp)
    # main_engine.add_app(OptionMasterApp)
    # main_engine.add_app(PortfolioStrategyApp)
    # main_engine.add_app(ScriptTraderApp)
    # main_engine.add_app(MarketRadarApp)
    # main_engine.add_app(ChartWizardApp)
    # main_engine.add_app(RpcServiceApp)
    # main_engine.add_app(ExcelRtdApp)
    # main_engine.add_app(DataManagerApp)
    # main_engine.add_app(DataRecorderApp)
    # main_engine.add_app(RiskManagerApp)
    # main_engine.add_app(WebTraderApp)
    # main_engine.add_app(PortfolioManagerApp)
    # main_engine.add_app(PaperAccountApp)

    main_window = MainWindow(main_engine, event_engine)
    main_window.showMaximized()

    qapp.exec()


if __name__ == "__main__":
    main()

回测的时候 发现最大回测都百分之负两百了,最后居然还盈利了。这早爆仓了吧。感觉不太合理

用Python的交易员 wrote:

数据量只有2880,太少了不足以满足策略初始化的要求,多准备点数据吧
谢谢 我发现是因为策略初始化只能选择日为周期,但是我只有14秒周期的一天的数据呀。我后来手动把这个周期改成不一定按照日了

发现new_bar 函数调用这个self.update_daily_close(bar.close_price)了 能不能自己指定interval呢?

单步调试发现 执行了self.buy但是成交记录一直为空

if cross_over:
            #import pdb; pdb.set_trace()
            if self.pos == 0:
                self.buy(bar.close_price+1000, 1)
            elif self.pos < 0:
                self.cover(bar.close_price, 1)
                self.buy(bar.close_price, 1)

2019-10-19 10:39:37.836007 开始加载历史数据
2019-10-19 10:39:38.160493 加载进度:########## [100%]
2019-10-19 10:39:38.160539 历史数据加载完成,数据量:2880
2019-10-19 10:39:38.196349 策略初始化完成
2019-10-19 10:39:38.196404 开始回放历史数据
2019-10-19 10:39:38.196462 历史数据回放结束
2019-10-19 10:39:38.196476 开始计算逐日盯市盈亏
2019-10-19 10:39:38.196484 成交记录为空,无法计算
2019-10-19 10:39:38.196493 开始计算策略统计指标
2019-10-19 10:39:38.196500 ------------------------------
2019-10-19 10:39:38.196507 首个交易日:
2019-10-19 10:39:38.196513 最后交易日:
2019-10-19 10:39:38.196520 总交易日: 0
2019-10-19 10:39:38.196526 盈利交易日: 0
2019-10-19 10:39:38.196532 亏损交易日: 0
2019-10-19 10:39:38.196544 起始资金: 1,000,000.00
2019-10-19 10:39:38.196552 结束资金: 0.00
2019-10-19 10:39:38.196560 总收益率: 0.00%
2019-10-19 10:39:38.196567 年化收益: 0.00%
2019-10-19 10:39:38.196574 最大回撤: 0.00
2019-10-19 10:39:38.196581 百分比最大回撤: 0.00%
2019-10-19 10:39:38.196588 总盈亏: 0.00
2019-10-19 10:39:38.196595 总手续费: 0.00
2019-10-19 10:39:38.196602 总滑点: 0.00
2019-10-19 10:39:38.196609 总成交金额: 0.00
2019-10-19 10:39:38.196784 总成交笔数: 0
2019-10-19 10:39:38.196806 日均盈亏: 0.00
2019-10-19 10:39:38.196815 日均手续费: 0.00
2019-10-19 10:39:38.196822 日均滑点: 0.00
2019-10-19 10:39:38.196829 日均成交金额: 0.00
2019-10-19 10:39:38.196836 日均成交笔数: 0
2019-10-19 10:39:38.196842 日均收益率: 0.00%
2019-10-19 10:39:38.196849 收益标准差: 0.00%
2019-10-19 10:39:38.196856 Sharpe Ratio: 0.00
2019-10-19 10:39:38.196863 收益回撤比: 0.00

用Python的交易员 wrote:

交易盘中,CTP/IB都能直接收到实时的Tick数据,历史的数据需要自行记录或者通过数据服务商购买,比如RQData,具体怎么用请看公众号vnpy-community的教程
谢谢!, 今天在robinhood上下载了一些这样15秒的数据,请问怎么用呢?
{"data_points": [{"begins_at": "2019-10-14T01:10:30Z", "open_price": "8284.810000", "close_price": "8285.125000", "high_price": "8298.360000", "low_price": "8274.490000", "volume": 0, "session": "reg", "interpolated": false}, {"begins_at": "2019-10-14T01:10:45Z", "open_price": "8285.125000", "close_price": "8285.515000", "high_price": "8296.225000", "low_price": "8275.415000", "volume": 0, "session": "reg", "interpolated": false}, {"begins_at": "2019-10-14T01:11:00Z", "open_price": "8293.995000", "close_price": "8286.355000", "high_price": "8298.425000", "low_price": "8275.215000", "volume": 0, "session": "reg", "interpolated": false}, {"begins_at": "2019-10-14T01:11:15Z", "open_price": "8277.580000", "close_price": "8286.410000", "high_price": "8297.800000", "low_price": "8275.835000", "volume": 0, "session": "reg", "interpolated": false}, {"begins_at": "2019-10-14T01:11:30Z", "open_price": "8277.685000", "close_price": "8285.870000", "high_price": "8296.575000", "low_price": "8275.445000", "volume": 0, "session": "reg", "interpolated": false}, {"begins_at": "2019-10-14T01:11:45Z", "open_price": "8285.870000", "close_price": "8285.840000", "high_price": "8296.650000", "low_price": "8275.630000", "volume": 0, "session": "reg", "interpolated": false}, {"begins_at": "2019-10-14T01:12:00Z", "open_price": "8294.360000", "close_price": "8287.010000", "high_price": "8298.985000", "low_price": "8275.830000", "volume": 0, "session": "reg", "interpolated": false}, {"begins_at": "2019-10-14T01:12:15Z", "open_price": "8278.575000", "close_price": "8286.350000", "high_price": "8297.435000", "low_price": "8276.300000", "volume": 0, "session": "reg", "interpolated": false}, {"begins_at": "2019-10-14T01:12:30Z", "open_price": "8286.350000", "close_price": "8287.380000", "high_price": "8298.325000", "low_price": "8275.120000", "volume": 0, "session": "reg", "interpolated": false}, {"begins_at": "2019-10-14T01:12:45Z", "open_price": "8278.700000", "close_price": "8286.720000", "high_price": "8298.430000", "low_price": "8276.690000", "volume": 0, "session": "reg", "interpolated": false}, {"begins_at": "2019-10-14T01:13:00Z", "open_price": "8278.090000", "close_price": "8286.715000", "high_price": "8297.620000", "low_price": "8275.800000", "volume": 0, "session": "reg", "interpolated": false},

是需要合并同一秒的sell 和 buy数据么? 还是遇到sell的tick把buy的volume设置成0就可以了?

谢谢! 那市场上的tick数据从哪来的呢?实盘交易的时候 系统收到的是tick数据么?

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

沪公网安备 31011502017034号

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