2.6 점 물품

저자:작은 꿈, 2016-11-10 18:43:53, 업데이트: 2017-10-11 10:20:49

선물


  • 상품 선물

    상품 선물 전략의 간단한 구조 (이전에 배운 디지털 화폐 전략과 달리, 주기가 시작될 때마다 거래소 서버와의 연결 상태를 확인하는 것) 은 물론 거래 시기의 계약이 아닌지 재검토하는 것이 좋습니다.
function MainLoop(){ //  处理具体工作的函数
    // deal Main task
}
function main() {
    var status = null;
    while(true){
        status = exchange.IO("status");      //  调用API 确定连接状态
        if(status === true){                 //  判断状态
            LogStatus("已连接!");
            MainLoop();                      //  连接上 交易所服务器后,执行主要工作函数。
        }else{                               //  如果没有连接上 即 exchange.IO("status") 函数返回 false
            LogStatus("未连接状态!");         //  在状态栏显示 未连接状态。
        }
        Sleep(1000);                         //  需要有轮询间隔, 以免访问过于频繁。
    }
}

다음으로 우리는 이런 구조로 API를 테스트합니다.

  • 계정 정보

여기서는 독자가 CTP 상품 선물 시뮬레이션 디스크 계정을 추가하는 과정을 이해하고 있으며 CTP 상품 선물 시뮬레이션 디스크를 추가했다고 가정합니다. 명확하지 않은 것은 숙련 될 수 있다 1.3.3 장 거래소 , CTP 상품 선물 模拟盘 配置 (教学贴)

테스트 소스 코드는 아래와 같습니다. CTP 상품 선물 시뮬레이션 디스크를 사용합니다.

var Account = null;
function MainLoop(){
    Account = _C(exchange.GetAccount);
}
function main() {
    var status = null;
    while(true){
        status = exchange.IO("status");
        if(status === true){
            LogStatus("已连接!", new Date(), '\n', "Account:", Account);
            MainLoop();            
        }else{
            LogStatus("未连接状态!", new Date());
        }
        Sleep(1000);
    }
}

모형 디스크가 실행되면:

img

  • 레버리지를 설정하고 계약 유형을 설정합니다

새로운 사용자가 이러한 오류를 겪을 수 있습니다. CTP 상품 선물 전략을 작성하는 것을 배우는 동안 API를 직접 호출하여 K 라인, 거래 데이터를 얻을 수 있습니다.exchange.IO("status");의 반환 값은 true로 확인되고 연결되었다. 이 이유는: 어떤 종류의 정보도 구독하지 않고, K 라인을 얻으려는 트랜잭션의 API를 호출하기 때문입니다. 그래서 계약 정보를 구독하는 방법, 즉 현재 동작하는 계약의 유형을 설정하는 방법을 살펴보겠습니다. 이 문서는 이 API 문서에 대한 설명에 대해 설명합니다.

SetContractType(ContractType)	设置合约类型
传统的CTP期货的ContractType就是指的合约ID,  如SetContractType("au1506") 返回合约的详细信息, 如最少一次买多少, 手续费, 交割时间等
股票合约格式为 股票代码.(SH/SZ), SH指上交所, SZ指深交所, 如000001.SZ就是指深交所的平安银行
商品期货与股票取消订阅合约, 在合约名前加上"-"前缀重新调用即可, 如SetContractType("-au1506"); 成功返回true
数字货币796支持: "week", "weekcny", 默认为子账户A, 要指定子账户是A还是B, 在合约后加"@A"或"@B", 如: "day@A" 为日合约A子账户
BitVC有week和quarter和next_week三个可选参数, OKCoin期货有this_week, next_week, quarter三个参数
exchange.SetContractType("week");

함수의 매개 변수 ContractType는 계약 코드이며 매개 변수는 문자열입니다.

img예를 들어, 메토올 MA는 2017년 1월에 전달된 계약으로, 코드 MA701이다. 아래에서 우리는 MA701의 예를 사용하여 SetContractType 함수를 호출하여 계약 정보를 얻고 현재 동작하는 계약으로 설정한다.

