主力合约
连续合约
股指
源码见回复
C/P反向排序
根据自己需要重新修正源码
调用方式:
Array<String> SymbolList; //合约合集
Array<String> CallContracts; //Call合集
Array<String> PutContracts; //Put合集
GetOptionsFun(DataIdx, SymbolList, CallContracts, PutContracts, True);
Print(TextArray(SymbolList));
Print(TextArray(CallContracts));
Print(TextArray(PutContracts));
//bug更新————20250628
//原代码需要融合一下
//兼容除ETF期权 商品/商品指数/股指期权
不愧是老油条👍
刚发现直接排序是不对的
自己用的时候注意一下即可
哥 好人呐 收藏了🙏
亦支持数据源为期权标的
使用建议:
夜盘前Restart策略
以更新系统最新的期权标的
代码没有优化/美化
不想写了
有需要的自取并修订
//------------------------------------------------------------------------
// 简称: GetOptionsFun
// 名称: GetOptionsFun
// 类别: 用户函数
// 类型: 用户函数
// 输出: 数值型
//------------------------------------------------------------------------
Params
Integer DataIdx(0); //数据源序列号
ArrayRef<String> SymbolList; //返回合约合集
ArrayRef<String> CallContracts; //返回指定源Call合集
ArrayRef<String> PutContracts; //返回指定源Put合集
Bool Ascending(True); //排序方式 True=升序
//Bool SubData(False); //是否订阅期权
Vars
Integer CodeLength;
Begin
Print("DataIdx:" + Text(DataIdx) + " Symbol:" + Data[DataIdx].Symbol);
{
ArrayClear(SymbolList);
ArrayClear(CallContracts);
ArrayClear(PutContracts);
Array <String> Temp_Contracts;
If(FindFirstOf(Data[DataIdx].Symbol, "000016") != InvalidInteger)
GetSymbolContracts("000016", Data[DataIdx].ExchangeCode, Enum_CategoryOptions, Temp_Contracts, -1);
Else If(FindFirstOf(Data[DataIdx].Symbol, "000300") != InvalidInteger)
GetSymbolContracts("000300", Data[DataIdx].ExchangeCode, Enum_CategoryOptions, Temp_Contracts, -1);
Else If(FindFirstOf(Data[DataIdx].Symbol, "000852") != InvalidInteger)
GetSymbolContracts("000852", Data[DataIdx].ExchangeCode, Enum_CategoryOptions, Temp_Contracts, -1);
Else
GetSymbolContracts(Data[DataIdx].SymbolType, Data[DataIdx].ExchangeCode, Enum_CategoryOptions, Temp_Contracts, -1);
ArraySort(Temp_Contracts, True);
String Code;
Integer I;
Integer J;
Integer C_IDX;
If(FindFirstof(Data[DataIdx].Symbol, "000") != InvalidInteger || FindFirstof(Data[DataIdx].Symbol, "888") != InvalidInteger || FindFirstof(Data[DataIdx].Symbol, "999") != InvalidInteger)
Code = Data[DataIdx].MainSymbol;
If(Code == "" || Code == InvalidString)
Code = Data[DataIdx].Symbol;
If(FindFirstOf(Data[DataIdx].Symbol, "000016") != InvalidInteger
|| FindFirstOf(Data[DataIdx].Symbol, "000300") != InvalidInteger
|| FindFirstOf(Data[DataIdx].Symbol, "000852") != InvalidInteger)
Code = Temp_Contracts[0];
I = FindFirstOf(Code, "-");
If(I != InvalidInteger)
Code = Left(Code, I);
Else
{
I = FindFirstOf(Code, ".");
Code = Left(Code, I);
}
//Print(Code);
String temp_code;
CodeLength = Len(Code);
ArrayPushBack(SymbolList, Code);
For J = 0 To GetArraySize(Temp_Contracts) - 1
{
I = FindFirstOf(Temp_Contracts[J], Code);
C_IDX = FindFirstOf(Temp_Contracts[J], "C");
If (I != InvalidInteger && C_IDX != InvalidInteger)
ArrayPushBack(CallContracts, Temp_Contracts[J]);
I = FindFirstOf(Temp_Contracts[J], Code);
C_IDX = FindFirstOf(Temp_Contracts[J], "P");
If (I != InvalidInteger && C_IDX != InvalidInteger)
ArrayPushBack(PutContracts, Temp_Contracts[J]);
temp_code = Left(Temp_Contracts[J], CodeLength);
If(!ArrayFind(SymbolList, temp_code))
ArrayPushBack(SymbolList, temp_code);
}
ArraySort(CallContracts, Ascending);
ArraySort(PutContracts, !Ascending);
ArraySort(SymbolList, Ascending);
Return 0;
}
End
//------------------------------------------------------------------------
// 编译版本: 2025-06-19 075653
// 版权所有 wgy_king
// 更改声明 TradeBlazer Software保留对TradeBlazer平台
// 每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------
你这代码写的是真漂亮,又简洁又有层次感。
我写的代码也能跑,但跟你比起来就像拖拉机跟法拉利一样,而且还得不定时的修理修理,不然就会罢工。
拖拉机也能跑
跑拖拉机攒钱了就有时间琢磨换法拉利啦~~~~
上周写的初始基础代码
运算效率还可以改善
我不想改了
写代码之前想好各种规则
实现就轻松了
后期有特殊情况更新也方便
兼容性要强劲
比如期权要考虑
1 商品(不同交易所合约代码不同,有的是-C-/-P-,有的是C/P) 这里没有体现,自己动态订阅的场景需要用到
2 指数/连续、指定具体合约数据源 这一项给了调用函数提供了极大的便利
3 特殊情况特定处理 如上期所股指期权 做好后期还要添加品种的可能性做好准备 代码更新简单 新增1-2行快速无障碍完成迭代
4 甚至兼顾数据源本身就是期权 代码中是半成品 没有考虑所有情况