exchange.GetPositions()
函数用于获取所有合约当前持仓信息。GetPositions()
函数是交易所对象{@var/EXCHANGE exchange}的成员函数。 GetPositions()
函数获取交易所对象exchange
绑定的交易所账户的持仓信息,exchange
对象的成员函数(方法)的用途只和exchange
相关,文档之后不再赘述。
exchange.GetPositions()
函数请求数据成功时返回{@struct/Position Position}结构数组,请求数据失败时返回空值。 没有持仓则返回空数组,即[]。
{@struct/Position Position}数组、空值
exchange.GetPositions() exchange.GetPositions(symbol)
参数symbol
用于指定请求的持仓数据的合约代码。不传该参数时默认请求所有合约的持仓数据。
symbol false string
/*
注意: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)
}
}
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"])
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);
}
}
商品期货的持仓需要注意:
GetPositions
函数返回的持仓数据{@struct/Position Position}结构数组中,Position
结构的Type
属性仅为PD_LONG
或者PD_SHORT
。IF
等一些品种只能先平今仓,所以今仓、昨仓仓位信息合并为一个并且不予区分。兼容exchange.GetPosition()
调用。
exchange.GetPositions()
函数不依赖于当前设置的合约代码,不传symbol
参数时获取所有合约当前持仓信息。传入symbol
参数时获取指定合约的持仓信息。
{@struct/Position Position}, {@fun/Futures/exchange.SetContractType exchange.SetContractType}
exchange.SetMarginLevel()
函数用于设置{@var/EXCHANGE exchange}交易所对象当前交易对、合约的杠杆值。 商品期货、股票证券不支持。
exchange.SetMarginLevel(marginLevel)
marginLevel
参数用于设置杠杆值,交易所的杠杆值通常是整数。
marginLevel
true
number
{@var/EXCHANGE exchange}
exchange.SetDirection()
函数用于设置{@fun/Trade/exchange.Buy exchange.Buy}函数、{@fun/Trade/exchange.Sell exchange.Sell}函数进行期货合约下单时的订单方向。
exchange.SetDirection(direction) exchange.SetDirection(direction, type)
direction
参数用于设置期货合约下单时的方向,可选值为:"buy"
、"closesell"
、"sell"
、"closebuy"
、closesell_today
、closebuy_today
。 其中closebuy_today
,closesell_today
指平今仓。closebuy
/closesell
为平昨仓。
direction
true
string
对于CTP协议传统期货,可以设置第二个参数type
为"1"
或者"2"
或者"3"
,分别指"投机",“套利”,“套保”,不设置默认为投机。
type
false
string
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)
}
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)
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);
}
exchange.SetDirection()
函数设置期货合约交易的方向和下单函数之间的对应关系:
下单函数 | SetDirection函数的参数设置的方向 | 备注 |
---|---|---|
exchange.Buy | “buy” | 买入开多仓 |
exchange.Buy | “closesell” | 买入平空仓 |
exchange.Buy | “closesell_today” | 买入平空仓(今仓) |
exchange.Sell | “sell” | 卖出开空仓 |
exchange.Sell | “closebuy” | 卖出平多仓 |
exchange.Sell | “closebuy_today” | 卖出平多仓(今仓) |
{@fun/Trade/exchange.Buy exchange.Buy}, {@fun/Trade/exchange.Sell exchange.Sell}
exchange.SetContractType()
函数用于设置{@var/EXCHANGE exchange}交易所对象当前的合约代码。
期货支持传统商品期货CTP协议,易盛协议。所有操作前需要先使用exchange.SetContractType()
函数设置合约代码。
exchange.SetContractType()
函数返回一个结构。该结构中记录合约的详细信息,例如:最小下单合约张数、手续费、交割时间等数据。
打印exchange.SetContractType("MA888")
函数返回的数据,即合约详细信息如下:
{
"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
}
object
exchange.SetContractType(symbol)
例如:exchange.SetContractType("rb2310")
,作用为设置当前操作的合约为螺纹钢2023年10月交割的合约。
主力连续合约的代码为888
,例如MA888
,连续指数合约为000
,例如MA000
。888
与000
虚拟合约的交易只支持回测,实盘只支持获取行情。
symbol true string
function main(){
while(true) {
if (exchange.IO("status")) {
var ret = exchange.SetContractType("MA888")
Log("订阅的合约的详细信息:", ret)
break
} else {
LogStatus(_D(), "未连接")
}
}
}
def main():
while True:
if exchange.IO("status"):
ret = exchange.SetContractType("MA888")
Log("订阅的合约的详细信息:", ret)
break
else:
LogStatus(_D(), "未连接")
void main() {
while(true) {
if(exchange.IO("status") == 1) {
auto ret = exchange.SetContractType("MA888");
Log("订阅的合约的详细信息:", ret);
break;
} else {
LogStatus(_D(), "未连接");
}
}
}
使用exchange.SetContractType()
函数设置(订阅)合约。
function 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 !")
}
}
}
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 !")
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 !");
}
}
}
商品期货只有回测支持虚拟合约交易,实盘时虚拟合约只支持获取行情,实盘时我们可以用虚拟合约映射的真实合约下单,例如以下代码:
在商品期货策略中调用exchange.SetContractType(ContractType)
函数时,实盘或者simnow模拟盘中是可能订阅失败的,例如连接期货公司前置机失败时或者设置了不存在的合约代码时。 订阅虚拟合约成功以后,返回的字段里面的InstrumentID
是主力合约(会在订阅同时获取),方便策略实盘下单交易时做映射使用。
对于商品期货合约代码不太熟悉的用户可以使用如下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个数字 |
{@fun/Futures/exchange.GetContractType exchange.GetContractType}
exchange.GetContractType()
函数用于获取{@var/EXCHANGE exchange}交易所对象当前设置的合约代码。
exchange.GetContractType()
函数返回交易所对象{@var/EXCHANGE exchange}当前设置的合约代码。
string
exchange.GetContractType()
function main () {
// 鉴于测试代码,不使用商品期货策略一般架构,这里仅仅判断exchange.IO("status")函数,判断连接期货公司前置机成功后立即执行测试代码。股票证券无需使用exchange.IO("status")判断连接状态
while(!exchange.IO("status")) {
Sleep(1000)
}
Log(exchange.SetContractType("rb888"))
Log(exchange.GetContractType())
}
def main():
while not exchange.IO("status"):
Sleep(1000)
Log(exchange.SetContractType("rb888"))
Log(exchange.GetContractType())
void main() {
while(exchange.IO("status") == 0) {
Sleep(1000);
}
Log(exchange.SetContractType("rb888"));
Log(exchange.GetContractType());
}
{@fun/Futures/exchange.SetContractType exchange.SetContractType}
商品期货CTP协议中的汉字是GBK编码可用StrDecode()
函数解码。
StrDecode()
函数返回GBK编码的字符串解码后的内容。
string
StrDecode(gbkString)
需要解码的字符串。 gbkString true string
{@fun/Global/Encode Encode}
Account Threads