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,
[]
)
合约手数
具体的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,下面的几个问题就解决了:
- 数据管理模块无法下载合约数据的问题
- CTA Backtester模块无法下载数据的问题
- 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.
这一部分没怎么看懂 请教一下 这是期望看到的么?
另外 在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里没有任何成交记录
xiaohe wrote:
可以去github拉取一下dev分支最新的代码再试试看
我用的是最新的分支 , IB paper trading, 但是挂的单一直处于 提交中, 而且TWS里面也没任何记录
选择的是 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数据么?