코드는 다음과 같습니다.

var Account = null;
var isFirstSetContractType = true;   // 标记是否第一次设置 合约。
function MainLoop(){
    Account = _C(exchange.GetAccount);
    if(isFirstSetContractType === true){    // 是第一次设置合约 ,执行以下设置。
        var ContractInfo = exchange.SetContractType("MA701");   // SetContractType 函数返回 设置的合约的详细信息。
        for(var k in ContractInfo){    // 遍历这个信息结构。
            Log(k, ContractInfo[k]);   // 逐行打印。
        }
        isFirstSetContractType = false;    // 设置过合约了。
    }
}
function main() {
    var status = null;
    while(true){
        status = exchange.IO("status");
        if(status === true){
            LogStatus("已连接!", new Date(), '\n', "Account:", Account);
            MainLoop();            
        }else{
            LogStatus("未连接状态!", new Date());
        }
        Sleep(1000);
    }
}

MA701 계약에 대한 자세한 정보를 인쇄한 것을 볼 수 있습니다.

img img

이 글은 한 가지 간단한 특징을 소개합니다. 계약: InstrumentName, 한쪽: VolumeMultiple 부분, 최대 주문량: MaxLimitOrderVolume, 보증금율: LongMarginRatio (다양한 포스팅), ShortMarginRatio (공백 포스팅), 배달 날짜: StartDelivDate.

이 사이트의 사용은 다음과 같은 문제를 일으킬 수 있습니다.어떤 계약을 설정할 수 있는지 궁금합니다.exchange.IO("instruments"); 문의하십시오. 제가 궁금한 것은 현재 프로그램들이 그 계약에 가입하고 있는지 입니다.exchange.IO("subscribed"); 문의하십시오. 한 번 시도해보세요:

var Account = null;
var isFirstSetContractType = true;                              // 标记是否第一次设置 合约。
function MainLoop(){
    Account = _C(exchange.GetAccount);
    if(isFirstSetContractType === true){                        // 是第一次设置合约 ,执行以下设置。
        var ContractInfo = exchange.SetContractType("MA701");   // SetContractType 函数返回 设置的合约的详细信息。
        for(var k in ContractInfo){                             // 遍历这个信息结构。
            Log(k, ContractInfo[k]);                            // 逐行打印。
        }
        isFirstSetContractType = false;                         // 设置过合约了。
        var contracts = exchange.IO("instruments");             // 查询 可订阅的合约 
        var str = "";
        for(var i in contracts){
            str += (i + "--");
        }
        Log("已经订阅的合约:" ,exchange.IO("subscribed"));        // 查询已经订阅的合约
        Log("可订阅的合约:", str);                               // 显示可以订阅的合约信息 
    }
}
function main() {
    var status = null;
    while(true){
        status = exchange.IO("status");
        if(status === true){
            LogStatus("已连接!", new Date(), '\n', "Account:", Account);
            MainLoop();            
        }else{
            LogStatus("未连接状态!", new Date());
        }
        Sleep(1000);
    }
}

모형판 테스트 결과:img

현재 CTP 상품 선물 레버 설정은 지원되지 않습니다.

  • 시장 데이터

SetContractType를 사용하여 현재 운영 계약을 설정하면 해당 계약의 K 라인 및 시장 데이터를 얻을 수 있습니다. 참고로 SetContractType 함수를 하나의 계약으로 설정하는 경우, SetContractType (MA705??) 를 설정하고, 구독 (MA705??) 을 한 번 실행하여 현재 계약을 MA705로 설정하고, 즉 2017년 5월에 전달된 메톨로 계약으로 설정하는 것이 좋습니다. 이 때 GetRecords, GetTicker, GetDepth 등의 API 함수를 호출하면 MA705 계약의 관련 데이터를 반환합니다. 다른 계약을 취득하려면 SetContractType 함수를 설정한 현재 계약 유형을 다시 호출해야 하며, 그 다음에는 API 또는 거래를 호출해야 합니다.

