2.6 Barang

Penulis:Mimpi kecil, Dicipta: 2016-11-10 18:43:53, Dikemas kini: 2017-10-11 10:20:49

Masa hadapan


  • Masa hadapan komoditi

    Struktur mudah strategi niaga hadapan komoditi (tidak seperti strategi mata wang digital yang dipelajari sebelum ini, memeriksa status sambungan ke pelayan pertukaran pada setiap permulaan kitaran) tentu lebih baik untuk menilai semula sama ada kontrak yang akan diperdagangkan adalah dalam jangka masa dagangan.
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);                         //  需要有轮询间隔, 以免访问过于频繁。
    }
}

Kemudian kita akan menguji setiap API dengan struktur seperti ini.

  • Dapatkan maklumat akaun

Di sini, kita menganggap bahawa pembaca sudah memahami proses penambahan akaun CTP, dan telah menambahkan CTP. Tidak jelas boleh dipelajari Bahagian 1.3.3 Bursa , CTP komoditi berjangka Perisian

Kod sumber ujian adalah seperti berikut, menggunakan CTP komoditi niaga hadapan piringan.

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

Peranti analog yang berjalan menunjukkan:

img

  • Tetapkan Leverage, Tetapkan Jenis Kontrak

Pengguna baru mungkin mengalami kesilapan seperti ini, ketika menulis strategi niaga hadapan komoditi CTP, ketika belajar, langsung memanggil API untuk mendapatkan K-line, data perdagangan.exchange.IO("status"); nilai pulangan didapati benar, telah disambungkan. Sebabnya ialah: tanpa melanggan sebarang jenis maklumat, hubungi API untuk mendapatkan K-Line, perdagangan (pembina tidak tahu apa data yang akan dihantar kepada anda). Jadi mari kita lihat bagaimana untuk melanggan maklumat kontrak, iaitu menetapkan jenis kontrak operasi semasa. Kita lihat di bawah dokumen API yang menerangkan:

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 adalah kod kontrak, dan parameternya adalah rentetan, jadi jangan lupa tanda kutip ganda.

imgSebagai contoh, methanol MA, kontrak yang diserahkan pada Januari 2017, kodnya MA701. Di bawah ini kita akan menggunakan contoh MA701 untuk memanggil fungsi SetContractType untuk mendapatkan maklumat kontrak dan menetapkan kontrak sebagai operasi semasa.

Kodnya ialah:

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

Anda boleh melihat maklumat terperinci mengenai kontrak MA701 yang dicetak.

img img

Perhatikan beberapa sifat yang mudah diambil: Kontrak: Nama Instrumen, Satu tangan: VolumeMultiple Bahagian, Jumlah pesanan maksimum: MaxLimitOrderVolume, kadar jaminan: LongMarginRatio (multi-posisi), ShortMarginRatio (kosong), Tarikh penghantaran: StartDelivDate.

Dalam penggunaan, masalah berikut mungkin berlaku:Saya ingin tahu, adakah ada kontrak yang boleh saya atur?exchange.IO("instruments"); carian. Saya ingin tahu, adakah semua program yang ada sekarang telah melanggan kontrak-kontrak itu?exchange.IO("subscribed"); pertanyaan. Cubalah:

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

Hasil ujian piringan analog:img

CTP tidak lagi menyokong penyesuaian leverage komoditi hadapan.

  • Mendapatkan data pasaran

Dengan SetContractType, kontrak operasi semasa boleh disiapkan untuk mendapatkan data K-line dan pasaran kontrak tersebut. Perlu diingat bahawa dengan menggunakan fungsi SetContractType yang ditetapkan sebagai kontrak, seperti menetapkan SetContractType (MA705), langganan (MA705), dan menetapkan kontrak semasa sebagai MA705, iaitu kontrak methanol yang diserahkan pada Mei 2017. Kemudian, pada masa ini, panggil fungsi API seperti GetRecords, GetTicker, GetDepth. Semua yang dikembalikan adalah data yang berkaitan dengan kontrak MA705, jika anda ingin mendapatkan kontrak lain, anda mesti memanggil semula jenis kontrak semasa yang ditetapkan oleh fungsi SetContractType, dan kemudian memanggil API Perdagangan atau Perdagangan.

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

Hasilnya:

img

  • Memperoleh pegangan

Fungsi GetPosition API dokumentasi:

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

Kode ujian:

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

Hasilnya:img

Seperti yang anda lihat, saya hanya menyimpan satu varieti dan memanggil fungsi GetPosition. Apa yang saya perolehi ialah satu susunan yang hanya mengandungi satu elemen, jika saya memegang beberapa susunan, apa yang saya perolehi ialah susunan yang mengandungi beberapa elemen.

  • Tetapkan arah operasi, bukaan, penentuan kedudukan (kedudukan sekarang, kedudukan sebelumnya)

