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 Commodity Futures Simulator Accounts и уже добавил на CTP Commodity Futures Simulator Accounts. Непонятное можно изучить раздел 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, присоединенное. Причина этого в том, что: если нет подписки на информацию любой разновидности, то призыв API для получения K-линии, транзакции (хостеры не знают, какие данные отправлять вам). В этом контексте мы должны быть готовы к тому, что мы не сможем сделать больше, чем только можем.

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 года, имел код 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, Firsthand: VolumeMultiple, Maximum order volume: MaxLimitOrderVolume, гарантированная ставка: Long MarginRatio (много позиций), Short MarginRatio (пустые позиции), дата доставки: 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 года. Тогда в данный момент призываются API-функции 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);
        }
}

Результаты:

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

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, чтобы продолжить.Пустое помещениеОперация........................

В этом случае, если вы хотите, чтобы ваш бизнес был более успешным, вы должны использовать эти параметры.

  • 1. closebuy_today : используется для покупки сегодня большего количества товаров.
  • 2. closesell_today : используется для сравнения сегодняшних вакансий.

По умолчанию два параметра:

  • 1. closebuy : используется для сравнения с прошлым днем.
  • 2. closesell: используется для сравнения прошлогоднего вакансия.

Ответ: Данные, возвращенные биржей, дают нам ответ. При вызове данных GetPosition для получения информации о позиции, есть свойство Type, которое говорит нам, что у нас есть позиция сегодня или вчера.

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 можно изменить рычаг, 10, 20, с небольшими различиями в зависимости от биржи.
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.

Больше

Количественный торговый потокПожалуйста, добавьте что-нибудь в учебную часть о цифровых валютных контрактах.

Маленькие мечтыНовый урок в процессе.