2.6 Hàng hóa

Tác giả:Giấc mơ nhỏ, Tạo: 2016-11-10 18:43:53, Cập nhật: 2017-10-11 10:20:49

Thời hạn


  • Hàng hóa tương lai

    Cơ cấu đơn giản của chiến lược tương lai hàng hóa (không giống như chiến lược tiền kỹ thuật số được học trước đây, kiểm tra trạng thái kết nối với máy chủ sàn giao dịch khi bắt đầu mỗi chu kỳ), tất nhiên, tốt nhất là phải phán xét lại liệu hợp đồng muốn giao dịch có trong khoảng thời gian giao dịch hay không.
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);                         //  需要有轮询间隔, 以免访问过于频繁。
    }
}

Sau đó, chúng tôi sẽ thử nghiệm các API theo cấu trúc này.

  • Truy cập thông tin tài khoản

Ở đây giả sử rằng người đọc đã hiểu quá trình thêm tài khoản CTP và đã thêm CTP. Không rõ ràng có thể quen thuộc Chương 1.3.3 giao dịch , CTP hàng hóa tương lai đĩa tương tự cấu hình

Mã nguồn thử nghiệm dưới đây, sử dụng đĩa tương lai hàng hóa của 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);
    }
}

Khả năng hoạt động của các ổ đĩa tương tự:

img

  • Thiết lập đòn bẩy, thiết lập loại hợp đồng

Một số người dùng mới có thể gặp lỗi như sau: khi viết một chiến lược tương lai hàng hóa CTP, khi học, họ sẽ trực tiếp gọi API để lấy K-line, dữ liệu thị trường.exchange.IO("status"); giá trị trả về được tìm thấy là true, đã được kết nối. Lý do là: không có thông tin đăng ký của bất kỳ loại nào, hãy gọi API để truy cập vào K-Line, giao dịch (nhà quản trị không biết phải gửi dữ liệu gì cho bạn). Vì vậy, hãy xem cách đăng ký thông tin hợp đồng, đó là thiết lập loại hợp đồng đang hoạt động. Chúng ta hãy xem tài liệu API mô tả:

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");

Các tham số của hàm ContractType là mã hợp đồng, các tham số là một chuỗi, vì vậy đừng quên ký tự hai chữ cái.

imgVí dụ, Methanol MA, một hợp đồng được giao vào tháng 1 năm 2017, mã là MA701. Dưới đây, chúng ta sẽ lấy một ví dụ như MA701 và gọi hàm SetContractType để lấy thông tin hợp đồng và đặt hợp đồng để hoạt động hiện tại.

Mã là:

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);
    }
}

Bạn có thể thấy thông tin chi tiết về hợp đồng MA701 được in ra.

img img

Một vài đặc điểm đơn giản: Hợp đồng: InstrumentName, một tay: VolumeMultiple phần, số lượng đặt hàng tối đa: MaxLimitOrderVolume, tỷ lệ bảo đảm: LongMarginRatio (nhiều cổ phiếu), ShortMarginRatio (không cổ phiếu), ngày giao hàng: StartDelivDate.

Có thể có những vấn đề sau đây:Tôi muốn biết, có bất kỳ hợp đồng nào tôi có thể thiết lập để làm gì không?exchange.IO("instruments"); truy vấn. Tôi muốn biết liệu các chương trình hiện tại có đăng ký các hợp đồng đó không?exchange.IO("subscribed"); truy vấn. Hãy thử:

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);
    }
}

Kết quả thử nghiệm đĩa giả:img

Hiện tại, CTP không hỗ trợ các thiết lập đòn bẩy tương lai hàng hóa.

  • Thu thập dữ liệu thị trường

Sau khi thiết lập hợp đồng hoạt động hiện tại với SetContractType, bạn có thể lấy dữ liệu đường K và thị trường của hợp đồng đó. Lưu ý rằng, sử dụng hàm SetContractType để thiết lập một hợp đồng, ví dụ như thiết lập SetContractType (MA705), đăng ký (MA705) và thiết lập hợp đồng hiện tại là MA705, đó là hợp đồng methanol được giao vào tháng 5 năm 2017.

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);
        }
}

Kết quả:

img

  • Nhận cổ phần

GetPosition hàm API tài liệu mô tả:

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的传入类型
}

Mã kiểm tra:

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);
        }
}

Kết quả:img

Bạn có thể thấy rằng nếu tôi chỉ giữ một giống, gọi hàm GetPosition, bạn sẽ nhận được một mảng chỉ chứa một yếu tố, nếu bạn giữ nhiều giống, bạn sẽ nhận được một mảng chứa nhiều yếu tố.

  • Thiết lập hướng hoạt động, mở, thanh toán (bây giờ, trước đây)

