# 金融 / 金融工程 / 策略验证 / 数量类中间函数 / 中间函数

## `bondPayMentByEndt(bondarr, endt)`

声明：function

返回债券数组在指定日是否有付息以及相应的数据

<!-- tags: 金融 金融工程 策略验证 数量类中间函数 中间函数 返回 获取 -->

| 参数      | 类型        | 说明               |
| --------- | ----------- | ------------------ |
| `bondarr` | array       | 一维数组，债券数组 |
| `endt`    | t_date_time | 日期型时间，截止日 |

返回：table_array

### 示例

范例01：调用函数

```tsl
bondarr := array('SH196237', 'SZ101516', 'SH175901');
endt := intToDate(20230116);
return bondPayMentByEndt(bondarr, endt);
```

## `depositOfOption(option_id, option_price, stock_price, p_1, p_2)`

声明：function

返回期权单位保证金，与系统参数时间有关

<!-- tags: 金融 金融工程 策略验证 数量类中间函数 中间函数 返回 获取 -->

| 参数           | 类型   | 说明                   |
| -------------- | ------ | ---------------------- |
| `option_id`    | string | 字符串类型，期权代码   |
| `option_price` | real   | 实数，期权价格         |
| `stock_price`  | real   | 实数，期权标的证券价格 |
| `p_1`          | real   | 实数，保证金比例(%)    |
| `p_2`          | real   | 实数，保证金比例Ⅱ(%)   |

返回：real

### 示例

范例01：调用函数

```tsl
setSysParam(pn_date(), intToDate(20230104));
option_id := 'OP10004679';
option_price := 0.4855;
stock_price := 2.66;
p1 := 12;
p2 := 7;
return depositOfOption(option_id, option_price, stock_price, p1, p2);
// 输出：0.8047
```

## `depositOfOptionByGroup(option, option_id, position, option_id_2, position_2, price, price_2, stock_price, p_1, p_2, margin, stockvol, stockunit)`

声明：function

返回期权组合保证金计算，与系统参数时间有关

<!-- tags: 金融 金融工程 策略验证 数量类中间函数 中间函数 返回 获取 -->

| 参数          | 类型    | 说明                                       |
| ------------- | ------- | ------------------------------------------ |
| `option`      | integer | 整数，组合保证金计算方式                   |
| `option_id`   | string  | 字符串，期权组合成分合约1                  |
| `position`    | integer | 整数，期权组合成分合约1头寸                |
| `option_id_2` | string  | 字符串，期权组合成分合约2                  |
| `position_2`  | integer | 整数，期权组合成分合约2头寸                |
| `price`       | real    | 实数，期权组合成份合约1价格                |
| `price_2`     | real    | 实数，期权组合成份合约2价格                |
| `stock_price` | real    | 实数，期权成分合约1和成分合约2标的证券价格 |
| `p_1`         | real    | 实数，期权保证金比例(%)                    |
| `p_2`         | real    | 实数，期权保证金比例Ⅱ(%)                   |
| `margin`      | real    | 实数，保证金系数                           |
| `stockvol`    | real    | 实数，组合数量                             |
| `stockunit`   | real    | 实数，期权合约单位                         |

返回：real

### 示例

范例01：调用函数

```tsl
// 这两个合约构成认沽熊市价差策略PNSJC
// PNSJC组合策略的保证金计算方式是：两个期权合约的行权价之差
setSysParam(pn_date(), intToDate(20190731));
option := 1;
option_id := 'OP10001902';
position := 1;
option_id2 := 'OP10001906';
position2 := 0;
price := spec(settlement(), option_id);
price2 := spec(settlement(), option_id2);
// 两个期权合约标的物SH510050
stock_price := spec(close(), 'SH510050');
p1 := 12;
p2 := 7;
margin := 0;
stockvol := 5;
stockunit := 10000;
return depositOfOptionByGroup(option, option_id, position, option_id2, position2, price, price2, stock_price, p1, p2, margin, stockvol, stockunit);
// 输出：5000
```

