大家好,问几个问题
1、官方文档中说OnInit只运行一次,我发现在图表上确实如此。但,如果是在策略单元中加载公式,就不是了。会运行两次,大家可以测试一下,我是通过FileAppend发现的:图表中运行只会有一条数据、正常,策略单元中运行会有两条数据(之前已清空文件)、不正常。
2、有没有办法在裸公式中直接订阅某个品种当前存续的合约?比如要在RB上交易,先获取rb2501.SHFE、rb2502.SHFE、rb2503.SHFE 、rb2504.SHFE……的合约代码,然后再订阅他们?
3、有没有办法在祼公式中,直接订阅某个标的的所有期权合约?比如标的是豆粕,就把m2503……m2512的所有到期日、所有行权价、两个方向的合约全部都拿到、再订阅。
刚刚是quant3,现在是quant,都无法复现你说的问题。
这我就没有办法了
提供一个新思路,先把平台内所有的symbol都获取到,然后遍历找到你想要的品种合约提取出来。
Array<String> symbols;
GetDicSymbols("TB_CP_Futures", symbols); //获得平台内所有关联合约。查询前在数据中心要
数据
Numeric Length;
Integer i;
Integer pos;
String tgt;
CodeProperty cp;
Length = GetArraySize(symbols);//获取所有合约数量总数
Print("size:" + Text(Length));
For i = 1 to Length-1//开始遍历
{
tgt = symbols[i];
IF (len(tgt) > 12) {continue;}//symbol长度超过12,跳过
pos = FindFirstOf(tgt, "rb");//如果查到是rb,挑出来
IF (pos <> 0) {continue;}//不是首字符说明可能是套利合约,跳过
//获取指定合约的所有合约属性
Bool ret = GetProperty(tgt, cp);//获取合约属性
Print(text(i) + " " + text(pos) + " " + tgt + "," + Text(cp.expiredDateTime));
//后续根据合约的过期时间和当前机器时间判断,如果过期时间小于当前机器时间,那就遗弃
//否则就加入备选数组
//后续代码较为简单可以自行完成
}
1你是不是同一个公式,策略单元加载了,然后又打开了k线图?这等于执行双份
2目前来说系统没有做每天哪些合约是可交易的这种数据记录。有两种比较麻烦的方法,第一种是根据当前的交易时间写一个函数自动生成理论上可交易合约的所有集合,但是这个函数要考虑到所有品种的合约上市规则和退市规则,很难完美写出来。第二种是先在自定义板块里添加该品种所有合约,然后保存到基础数据自定义数据中,然后策略单元读自定义数据读到这些合约
3方法同上
谢谢解答。
不过,那个输出两次的问题,我确认了,没有打开K线图,刻意把所有东西都关掉了,只留一个策略单元,还是输出了两次。
代码如下
Params
//此处添加参数
Vars
//此处添加变量
String outPutInfo;
Dic<Array<String>> tbCommissionFu("TB_CommissionRate_Futures"); //数据中心》基础数据》手续费
Defs
//此处添加公式函数
Events
//此处实现事件函数
//初始化事件函数,策略运行期间,首先运行且只有一次
OnInit()
{
outPutInfo = Symbol()+": MinMove = "+Text(MinMove)+", PriceScale = "+Text(PriceScale)+", ContractUnit = "+Text(ContractUnit)+", BigPointValue = "+Text(BigPointValue);
Print(outPutInfo);
FileAppend("D:\\drafts\\tbDev\\test\\props.log",outPutInfo);
}
}
我这里跑了一下,没有复现,只有一行,使用k线图和策略单元,都没有复现。
建议关闭所有其他工作区,只留一个k线图或者一个策略单元,删除所有其他公式或者图层,删除之间生成的文件,然后启动策略单元再试试
在图表上一直是正常的,
就是在策略单元中会运行两次。
试了,全部关了还是两行。