排除基本的语法问题,策略能跑通。
可是,
这个策略是完全实现我的想法吗?怎么验证呢?
一个是可以把所有价格序列和用到的指标值全部打印出来
另一个办法是在k线图上显示相应的价格和指标线,但目前只是1分钟,如果我的策略是30分钟上跑的呢?
另外,怎么显示出来那些指标值呢? 不能像tb,mc那种,很友好地显示出来k线周期选项和指标值显示选项吗?
https://www.tradingview.com/script/sufFpGjC-Supertrend-V1-0-Buy-or-Sell-Signal/
只会写mc,不太会写vnpy,似乎需要用到循环和递归,
请大佬改写一个,谢谢!
mc代码 ```
input:
n(10),
m(3);
variables:
avg(0),up(0),dn(0),trend(0),atr(0),
ST(0);
avg = (h+l)/2;
atr = AvgTrueRange(n);
up = avg + m atr;
dn = avg - m atr;
if c > up[1] then
trend = 1
else if c < dn[1] then
trend = -1;
if trend > 0 and dn < dn[1] then dn=dn[1];
if trend < 0 and up > up[1] then up=up[1];
if trend = 1 then ST = dn else ST = up;
Plot3(st,"SThl2",iff(trend = 1,red,green));
```
对完全程序化自动化没有信心。但脚本策略是不是可以实现这样的功能。
譬如,价格,或者成交量,仓差变动达到一个水平,然后开仓,成交的同时,自动设置上的止损止盈价?
哪个大佬给个示范的脚本呀,谢谢!
譬如
1,某品种 跌破某价格 ,做空,
出发成交后立即设置好止损止盈单。
2,持仓某品种的持仓数量,设置好止损止盈。
谢谢
请问夜盘品种怎么根据1分钟合成日线K线?
现在合成的分割是按照自然日期 ,
是否有交易小节的属性,然后做一个区分判断?
目的:
想将测试回测中的有关变量保存下来,做检查对比(因为策略表现不符合逻辑意图)
操作:
在策略类中一开始定义
log_dict = {}
在on_init():中
#定义要记录的变量
self.log_dict['date'] = []
self.log_dict['close'] = []
self.log_dict['qqe'] = []
self.log_dict['qqesf'] = []
self.log_dict['ma1'] = []
self.log_dict['ma2'] = []
self.log_dict['pos'] = []
然后 在on_bar中,
...
self.put_event()
self.log_dict['date'].append(bar.datetime)
self.log_dict['close'].append(bar.close_price)
self.log_dict['qqe'].append(round(self.qqe[-1], 2))
self.log_dict['qqesf'].append(round(self.qqesf[-1], 2))
self.log_dict['ma1'].append(round(self.ma_fast[-1], 2))
self.log_dict['ma2'].append(round(self.ma_slow[-1], 2))
self.log_dict['pos'].append(self.pos)
在on_stop中
pd.DataFrame(self.log_dict).to_csv('D:\maqqelog.txt')
self.write_log("策略停止")
但程序回测完了,相关图表也输出了,
但D盘没有这个文件,
但如果把这个 pd.DataFrame(self.log_dict).to_csv('D:\maqqelog.txt')
放在on_bar中,程序可能需要每更新一个bar就写一次,特别耗时。
请问:
在on_bar()里有没有可能,用那个变量,检测表现全部跑完?
if XXX:
log.to_csv()这样?
或者要实现我的目的,最好的方式该如何处理呢?
谢谢!
请问,
当根k线收盘走完 条件满足(信号bar) 我想立即在下个k线(入场bar)开盘是买入。
那么回测记录的买开价格是信号bar的close呢 还是下个k线的开盘价呢?
策略回测的权益图
是按 平仓记录更新 还是按日更新呢?
请教个问题,
情况是这样的,
我导入1分钟K线,然后策略是使用这个1分钟合成的60分钟K线周期来进行判断买卖。
那么回放历史数据生成交易信号时,是用1分钟K线“动态模拟” 这个价格运行呢?还是直接使用60分钟K线来进行判断买卖。
两者的回测精确度还是很不少区别,譬如日内小节的一些体市再开始交易的跳空。
RT。
我想把策略回测时的,
K线时间,价格序列,技术指标值 打印输出到文件,以便检查自己写的指标是否正确 (策略移植中)
我的jupyter notebook里,
with open('./log.txt','wt') as f:
print(data['Close'],',',data['MA'],file=f)
这样是可以的,
但写在策略文件的 def on_5min_bar(self, bar: BarData): 里(策略逻辑所在的部分)
写在指标计算结果 的下行,策略回测一遍,找不到这个文件呢。
请问正确打印想观察变量的值的方式是如何 的?
策略,自带的Rsi_atr ,参数默认
品种rb2010
今天发现螺纹有一个开多信号,之前是平仓
但平仓发单是以3615的涨停价来发出的,这是正常的吗?
elif self.pos < 0:
self.intra_trade_low = min(self.intra_trade_low, bar.low_price)
self.intra_trade_high = bar.high_price
short_stop = self.intra_trade_low * \
(1 + self.trailing_percent / 100)
self.cover(short_stop, abs(self.pos), stop=True)
这段代码怎么也看不出来是要涨停价发单呢?
以自带的atr_rsi策略为例,默认参数,品种为rb2010.
vnpy 2.1.2 ctp 的simnow 模拟账户。
if self.atr_value > self.atr_ma:
if self.rsi_value > self.rsi_buy:
self.buy(bar.close_price + 5, self.fixed_size)
elif self.rsi_value < self.rsi_sell:
self.short(bar.close_price - 5, self.fixed_size)
9点开盘立即发单(我理解是上周收盘时就满足了条件)
不过对照文华的1分钟数据,看到Atr(22)与atr_ma(10)满足条件,但RSI(5)并不满足条件>66。(只对监临近的几根Bar,这里假设文华与vnpy里的行情数据一致)
【问题1】如果是这样,那天9点开盘时,不应该发出 多开指令!除非不是next bar模式。因为高开后,rsi是立即满足了。那么是否存在信号闪烁的问题?
【问题2】假设条件逻辑没问题,进场指令都是限价指令,bar.close加减5。
17日最后一个1分钟Bar,收盘价3381,那我理解发出买单应该是3386。但回测来看,不论是否设置滑点,回测里的价格都是 3387。
然后策略实际跑的情况是以3404发单,成交3401。不是应该是限价单吗?这个是我的主要困惑。
问题3,策略运行的委托结果,与回测偏很大是如何产生的,尤其是 后面的翻空操作
5_-957772934_4那个委托,是手动测试交易模块的手动下单(不知道最近老是不成功,订阅不了,下单也老是提交中)
CTP 模拟账户
通过加载运行策略,可以订阅到行情,会在行情列表显示相应的品种;
但在左侧的交易模块,输入品种代码,如交易所SHFE, 品种代码 rb2010.SHFE , 无法获取盘口信息,也无法订阅行情到 行情模块。
有些指标用talib实现不太了。
指标含义大概是这样的,回溯过去几根bar,如果依次走高是上升,返回0,否则 返回1
主要问题是,我需要对返回的结果 进行回溯,不一定是使用最新(最后一个)的结果。
mc代码,接近自然语言,应该比较好理角,供参考
inputs:
InputData( numericseries ),
BarCount( numericsimple ),
NotStrict( truefalse );
vars:
result( 0 ), PrevValue(0), CurrValue(0), Index(0);
PrevValue = InputData[BarCount-1];
result = 0;
For Index = 1 to BarCount-1 begin
CurrValue = InputData[BarCount - 1 - Index];
If (CurrValue < PrevValue) then begin
// indicator is falling, not rising
result = 0;
break;
end;
if(NotStrict = false and CurrValue = PrevValue) then begin
result = 0;
break;
end;
if(CurrValue > PrevValue) then begin
result = 1;
end;
PrevValue = CurrValue;
end;
rising = result;
我尝试的python代码
def IsRisingFunc(self, arrayvalue, barcount: int, NotStrict: bool=True,
array: bool = False
) -> Union[int, np.ndarray]:
""""
判断是上涨趋势,回溯barcount个价格序列,从左向右循环比较,均大为上升
"""
PreValue = arrayvalue[-barcount]
result = []
for num in range(-(barcount-1),0):
CurrValue = arrayvalue[num]
if CurrValue < PreValue:
result.append(0)
break
if NotStrict == False and CurrValue == PreValue:
result.append(0)
break
if CurrValue > PreValue:
result.append(1)
PreValue = CurrValue
resultarray = np.array(result)
if array:
return resultarray
return resultarray[-1]
修改了一下,应该是可以运行了,之前的错误是均线指标调用时,返回序列,直接当数值来比较了,加个[-1]就好了。
现在能回测,但就是返回一个错误提示
File "D:\Tmp\vnpy\strategies\ma_bo_v1.py", line 111, in on_Xmin_bar
array =False
File "d:\vnstudio\lib\site-packages\vnpy\app\xtool\XQuantTool.py", line 219, in SQ_IsRising
return resultarray[-1]
IndexError: index -1 is out of bounds for axis 0 with size 0
在策略文件是这样写的
self.ma_fast = am.sma(self.ma_f_len, array=True)
self.ma_slow = am.sma(self.ma_s_len, array=False)
self.IsRising = am.SQ_IsRising(self.ma_fast,5,NotStrict=True,
array =False
)
# longcond = self.ma_fast > self.ma_slow
longcond = self.IsRising == 1 and self.ma_fast[-1] > self.ma_slow
shortcond = self.ma_fast[-1] < self.ma_slow
...
尝试看ta_lib的源码,看看有没有启示,但C实在太难了。
因为经常使用其他指标值 作为参数输入,所以最后还是方法化了他。
请大家帮帮忙,如果把这个改写到符合vnpy, arraymanager的要求。
谢谢!
RT。显示在加载数据,但最终是 空 的。 好奇怪
2020-04-14 21:23:26.781135 开始加载历史数据
2020-04-14 21:23:26.781135 加载进度: [2%]
2020-04-14 21:23:26.781135 加载进度: [4%]
2020-04-14 21:23:26.781135 加载进度: [6%]
2020-04-14 21:23:26.781135 加载进度: [8%]
2020-04-14 21:23:26.781135 加载进度: [10%]
2020-04-14 21:23:26.781135 加载进度:# [12%]
2020-04-14 21:23:26.781135 加载进度:# [13%]
2020-04-14 21:23:26.781135 加载进度:# [15%]
2020-04-14 21:23:26.781135 加载进度:# [17%]
2020-04-14 21:23:26.781135 加载进度:# [19%]
2020-04-14 21:23:26.781135 加载进度:## [21%]
2020-04-14 21:23:26.782105 加载进度:## [23%]
2020-04-14 21:23:26.782105 加载进度:## [25%]
2020-04-14 21:23:26.782105 加载进度:## [27%]
2020-04-14 21:23:26.782105 加载进度:## [29%]
2020-04-14 21:23:26.782105 加载进度:### [31%]
2020-04-14 21:23:26.782105 加载进度:### [33%]
2020-04-14 21:23:26.782105 加载进度:### [35%]
2020-04-14 21:23:26.782105 加载进度:### [37%]
2020-04-14 21:23:26.782105 加载进度:### [38%]
2020-04-14 21:23:26.782105 加载进度:#### [40%]
2020-04-14 21:23:26.782105 加载进度:#### [42%]
2020-04-14 21:23:26.782105 加载进度:#### [44%]
2020-04-14 21:23:26.782105 加载进度:#### [46%]
2020-04-14 21:23:26.782105 加载进度:#### [48%]
2020-04-14 21:23:26.782105 加载进度:#### [50%]
2020-04-14 21:23:26.782105 加载进度:##### [52%]
2020-04-14 21:23:26.782105 加载进度:##### [54%]
2020-04-14 21:23:26.782105 加载进度:##### [56%]
2020-04-14 21:23:26.782105 加载进度:##### [58%]
2020-04-14 21:23:26.782105 加载进度:##### [60%]
2020-04-14 21:23:26.782105 加载进度:###### [61%]
2020-04-14 21:23:26.782105 加载进度:###### [63%]
2020-04-14 21:23:26.782105 加载进度:###### [65%]
2020-04-14 21:23:26.782105 加载进度:###### [67%]
2020-04-14 21:23:26.782105 加载进度:###### [69%]
2020-04-14 21:23:26.782105 加载进度:####### [71%]
2020-04-14 21:23:26.782105 加载进度:####### [73%]
2020-04-14 21:23:26.782105 加载进度:####### [75%]
2020-04-14 21:23:26.782105 加载进度:####### [77%]
2020-04-14 21:23:26.782105 加载进度:####### [79%]
2020-04-14 21:23:26.783187 加载进度:######## [81%]
2020-04-14 21:23:26.783187 加载进度:######## [83%]
2020-04-14 21:23:26.783187 加载进度:######## [85%]
2020-04-14 21:23:26.783187 加载进度:######## [86%]
2020-04-14 21:23:26.783187 加载进度:######## [88%]
2020-04-14 21:23:26.783187 加载进度:######### [90%]
2020-04-14 21:23:26.783187 加载进度:######### [92%]
2020-04-14 21:23:26.783187 加载进度:######### [94%]
2020-04-14 21:23:26.783187 加载进度:######### [96%]
2020-04-14 21:23:26.783187 加载进度:######### [98%]
2020-04-14 21:23:26.783187 加载进度:######### [100%]
2020-04-14 21:23:26.783187 加载进度:########## [100%]
2020-04-14 21:23:26.783187 历史数据加载完成,数据量:0
2020-04-14 21:23:26.783187 策略初始化完成
2020-04-14 21:23:26.783187 开始回放历史数据
2020-04-14 21:23:26.783187 历史数据回放结束
2020-04-14 21:23:26.783187 开始计算逐日盯市盈亏
2020-04-14 21:23:26.788089 成交记录为空,无法计算
2020-04-14 21:23:26.788089 开始计算策略统计指标
2020-04-14 21:23:26.788089 ------------------------------
2020-04-14 21:23:26.788089 首个交易日:
2020-04-14 21:23:26.788089 最后交易日:
2020-04-14 21:23:26.788089 总交易日: 0
2020-04-14 21:23:26.788089 盈利交易日: 0
2020-04-14 21:23:26.788089 亏损交易日: 0
2020-04-14 21:23:26.788089 起始资金: 1,000,000.00
2020-04-14 21:23:26.788089 结束资金: 0.00
2020-04-14 21:23:26.788089 总收益率: 0.00%
2020-04-14 21:23:26.788089 年化收益: 0.00%
2020-04-14 21:23:26.788089 最大回撤: 0.00
2020-04-14 21:23:26.788089 百分比最大回撤: 0.00%
2020-04-14 21:23:26.788089 最长回撤天数: 0
2020-04-14 21:23:26.788089 总盈亏: 0.00
2020-04-14 21:23:26.788089 总手续费: 0.00
2020-04-14 21:23:26.788089 总滑点: 0.00
2020-04-14 21:23:26.788089 总成交金额: 0.00
2020-04-14 21:23:26.788089 总成交笔数: 0
2020-04-14 21:23:26.788089 日均盈亏: 0.00
2020-04-14 21:23:26.788089 日均手续费: 0.00
2020-04-14 21:23:26.788089 日均滑点: 0.00
2020-04-14 21:23:26.788089 日均成交金额: 0.00
2020-04-14 21:23:26.788089 日均成交笔数: 0
2020-04-14 21:23:26.788089 日均收益率: 0.00%
2020-04-14 21:23:26.788089 收益标准差: 0.00%
2020-04-14 21:23:26.788089 Sharpe Ratio: 0.00
2020-04-14 21:23:26.788089 收益回撤比: 0.00
2020-04-14 21:23:26.789086 策略统计指标计算完成
前面的设置应该没错
engine = BacktestingEngine()
engine.set_parameters(
vt_symbol="rb88.SHFE",
interval="1m",
start=datetime(2016, 1, 1),
end=datetime(2020, 4, 10),
rate=1.0/10000,
slippage=1,
size=1,
pricetick=0,
capital=1_000_000,
)
engine.add_strategy(AtrRsiStrategy, {})
譬如,均线指标,
SMA(real[, timeperiod=?])
Simple Moving Average (Overlap Studies)
Inputs:
real: (any ndarray)
Parameters:
timeperiod: 30
Outputs:
real
我看vnpy里的指标,都是在定义里面写成固定的,直接传了self.close, self.high等进去。
如果我想使用 SMA(high,20), SMA(low,20)这类的,难道要为此单独定义一个指标出来?
不太懂编程,尤其是在面对对象这种,类内外,分不清哪个变量对应哪个变量。
请问哪位可以指点一下,提供个范例呢?谢谢!
1、有两个问题请教。
请问这个gui回测策略,
K线周期是原始数据的周期框架?譬如我导入是1分钟数据,这是选是1m。这是标识是原始数据的周期,不是指策略回测时使用的周期?
2、
另外搜索看到boll那个策略,可以实现从1分钟合成高级别,譬如15分钟的周期框架,
但如果我想测试30分钟周期,或者2小时周期框架上,好像不能即时刷新呀,需要关闭vn,然后再打开才能生效。