casf wrote:
MTF wrote:
需要修改on_bar函数名称进行调用
def on_bar(self, bar: BarData):
#self.bg15min.update_bar(bar)
这段调用被你注释了,所以不会合成15分钟K线,也就导致不会触发后续的指标计算
我取消掉了注释,这个策略运行起来其图形界面变量仍然显示为0,请问我是不是有其他地方写错了呢?不知道问题出在哪了
代码如下:
```
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)
```
MTF wrote:
需要修改on_bar函数名称进行调用
def on_bar(self, bar: BarData):
#self.bg15min.update_bar(bar)
这段调用被你注释了,所以不会合成15分钟K线,也就导致不会触发后续的指标计算
我取消掉了注释,这个策略运行起来其图形界面变量仍然显示为0,请问我是不是有其他地方写错了呢?不知道问题出在哪了
现在是这样了,同一个品种运行别的策略是图形界面是正常更新没有问题的,但是这个不行
MTF wrote:
如果是指图形界面数据没有刷新的话,查下是否漏了put_event函数调用
这是全部代码了,并没有漏掉put_event函数,您可以帮我看看问题出在哪里吗,谢谢您
现在是图形界面数据都显示为0了
`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)
self.am15min = ArrayManager()
def on_init(self):
self.write_log("策略初始化")
self.load_bar(20)
def on_start(self):
"""
Callback when strategy is started.
"""
#策略启动时,调用此函数
self.write_log("策略启动")
def on_stop(self):
"""
Callback when strategy is stopped.
"""
self.write_log("策略停止")
def on_tick(self, tick: TickData):
"""
Callback of new tick data update.
"""
#接受tick数据用于合成bar数据
self.bg15min.update_tick(tick)
#需要修改on_bar函数名称进行调用
#def on_bar(self, bar: BarData):
#self.bg15min.update_bar(bar)
def on_15min_bar(self, bar: BarData):
self.cancel_all()
am = self.am15min
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):
"""
Callback of new trade data update.
"""
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):
"""
Callback of new order data update.
"""
#处理委托订单时调用
pass
def on_stop_order(self, stop_order: StopOrder):
"""
Callback of stop order update.
"""
#处理停止单回报时调用
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)
`
请问是不是哪里出现问题才会导致entry_up及之后的变量一直没有变化?
我有推送足够多的数据,策略是成功运行的,如果用我未更改的vnpy自带的turtle策略,运行是没有任何问题的,但是更改之后,这些变量一直没有任何变化。
`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)
self.am15min = 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()
am = self.am15min
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`
我把vnpy自带的turtle策略修改了一下,我想基于15min级别进行交易,但是如图所示的数值一直都没有变化过,我想知道是什么问题?
代码如下所示:
比如万分之二的手续费,我应该写0.0002吗
volume_array = am.volume(self.volume_length, array=True)
self.volume_value = volume_array[-1]
self.volume_ma = volume_array[-self.volume_ma_length:].mean()
您好,我想把成交量元素加入自己的策略里,请问volume_ma和volume_length应当如何设置呢?
我发现在开发策略的时候,我有时候不知道某些变量应该如何设置,有的地方不知道怎么去写,可能有些没有概念,请问平台上有没有什么文档或者其它内容可以帮助我更好地开放自己的策略?
MTF wrote:
D:\veighna_studio\lib\site-packages\vnpy_ctastrategy\strategies
还有一个问题,自己开发的策略文件名应当与类名一样吗,还是可以随意命名?
MTF wrote:
D:\veighna_studio\lib\site-packages\vnpy_ctastrategy\strategies
请问自己开发的策略也可以放在这个文件夹里面吗
MTF wrote:
D:\veighna_studio\lib\site-packages\vnpy_ctastrategy\strategies
谢谢!
如图,应该有一个cta_strategy的文件夹吧 但是我这里没有
我想找到这些策略的py文件
MTF wrote:
casf wrote:
MTF wrote:
导入数据的时候,代码要写【i2305】,不要加上【.DCE】的后缀
问题已经解决,谢谢您。
此外我还有些问题。
1.load_bar函数默认加载“十天”的数据,那我运行策略时候导入的是15min级别的数据这样可以吗?
- 请问SQLite的database.database字段应该如何配置?我看文档写的是“数据库文件(相对于trader目录)”,我并不太理解这个意思。
感谢您的耐心解答!
- 理论上可以,实盘上不推荐了
- 默认不配置就行,会在C:\users\xxx\.vntrader目录下生成database.db文件存储
好的,谢谢您
我在启动CTA应用模块时会出现:
找不到数据库驱动vnpy,使用默认的SQLite数据库
找不到数据服务驱动vnpy,使用默认的RQData数据服务
请问这种情况我需要做什么配置上的更改吗
MTF wrote:
导入数据的时候,代码要写【i2305】,不要加上【.DCE】的后缀
问题已经解决,谢谢您。
此外我还有些问题。
1.load_bar函数默认加载“十天”的数据,那我运行策略时候导入的是15min级别的数据这样可以吗?
数据我是已经导入到本地了,更新到了最新数据,数据量也是足够的。
为什么pos、fast_ma0等变量数值为0呢?是不是我的数据配置问题?我没有用米筐等等,是下载到本地的数据。如果是数据配置的问题,那我应该如何设置呢
删除以后再次添加环境变量也无法成功运行程序。双击无反应。我不知道是不是自己添加的环境变量路径错误。
请问是D:\vnpy\Scripts和D:\vnpy\吗?
系统内有多个python,想在不卸载其它python的情况下解决这个问题。