Futures
exchange.GetPositions
exchange.GetPositions()函数用于获取所有合约的当前持仓信息。GetPositions()函数是交易所对象exchange的成员函数。
GetPositions()函数获取交易所对象exchange所绑定的交易所账户的持仓信息。exchange对象的成员函数(方法)的用途仅与exchange相关,文档之后不再赘述。
exchange.GetPositions()
exchange.GetPositions(symbol)示例
javascript
/*
注意:GetPositions 函数获取的是所有持仓品种的持仓信息,如果没有持仓则返回空数组,因此在使用该接口返回的数据前,需先判断返回的数据是否为空数组
*/
function main(){
// 由于是测试代码,不使用商品期货策略的一般架构,这里仅判断 exchange.IO("status") 函数,在成功连接期货公司前置机后立即执行测试代码。股票证券无需使用 exchange.IO("status") 判断连接状态
while(!exchange.IO("status")) {
Sleep(1000)
}
var info = exchange.SetContractType("rb888")
var ticker = exchange.GetTicker()
exchange.SetDirection("buy")
exchange.Buy(ticker.Last + info.PriceTick * 20, 2)
var position = exchange.GetPositions()
if(position.length>0){
Log("Amount:", position[0].Amount, "FrozenAmount:", position[0].FrozenAmount, "Price:",
position[0].Price, "Profit:", position[0].Profit, "Type:", position[0].Type,
"ContractType:", position[0].ContractType, "Symbol:", position[0].Symbol)
}
}
python
def main():
while not exchange.IO("status"):
Sleep(1000)
info = exchange.SetContractType("rb888")
ticker = exchange.GetTicker()
exchange.SetDirection("buy")
exchange.Buy(ticker["Last"] + info["PriceTick"] * 20, 2)
position = exchange.GetPositions()
if len(position) > 0:
Log("Amount:", position[0]["Amount"], "FrozenAmount:", position[0]["FrozenAmount"], "Price:",
position[0]["Price"], "Profit:", position[0]["Profit"], "Type:", position[0]["Type"],
"ContractType:", position[0]["ContractType"], "Symbol:", position[0]["Symbol"])
rust
fn main() {
// 由于是测试代码,不使用商品期货策略的一般架构,这里仅判断 exchange.IO("status") 函数,在成功连接期货公司前置机后立即执行测试代码。股票证券无需使用 exchange.IO("status") 判断连接状态
while exchange.IO("status").unwrap_or_default() != "true" {
Sleep(1000);
}
let info = JSONParse(&exchange.SetContractType("rb888").unwrap()).unwrap();
let ticker = exchange.GetTicker(None).unwrap();
// 注意:Rust 中不推荐使用 SetDirection,优先使用 CreateOrder 直接指定方向
exchange.SetDirection("buy").unwrap();
exchange.Buy(ticker.Last + info["PriceTick"].as_f64().unwrap_or(0.0) * 20.0, 2).unwrap();
let position = exchange.GetPositions(None).unwrap();
if position.len() > 0 {
Log!("Amount:", position[0].Amount, "FrozenAmount:", position[0].FrozenAmount, "Price:",
position[0].Price, "Profit:", position[0].Profit, "Type:", position[0].Type,
"ContractType:", position[0].ContractType, "Symbol:", position[0].Symbol);
}
}
c++
void main() {
while(exchange.IO("status") == 0) {
Sleep(1000);
}
auto info = exchange.SetContractType("rb888");
auto ticker = exchange.GetTicker();
exchange.SetDirection("buy");
exchange.Buy(ticker.Last + info["PriceTick"].get<double>() * 20, 2);
auto position = exchange.GetPositions();
if(position.size() > 0) {
Log("Amount:", position[0].Amount, "FrozenAmount:", position[0].FrozenAmount, "Price:",
position[0].Price, "Profit:", position[0].Profit, "Type:", position[0].Type,
"ContractType:", position[0].ContractType, "Symbol:", position[0].Symbol);
}
}返回值
| 类型 | 描述 |
|
|
参数
| 名称 | 类型 | 必填 | 描述 |
symbol | string | 否 | 参数 |
参考
备注
商品期货的持仓需要注意以下几点:
- 回测系统
回测系统不区分今仓、昨仓。GetPositions函数返回的持仓数据Position结构数组中,Position结构的Type属性仅为PD_LONG或者PD_SHORT。 - 实盘
有些交易所区分今仓、昨仓,例如上期所。
有些交易所虽然也区分,但是不能指定平今仓还是平昨仓,存在今仓时优先平今仓。例如IF等一些品种只能先平今仓,因此今仓、昨仓的仓位信息合并为一个并且不予区分。
兼容exchange.GetPosition()调用。
exchange.GetPositions()函数不依赖于当前设置的合约代码。不传symbol参数时获取所有合约的当前持仓信息;传入symbol参数时获取指定合约的持仓信息。
exchange.SetMarginLevel
exchange.SetMarginLevel()函数用于设置exchange交易所对象当前交易对或合约的杠杆倍数。商品期货和股票证券不支持此功能。
exchange.SetMarginLevel(marginLevel)参数
| 名称 | 类型 | 必填 | 描述 |
marginLevel | number | 是 |
|
参考
exchange.SetDirection
exchange.SetDirection()函数用于设置exchange.Buy函数、exchange.Sell函数在进行期货合约下单时的订单方向。
exchange.SetDirection(direction)
exchange.SetDirection(direction, type)示例
javascript
function main(){
// 鉴于此为测试代码,未采用商品期货策略的一般架构,这里仅通过exchange.IO("status")函数判断,在成功连接期货公司前置机后立即执行测试代码。股票证券无需使用exchange.IO("status")判断连接状态
while(!exchange.IO("status")) {
Sleep(1000)
}
// 举例设置为螺纹钢主力合约
exchange.SetContractType("rb888")
// 设置下单类型为做多
exchange.SetDirection("buy")
// 以10000的价格,合约数量为2张下单。注意,这里的下单价格仅为举例,具体测试时可自行设置、改动
exchange.Buy(10000, 2)
// 设置下单类型为平多
exchange.SetDirection("closebuy")
exchange.Sell(1000, 2)
}
python
def main():
while not exchange.IO("status"):
Sleep(1000)
exchange.SetContractType("rb888")
exchange.SetDirection("buy")
exchange.Buy(10000, 2)
exchange.SetDirection("closebuy")
exchange.Sell(1000, 2)
rust
fn main() {
// 鉴于此为测试代码,未采用商品期货策略的一般架构,这里仅通过exchange.IO("status")函数判断,在成功连接期货公司前置机后立即执行测试代码。股票证券无需使用exchange.IO("status")判断连接状态
while exchange.IO("status").unwrap_or_default() != "true" {
Sleep(1000);
}
// 举例设置为螺纹钢主力合约
exchange.SetContractType("rb888").unwrap();
// 设置下单类型为做多。注意:Rust 中 SetDirection 不推荐使用,优先使用 CreateOrder 直接指定 side("buy"/"sell"/"closebuy"/"closesell"),无需先 SetDirection
exchange.SetDirection("buy").unwrap();
// 以10000的价格,合约数量为2张下单。注意,这里的下单价格仅为举例,具体测试时可自行设置、改动
exchange.Buy(10000, 2).unwrap();
// 设置下单类型为平多
exchange.SetDirection("closebuy").unwrap();
exchange.Sell(1000, 2).unwrap();
}
c++
void main() {
while(exchange.IO("status") == 0) {
Sleep(1000);
}
exchange.SetContractType("rb888");
exchange.SetDirection("buy");
exchange.Buy(10000, 2);
exchange.SetDirection("closebuy");
exchange.Sell(1000, 2);
}参数
| 名称 | 类型 | 必填 | 描述 |
direction | string | 是 |
|
type | string | 否 | 对于采用CTP协议的传统期货,可将第二个参数 |
参考
备注
exchange.SetDirection()函数设置了期货合约交易方向与下单函数之间的对应关系:
| 下单函数 | SetDirection函数的参数设置的方向 | 备注 |
|---|---|---|
| exchange.Buy | "buy" | 买入开多仓 |
| exchange.Buy | "closesell" | 买入平空仓 |
| exchange.Buy | "closesell_today" | 买入平空仓(今仓) |
| exchange.Sell | "sell" | 卖出开空仓 |
| exchange.Sell | "closebuy" | 卖出平多仓 |
| exchange.Sell | "closebuy_today" | 卖出平多仓(今仓) |
exchange.SetContractType
exchange.SetContractType()函数用于设置exchange交易所对象当前的合约代码。
期货支持传统商品期货的CTP协议与易盛协议。在进行任何操作之前,需要先使用exchange.SetContractType()函数设置合约代码。
exchange.SetContractType(symbol)示例
-
使用
exchange.SetContractType()函数设置(订阅)合约。javascriptfunction main(){ while(true) { if (exchange.IO("status")) { var ret = exchange.SetContractType("MA888") Log("订阅合约的详细信息:", ret) break } else { LogStatus(_D(), "未连接") } } }pythondef main(): while True: if exchange.IO("status"): ret = exchange.SetContractType("MA888") Log("订阅合约的详细信息:", ret) break else: LogStatus(_D(), "未连接")rustfn main() { loop { if exchange.IO("status").unwrap_or_default() == "true" { let ret = exchange.SetContractType("MA888"); Log!("订阅合约的详细信息:", ret); break; } else { LogStatus!(_D(None), "未连接"); } } }c++void main() { while(true) { if(exchange.IO("status") == 1) { auto ret = exchange.SetContractType("MA888"); Log("订阅合约的详细信息:", ret); break; } else { LogStatus(_D(), "未连接"); } } } -
商品期货仅在回测中支持虚拟合约交易;在实盘交易中,虚拟合约只能用于获取行情数据。实盘时,我们可以使用虚拟合约所映射的真实合约进行下单,示例代码如下:
javascriptfunction main(){ var n = 0 while(true){ // 需要在判断exchange.IO("status")函数返回true,即为真值时才可调用行情、交易等函数 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 !") } } }pythondef 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 !")rustfn main() { let mut n = 0; loop { // 需要在判断exchange.IO("status")函数返回true,即为真值时才可调用行情、交易等函数 if exchange.IO("status").unwrap_or_default() == "true" { // 设置合约为虚拟合约,MA888,即甲醇主力合约 let ret = JSONParse(&_C!(exchange.SetContractType("MA888"))).unwrap(); 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 !"); } } }c++void main() { int n = 0; while(true) { if(exchange.IO("status") == 1) { auto ret = exchange.SetContractType("MA888"); auto ticker = exchange.GetTicker(); if(n == 100) { exchange.SetContractType(ret["InstrumentID"]); Log("设置映射的实际合约:", ret["InstrumentID"]); exchange.SetDirection("buy"); auto 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 !"); } } }
返回值
| 类型 | 描述 |
object |
打印
|
参数
| 名称 | 类型 | 必填 | 描述 |
symbol | string | 是 | 例如: 主力连续合约的代码为 |
参考
备注
- 主力连续合约(例如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)
}
}
查询结果将显示各个交易所的合约信息。
商品期货合约的命名规则如下:
前面的字母代表品种名称(合约代码短名),后面的数字代表合约到期日。
| 交易所 | 合约命名规则 |
|---|---|
| 上期 / 能源所: | 小写 + 4个数字 |
| 大商所: | 小写 + 4个数字 |
| 中金所: | 大写 + 4个数字 |
| 郑商所: | 大写 + 3个数字 |
exchange.GetContractType
exchange.GetContractType()函数用于获取exchange交易所对象当前设置的合约代码。
exchange.GetContractType()示例
javascript
function main () {
// 鉴于此为测试代码,未采用商品期货策略的通用架构,这里仅通过 exchange.IO("status") 函数判断,在确认成功连接期货公司前置机后立即执行测试代码。股票证券交易无需使用 exchange.IO("status") 判断连接状态
while(!exchange.IO("status")) {
Sleep(1000)
}
Log(exchange.SetContractType("rb888"))
Log(exchange.GetContractType())
}
python
def main():
while not exchange.IO("status"):
Sleep(1000)
Log(exchange.SetContractType("rb888"))
Log(exchange.GetContractType())
rust
fn main() {
// 鉴于此为测试代码,未采用商品期货策略的通用架构,这里仅通过 exchange.IO("status") 函数判断,在确认成功连接期货公司前置机后立即执行测试代码。股票证券交易无需使用 exchange.IO("status") 判断连接状态
while exchange.IO("status").unwrap_or_default() != "true" {
Sleep(1000);
}
Log!(exchange.SetContractType("rb888"));
Log!(exchange.GetContractType());
}
c++
void main() {
while(exchange.IO("status") == 0) {
Sleep(1000);
}
Log(exchange.SetContractType("rb888"));
Log(exchange.GetContractType());
}返回值
| 类型 | 描述 |
string |
|
参考