2.6 Produits

Auteur:Le petit rêve, Créé: 2016-11-10 18:43:53, Mis à jour: 2017-10-11 10:20:49

Le terme


  • Futures sur produits

    L'architecture simple des stratégies de futures de produits (à la différence des stratégies de devises numériques apprises précédemment, qui vérifient l'état de la connexion au serveur de l'échange au début de chaque cycle), bien sûr, il est préférable de revenir sur le fait que le contrat à négocier n'est pas dans la période de négociation.
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);                         //  需要有轮询间隔, 以免访问过于频繁。
    }
}

Ensuite, nous avons testé les différentes API avec cette architecture.

  • Obtenir des informations sur le compte

Ici, on suppose que le lecteur a compris le processus d'ajout d'un compte de simulation de CTP et a ajouté un simulation de CTP. Les échanges de billets de banque, les futures de produits CTP, les disques analogiques, la configuration (enregistrement pédagogique)

Le code source du test est le suivant, il utilise un simulateur de 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);
    }
}

Le disque d'analogie est en cours d'exécution:

img

  • Configurer le levier, définir le type de contrat

Les nouveaux utilisateurs peuvent rencontrer l'erreur suivante: lors de l'écriture d'une stratégie de CTP, ils doivent appeler directement l'API pour obtenir les données de la ligne K.exchange.IO("status"); la valeur de retour est trouvée vraie et est connectée. La raison en est la suivante: si vous n'avez pas de souscription à une information de quelque nature que ce soit, appelez l'API pour obtenir la ligne K. (l'hôte ne sait pas quelle donnée vous envoyer). Nous allons voir la description de l'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");

Le paramètre de la fonction ContractType est le code du contrat, le paramètre est une chaîne, alors n'oubliez pas les guillemets.

imgPar exemple, le contrat de méthanol MA, qui a été livré en janvier 2017, est codé MA701. Ci-dessous, nous utilisons l'exemple de MA701 pour appeler la fonction SetContractType pour obtenir des informations sur le contrat et le mettre en œuvre.

Le code est le suivant:

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

Vous pouvez voir les détails du contrat MA701 imprimés.

img img

Il y a aussi une autre partie de l'histoire de l'humanité qui se déroule dans le passé. Le contrat: Nom de l'instrument, volume multiple, volume maximal de commande, taux de garantie: long margin ratio (plus de positions), short margin ratio (plus de positions), date de livraison: date de livraison.

Les problèmes suivants peuvent survenir lors de l'utilisation:Je veux savoir s'il y a des contrats que je peux mettre en place et comment je peux le faire.exchange.IOIl y a aussi une question à se poser. Je veux savoir si tous les programmes actuels souscrivent à ces contrats?exchange.IO("subscribed"); une requête. Vous pouvez essayer:

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

Les résultats des tests sur le disque:img

Le CTP n'est pas encore compatible avec le système d'effet de levier sur les produits à terme.

  • Obtenir des données sur le marché

Une fois que le contrat d'exploitation actuel est configuré avec SetContractType, les données de ligne K et de marché de ce contrat peuvent être obtenues. Il est important de noter que la fonction SetContractType est configurée comme un contrat, par exemple, configurer SetContractType (MA705), souscrire (exécuter une fois) et configurer le contrat actuel comme MA705, le contrat de méthane livré en mai 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);
        }
}

Les résultats:

img

  • Acquisition de titres

La fonction GetPosition est décrite dans la documentation de l'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的传入类型
}

Le code de test:

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

Les résultats:img

Vous pouvez voir que si je n'ai qu'une seule variété, j'appelle la fonction GetPosition et je reçois une matrice qui contient un seul élément. Si j'ai plusieurs variétés, je reçois une matrice qui contient plusieurs éléments.

  • Définir la direction d'opération, l'ouverture, l'équilibrage (position actuelle, position précédente)

Une fois que le type de contrat est configuré, il est nécessaire de définir la direction d'opération (par opposition à la direction directe) avant d'opérer la position de mise en marché. Nous avons besoin d'une autre fonction API: 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);

