2.6 Productos

El autor:Un sueño pequeño., Creado: 2016-11-10 18:43:53, Actualizado: 2017-10-11 10:20:49

Tiempo de entrega


  • Los futuros de productos

    La estructura simple de la estrategia de futuros de productos (a diferencia de la estrategia de moneda digital que se aprendió anteriormente, la cual comprueba el estado de la conexión con el servidor del intercambio al comienzo de cada ciclo) es, por supuesto, mejor volver a juzgar si el contrato a negociar está dentro del período de tiempo de negociación.
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);                         //  需要有轮询间隔, 以免访问过于频繁。
    }
}

Y luego probamos las APIs con esta arquitectura.

  • Obtener información de la cuenta

Aquí se supone que el lector ya ha entendido el proceso de adición de la cuenta de simulación de futuros de productos CTP y que ha añadido la simulación de futuros de productos CTP. Se puede aprender lo que no está claro capítulo 1.3.3 bolsas de valores futuros de productos CTP placas de simulación configuración instrucciones

El código fuente de la prueba es el siguiente, y se utiliza un simulador de futuros de productos 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);
    }
}

El simulador está funcionando y muestra:

img

  • Configurar el apalancamiento, configurar el tipo de contrato

Algunos usuarios nuevos pueden tener este error: cuando escriben una estrategia de futuros de productos CTP, cuando aprenden, llaman directamente a la API para obtener K-line, datos de mercado. Se encuentran con el mensaje de error: not ready.exchange.IO("status"); el valor de retorno se encuentra como verdadero, ya está conectado. Esto se debe a que: no se ha suscrito a ninguna variedad de información, por lo que se llama a la API para obtener la línea K. El administrador no sabe qué datos se le envían. En el caso de los usuarios de Twitter, la API es la siguiente:

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

Los parámetros de la función ContractType son el código del contrato, los parámetros son una cadena, así que no olvides las dobles comillas.

imgPor ejemplo, el metanol MA, un contrato entregado en enero de 2017, tiene el código MA701. A continuación, usamos el ejemplo de MA701 para llamar a la función SetContractType para obtener información sobre el contrato y establecerlo como el contrato en curso.

El código es el siguiente:

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

Se puede ver la información detallada del contrato MA701 impresa.

img img

En la actualidad, la mayoría de los usuarios de Twitter no tienen acceso a las redes sociales. Contrato: Nombre del instrumento, un lado: VolumeMultiple, volumen máximo de pedido: MaxLimitOrderVolume, tasa de interés garantizada: LongMarginRatio (muchos puestos), ShortMarginRatio (vacíos puestos), fecha de entrega: StartDelivDate.

En el caso de los usuarios, los siguientes problemas pueden ocurrir:¿Qué tipo de contratos se pueden configurar?exchange.IO("instruments"); búsqueda. Me pregunto si todos los programas actuales se han suscrito a esos contratos.exchange.IO("subscribed"); consulta. ¿Qué es lo que está sucediendo?

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

Los resultados de las pruebas de simulación:img

El sistema de apalancamiento de futuros de productos de CTP no es compatible por ahora.

  • Obtención de datos del mercado

Con SetContractType, se puede obtener la línea K y los datos de mercado de ese contrato después de establecer el contrato de operación actual. Es importante tener en cuenta que la función SetContractType puede configurarse como un contrato, por ejemplo, configurando SetContractType (MA705), suscribirse ( una vez ejecutado) y configurando el contrato actual como MA705, el contrato de metanol que se entregó en mayo de 2017. Entonces, en este momento, llame a las funciones de API como GetRecords, GetTicker, GetDepth.

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

Los resultados:

img

  • Adquisición de acciones

Descripción de la API de la función GetPosition:

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

El código de prueba:

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

Los resultados:img

Como se puede ver, si solo tengo una variedad, llamando a la función GetPosition, obtendré una matriz que contiene solo un elemento, y si tengo varias variedades, obtendré una matriz que contiene varios elementos.

  • Configurar la dirección de operación, apertura, liquidación (actual y anterior)

Una vez que el tipo de contrato está configurado, antes de que se inicie la operación de liquidación, se debe establecer la dirección de operación (a diferencia de la del contado), y necesitamos otra función de 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);

