没事了,搞定。
这个本地停止单的逻辑就是下的单都会是市价单吗?
那就有点奇怪啊,之前发的停止单好像没有市价单啊,
我接下来再观察一下
停止单发给交易所,交易所根据当前的价格来决定是否用市价下单?是这样吗?
在C:\vnstudio\Lib\site-packages\vnpy\trader\ui\mainwindow.py中的
self.tabifyDockWidget(active_dock, order_dock)
语句之后加上
self.tabifyDockWidget(active_dock, trade_dock)
self.tabifyDockWidget(active_dock, position_dock)
怎么改完了没有反应呢?
策略on_bar中有:
elif self.pos < 0:
if XXXXX:
self.cover(bar.close_price+5, abs(self.pos), stop=True)
self.write_log(f"cover at price: {bar.close_price} with size {self.pos}")
on_trade中有
self.write_log("on trade")
然而在下单时本应该是close_price+5下出去,却以市价下的单,怎么会出现的呢?
是因为我下单时的价钱低于最新价不能成交了,所以市价单追的?如果是这样,实现在逻辑在哪里啊?
bg: BarGenerator = self.bar_generators.get(vt_symbol, None)
这句话里有个冒号,是什么意思啊?
在增删行情记录的合约时尤其是删除和修改,不通过UI操作,直接修改data_recorder_setting.json文件,试过好像能工作,会不会有隐患?
看起来是个常见问题,那为什么不过滤掉脏数据呢?
另外为什么别人都没有这个问题呢,好奇怪
郭易燔 wrote:
有可能是k线数据合成失败了,为了保证k线合成的准确性,所以默认tick数据的时间是递增的,一旦有乱序的tick则直接抛弃。
理论上是没问题的,但是有时未开盘前会有脏数据,这个数据的时间是任意的,如果恰巧是未来时间的话,那么程序就会认为这个时间是正确的,到这个未来时间为止,之前的数据将全部被抛弃。
行情记录加入了大概十几个合约,
收盘后数据管理检查发现很多数据缺失,查LOG看策略的on_bar()都执行了
也就是实时数据应该收到了,但是没有写进数据库mysql,
这是什么原因造成的呢?
电脑性能是比较差的,赛扬N2920+2G内存,跟这个有关系吗?或者说关系大吗?
另外据上所述,实时数据收到了,跟期商的CTP服务应该没关系对吧?
只记录了分钟数据,没有记录tick数据,觉得负担应该不重才对,另外就是写入时间也是10秒,并不算快,策略也很简单只跑了一个,之前测试大约在tick下跑的话跑100多个没问题。也就是策略计算一遍,应该占用0.5/100=0.005秒这么长的时间,不会太占用资源。
还有就是今天上午做了几件事:
1、有VNPY连着CTP的情况下用手机连快期转了一下资金,后在VNPY上运行策略和查看权益都没问题
2、上午策略运行中用数据管理看了一下数据,只更新到昨天收盘,也就没在意
3、中午关闭了VNPY重启了一次电脑,下午继续运行策略,收盘后发现跟回测不一致才发现上午的数据没有写入数据库
这几个动作哪个可能会造成上面的问题呢?如何改进呢?
又检查了一下,有些合约昨天一天的数据都没有,有些合约上午的数据倒是有。
谢谢指教,看到了load_strategy_data和sync_strategy_data,但是strategy_data中pos是怎么传给策略中的pos的呢?
策略在成交和停止时会将当前策略的状态存入,那么直接关闭APP是不合理的?需要先停止策略再关闭vnstation吗?
我看它是在发生交易时也会存入,其实应该没问题的,对吧?
还有一个问题顺便请教:在非交易时间没有交易所数据推送的时候有什么方法或环境可以仿真数据推送时候的调试呢?
打印了,看起来是对的,
在策略初始化的时候pos一直都是0,
新来一个BAR后,pos就变成1了,这个逻辑上也没问题。
上次在另一个贴子中问过pos在哪里更新的,得到的答案是在vnpy_ctastrategy中engine.py的process_trade_event中
on_trade的更新我理解是发生了交易才会更新,而实际上,加载策略后还没有发生交易,只是过去发生了交易,
策略初始化后应该就更新这个值或者查询账户后就更新这个值,这个是在哪里实现的呢?
看不出来有什么问题啊,对于开仓平仓仓位的逻辑,差不多都是这种写法吧,
在前后几个bar上可能都满足开仓条件,但是应由pos控制不会出现多次开仓才对啊
def on_bar(self, bar: BarData):
if self.pos == 0:
if condition1:
self.buy(bar.close_price, self.lots)
elif condition2:
self.short(bar.close_price, self.lots)
elif self.pos > 0:
if condition3:
self.sell(bar.close_price, abs(self.pos), stop=True)
elif self.pos < 0:
if condition4:
self.cover(bar.close_price, abs(self.pos), stop=True)
self.put_event()
由于调试过程中多次重启软件、重新启动策略,发现会多次开仓
觉得应该是由于pos值不对造成的,但具体是怎么回事呢?
另外就是怎样解决呢?难道要新增一个变量自己控制吗?
不好意思,了解了,要把合约代码和交易所填好
2台机器,VNPY版本都一样,装的Mysql,A机器上导出的CSV文件在B机器上导入之后,
显示导入成功了,但是刷新之后实际上数据并没有更新,重启也不能显示新数据,
也点击了导入数据右边的更新数据,都不能更新。
(B机器上的数据有可能最新的数据比A机器上导出的文件新,但B中间缺了很多数据)
调试工具是vscode
在CtpGateway->connect中加入断点很快就能触发,
在CtpMdApi->onFrontConnected中加入打印也能显示,但是断点不能触发,怎样能触发其中的断点呢?
cross_over = self.fast_ma0 > self.slow_ma0 and self.fast_ma1 < self.slow_ma1
cross_below = self.fast_ma0 < self.slow_ma0 and self.fast_ma1 > self.slow_ma1
在一次交易中,策略在运行时会出现多次cross_over的发生,回测时只会在第一次发生时才会入场,并且由pos控制其后不再入场,
而实盘时由于换合约,可能会在第二次发生时或者之后的几次中任意一次发生时入场,这个是和回测有出入的,取决于策略针对合约是何时开始运行的
那么第一个问题是想知道pos这个变量是在什么地方更新的
第二个问题是想引入一个变量inpos来指示第一次发生之后再发生时不产生入场信号,想在template里面加上这2句
self.inpos = 0
self.variables.insert(3, "inpos")
再在策略中通过控制这个变量来控制入场是否可行?
如果可行,那么在on_init中需要怎样运行策略来有加载历史数据时把这个变量置上呢?有以教我
账户是simnow
def on_bar(self, bar: BarData):
"""
Callback of new bar data update.
"""
self.cancel_all()
am = self.am
am.update_bar(bar)
if not am.inited:
return
。。。
if self.pos == 0:
if 。。。:
self.buy(bar.close_price, tradesize)
self.write_log(f"buy at price: {bar.close_price} with size {tradesize}")
elif 。。。:
self.short(bar.close_price, tradesize)
self.write_log(f"short at price: {bar.close_price} with size {tradesize}")
elif self.pos > 0:
if 。。。:
self.sell(bar.close_price, abs(self.pos), stop=True)
self.write_log(f"sell at price: {bar.close_price} with size {tradesize}")
elif self.pos < 0:
if 。。。:
self.cover(bar.close_price, abs(self.pos), stop=True)
self.write_log(f"cover at price: {bar.close_price} with size {tradesize}")
self.put_event()
MTF wrote:
不推荐在CTA策略中访问底层账户资金数据,原因:
- 资金数据是6秒查询同步(CTP接口),而非实时
- 在策略中基于资金去调整交易仓位,是一种风险很高的操作(万一开仓过重可能导致直接保证金不足)
是的,这个在前面的贴子中都看到有这方面的讨论,但是还是想能实现最好,看看效果,毕竟现在还是simnow模拟,各种风险都可以试一下。
当然,如果技术或代码本身有BUG或风险,也最好能明示一下。