在自己的策略中调用时,只cancel此策略所下的单子吗?不会影响到同一个策略针对别的品种下的单子对吗?
好像说的不太清楚,比如我有一个atr_rsi_strategy.py,针对2个品种各添加了1个策略,对品种甲执行的cancel_all()不会影响到对品种乙的订单吧?
在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)
这句话里有个冒号,是什么意思啊?
行情记录加入了大概十几个合约,
收盘后数据管理检查发现很多数据缺失,查LOG看策略的on_bar()都执行了
也就是实时数据应该收到了,但是没有写进数据库mysql,
这是什么原因造成的呢?
电脑性能是比较差的,赛扬N2920+2G内存,跟这个有关系吗?或者说关系大吗?
另外据上所述,实时数据收到了,跟期商的CTP服务应该没关系对吧?
只记录了分钟数据,没有记录tick数据,觉得负担应该不重才对,另外就是写入时间也是10秒,并不算快,策略也很简单只跑了一个,之前测试大约在tick下跑的话跑100多个没问题。也就是策略计算一遍,应该占用0.5/100=0.005秒这么长的时间,不会太占用资源。
还有就是今天上午做了几件事:
1、有VNPY连着CTP的情况下用手机连快期转了一下资金,后在VNPY上运行策略和查看权益都没问题
2、上午策略运行中用数据管理看了一下数据,只更新到昨天收盘,也就没在意
3、中午关闭了VNPY重启了一次电脑,下午继续运行策略,收盘后发现跟回测不一致才发现上午的数据没有写入数据库
这几个动作哪个可能会造成上面的问题呢?如何改进呢?
又检查了一下,有些合约昨天一天的数据都没有,有些合约上午的数据倒是有。
由于调试过程中多次重启软件、重新启动策略,发现会多次开仓
觉得应该是由于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()
https://www.vnpy.com/forum/topic/4283-yong-hu-ce-lue-zen-yao-ke-yi-mei-you-zi-jin-can-shu-ctace-lue-zhang-hu?page=1
https://www.vnpy.com/forum/topic/348-vnpyce-lue-nei-diao-yong-zi-jin-shi-xian-dan-shi-wo-bing-bu-jian-yi-da-jia-shi-yong-dong-tai-zi-jin-cang-wei
上面2个链接都提到了资金的实现,第1个虽然提到了用的接口,但是也不知道怎么直接调用,第2个稍复杂一点,回贴中有人提到直接用self.acc_dict = self.cta_engine.main_engine.engines['oms'].accounts,能用是能用,丑了点
对于
main_engine.get_contract()
和
main_engine.get_account()
怎样在策略文件中直接调用而不用另开类似 def on_account(self,account):的事件调用接口呢?
main_engine.get_account()应该还需要提供acount_id参数,怎么提供给它呢?
看到晚上8:12分会自动登录,想改到8点40多,在哪里可以修改啊
配置mysql之后,每次重启机器运行VNSTUDIO都会出现以下exception,在启动mysql workbench后点击一下local instance mysql 80后连接一下数据库就好了,代码里有自动连接登录吗?
Exception has occurred: RuntimeError (note: full exception trace is shown but execution is paused at: _run_module_as_main)
'cryptography' package is required for sha256_password or caching_sha2_password auth methods
File "C:\vnstudio\Lib\site-packages\pymysql_auth.py", line 144, in sha2_rsa_encrypt
"'cryptography' package is required for sha256_password or caching_sha2_password auth methods"
File "C:\vnstudio\Lib\site-packages\pymysql_auth.py", line 265, in caching_sha2_password_auth
data = sha2_rsa_encrypt(conn.password, conn.salt, conn.server_public_key)
File "C:\vnstudio\Lib\site-packages\pymysql\connections.py", line 932, in _request_authentication
auth_packet = _auth.caching_sha2_password_auth(self, auth_packet)
File "C:\vnstudio\Lib\site-packages\pymysql\connections.py", line 633, in connect
self._request_authentication()
File "C:\vnstudio\Lib\site-packages\pymysql\connections.py", line 353, in init
self.connect()
File "C:\vnstudio\Lib\site-packages\peewee.py", line 4013, in _connect
conn = mysql.connect(db=self.database, **self.connect_params)
File "C:\vnstudio\Lib\site-packages\peewee.py", line 3096, in connect
self._state.set_connection(self._connect())
File "C:\vnstudio\Lib\site-packages\vnpy_mysql\mysql_database.py", line 137, in init
self.db.connect()
File "C:\vnstudio\Lib\site-packages\vnpy\trader\database.py", line 137, in get_database
database = module.Database()
File "C:\vnstudio\Lib\site-packages\vnpy_ctastrategy\engine.py", line 107, in init
self.database: BaseDatabase = get_database()
File "C:\vnstudio\Lib\site-packages\vnpy\trader\engine.py", line 74, in add_engine
engine = engine_class(self, self.event_engine)
File "C:\vnstudio\Lib\site-packages\vnpy\trader\engine.py", line 99, in add_app
engine = self.add_engine(app.engine_class)
File "C:\vnstudio\run.py", line 84, in main
main_engine.add_app(CtaStrategyApp)
File "C:\vnstudio\run.py", line 112, in <module>
main()
File "C:\vnstudio\Lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "C:\vnstudio\Lib\runpy.py", line 96, in _run_module_code
mod_name, mod_spec, pkg_name, script_name)
File "C:\vnstudio\Lib\runpy.py", line 263, in run_path
pkg_name=pkg_name, script_name=fname)
File "C:\vnstudio\Lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "C:\vnstudio\Lib\runpy.py", line 193, in _run_module_as_main (Current frame)
"main", mod_spec)
请教:
看到说数据管理里面不能管理tick数据,那么可以用tick数据回测吗?
想查看tick数据只能用外部的工具了吗?
当行情记录里面删除了某个合约后,相应的数据库里面数据会清除吗?
用VNPY可以清除行情记录的数据吗?
还是说需要用户用外部工具或者mysql的workbench自己去管理里面的数据?
之前用默认的数据库sqlite,改成mysql之后C:\Users\Admin.vntrader下的database.db文件没有更新,
那新的数据库文件放在什么地方了呢?
请教:
实盘时想一直读取当前tick的close作为最新一分钟的close来运行分钟策略,有没有例子呢?
另外还有在一分钟内不重复发单,怎么能做到呢?
这几天浏览论坛,一直520 bad gateway好痛苦啊,感觉像是网站限制访问造成的?
请教:
在run.py中加入
from vnpy_ctastrategy.base import EVENT_CTA_LOG
后,再在后面加入log_engine
# main_engine.add_app(PaperAccountApp)
log_engine = main_engine.get_engine("log") #add log to file
event_engine.register(EVENT_CTA_LOG, log_engine.process_log_event) #add log to file
main_window = MainWindow(main_engine, event_engine)
但是在c:/user/admin/.vntrader/log下的文件大小还是一直为0啊,还需要做什么才能写入log文件呢
全局配置中level为50,log.active,log.console和log.file都是默认的true
502 bad gateway
最近访问论坛时经常出这个错,每次都需要挺长的时间才能恢复访问,
有什么好办法解决吗?
脚本模式
在文件夹examples/vn_trader中找到run.py文件(不是vnstudio下的,需要在github上单独下载)。运行run.py即可进入VN Trader。
这个在用vn studio安装之后怎么用的啊?有没有更详细的说明呢?把vnpy-master\examples\vn_trader下的run.py拷贝到哪个目录下去呢?保持C:\vnstudio\examples\vn_trader这个路径不能直接运行啊,会说No module named 'vnpy'
sqlite是vnstudio安装好后不需做任何配置就可以用了吗?
没有设置任何数据源,只需要用自己的行情数据,可是加入行情记录后好像也看不到啊?
实际上刚添加时有这样的错误
Traceback (most recent call last):
File "c:\vnstudio\lib\site-packages\peewee.py", line 3160, in execute_sql
cursor.execute(sql, params or ())
sqlite3.OperationalError: table dbtickdata has no column named turnover
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "c:\vnstudio\lib\site-packages\vnpy_datarecorder\ui\widget.py", line 157, in process_exception_event
raise exc_info[1].with_traceback(exc_info[2])
File "c:\vnstudio\lib\site-packages\vnpy_datarecorder\engine.py", line 84, in run
self.database.save_tick_data(data)
File "c:\vnstudio\lib\site-packages\vnpy_sqlite\sqlite_database.py", line 208, in save_tick_data
DbTickData.insert_many(c).on_conflict_replace().execute()
File "c:\vnstudio\lib\site-packages\peewee.py", line 1911, in inner
return method(self, database, args, **kwargs)
File "c:\vnstudio\lib\site-packages\peewee.py", line 1982, in execute
return self._execute(database)
File "c:\vnstudio\lib\site-packages\peewee.py", line 2761, in _execute
return super(Insert, self)._execute(database)
File "c:\vnstudio\lib\site-packages\peewee.py", line 2479, in _execute
cursor = database.execute(self)
File "c:\vnstudio\lib\site-packages\peewee.py", line 3173, in execute
return self.execute_sql(sql, params, commit=commit)
File "c:\vnstudio\lib\site-packages\peewee.py", line 3167, in execute_sql
self.commit()
File "c:\vnstudio\lib\site-packages\peewee.py", line 2933, in exit
reraise(new_type, new_type(exc_value, exc_args), traceback)
File "c:\vnstudio\lib\site-packages\peewee.py", line 191, in reraise
raise value.with_traceback(tb)
File "c:\vnstudio\lib\site-packages\peewee.py", line 3160, in execute_sql
cursor.execute(sql, params or ())
peewee.OperationalError: table dbtickdata has no column named turnover
当时点掉了,刚才又莫名点出来这个exception,幸好拷贝下来了,但是再去找却又找不到了