## `depositOfSecurity(stock_id, position, price, price_2, margin, margin_2, stockvol, stockunit)`

声明：function

返回证券保证金计算，与系统参数时间有关

<!-- tags: 金融 金融工程 策略验证 数量类中间函数 中间函数 返回 获取 -->

| 参数        | 类型    | 说明                       |
| ----------- | ------- | -------------------------- |
| `stock_id`  | string  | 字符串，期权、期货合约代码 |
| `position`  | integer | 整数，持仓头寸             |
| `price`     | real    | 实数，期权、期货合约价格   |
| `price_2`   | real    | 实数，期权标的证券价格     |
| `margin`    | real    | 实数，保证金比例(%)        |
| `margin_2`  | real    | 实数，保证金比例Ⅱ(%)       |
| `stockvol`  | real    | 实数，持仓数量             |
| `stockunit` | real    | 实数，合约单位             |

返回：real

### 示例

范例01：期权保证金

```tsl
// 期权保证金
setsysparam(pn_date(), inttodate(20230104));
StockID := 'OP10004679';
position := 0;
price := 0.4855;
price2 := 2.66;
margin := 12;
margin2 := 7;
stockvol := 100;
stockunit := 10142;
return DepositOfSecurity(StockID, position, price, price2, margin, margin2, stockvol, stockunit);
// 输出：816126.74
```

范例02：期货保证金

```tsl
// 期货保证金
setsysparam(pn_date(), inttodate(20230104));
StockID := 'IF01';
position := 1;
price := 3895;
price2 := 0;
margin := 8;
margin2 := 0;
stockvol := 100;
stockunit := 300;
return DepositOfSecurity(StockID, position, price, price2, margin, margin2, stockvol, stockunit);
// 输出：9348000
```

## `getBondMaturityTradeData(endt, tpgp)`

声明：function

返回债券到期兑付本金转化为交易数据

<!-- tags: 金融 金融工程 策略验证 数量类中间函数 中间函数 返回 获取 -->

| 参数   | 类型        | 说明               |
| ------ | ----------- | ------------------ |
| `endt` | t_date_time | 日期型时间，截止日 |
| `tpgp` | table_array | 数据表类型，昨持仓 |

返回：table_array

### 示例

范例01：调用函数

```tsl
end_t := intToDate(20170613);
tpgp := array(
    ("截止日":42734.0, "代码":"BK078020", "方向":1.0, "乘数":1.0, "保证金比例(%)":100.0, "保证金比例II(%)":nil, "数量":1330.0, "收盘":103.68, "市值":137899.32, "保证金占用":137899.32, "占净值比例(%)":0.14, "总成本":134984.59, "成本价":101.49, "浮动盈亏":2914.73, "浮盈率(%)":2.16, "证券类别":18.0, "行业名称":0.0),
    ("截止日":42734.0, "代码":"BK030014", "方向":1.0, "乘数":1.0, "保证金比例(%)":100.0, "保证金比例II(%)":nil, "数量":25131.0, "收盘":76.76, "市值":1929151.06, "保证金占用":1929151.06, "占净值比例(%)":1.9, "总成本":1895204.27, "成本价":75.41, "浮动盈亏":33946.78, "浮盈率(%)":1.79, "证券类别":18.0, "行业名称":0.0)
);
return getBondMaturityTradeData(end_t, tpgp);
```

## `getContractMultiplier()`

声明：function

返回证券合约单位，与系统参数(证券、时间相关)

<!-- tags: 金融 金融工程 策略验证 数量类中间函数 中间函数 返回 获取 -->

返回：real

### 示例

范例01：调用函数

```tsl
setSysParam(pn_stock(), 'IF2301');
setSysParam(pn_date(), intToDate(20230105));
return getContractMultiplier();
// 输出：300
```

