资源加载中... loading...

Futures

exchange.GetPositions

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

exchange.SetMarginLevel()函数用于设置{@var/EXCHANGE exchange}交易所对象当前交易对、合约的杠杆值。 商品期货、股票证券不支持。

exchange.SetMarginLevel(marginLevel)

marginLevel参数用于设置杠杆值,交易所的杠杆值通常是整数。 marginLevel true number

{@var/EXCHANGE exchange}

exchange.SetDirection

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_todayclosebuy_today。 其中closebuy_todayclosesell_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

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,例如MA000888000虚拟合约的交易只支持回测,实盘只支持获取行情。

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

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}

StrDecode

商品期货CTP协议中的汉字是GBK编码可用StrDecode()函数解码。

StrDecode()函数返回GBK编码的字符串解码后的内容。 string

StrDecode(gbkString)

需要解码的字符串。 gbkString true string

{@fun/Global/Encode Encode}

Account Threads