xiaohe wrote:
可以把报错截图贴一下
不是数据源的问题那很可能是合成长周期的代码有问题
可以自己参考下示例策略multi_timeframe_strategy
运行策略没有报错,合成长周期的代码也没有问题。
和multi_timeframe_strategy的差别除了计算数值的部分,就是在我自己的长周期代码里有一个put_event()函数,短周期里也有put_event()。不知道和这个也关系吗?
而且这个问题是在rqdata到期以后突然出现的,之前从来没有过
casf wrote:
MTF wrote:
你这里SQLite的配置看着没什么问题,建议查下你本地的database.db文件里,是否有存入数据了
我查看了,存入数据了。
我用朋友的RQDATA试了一下,发现运行我的主策略时候,图形界面的某些数据就是无法没有办法更新,且无法打印。然后我试着运行了另一个逻辑相似的策略,发现另一个策略的图形界面又可以更新。然后我又试着运行了自己的主策略,此时发现图形界面更新正常,打印正常。
我很确定我的主策略load_bar(),arraymanager()等等参数设置没问题,用的rqdata所以数据量肯定也是足够的。现在不是很明白问题可能出在哪里,请问应该如何排查呢
我写的是多周期策略。异常时候:1min级别的数据全都正常且可以打印,15min级别的数据显示都为0,且无法打印
MTF wrote:
你这里SQLite的配置看着没什么问题,建议查下你本地的database.db文件里,是否有存入数据了
我查看了,存入数据了。
我用朋友的RQDATA试了一下,发现运行我的主策略时候,图形界面的某些数据就是无法没有办法更新,且无法打印。然后我试着运行了另一个逻辑相似的策略,发现另一个策略的图形界面又可以更新。然后我又试着运行了自己的主策略,此时发现图形界面更新正常,打印正常。
我很确定我的主策略load_bar(),arraymanager()等等参数设置没问题,用的rqdata所以数据量肯定也是足够的。现在不是很明白问题可能出在哪里,请问应该如何排查呢
我的rqdata到期了,暂时换回本地数据,我把全局配置里的datafeed.username、password等信息都删掉了,就像之前一样。但是现在想用地本数据使用CTA策略时候显示“rqdata数据服务初始化失败:用户名为空”。而且需要初始化的一些数据显示“0”。请问这种情况怎么办?
buy/sell等开仓指令,下单时候是市价委托吗?
cover是限价吗
我打算用米筐4000的不含TICK数据的服务,我想知道实盘使用时候我获取实时tick级别数据(非历史数据)能否通过CTP接口?会有什么冲突吗
这个问题出现在15min级别的策略运行时,1min级别策略没有问题。
推送的数据量我非常确定是足够的,也没有其他别的问题。
而且上周运行15min策略时,初始化且启动后指标计算就成功了
有时运行15min时,需要等几分钟,指标才能计算成功
但是今天很久了指标数值还是显示0,请问这会是什么原因呢
现在本地数据入库可以通过数据管理模块入库,我想知道现在能不能写一个程序实现,有时候入库数据有点多,一个一个入库有些麻烦
casf wrote:
请问是啥问题呢
没有任何反应,日志没有任何输出
请问是啥问题呢
其次在新设备使用vnpy需要登录,但是我不记得我的账号和密码了,应该咋样查看呢
xiaohe wrote:
你指的打印没有问题是说数据足够am初始化,指标计算正确,成功发出委托指令并收到on_order/on_trade推送吗?
是的,这些都没有问题。
目前我发现我使用1min数据可以回测成功,但是使用15min数据会回测失败,显示成交记录为空。
使用15min数据回测时候,我打印发现on_15min_bar函数似乎没有被调用,在15_min_bar之前打印的都可以成功输出
请问您知道这会是啥问题吗
xiaohe wrote:
自己在策略里打印策略变量排查看看就知道了
谢谢您的反馈
我打印策略变量没啥问题,但是回测还是有问题
14:53:48 ----------------------------------------
14:53:48 开始加载历史数据
14:53:48 加载进度:# [0%]
14:53:48 加载进度:# [10%]
14:53:48 加载进度:## [20%]
14:53:48 加载进度:### [29%]
14:53:48 加载进度:#### [39%]
14:53:48 加载进度:##### [49%]
14:53:48 加载进度:###### [59%]
14:53:48 加载进度:####### [68%]
14:53:48 加载进度:######## [78%]
14:53:48 加载进度:######### [88%]
14:53:48 加载进度:########## [98%]
14:53:48 历史数据加载完成,数据量:1023
14:53:48 策略初始化完成
14:53:48 开始回放历史数据
14:53:48 回放进度:= [0%]
14:53:48 回放进度:== [10%]
14:53:48 回放进度:=== [20%]
14:53:48 回放进度:==== [30%]
14:53:48 回放进度:===== [40%]
14:53:48 回放进度:====== [50%]
14:53:48 回放进度:======= [60%]
14:53:48 回放进度:======== [70%]
14:53:48 回放进度:========= [80%]
14:53:48 回放进度:========== [90%]
14:53:48 回放进度:=========== [100%]
14:53:48 历史数据回放结束
14:53:48 开始计算逐日盯市盈亏
14:53:48 成交记录为空,无法计算
14:53:48 开始计算策略统计指标
14:53:48 策略统计指标计算完成
14:55:00 ----------------------------------------
这样子的结果
xiaohe wrote:
正常应该是策略加载1分钟K线合成15分钟K线
不知道你这里推送的几百条都是15分钟级别的指的是你是加载1分钟K线已经合成了几百条15分钟K线还是你加载的就是几百条15分钟K线
这个问题解决了,谢谢
还有一个问题是,我拿我这个代码去回测,显示成交记录为空无法计算,请问这是什么问题呢,是不是因为我这是15min级别的?
打印发现on_15min_bar()里self.am.update_bar(bar)之后的代码都没有被执行
我觉得可能是am的问题,所以我尝试把arraymanager()的参数改成1,修改之后后面的代码才开始被执行,之前的参数就是默认值size=100
我是VNPY默认数据库加载的数据,推送数据值都有几百条了,现在不明白问题在哪
代码如下:
from vnpy_ctastrategy import (
CtaTemplate,
StopOrder,
Direction,
TickData,
BarData,
TradeData,
OrderData,
BarGenerator,
ArrayManager,
)
from vnpy.trader.constant import Interval
class ver_two_TS_Strategy(CtaTemplate):
""""""
author = "用Python的交易员"
entry_window = 20
exit_window = 10
atr_window = 20
fixed_size = 1
entry_up = 0
entry_down = 0
exit_up = 0
exit_down = 0
atr_value = 0
long_entry = 0
short_entry = 0
long_stop = 0
short_stop = 0
parameters = ["entry_window", "exit_window", "atr_window", "fixed_size"]
variables = ["entry_up", "entry_down", "exit_up", "exit_down", "atr_value"]
def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
""""""
# 类的初始化
super().__init__(cta_engine, strategy_name, vt_symbol, setting)
self.bg15min = BarGenerator(self.on_bar, 15, self.on_15min_bar, interval=Interval.MINUTE)
self.am = ArrayManager()
def on_init(self):
self.write_log("策略初始化")
self.load_bar(20)
def on_start(self):
self.write_log("策略启动")
def on_stop(self):
self.write_log("策略停止")
def on_tick(self, tick: TickData):
self.bg15min.update_tick(tick)
def on_bar(self, bar: BarData):
self.bg15min.update_bar(bar)
def on_15min_bar(self, bar: BarData):
self.cancel_all()
self.am.update_bar(bar)
if not self.am.inited:
return
if not self.pos:
self.entry_up, self.entry_down = self.am.donchian(
self.entry_window)
self.exit_up, self.exit_down = self.am.donchian(self.exit_window)
if not self.pos:
# 计算atr值
self.atr_value = self.am.atr(self.atr_window)
self.long_entry = 0
self.short_entry = 0
self.long_stop = 0
self.short_stop = 0
self.send_buy_orders(self.entry_up)
self.send_short_orders(self.entry_down)
elif self.pos > 0:
self.send_buy_orders(self.entry_up)
sell_price = max(self.long_stop, self.exit_down)
self.sell(sell_price, abs(self.pos), True)
elif self.pos < 0:
self.send_short_orders(self.entry_down)
cover_price = min(self.short_stop, self.exit_up)
self.cover(cover_price, abs(self.pos), True)
# 更新图形界面
self.put_event()
def on_trade(self, trade: TradeData):
if trade.direction == Direction.LONG:
self.long_entry = trade.price
self.long_stop = self.long_entry - 2 * self.atr_value
else:
self.short_entry = trade.price
self.short_stop = self.short_entry + 2 * self.atr_value
def on_order(self, order: OrderData):
pass
def on_stop_order(self, stop_order: StopOrder):
pass
def send_buy_orders(self, price):
t = self.pos / self.fixed_size
if t < 1:
self.buy(price, self.fixed_size, True)
if t < 2:
self.buy(price + self.atr_value * 0.5, self.fixed_size, True)
if t < 3:
self.buy(price + self.atr_value, self.fixed_size, True)
if t < 4:
self.buy(price + self.atr_value * 1.5, self.fixed_size, True)
def send_short_orders(self, price):
t = self.pos / self.fixed_size
if t > -1:
self.short(price, self.fixed_size, True)
if t > -2:
self.short(price - self.atr_value * 0.5, self.fixed_size, True)
if t > -3:
self.short(price - self.atr_value, self.fixed_size, True)
if t > -4:
self.short(price - self.atr_value * 1.5, self.fixed_size, True)
xiaohe wrote:
可以自己先在on_bar和on_15min_bar下打印看看有没有收到bar。如果收到了话然后再在on_15min_bar打印排查一下是不是被策略逻辑过滤了,比如是否满足self.am.inited条件
我按照您说的方法测试了一下,在on_bar底下打印bar或者任何内容都是成功的
但是on_15min_bar这个函数应该是根本没有在策略运行的时候被调用
我无论在on_15min_bar函数的任何位置打印东西都没有结果,比如最开头或者中间或者结尾打印一个print('a'),都没有任何输出
在on_bar函数里的打印都是可以输出的,on_15min_bar函数及以后函数的打印都没有输出
请问这会是什么问题呢
xiaohe wrote:
可以自己先在on_bar和on_15min_bar下打印看看有没有收到bar。如果收到了话然后再在on_15min_bar打印排查一下是不是被策略逻辑过滤了,比如是否满足self.am.inited条件
谢谢您的提醒。
请问我用这个15min级别的策略可以直接做回测吗?会不会因为是15min级别的所以没法做呢