Les paramètres de SetDirection sont les suivants:

  • 1. appeler le paramètre SetDirection et appeler la fonction exchange.Buy pour procéder.Le plus grandJe ne peux pas le faire.
  • L'option de vente est utilisée pour appeler la fonction SetDirection et l'option de vente est utilisée pour appeler la fonction Exchange.Sell.Le dépôt videJe ne peux pas le faire.
  • Le paramètre est alors invoqué par l'intermédiaire d'un appel à la fonction Exchange.Sell, et le paramètre est alors invoqué par l'intermédiaire de l'intermédiaire de la fonction Exchange.Sell.Plateau à plusieurs étagesL'opération (( peut être vue comme appelant la fonction exchange.Sell, avant d'appeler SetDirection pour définir la direction de l'opération.Le dépôt videOu alorsPlateau à plusieurs étages)
  • 4. le clavier de clôture de vente: le paramètre est entré lorsque SetDirection a été appelé, puis l'exchange.Buy a été appelé.Un dépôt videOpération. (également différente de SetDirection)

Les contrats à terme traditionnels ont deux paramètres supplémentaires:

  • 1.??closebuy_today??: pour acheter plus de magasins aujourd'hui.
  • 2. closesell_today: utilisé pour compenser les offres aujourd'hui.

Les deux paramètres sont définis par défaut:

  • 1.??closebuy??: pour compenser hier avec plus de magasins.
  • 2. le clavier de vente: utilisé pour compenser le stock vide d'hier.

Certains de vos camarades vont peut-être vous demander: Comment faire la différence entre ma position d'aujourd'hui et celle d'hier? R: Les données renvoyées par l'échange nous indiquent la réponse.

img

Venez et essayez, ouvrez la balance!

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

Dans le système de retouche, les frais d'entretien sont automatiquement déduits et le montant de la garantie est automatiquement retourné dans le compte. Et le système de retouche ne fait pas la distinction entre les positions actuelles et les positions antérieures.

img

  • Une bibliothèque de futures de produits à la main

Pour une meilleure utilisation par les utilisateurs, la plateforme a fourni un ensemble d'outils faciles à utiliser. Le code source est ouvert, les élèves intéressés peuvent voir la mise en œuvre et apprendre beaucoup de connaissances et d'idées. Nous allons voir ci-dessous les avantages de ce modèle. 1. Copier le modèle.

img

2. Décrivez le code, dans le code du modèle lui-même, il y a une fonction main pour tester, vous pouvez exécuter directement le test du modèle. Après avoir copié le modèle, un modèle déjà existant apparaît dans la barre de modèles de la stratégie.

img

3. Essayez de l'utiliser: le modèle est disponibleUne seule variétéMulti-tâchesIl existe deux modes de travail, dont nous connaissons d'abord les méthodes d'utilisation primaires de la variété unique.

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

imgDans le code du modèle, les fonctions commençant par $. sont des fonctions d'exportation du modèle et peuvent être appelées par d'autres stratégies (à condition qu'elles aient été ajoutées à la politique).

  • Les contrats à terme sur la monnaie numérique

Il prend en charge principalement BitVC, OKCoin, 796

  • L'effet de levier peut être modifié à l'aide de la fonction SetMarginLevel, 10, 20, qui diffère légèrement d'un échange à l'autre.
SetMarginLevel(MarginLevel)	设置杆杠大小
设置Buy(多单)或者Sell(空单)的杆杠大小, MarginLevel有5, 10, 20 三个可选参数
796支持5,10,20,50三个选项, BitVC的LTC不支持20倍杠杆, OKCoin支持10倍和20倍
如: exchange.SetMarginLevel(5)
  • Variété contractée Les contrats à terme OKCoin sont les suivants: this_week, next_week et quarter. Les contrats diffèrent d'une bourse à l'autre, voir la documentation API.

Plus de

La quantité de fluxPourriez-vous compléter la partie pédagogique des contrats de crypto-monnaie?

Le petit rêveBon, le nouveau tutoriel est en cours.