只要公式中有涉及到期权希腊字母,交易就不正常,这是什么原因?麻烦老师答复一下,谢谢
Vars
Global Integer id(0);
Global Bool subFlag(False);
Events
OnReady()
{
if(!subFlag)
{
id = SubscribeBar(RelativeSymbol(), "1d", BeginDateTime);
subFlag = True;
}
}
OnBar(ArrayRef<Integer> indexs)
{
Buy(1, Open);
Sell(1, Open);
Numeric volty = Volatility(data[id].Close);
Print("Delta:" + Text(Delta(TradingDayLeft, StrikePrice, data[id].Close, 5, volty, OptionType, OptionStyle)));
}
和研发人员确认了一下,不是bug
就是因为maxbarsback导致的信号被过滤掉
前面三根有信号,是因为volatility函数内部,直到第三根bar开始才执行含有回溯的操作,而之前两根因为没有回溯操作,所以不会过滤信号。
感谢大佬回复,但是貌似还有问题,当我加载更多K线,比如改成5分钟周期,就只有第一天有信号,后面就没有了
然后我用CurrentBar去限制前期不开仓,后面也是一样没有信号,只在当天以及第二天的第一根K线有信号
这个可能是因为,钱亏完了......
你可以输出一下portfolio_currentequity看看
不会的,这里写的是以open开多平多,只亏手续费的,我看了报告也只亏了几千
发代码复现
Params
//此处添加参数
Vars
Global Integer id(0);
Global Bool subFlag(False);
Events
OnReady()
{
if(!subFlag)
{
id = SubscribeBar(RelativeSymbol(), "5m", BeginDateTime);
subFlag = True;
}
}
OnBar(ArrayRef<Integer> indexs)
{
if(CurrentBar < 100)
Return;
Buy(1, Open);
Sell(1, Open);
Numeric volty = Volatility(data[id].Close);
Print("Delta:" + Text(Delta(TradingDayLeft, StrikePrice, data[id].Close, 5, volty, OptionType, OptionStyle)));
}
原因是一样的。
你可以通过commentary一下maxbarsback来查看当前bar的最大回溯根数。
在你信号消失的地方,这个最大回溯根数发生了突变,变得非常大。
主要原因还是volatility这个函数的问题。
首先第一,这个函数计算波动率,理论上应该是通过标的物数据去计算,而不是通过期权数据计算,你虽然参数使用的是data[id],但实际上正确写法应该是在volatility函数前面家data[id]。
其次,波动率数据计算的单位是日,参数数字实际上表示的是日。所以理论上如果执行正确,你没有加参数,那就是默认30,30日内的数据,都应该没信号的。
最后,你这个写法也非常怪异。任何一个模型,都是先做数据处理,再判断开平信号。数据处理的部分,如果发现数据不够计算正确的结果,那就不应该执行开平信号判断部分。
你的这个问题,本质上还是因为tb机制里是动态判断最大回溯数量从而进行信号过滤所导致的,原因跟上面完全一致。如果你是正常写模型,自己做一个控制,基本上是不会出现这个问题的
解决问题了,感谢大佬,我先写交易部分就为了验证是函数的问题,和交易的逻辑没关系,我的结论是,volatility引用数据的图层不能交易
这个主要是由于volatility这个函数存在回溯周期的缘故
tb有一个很老的机制,就是如果策略中使用了回溯调用,比如需要最多回溯10根bar来计算,那么图表最开始的10根bar是不会作图,也不会出信号的
而volatility是默认回溯30根的
你如果修改了参数会发现信号显示也会变化
但是这个数字和根数没有对上,这个会和产品研发确认看是不是bug