## `getGroupDeposit(idtype, option_id, position, option_id_2, position_2, price, price_2, stock_price, p_1, p_2, stockvol, stockunit)`

声明：function

返回期权组合保证金计算，与系统参数时间有关

<!-- tags: 金融 金融工程 策略验证 数量类中间函数 中间函数 返回 获取 -->

| 参数          | 类型    | 说明                                       |
| ------------- | ------- | ------------------------------------------ |
| `idtype`      | string  | 字符串，组合类型                           |
| `option_id`   | string  | 字符串，期权组合成分合约1                  |
| `position`    | integer | 整数，期权组合成分合约1头寸                |
| `option_id_2` | string  | 字符串，期权组合成分合约2                  |
| `position_2`  | integer | 整数，期权组合成分合约2头寸                |
| `price`       | real    | 实数，期权组合成份合约1价格                |
| `price_2`     | real    | 实数，期权组合成份合约2价格                |
| `stock_price` | real    | 实数，期权成分合约1和成分合约2标的证券价格 |
| `p_1`         | real    | 实数，期权保证金比例(%)                    |
| `p_2`         | real    | 实数，期权保证金比例Ⅱ(%)                   |
| `stockvol`    | real    | 实数，组合数量                             |
| `stockunit`   | real    | 实数，期权合约单位                         |

返回：real

### 示例

范例01：调用函数

```tsl
// 这两个合约构成认沽熊市价差策略PNSJC
setSysParam(pn_date(), intToDate(20190731));
idtype := 'PNSJC';
option_id := 'OP10001902';
position := 1;
option_id2 := 'OP10001906';
position2 := 0;
price := spec(settlement(), option_id);
price2 := spec(settlement(), option_id2);
// 两个期权合约标的物SH510050
stock_price := spec(close(), 'SH510050');
p1 := 12;
p2 := 7;
stockvol := 5;
stockunit := 10000;
return getGroupDeposit(idtype, option_id, position, option_id2, position2, price, price2, stock_price, p1, p2, stockvol, stockunit);
// 输出：5000
```

## `getLowestFee(v_amount, fee_rate, action, lowest_fee_type, o_lowest_fee, c_lowest_fee)`

声明：function

计算费用，若用户选择启用最低费用，则当根据费率计算的费用不足最低费用，则返回最低费

<!-- tags: 金融 金融工程 策略验证 数量类中间函数 中间函数 计算 求解 -->

| 参数              | 类型    | 说明                       |
| ----------------- | ------- | -------------------------- |
| `v_amount`        | real    | 实数，成交金额（税前）     |
| `fee_rate`        | real    | 实数，费率(%)              |
| `action`          | integer | 整数，动作                 |
| `lowest_fee_type` | integer | 整数，是否启用最低费用限制 |
| `o_lowest_fee`    | real    | 实数，最低开仓费用         |
| `c_lowest_fee`    | real    | 实数，最低平仓费用         |

返回：real

### 示例

范例01：调用函数

```tsl
return array(
    '不启用最低费用':getLowestFee(999536, 0.01, 0, 0, 100, 100),
    '启用最低费用': getLowestFee(999536, 0.01, 0, 1, 100, 100)
);
// 输出：array("不启用最低费用":99.9536,"启用最低费用":100)
```

## `getMarginRatio()`

声明：function

返回期权、期货的保证金比例Ⅱ(%)，与系统参数(证券、时间相关)

<!-- tags: 金融 金融工程 策略验证 数量类中间函数 中间函数 返回 获取 -->

返回：real

### 示例

范例01：调用函数

```tsl
setSysParam(pn_stock(), 'IO2306-C-3100');
setSysParam(pn_date(), intToDate(20230105));
return getMarginRatio();
// 输出：12
```

## `getMarginRatio2()`

声明：function

返回期权保证金比例Ⅱ(%)，与系统参数(证券、时间相关)

