如题,
谢谢
我们都知道常说的dual thrust策略是根据开盘价加减range得到一个上下轨的范围,突破之后进行入场
vnpy的DT策略,有些 不同,它是设置只要比开盘价高就用上轨的价格一直发出买入信号,反之卖空。
我想知道这样做的好处是什么?有什么优势吗?
from vnpy.app.cta_strategy import (
CtaTemplate,
StopOrder,
TickData,
BarData,
TradeData,
OrderData,
BarGenerator,
ArrayManager,
)
from vnpy.trader.constant import Direction
class ChatGptDt(CtaTemplate):
""""""
author = "vn.py"
vt_symbol = "IF2305.CFFEX"
fixed_size = 1
atr_length = 22
atr_ma_length = 10
k1 = 0.5
k2 = 0.5
trading_window = 30
atr_value = 0
atr_ma_value = 0
range_up = 0
range_down = 0
long_entry = 0
long_exit = 0
short_entry = 0
short_exit = 0
trading_window_high = 0
trading_window_low = 0
exit_long = False
exit_short = False
parameters = [
"fixed_size",
"atr_length",
"atr_ma_length",
"k1",
"k2",
"trading_window",
]
variables = [
"atr_value",
"atr_ma_value",
"range_up",
"range_down",
"long_entry",
"long_exit",
"short_entry",
"short_exit",
"trading_window_high",
"trading_window_low",
"exit_long",
"exit_short",
]
def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
""""""
super().__init__(cta_engine, strategy_name, vt_symbol, setting)
self.bg = BarGenerator(self.on_bar)
self.am = ArrayManager()
def on_init(self):
"""
Callback when strategy is inited.
"""
self.write_log("策略初始化")
self.load_bar(10)
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.
"""
self.bg.update_tick(tick)
def on_bar(self, bar: BarData):
"""
Callback of new bar data update.
"""
self.am.update_bar(bar)
if not self.am.inited:
return
self.calculate_atr()
self.calculate_range()
self.calculate_entry_exit()
self.calculate_trading_window()
self.calculate_exit()
if self.pos == 0:
self.entry_long()
self.entry_short()
elif self.pos > 0:
self.exit_long()
self.entry_short()
elif self.pos < 0:
self.exit_short()
self.entry_long()
self.put_variables_event()
def calculate_atr(self):
""""""
atr_array = self.am.atr(self.atr_length, array=True)
self.atr_value = atr_array[-1]
self.atr_ma_value = atr_array[-self.atr_ma_length:].mean()
def calculate_range(self):
""""""
self.range_up = self.k1 * self.atr_value +self.am.high_array[-self.trading_window:].max()
self.range_down = self.k2 * self.atr_value - self.am.low_array[-self.trading_window:].min()
def calculate_entry_exit(self):
""""""
self.long_entry = self.range_up
self.long_exit = self.atr_ma_value
self.short_entry = self.range_down
self.short_exit = self.atr_ma_value
def calculate_trading_window(self):
""""""
self.trading_window_high = self.am.high_array[
-self.trading_window:
].max()
self.trading_window_low = self.am.low_array[
-self.trading_window:
].min()
def calculate_exit(self):
""""""
self.exit_long = (
self.pos > 0
and self.am.low_array[-1] < self.trading_window_low
)
self.exit_short = (
self.pos < 0
and self.am.high_array[-1] > self.trading_window_high
)
def entry_long(self):
""""""
if self.close_price > self.long_entry:
self.buy(self.long_entry, self.fixed_size, True)
def exit_long(self):
""""""
if self.exit_long:
self.sell(self.long_exit, abs(self.pos), True)
def entry_short(self):
""""""
if self.close_price < self.short_entry:
self.short(self.short_entry, self.fixed_size, True)
def exit_short(self):
""""""
if self.exit_short:
self.cover(self.short_exit, abs(self.pos), True)
据理解,这个json文件是缓存策略初始化数据的,每次策略启动会读取这个文件内容。
现在遇到的问题是它(最上面这个)这个数据已经三天没有变化了,
下面两个是我做对照,在最新一天添加的策略。
请问这是什么原因导致的呢?
夜盘的日k线是怎么合成的?
vnpy的BG 会自己根据有夜盘的品种合成相应的日k线吗?
000
想写个突破均线开仓的策略
但是获取k线收盘价不知道如何操作了
我的想法是从arrarymanager里面提取最新的k线收盘价
但是它好像是ndarray数列还是什么的,请问能从这里面取到吗?用什么方法呢?
或者有没有其他更好的方法取到最新几根k线收盘价呢?
折腾了两天,实在不知道怎么做了
谢谢
初衷:(基于双均线策略)想规避开盘前后的剧烈波动,不想持隔夜仓。想加入交易时间段的方法
我是这样写的:
DAY_START = time(9, 15)
DAY_END = time(14, 45)
NIGHT_START = time(21, 15)
NIGHT_END = time(22, 45)
TIME_NOW = datetime.now().time()
if DAY_END >= TIME_NOW >= DAY_START or NIGHT_END >= TIME_NOW >= NIGHT_START:
if cross_over:
if self.pos == 0:
self.buy(bar.close_price, 1,stop=True)
elif self.pos < 0:
self.cover(bar.close_price, 1,stop=True)
self.buy(bar.close_price, 1,stop=True)
elif cross_below:
if self.pos == 0:
self.short(bar.close_price, 1,stop=True)
elif self.pos > 0:
self.sell(bar.close_price, 1,stop=True)
self.short(bar.close_price, 1,stop=True)
self.put_event()
# 如果不在交易时间,停止交易并且清仓
else:
if self.pos > 0:
self.cover(bar.close_price, 1,stop=True)
elif self.pos < 0:
self.short(bar.close_price, 1,stop=True)
else:
self.cancel_all()
self.put_event()
我遇到的问题是:既没有报错,也能运行到最底部。但是回测的时候显示成交记录为空。不知道哪里写错了。
是不是我判断的逻辑,或者放的位置不正确?请大佬指点一下。
这不是一个提问,大神可以不用看了哈
自己做穿透认证遇到的问题,希望可以帮到新人
如果按照操作替换了API的dll文件还是报错4040,只是行情接口报错,但是交易接口可以成功连接,可以查看账户信息,可以查询合约,就可以不必理会这个4040错误。一样可以通过。
还是有几个地方不太明白,想请教一下:
1、关于米筐数据,初始化的时候,夜盘的数据是空的。请问这是什么原因呢?
2、如果不使用米筐或其他数据服务商,想使用本地记录的数据的话,把load_bar参数use_database=True就可以了吗?还需要修改其他地方吗?
3、行情记录模块,如果只是用于初始化,那是不是只记录1分钟k线就可以了?如果是这样的话是不是记录间隔60秒即可呢?
4、用于计算均线的k线池array manager ()是不是只要不关机并且运行,是不是一直加载在内存中?如果是这样的话,是不是只要开着机,初始化就一定会在k线池中拿到数据呢?
恳请路过的大神,不惜赐教,谢谢
我有些问题一直不清楚:
1、实盘交易中,是否需要一直接入米筐等数据服务。
2、只做一个品种,螺纹期货。是否有必要购买数据服务。
本着能自己查尽量不麻烦大家的态度学习,但是一直没有发现类似提问。所以恳请大佬们帮忙解答一下,感谢