var Account = null;   // 全局变量  用来保存每次获取的账户信息
var ticker = null;    //          用来保存每次获取的行情信息
var records = null;   //          用来保存每次获取的K线数据
var isFirstSetContractType = true;                              // 标记是否第一次设置 合约。
function MainLoop(){
        Account = _C(exchange.GetAccount);
        if(isFirstSetContractType === true){                        // 是第一次设置合约 ,执行以下设置。
            var ContractInfo = exchange.SetContractType("MA701");   // SetContractType 函数返回 设置的合约的详细信息。
            for(var k in ContractInfo){                             // 遍历这个信息结构。
                Log(k, ContractInfo[k]);                            // 逐行打印。
            }
            isFirstSetContractType = false;                         // 设置过合约了。
            var contracts = exchange.IO("instruments");             // 查询 可订阅的合约 
            var str = "";
            for(var i in contracts){
                str += (i + "--");
            }
        }
        ticker = exchange.GetTicker();      //    调用API  GetTicker 
        records = exchange.GetRecords();    //    调用API  GetRecords   默认周期
}
function main() {
        var status = null;
        while(true){
            status = exchange.IO("status");
            if(status === true){
                LogStatus("已连接!", new Date(), '\n', "Account:", Account, '\n', "ticker:", ticker , '\n', "records:", records);
                MainLoop();            
            }else{
                LogStatus("未连接状态!", new Date());
            }
            Sleep(1000);
        }
}

이 프로젝트의 결과는:

img

  • 지분을 취득

GetPosition 함수 API 문서 설명:

GetPosition	获取当前持仓信息
返回一个Position数组, (BitVC和OKCoin)可以传入一个参数, 指定要获取的合约类型
Position 结构	期货交易中的持有仓位信息, 由GetPosition()函数返回此结构数组
{
        MarginLevel :杆杠大小, 796期货有可能为5, 10, 20三个参数, OKCoin为10或者20, 
                      BitVC期货和OK期货的全仓模式返回为固定的10, 因为原生API不支持。
        Amount       :持仓量, 796期货表示持币的数量, BitVC指持仓的总金额(100的倍数), OKCoin表示合约的份数(整数且大于1)
        CanCover     :可平量, 只有股票有此选项, 表示可以平仓的数量(股票为T+1)今日仓不能平
        FrozenAmount :冻结量, 支持传统期货与股票, 数字货币只支持796交易所
        Price        :持仓均价
        Profit       :持仓浮动盈亏(数据货币单位:BTC/LTC, 传统期货单位:RMB, 股票不支持此字段, 
                     注: OKCoin期货全仓情况下指实现盈余, 并非持仓盈亏, 逐仓下指持仓盈亏)
        Type	     :PD_LONG为多头仓位(CTP中用closebuy_today平仓), PD_SHORT为空头仓位(CTP用closesell_today)平仓, 
              (CTP期货中)PD_LONG_YD为咋日多头仓位(用closebuy平), PD_SHORT_YD为咋日空头仓位(用closesell平)
        ContractType :商品期货为合约代码, 股票为'交易所代码_股票代码', 具体参数SetContractType的传入类型
}

테스트 코드:

var Account = null;   // 全局变量  用来保存每次获取的账户信息
var ticker = null;    //          用来保存每次获取的行情信息
var records = null;   //          用来保存每次获取的K线数据
var positions = null;  //          用来获取 账户的持仓信息。
var isFirstSetContractType = true;                              // 标记是否第一次设置 合约。
function MainLoop(){
        Account = _C(exchange.GetAccount);
        if(isFirstSetContractType === true){                        // 是第一次设置合约 ,执行以下设置。
            var ContractInfo = exchange.SetContractType("MA701");   // SetContractType 函数返回 设置的合约的详细信息。
            for(var k in ContractInfo){                             // 遍历这个信息结构。
                Log(k, ContractInfo[k]);                            // 逐行打印。
            }
            isFirstSetContractType = false;                         // 设置过合约了。
            var contracts = exchange.IO("instruments");             // 查询 可订阅的合约 
            var str = "";
            for(var i in contracts){
                str += (i + "--");
            }
            exchange.SetDirection("buy");     // 设置 操作
            exchange.Buy(_C(exchange.GetTicker).Sell + 2, 1);    // 开多仓。
        }
        positions = exchange.GetPosition();   //    获取所有持仓信息
}
function main() {
        var status = null;
        while(true){
            status = exchange.IO("status");
            if(status === true){
                LogStatus("已连接!", new Date(), '\n', "Account:", Account, '\n', "ticker:", ticker 
                    , '\n', "records:", records, '\n', "positions:", positions);
                MainLoop();            
            }else{
                LogStatus("未连接状态!", new Date());
            }
            Sleep(1000);
        }
}