<!-- tags: 金融 金融工程 策略验证 数量类中间函数 中间函数 返回 获取 -->

返回：real

### 示例

范例01：调用函数

```tsl
setSysParam(pn_stock(), 'IO2306-C-3100');
setSysParam(pn_date(), intToDate(20230105));
return getMarginRatio2();
// 输出：50
```

## `getPriceOfUnderlying(option_id, end_t, is_open)`

声明：function

返回指定日期权标的证券价格

<!-- tags: 金融 金融工程 策略验证 数量类中间函数 中间函数 返回 获取 -->

| 参数        | 类型        | 说明                       |
| ----------- | ----------- | -------------------------- |
| `option_id` | string      | 字符串，期权代码           |
| `end_t`     | t_date_time | 日期型时间，截止日         |
| `is_open`   | integer     | 是否获取期权标的证券昨价格 |

返回：real

### 示例

范例01：期权标的证券系统昨收

```tsl
// 期权标的证券系统昨收
OptionID := 'OP10004679';
EndT := inttodate(20230104);
isOpen := 1;
return GetPriceOfUnderlying(OptionID, EndT, isOpen);
// 输出：2.651
```

范例02：期权标的证券收盘

```tsl
// 期权标的证券收盘
OptionID := 'OP10004679';
EndT := inttodate(20230104);
return GetPriceOfUnderlying(OptionID, EndT);
// 输出：2.66
```

## `getTradeDeposit(tjy)`

声明：function

计算交易保证金

<!-- tags: 金融 金融工程 策略验证 数量类中间函数 中间函数 计算 求解 -->

| 参数  | 类型        | 说明                 |
| ----- | ----------- | -------------------- |
| `tjy` | table_array | 数据表类型，交易数据 |

返回：table_array

### 示例

范例01：调用函数

```tsl
tjy := array(
    ("截止日":44930.0, "代码":"SZ000001", "方向":1.0, "动作":0, "乘数":1.0, "保证金比例(%)":100.0, "保证金比例II(%)":0, "成交量":10000.0, "成交价":14.32),
    ("截止日":44930.0, "代码":"IF01", "方向":1.0, "动作":0, "乘数":300.0, "保证金比例(%)":8.0, "保证金比例II(%)":0, "成交量":100.0, "成交价":3895.0),
    ("截止日":44930.0, "代码":"OP10004688", "方向":1.0, "动作":0, "乘数":10142.0, "保证金比例(%)":12.0, "保证金比例II(%)":7.0, "成交量":100.0, "成交价":0.0142),
    ("截止日":44930.0, "代码":"OP10004679", "方向":0, "动作":0, "乘数":10142.0, "保证金比例(%)":12.0, "保证金比例II(%)":7.0, "成交量":100.0, "成交价":0.473),
    ("截止日":44930.0, "代码":"CF307C14000", "方向":0, "动作":0, "乘数":5.0, "保证金比例(%)":5.0, "保证金比例II(%)":0, "成交量":100.0, "成交价":877.0)
);
getTradeDeposit(tjy);
return tjy;
```

## `portfolioBackTesting_quantity_compositeDetail(end_t, tp_gp, t_ls)`

声明：function

合并指定日的上期持仓和当日交易流水，返回股票组合的持仓明细

<!-- tags: 金融 金融工程 策略验证 数量组合 持仓 持仓明细 交易流水 合并 -->

| 参数    | 类型        | 说明             |
| ------- | ----------- | ---------------- |
| `end_t` | t_date_time | 持仓明细对应日期 |
| `tp_gp` | table_array | 上期股票持仓明细 |
| `t_ls`  | table_array | 当日股票交易流水 |

返回：table_array

### 示例

范例01：处理没有上期持仓和当日交易的组合

```tsl
return portfolioBackTesting_quantity_compositeDetail(
    intToDate(20120711),
    array(),
    array());
// 输出：array()
```
