期权合约集【GetOptionsFun】函数


主力合约


连续合约


股指


源码见回复

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));

如何获取当前品种合约的期权合约集
卖方期权的 函数
期权函数
有没有函数能识别合约为卖方期权,还是买方期权。 有没有函数 识别期权是call或着put
a函数获期权的报价问题
要在夜盘20:55-20:59集合竞价这段时间,通过程序下单,应该用哪个函数呢?
要在夜盘20:55-20:59集合竞价这段时间,通过程序下单,应该用哪个函数呢?
期权函数使用问题
读取特定期权的时间价值的函数
建议TB增加对期权回测的支持功能,增加多一些期权代码的函数,可以参考真格量化的函数


//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 甚至兼顾数据源本身就是期权 代码中是半成品 没有考虑所有情况