이 프로젝트의 결과는:img

예를 들어, 제가 하나의 품종만을 저장하고, GetPosition 함수를 호출하면 하나의 요소만 포함된 배열을 얻을 수 있습니다. 여러 품종을 보관하면 여러 요소를 포함하는 배열을 얻을 수 있습니다.

  • 운영 방향, 오픈, 평형 (현지 위치, 이전 위치)

계약 유형을 설정한 후, 거래 상거래를 시작하기 전에 운영 방향을 설정해야 합니다. 우리는 다른 API 함수를 필요로 합니다.

SetDirection(Direction)	设置Buy或者Sell下单类型
Direction可以取buy, closebuy, sell, closesell四个参数, 传统期货多出closebuy_today,与closesell_today, 指平今仓,
默认为closebuy/closesell为平昨仓
对于CTP传统期货, 可以设置第二个参数"1"或者"2"或者"3", 分别指"投机", "套利", "套保", 不设置默认为投机
股票只支持buy与closebuy, 因为股票只能买跟平仓
exchange.SetMarginLevel(5);
exchange.SetDirection("buy");
exchange.Buy(1000, 2);
exchange.SetMarginLevel(5);
exchange.SetDirection("closebuy");
exchange.Sell(1000, 2);

SetDirection의 매개 변수는 다음과 같습니다.

  • 1.buy: SetDirection를 호출할 때 이 매개 변수를 입력하고, 호출 후 다시 exchange.Buy 함수를 호출하여 수행합니다.더 많은 창고운영합니다.
  • 2.sell 버튼: SetDirection를 호출할 때 이 매개 변수를 입력하고, 호출 후 다시 exchange.Sell 함수를 호출하여 수행합니다.빈 창고운영합니다.
  • 3.closebuy: SetDirection를 호출할 때 이 매개 변수를 입력하고, 호출 후 다시 exchange.Sell 함수를 호출하여 수행합니다.평면 다중장동작 (() 은 같은 것을 볼 수 있습니다. Exchange.Sell 함수를 호출하는 것과 마찬가지로, SetDirection를 호출하여 동작 방향을 설정하기 전에빈 창고아니면평면 다중장)
  • 4.closesell 버튼: SetDirection를 호출할 때 이 매개 변수를 입력하고, 호출 후 다시 exchange.Buy 함수를 호출하여 수행합니다.평평한 창고동작。(또한 SetDirection (buy) 과 다른 동작이다.

기존의 선물에는 두 가지 매개 변수가 추가되었습니다.

  • 1.closebuy_today: 오늘 많은 상장을 구매하기 위해 사용된다.
  • 2.closesell_today: 오늘 빈 상품을 평준화합니다.

기본으로 두 개의 매개 변수가 있습니다.

  • 1. closebuy: 어제를 평준화하기 위해 사용되다.
  • 2. closesell: 어제 빈 물건을 평정하기 위해 쓰다.

어떤 동료가 질문할 수 있습니다. "내가 가진 지분은 오늘이나 어제인지 어떻게 구분할 수 있을까?"

img

자, 이제 손을 들어보세요.

function main() {  // 这次为了方便重点看  开仓平仓操作,我们在回测系统中进行测试。
    var initAccount = exchange.GetAccount();   // 获取初始 账户信息
    var info = exchange.SetContractType("MA701");   //   设置我们要操作的合约  甲醇 
    var ticker = exchange.GetTicker();   // 先获取当前的行情 数据
    
    Log("initAccount:", initAccount);
    Log(info);
    
    // 开仓买入做多
    exchange.SetDirection("buy");
    exchange.Buy(ticker.Sell + 1, 1);  // 吃掉卖一价这个单子,  买入一手。
    
    Sleep(1000);
    
    // 获取一下持仓信息
    var positions = exchange.GetPosition();  // 获取持仓信息
    Log("当前所有持仓:", positions);
    
    //平仓
    var pos = null;
    for(var i = 0 ; i < positions.length ; i++){
        if(positions[i].ContractType == "MA701"){
            pos = positions[i];
        }
    }
    exchange.SetDirection("closebuy_today");
    exchange.Sell(ticker.Buy - 1, pos.Amount);
    
    positions = exchange.GetPosition();
    Log("当前所有持仓:", positions);
}

재검토 시스템에서는 절차 수수료가 자동으로 적립되고 보증금은 자동으로 계좌로 반환됩니다. 그리고 재검토 시스템은 현재 포지션, 어제 포지션을 구분하지 않습니다. 정책을 작성할 때 요구 사항에 따라 작성하는 것이 좋습니다.

img

  • 재래소 상품 거래 서식지

사용자들의 더 나은 사용을 위해, 플랫폼은 사용하기 쉬운 도구 을 포장했습니다. 오픈 소스 코드가 공개되어 있고, 관심있는 학생들이 이 프로그램을 보고 많은 지식과 아이디어를 배울 수 있습니다. 아래에는 템플릿이 제공하는 편의성에 대해 알아보겠습니다. 1. 템플릿을 먼저 복사합니다.

img

2. 코드를 간략히 설명하자면, 템플릿 코드 자체에는 main 함수가 있다. 테스트를 위해, 템플릿 테스트를 직접 실행할 수 있다. 우리는 템플릿을 복사한 후, 정책의 템플릿 칸에 이미 존재하는 템플릿이 나타난다.

img

3. 사용 시도: 템플릿이 있습니다.단종멀티태스킹두 가지 작업 모형, 우리는 초기의 단일 유형 사용 방법을 먼저 알고 있습니다.

function main() {
    var p = $.NewPositionManager();   // $.NewPositionManager() 是 商品期货交易类库 模板的导出函数(接口)。
                                      // 该函数的作用是返回一个对象,用该对象管理开仓、平仓等操作。
    p.OpenShort("MA701", 1);          // p对象 的方法 OpenShort() , 功能是开空仓, 参数传入 合约代码 ,数量
                                      // 会根据当前行情的价格 开空仓。
    p.OpenShort("MA701", 1);          // 继续开空
    Log(p.GetPosition("MA701", PD_SHORT));   // 调用对象 p的 方法 GetPosition() ,传入合约代码, 合约类型, 找出相应的持仓,打印出来。

    Log(p.Account());
    Sleep(60000 * 10);                // 暂停一段时间
    p.CoverAll();                     // 调用 对象 p的方法 CoverAll() 把持仓全部平掉。
    LogProfit(p.Profit());            // 调用 对象 p的方法 Profit()  并打印 盈亏信息。
}

img템플릿 코드에서 $.로 시작되는 함수는 다른 정책에 의해 호출될 수 있는 템플릿의 출력 함수입니다.

  • 디지털 화폐 선물

주로 BitVC, OKCoin, 796를 지원합니다.

  • SetMarginLevel 함수를 사용하여 레버리지를 수정할 수 있습니다.
SetMarginLevel(MarginLevel)	设置杆杠大小
设置Buy(多单)或者Sell(空单)的杆杠大小, MarginLevel有5, 10, 20 三个可选参数
796支持5,10,20,50三个选项, BitVC的LTC不支持20倍杠杆, OKCoin支持10倍和20倍
如: exchange.SetMarginLevel(5)
  • 계약 품종 OKCoin 선물에는 this_week (이번주), next_week (다음주), quarter (분기) 가 있습니다. 각 거래소에서 계약이 다르며 API 문서를 참조하십시오.

더 많은

양적 거래소디지털 화폐 계약에 대한 교육 부분을 추가해 주시겠습니까?

작은 꿈새로운 교육이 진행중입니다.