Играть в JavaScript с стариком - создать партнёра, который будет делать покупки и продажи

Автор:Маленькие мечты, Создано: 2017-03-06 10:41:40, Обновлено: 2017-10-11 10:36:53

Играя с братом и матерью в JavaScript, мы создаем партнера, который будет делать покупки и продажи.

Родился в песочнице

  • Система песочницы

    При поиске различных материалов в Интернете вы обнаружите, что компьютерная программа для торговли финансовыми ценными бумагами называется программированная торговля, количественная торговля. Старый уровень математики также на специализированном уровне, а статистика имеет только несколько основных понятий: нормальное распределение, ожидания, сочетание и т. д. Не смей говорить, что ты количественный больше всего в обучении программированию, количественному обучению, в процессе обучения программированию, количественному обучению или практике.

    По мнению старейшины, полезная песочница должна иметь следующие элементы:

    • 1, максимально имитировать реальные временные последовательности, то есть, когда программа работает в песочнице, временные последовательности должны быть как можно ближе к реальным условиям, основываясь на уровне тика, чтобы результаты тестирования имели значение. Это может привести к ограничению скорости работы программы в песочнице.

    • 2, различные параметры опционального контроля, который требуется не параметры тестируемой программы, а параметры системы песочницы. Например: настройки биржи (фьючерсы? акции A? валюты?), информация о модном счете тестируемой биржи, процедурные сборы биржи, вероятный уровень скольжения, контроль временного диапазона и т. д.

    • 3, настройка параметров программы: иногда у старого человека есть куча запасных параметров, чтобы попробовать, какой из них лучше. Хорошая песочница может принять кучу параметров, которые были заранее настроены, а затем сама будет работать, анализировать результаты и показывать лучшие.

    • 4, ошибочность тестирования: при выполнении моделирования программы часто ветер идет гладко, и волны тихие, потому что они находятся в водоеме (насколько большие волны могут быть?), а на самом деле в непредвиденном глубоком океане, и всевозможные неизвестные штормы появляются в любое время. Тогда система песочницы должна автоматически создавать в водоеме несколько больших волн ветра, чтобы максимально имитировать плохую среду.

    • 5. Графики показывают: Графики могут записывать много полезных данных для анализа, таких как графики прибыли, кривые разницы цен и т. д.

  • У нас есть система песочницы, и мы начали писать простые тексты в JS.

    • 1. Общая структура автоматизированных программ CTP для товарных фьючерсов Функция, используемая в нижнем слое, уже встроена.exchange.IO("status")Для того, чтобы определить, подключен ли он к первичному серверу фьючерсной компании. Ответ: Коммерческие фьючерсы используют протокол CTP, структура соединения: терминальные программы клиентов фьючерсных компаний ((старый белый код)------> предварительные серверы фьючерсных компаний-------> серверы бирж Возвращаясь к основному вопросу, когда товарные фьючерсы не торгуются, это невозможность подключения к переднему серверу фьючерсной компании ("преднему серверу фьючерсной компании после определенного времени закрывается").

      function MainLoop(){  //  处理具体工作的函数
                          //  编写处理具体交易逻辑
      }
      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);                         //  封装的睡眠函数,参数是毫秒,1000毫秒 等于 1秒,需要有轮询间隔, 以免访问过于频繁。CTP协议是每秒推送2次数据。
          }
      }
      

      Побегите в песочницу:

      img img

      Посмотрите на рисунок, мы установили сумму на счет перепроверки, 100 Вт.

      img

    • Как получить информацию о своем аккаунте в программе, поскольку она упакована в нижний слой и сделана функцией?exchange.GetAccount()Попробуйте попробовать эту простую фразу.

      function MainLoop(){  //  处理具体工作的函数
          exchange.GetAccount();    
      }
      

      И я не могу сказать, что это так.MainLoop()Запишите в функциюexchange.GetAccount();

      Результат ничего не показывает. О! Функция работает, но не вызывает функцию печати журналов.Log(), параметры функций - это для вывода различных переменных, можно передать несколько с помощью запятой интервал.( При написании кода, кроме строки в ней можно вводить в китайском языке, остальное написание кода, обязательно помните переключаться на английский язык, старик выбросил эту яму, тратить много времени, чтобы обнаружить, что в китайском языке вводить символы.

      function MainLoop(){                     // 处理具体工作的函数
          Log(exchange.GetAccount());          // 写法1
          var Account = exchange.GetAccount(); // 写法2
      }
      

      img

      MainLoop выполняется непрерывно (с интервалом в 1 секунду полностью с помощью функции Sleep), так что весь вывод системного журнала отзывов - это информация о аналогичных учетных записях.
    • Затем в песочнице запросить некоторые другие данные, лоубейн раньше часто обращают внимание на шнуровой сталь товарный фьючерсный сорт, потому что в то же время обращает внимание на цены на недвижимость.

      Первое, что нужно знать, чтобы понять, какой рынок, например, о контрактах на 1705 штрих-сталь. Ну, этот контракт на бирже кодируется: rb1705 (знание фьючерсов я тоже сам наполняю мозг Baidu), используйтеexchange.SetContractType("rb1705")Кроме того, я хотел бы знать, в каком положении в данный момент находится этот договор rb1705 (то есть момент времени в системе рецензирования, когда он работает).exchange.GetTicker()Далее я хочу узнать историческую циклическую статистику цены на этот контракт.exchange.GetRecords()СделайтеMainLoopФункция изменяется:

      var index = 0;                                                // 声明一个全局变量 用来记录循环次数
      function MainLoop(){
          var ContractInfo = exchange.SetContractType("rb1705");    // 设置我要操作的 商品期货合约类型 即 螺纹钢1705合约。
          if(!ContractInfo){
              return;                                               // 如果设置合约没有成功,即返回函数,再次进入重试。
          }
          Log("rb1705 Info:", ContractInfo);                        // 显示一下合约详细信息。
          var ticker = exchange.GetTicker();                        // 通过CTP协议请求 此刻行情数据
          var records = exchange.GetRecords();                      // 通过CTP协议请求 历史K线数据,K线的周期默认周期是在沙盒系统上设置的。
          Log("ticker:", ticker);                                   // 打印出来 此刻行情数据
          Log("records:", records);                                 // 打印出来 历史K线数据
          Log("index:", index++, "#FF0000");                        // 打印循环次数, 在最后参数传入 "#FF0000" 可以使打印的日志显示为红色。
      }
      

      img

      Выбор части records значения переменных ((тип матрицы): [ {Time:1486083600000,Open:3354,High:3358,Low:3071,Close:3272,Volume:328708.00000000006},{Time:1486083900000,Open:3272,High:3272,Low:3228,Close:3228,Volume:133542},...] Time: Время в миллисекундах. Открыть: Открыть: Высокая: Высокая: Низкая: Низкая: Закрыть: Закрыть: Объем: Объем сделки

      Значение тикера (объекта): {High:3090.5,Low:3088.5,Sell:3090.5,Buy:3088.5,Last:3089.5,Volume:100} High: текущая максимальная цена Low: текущая минимальная цена Sell: цена продажи Buy: цена покупки Last: цена последней сделки Volume: последняя сделка

      Информация о договоре rb1705: ((Вы можете посмотреть описание полей в протоколе CTP.)) {c:$a Смесь: 0, Смотрите на страницу "Создание даты": Оригинальное название: В этом году он вышел на экраны впервые. Оригинальное название: Ссылка на сайт: http://www.exchangeid.ru Оригинальное название: Rb1705 "Отправляйтесь в "Открытие" ИнстаЛайфФазе: Имеется в виду, что в этом случае вы можете использовать только один из этих инструментов. Название инструмента: rb1705 В этом случае вы должны быть готовы. Относительно высокий показатель Long Margin Ratio: 0.06, MaxLimitOrderVolume Max: 500 Обычно это происходит из-за того, что мы не знаем, что делать. Оригинальное название: Оригинальное название: Оригинальное название: MinMarketOrder Оригинальное название: OpenDate Оптимизация PositionDateType :49, Позиция Тип Позиция:50, В этом случае, вы должны быть готовы. Продуктовый класс: Продукт ID: Относительно небольшое количество пользователей, которые хотят получить доступ к сервису. Смотрите на страницу "СтартDelivDate": Стрейк Прайс: 0, "Универсальный инструмент" Подходящее множественное число: 0, Оптимизация VolumeMultiple Оптимизация: 10 {y:bi}

    • Наконец, мы запустили роботов, которые работают в песочнице.

      Здесь представлена концепция товарного фьючерса, в котором контракт на покупку многопозиционного контракта (контракт на взгляд) или контракт на покупку пустого хранения (контракт на падение) называется открытым, чтобы различить: контракт на покупку многопозиционного контракта называется открытым, контракт на покупку пустого хранения называется открытым.

Планшеты - это действия фьючерсных трейдеров, которые покупают или продают фьючерсные контракты того же сорта, количества и месяца, но в противоположном направлении. Фьючерсные трейдеры выбирают продать купленные фьючерсные контракты до окончания последнего торгового дня или выкупить проданные фьючерсные контракты, чтобы получить равную сумму. Фьючерсная торговля в противоположном направлении обанкрощает первоначальный фьючерсный контракт, тем самым заканчивая торговлю фьючерсом и освобождая от обязательств по осуществлению физических сделок по истечении срока. ``

##### 所以在期货市场做买卖就有4个方向:

用 ```SetDirection()``` 函数来 确定操作的方向

- 开多仓:SetDirection("buy") ,传入参数 "buy" 字符串,明确 exchange.Buy() 函数为 开多仓 操作, Buy 函数稍后讲到。

- 开空仓:SetDirection("sell"), 传入参数 "sell" 字符串,明确 exchange.Sell() 函数为 开空仓 操作,Sell 函数稍后讲到。

- 平多仓:SetDirection("closebuy"), 传入参数 "closebuy" 字符串, 明确 exchange.Sell()函数为 平多仓操作。

- 平空仓:SetDirection("closesell"), 传入参数 "closesell" 字符串,明确 exchange.Buy()函数为 平空仓操作。

下个单试试!继续改写 MainLoop 函数,我们让程序在沙盒里面每隔10分钟 交易一次,开多仓平多仓交替进行。
```
var index = 0;
var isFirst = true;
function MainLoop(){
    if(isFirst){
        Log(exchange.GetAccount());
        isFirst = false;
    }
    var ContractInfo = exchange.SetContractType("rb1705");
    if(!ContractInfo){
        return;                                               // 如果设置合约没有成功,即返回函数,再次进入重试。
    }
    var ticker = exchange.GetTicker();
    if(index % 2 === 0){
        exchange.SetDirection("buy");
        exchange.Buy(ticker.Last + 1, 1, ticker); // exchange.Buy 函数有2个必要参数,第一个参数为下单价格,
                                          // 第二个参数为下单数量(希望交易的数量),之后还可以跟一些参数输出在日志信息。 
                                          //ticker.Last + 1 是为了让单子能成交,意思是在最后成交价的基础上多出1块钱。
    }else if(index % 2 === 1){
        exchange.SetDirection("closebuy");
        exchange.Sell(ticker.Last - 1, 1, ticker); // ticker.Last - 1 是为了在最后成交价的基础上减去1元 卖出。
    }
    index++;
    Sleep(1000 * 60 * 10 - 1000);         // 这里暂停10分钟 ,减去的1000 即1秒是 main 函数循环中的1秒。
    Log(exchange.GetAccount());
}
```

![img](/upload/asset/bd6dd2ef0e5db88c70f0585aee3a417c92227d31.png) 

##### 开始的账户信息 和 最后一次开仓 前的账户信息比较,可见不能胡乱开仓平仓。 >_<

Если вы хотите поделиться своим мнением, вы можете поделиться с другими друзьями, которые любят программы и хотят работать.

https://www.fmz.com/bbs-topic/724

Программист littleDream


Больше