输入/搜索内容
内置函数
Global
Log
Market
Trade
Account
Futures
exchange.GetPositions
exchange.SetMarginLevel
exchange.SetDirection
exchange.SetContractType
exchange.GetContractType
StrDecode
Threads
TA
Talib
OS
结构体
内置变量

设置exchange交易所对象当前的合约代码。

期货支持传统商品期货的CTP协议与易盛协议。在进行任何操作之前,需要先使用exchange.SetContractType()函数设置合约代码。

exchange.SetContractType(symbol)

示例

  • 使用exchange.SetContractType()函数设置(订阅)合约。

    javascript
    function main(){ while(true) { if (exchange.IO("status")) { var ret = exchange.SetContractType("MA888") Log("订阅合约的详细信息:", ret) break } else { LogStatus(_D(), "未连接") Sleep(1000) } } }
    python
    def main(): while True: if exchange.IO("status"): ret = exchange.SetContractType("MA888") Log("订阅合约的详细信息:", ret) break else: LogStatus(_D(), "未连接") Sleep(1000)
    rust
    fn main() { loop { if exchange.IO("status").is_ok_and(|v| v.as_i64() == Some(1)) { let ret = exchange.SetContractType("MA888"); Log!("订阅合约的详细信息:", ret); break; } else { LogStatus!(_D(None), "未连接"); Sleep(1000); } } }
  • 商品期货仅在回测中支持虚拟合约交易;在实盘交易中,虚拟合约只能用于获取行情数据。实盘时,我们可以使用虚拟合约所映射的真实合约进行下单,示例代码如下:

    javascript
    function main(){ var n = 0 while(true){ // 需要在判断exchange.IO("status")函数返回1(真值)时才可调用行情、交易等函数 if(exchange.IO("status")){ // 设置合约为虚拟合约,MA888,即甲醇主力合约 var ret = _C(exchange.SetContractType, "MA888") var ticker = exchange.GetTicker() // 当到达交易条件时 if(n == 100) { exchange.SetContractType(ret.InstrumentID) Log("设置映射的实际合约:", ret.InstrumentID) exchange.SetDirection("buy") var id = exchange.Buy(ticker.Buy - 10, 1) Log("id:", id) Sleep(1000) Log(exchange.GetOrder(id)) Sleep(1000) Log(exchange.GetPositions()) Sleep(1000) exchange.CancelOrder(id) Sleep(1000) Log(exchange.GetOrders()) } n++ LogStatus(_D(), "已经连接CTP !") } else { LogStatus(_D(), "未连接CTP !") Sleep(1000) } } }
    python
    def main(): n = 0 while True: if exchange.IO("status"): ret = _C(exchange.SetContractType, "MA888") ticker = exchange.GetTicker() if n == 100: exchange.SetContractType(ret["InstrumentID"]) Log("设置映射的实际合约:", ret["InstrumentID"]) exchange.SetDirection("buy") id = exchange.Buy(ticker["Buy"] - 10, 1) Log("id:", id) Sleep(1000) Log(exchange.GetOrder(id)) Sleep(1000) Log(exchange.GetPositions()) Sleep(1000) exchange.CancelOrder(id) Sleep(1000) Log(exchange.GetOrders()) n += 1 LogStatus(_D(), "已经连接CTP !") else: LogStatus(_D(), "未连接CTP !") Sleep(1000)
    rust
    fn main() { let mut n = 0; loop { // 需要在判断exchange.IO("status")函数返回1(真值)时才可调用行情、交易等函数 if exchange.IO("status").is_ok_and(|v| v.as_i64() == Some(1)) { // 设置合约为虚拟合约,MA888,即甲醇主力合约 let ret = _C!(exchange.SetContractType("MA888")); let ticker = exchange.GetTicker(None).unwrap(); // 当到达交易条件时 if n == 100 { let instrument_id = ret["InstrumentID"].as_str().unwrap_or(""); exchange.SetContractType(instrument_id).unwrap(); Log!("设置映射的实际合约:", instrument_id); // 注意:Rust 中 SetDirection 不推荐使用,优先使用 CreateOrder 直接指定方向 exchange.SetDirection("buy").unwrap(); let id = exchange.Buy(ticker.Buy - 10.0, 1).unwrap(); Log!("id:", id); Sleep(1000); Log!(exchange.GetOrder(&id)); Sleep(1000); Log!(exchange.GetPositions(None)); Sleep(1000); exchange.CancelOrder(&id).unwrap(); Sleep(1000); Log!(exchange.GetOrders(None)); } n += 1; LogStatus!(_D(None), "已经连接CTP !"); } else { LogStatus!(_D(None), "未连接CTP !"); Sleep(1000); } } }

返回值

类型描述

object

合约详细信息(CTP合约字段,例如最小下单量MinLimitOrderVolume、合约乘数VolumeMultiple、最小变动价位PriceTick、交割日期StartDelivDate),返回示例见备注。

参数

名称类型必填描述

symbol

string

是

例如:exchange.SetContractType("rb2310"),作用是将当前操作的合约设置为螺纹钢2023年10月交割的合约。

主力连续合约的代码为888,例如MA888;次主力连续合约的代码为889,例如MA889;连续指数合约的代码为000,例如MA000。888、889与000虚拟合约仅支持回测交易,实盘中只支持获取行情。

参考

备注

  • 主力连续合约(例如rb888):
    由该期货品种不同时期的主力合约(价格和成交量)直接拼接而成,代码以888结尾,例如rb888。合约首次上市时,以当日收盘时同品种持仓量最大者作为下一交易日起的主力合约。若同品种其他合约在收盘后持仓量超过当前主力合约的1.1倍,则在下一交易日进行主力合约切换。
  • 次主力连续合约(例如rb889):
    由该期货品种不同时期的次主力合约直接拼接而成,代码以889结尾,例如rb889。次主力合约为同品种中持仓量排名第二的合约。
  • 指数合约(例如rb000):
    由该期货品种所有正在交易的合约,按持仓量加权平均计算。

在商品期货策略中调用exchange.SetContractType(ContractType)函数时,无论是实盘还是simnow模拟盘,都可能出现订阅失败的情况,例如连接期货公司前置机失败,或设置了不存在的合约代码。虚拟合约订阅成功后,返回字段中的InstrumentID即为主力合约(会在订阅的同时获取),便于策略在实盘下单交易时进行合约映射。

对于不熟悉商品期货合约代码的用户,可以使用如下JavaScript语言的代码进行查询:

javascript
function main(){ while(true){ if(exchange.IO("status")){ var products_CZCE_Tbl = { "type" : "table", "title" : "郑商所 CZCE", "cols" : ["商品名称(ProductName)", "合约代码短名(ProductID)" , "一跳价格(PriceTick)", "一手合约乘数(VolumeMultiple)", "交易所代码(ExchangeID)"], "rows" : [] } var products_DCE_Tbl = { "type" : "table", "title" : "大商所 DCE", "cols" : ["商品名称(ProductName)", "合约代码短名(ProductID)" , "一跳价格(PriceTick)", "一手合约乘数(VolumeMultiple)", "交易所代码(ExchangeID)"], "rows" : [] } var products_SHFE_Tbl = { "type" : "table", "title" : "上期所 SHFE", "cols" : ["商品名称(ProductName)", "合约代码短名(ProductID)" , "一跳价格(PriceTick)", "一手合约乘数(VolumeMultiple)", "交易所代码(ExchangeID)"], "rows" : [] } var products_other_Tbl = { "type" : "table", "title" : "其它", "cols" : ["商品名称(ProductName)", "合约代码短名(ProductID)" , "一跳价格(PriceTick)", "一手合约乘数(VolumeMultiple)", "交易所代码(ExchangeID)"], "rows" : [] } exchange.IO("products").forEach(function(product) { if (product.ExchangeID == "CZCE") { products_CZCE_Tbl.rows.push([product.ProductName, product.ProductID, product.PriceTick, product.VolumeMultiple, product.ExchangeID]) } else if (product.ExchangeID == "DCE") { products_DCE_Tbl.rows.push([product.ProductName, product.ProductID, product.PriceTick, product.VolumeMultiple, product.ExchangeID]) } else if (product.ExchangeID == "SHFE") { products_SHFE_Tbl.rows.push([product.ProductName, product.ProductID, product.PriceTick, product.VolumeMultiple, product.ExchangeID]) } else { products_other_Tbl.rows.push([product.ProductName, product.ProductID, product.PriceTick, product.VolumeMultiple, product.ExchangeID]) } }) LogStatus(_D(), "已经连接CTP", "\n`" + JSON.stringify([products_CZCE_Tbl, products_DCE_Tbl, products_SHFE_Tbl, products_other_Tbl]) + "`") Sleep(1000 * 60 * 5) } else { LogStatus(_D(), "未连接CTP !") Sleep(1000) } Sleep(1000) } }

查询结果将显示各个交易所的合约信息。

商品期货合约的命名规则如下:

前面的字母代表品种名称(合约代码短名),后面的数字代表合约到期日。

交易所合约命名规则
上期 / 能源所:小写 + 4个数字
大商所:小写 + 4个数字
中金所:大写 + 4个数字
郑商所:大写 + 3个数字

返回示例

打印exchange.SetContractType("MA888")函数返回的数据,可查看合约详细信息,示例如下:

json
{ "InstrumentName": "甲醇连续", "MinLimitOrderVolume": 1, "OpenDate": "20190116", "PositionType": 50, "LongMarginRatio": 0.06999999999999999, "DeliveryYear": 2020, "MaxMarketOrderVolume": 1000, "ExpireDate": "20200114", "PositionDateType": 50, "InstLifePhase": 49, "UnderlyingMultiple": 1, "CombinationType": 48, "InstrumentID": "MA001", "ExchangeInstID": "MA001", "ProductClass": 49, "MinMarketOrderVolume": 1, "VolumeMultiple": 10, "CreateDate": "20190116", "ShortMarginRatio": 0.06999999999999999, "UnderlyingInstrID": "", "ProductID": "MA", "PriceTick": 1, "StartDelivDate": "20200114", "EndDelivDate": "20200114", "ExchangeID": "CZCE", "MaxLimitOrderVolume": 1000, "MaxMarginSideAlgorithm": 48, "DeliveryMonth": 1, "IsTrading": 1, "StrikePrice": 0, "OptionsType": 0 }