关于期权希腊字母的bug

只要公式中有涉及到期权希腊字母,交易就不正常,这是什么原因?麻烦老师答复一下,谢谢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