Los parámetros de SetDirection se explican de la siguiente manera:

  • 1. el botón de compra: cuando se llama SetDirection, se introduce este parámetro, y después se llama la función exchange.Buy, para continuar.Muchos puestos¿Cómo se hace esto?
  • 2. sell button: cuando se llama SetDirection, se introduce este parámetro, y después de ser llamado, se llama la función exchange.Sell, para continuar.El almacén vacío¿Cómo se hace esto?
  • 3. closebuy button: Cuando se llama SetDirection, se introduce este parámetro, y después de ser llamado, se llama la función exchange.Sell, para continuar.Hay muchas tiendas.La operación (( puede verse también como una llamada a la función exchange.Sell, que se puede distinguir por establecer la dirección de la operación antes de llamar SetDirection.El almacén vacío¿Qué es esto?Hay muchas tiendas.)
  • 4.closesell bar: cuando se llama SetDirection, se introduce este parámetro, después de ser llamado, se llama la función exchange.Buy, para continuar.Almacenamiento en blancoOperación. (también diferente de SetDirection)

Los futuros tradicionales tienen dos parámetros adicionales:

  • 1. closebuy_today : para comprar más tiendas hoy.
  • 2. closesell_today: Se usa para fijar el precio de las ofertas de hoy.

Los dos parámetros por defecto tienen un significado:

  • 1. closebuy: para hacer frente a la multitud de tiendas de ayer.
  • 2. closesell: se usa para cubrir el vacío de ayer.

Algunos compañeros pueden preguntarme: ¿Cómo distinguir si mi posición es hoy o ayer? Respuesta: Los datos que devuelve el exchange nos dirán la respuesta. En los datos que llaman a GetPosition para obtener información sobre la posición, hay una propiedad de Tipo que nos dice si la posición es ahora o ayer.

img

¡Ven y prueba con tu mano, abre la balanza!

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

En el sistema de retroceso, las tarifas de tramitación se deducen automáticamente y el depósito de garantía también se devuelve automáticamente a la cuenta. Y el sistema de retroceso no distingue entre la posición actual y la posición anterior.

img

  • Commodity Futures Trading es un libro de clases de comercio de commodities que se puede aprender rápidamente.

Para que los usuarios puedan usarlo mejor, la plataforma ha incluido una herramienta fácil de usar para crear una librería de productos futuros. El código fuente es abierto, los estudiantes interesados pueden ver la implementación y aprender muchas ideas. A continuación, vamos a ver algunas de las facilidades que ofrece la plantilla. 1. Copie la plantilla y tráela aquí

img

2. Describa el código, en el propio código de la plantilla, hay una función principal para probar, se puede ejecutar directamente la prueba de la plantilla. Después de copiar la plantilla, en la barra de plantillas de la política aparecerá una plantilla ya existente, que se necesita para agregar a la política.

img

3. Prueba de usar: la plantilla tieneUna sola variedadMúltiples tareasLos dos modelos de trabajo, que conocemos primero, son los métodos de uso de variedades únicas.

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

imgEn el código de la plantilla, las funciones que comienzan con $ son las funciones de exportación de la plantilla y pueden ser llamadas por otras políticas (siempre que se hayan agregado a la política).

  • Los futuros de la moneda digital

Apoya principalmente BitVC, OKCoin y 796

  • Puede utilizar la función SetMarginLevel para modificar el apalancamiento, 10 20, con ligeras diferencias entre los intercambios.
SetMarginLevel(MarginLevel)	设置杆杠大小
设置Buy(多单)或者Sell(空单)的杆杠大小, MarginLevel有5, 10, 20 三个可选参数
796支持5,10,20,50三个选项, BitVC的LTC不支持20倍杠杆, OKCoin支持10倍和20倍
如: exchange.SetMarginLevel(5)
  • Variedad de contrato Los futuros de OKCoin tienen this_week (la semana), next_week (la semana siguiente) y quarter (el trimestre). Los contratos varían de una bolsa a otra, por lo que puedes consultar los documentos de la API.

Más.

Cuantificar el flujo comercialPor favor, ¿puedes agregar algo a la sección de enseñanza de los contratos de moneda digital?

Un sueño pequeño.Bien, el nuevo tutorial está en marcha.