Selepas jenis kontrak telah ditetapkan, sebelum operasi penempatan perdagangan terbuka, arah operasi mesti ditetapkan (tidak seperti tempat nyata), kita memerlukan fungsi API lain: 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);

Parameter SetDirection diterangkan sebagai berikut:

  • 1. buy: parameter ini dimasukkan apabila SetDirection dipanggil, dan selepas dipanggil, fungsi exchange.Buy dipanggil semula, dan dijalankanKedahOperasi.
  • 2. sell button: parameter ini dimasukkan apabila SetDirection dipanggil, dan selepas dipanggil, fungsi exchange.Sell dipanggil semula, dan dilakukanKemudahan kosongOperasi.
  • 3. closebuy : parameter ini dimasukkan apabila SetDirection dipanggil, dan selepas dipanggil, fungsi exchange.Sell dipanggil semula, dan dilakukanPelan-pelanOperasi (() dapat dilihat sama dengan panggilan kepada fungsi exchange.Sell, yang dapat dibezakan dengan menetapkan arah operasi sebelum memanggil SetDirection.Kemudahan kosongatauPelan-pelan)
  • 4.closesell button: Pasang parameter ini apabila memanggil SetDirection, kemudian panggil semula fungsi exchange.Buy, teruskanGudang kosongOperasi.................................

Di samping itu, ia juga mempunyai ciri-ciri yang berbeza.

  • 1.closebuy_today: digunakan untuk membelanjakan hari ini lebih banyak kedai.
  • 2.closesell_today: Digunakan untuk membelanjakan stok kosong hari ini.

Peraturan ini mempunyai dua parameter lalai:

  • 1.closebuy: digunakan untuk membelanjakan semalam lebih banyak kedai.
  • 2.closesell: digunakan untuk menampung stok kosong semalam.

Jawapan: Data yang dikembalikan oleh bursa akan memberitahu kita jawapannya. Dalam data yang dipanggil GetPosition untuk mendapatkan maklumat pegangan, terdapat sifat Type yang akan memberitahu kita pegangan adalah pegangan sekarang atau pegangan semalam.

img

Mari kita cuba, buka saham!

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

Dalam sistem pengesanan semula, bayaran prosedur dikurangkan secara automatik, dan simpanan juga dikembalikan secara automatik ke dalam akaun. Dan sistem pengesanan semula tidak membezakan kedudukan sekarang, kedudukan semalam. Apabila menulis dasar, lebih baik menulis mengikut permintaan, supaya tidak diubah pada masa sebenar.

img

  • Perpustakaan perdagangan komoditi masa hadapan yang mudah digunakan

Untuk pengguna yang lebih mudah digunakan, platform telah dibungkus dengan alat yang mudah digunakan untuk membungkus templat perpustakaan perdagangan masa hadapan komoditi. Kod sumber terbuka, pelajar yang berminat boleh melihat implementasinya dan dapat mempelajari banyak pengetahuan dan idea. Di bawah ini, kita akan melihat kemudahan yang ditawarkan oleh templat. 1. Salin semula templat.

img

2. Ringkaskan kod, dalam kod templat itu sendiri terdapat fungsi main untuk diuji, yang boleh dijalankan secara langsung. Selepas kita menyalin templat, di bar templat dasar akan muncul templat yang sudah ada, yang perlu ditambahkan kepada dasar akan ditandakan di kotak di depannya.

img

3. Cuba gunakan: Templat ini mempunyaiJenis tunggalMultitaskingDua model kerja, yang pertama kita kenali adalah jenis penggunaan tunggal yang rendah.

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

imgDalam kod templat, fungsi yang dimulakan dengan $ adalah fungsi pengeksport templat, yang boleh dipanggil oleh dasar lain (asalkan telah ditambahkan ke dasar).

  • Masa hadapan mata wang digital

Sokongan utama untuk BitVC, OKCoin, 796

  • Fungsi SetMarginLevel boleh digunakan untuk mengubah levera, 10, 20, yang sedikit berbeza di setiap bursa.
SetMarginLevel(MarginLevel)	设置杆杠大小
设置Buy(多单)或者Sell(空单)的杆杠大小, MarginLevel有5, 10, 20 三个可选参数
796支持5,10,20,50三个选项, BitVC的LTC不支持20倍杠杆, OKCoin支持10倍和20倍
如: exchange.SetMarginLevel(5)
  • Jenis kontrak OKCoin berjangka mempunyai this_week (minggu), next_week (minggu berikutnya), quarter (separuh). Kontrak berbeza di setiap bursa, lihat dokumen API.

Lebih lanjut

Kuantiti aliran daganganBolehkah anda menambah bahagian pengajaran mengenai kontrak mata wang digital?

Mimpi kecilBaiklah, tutorial baru sedang dibuat.