Sau khi thiết lập loại hợp đồng, trước khi mở giao dịch giao dịch, chúng ta phải thiết lập hướng hoạt động (không giống như giao dịch trực tiếp), chúng ta cần một hàm API khác: SetDirection

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);

Các tham số của SetDirection được giải thích:

  • 1. buy: Lập mục này khi gọi SetDirection, sau khi gọi, gọi lại hàm exchange.Buy, thực hiệnQuay nhiều hơnCác hoạt động.
  • 2. sell: Lập SetDirection và gọi lại hàm exchange.Sell.Kho trốngCác hoạt động.
  • 3. closebuy button: nhập tham số này khi gọi SetDirection, sau khi gọi lại, gọi lại hàm exchange.Sell, thực hiệnĐịa ngụcChức năng này cũng được sử dụng để gọi hàm exchange.Sell.Kho trốngHoặcĐịa ngục)
  • closesell: Lập mục này khi gọi SetDirection, sau đó gọi lại hàm exchange.Buy, thực hiệnCửa hàng trốngHoạt động... (cũng khác với SetDirection)

Trong khi đó, các nhà đầu tư khác cũng cho rằng các hợp đồng tương lai truyền thống có thêm 2 thông số:

  • 1. closebuy_today : dùng để đặt giá hôm nay.
  • closesell_today: dùng để tính giá bán trống hôm nay.

Theo mặc định, 2 tham số có nghĩa là:

  • closebuy: dùng để thanh toán ngày hôm qua nhiều cửa hàng.
  • closesell: dùng để bù đắp hàng rỗng ngày hôm qua.

Một số bạn có thể hỏi: Làm thế nào để phân biệt giá trị cổ phiếu của tôi là ngày hôm nay hay ngày hôm qua? Đáp: Dữ liệu được trao đổi trả về sẽ cho chúng ta câu trả lời, trong dữ liệu được gọi GetPosition để có được thông tin cổ phiếu, có một thuộc tính Type, thuộc tính này sẽ cho chúng ta biết giá trị cổ phiếu là hiện tại hoặc hôm qua.

img

Hãy bắt tay thử, mở sàn giao dịch!

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);
}

Trong hệ thống kiểm tra lại, chi phí thủ tục được tự động khấu trừ, tiền bảo lãnh cũng tự động trở lại tài khoản. Và hệ thống kiểm tra lại không phân biệt hiện tại và ngày hôm qua.

img

  • Sổ giao dịch tương lai hàng hóa nhanh

Để người dùng có thể sử dụng nó một cách dễ dàng hơn, nền tảng đã đóng gói một công cụ dễ sử dụng. Mã nguồn mở, các học sinh có thể xem thực hiện và có thể học được nhiều kiến thức và ý tưởng. Dưới đây chúng ta sẽ giới thiệu một số tiện ích của mẫu. 1. Sao chép mẫu

img

Sau khi sao chép mẫu, một mẫu đã có sẽ xuất hiện trong thanh mẫu của chính sách, cần thêm vào chính sách và đặt dấu ấn vào hộp bên cạnh nó. Ví dụ:

img

3. Hãy thử sử dụng:Một giốngĐa nhiệm vụHai mô hình làm việc, chúng ta sẽ biết trước về phương pháp sử dụng đơn loại ở cấp độ sơ cấp.

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()  并打印 盈亏信息。
}

imgTrong mã mẫu, các hàm bắt đầu bằng $. là các hàm xuất từ mẫu và có thể được gọi bởi các chính sách khác (miễn là đã được thêm vào chính sách).

  • Tiền tương lai tiền kỹ thuật số

Hỗ trợ BitVC, OKCoin, 796

  • Bạn có thể sử dụng hàm SetMarginLevel để thay đổi đòn bẩy, 10, 20, với sự khác biệt nhỏ giữa các sàn giao dịch.
SetMarginLevel(MarginLevel)	设置杆杠大小
设置Buy(多单)或者Sell(空单)的杆杠大小, MarginLevel有5, 10, 20 三个可选参数
796支持5,10,20,50三个选项, BitVC的LTC不支持20倍杠杆, OKCoin支持10倍和20倍
如: exchange.SetMarginLevel(5)
  • Nhóm hợp đồng OKCoin tương lai có this_week, next_week, quarter. Các hợp đồng khác nhau giữa các sàn giao dịch, có thể xem tài liệu API.

Thêm nữa

Số lượng dòng chảyXin vui lòng thêm vào phần giảng dạy về hợp đồng tiền kỹ thuật số.

Giấc mơ nhỏMột bài học mới đang được thực hiện.