자바스크립트와 함께 게임을 하는 노인 - 구매를 하는 파트너를 만드는 (2)

저자:작은 꿈, 창간: 2017-03-06 10:41:40, 업데이트: 2017-10-11 10:36:53

과 함께 자바스크립트 게임을 하며 구매를 하는 파트너를 만들었습니다.

샌드박스에서 태어났다

  • 샌드박스 시스템

    인터넷에서 다양한 자료를 검색하면서 컴퓨터 프로그램을 사용하여 금융 증권 거래를하는 것을 발견하면 프로그래밍 거래, 정량 거래라고합니다. 오래된 수학 수준은 학사 수준에도 있고, 통계학은 정형 분포, 기대, 합동 등 몇 가지 기본 개념만 가지고 있습니다. 자신을 가장 많이 정량화한다고 말하는 것은 프로그래밍, 정량화, 학습, 프로그래밍, 정량화 과정, 또는 실제에서 아닙니다. 모래 상자 시스템은 필수적입니다. 이것은 모래 상자 게임과 같으며, 규칙이 정의 된 다양한 자원이 있습니다.

    노인백은 유용한 모래통에 다음과 같은 것이 필요하다고 생각합니다.

    • 1, 최대 모의적 실제 시간 순서, 즉 샌드박스에서 프로그램을 실행할 때 시간 순서가 실제 상황과 가능한 한 가깝게, 티크 레벨에 기반하여 테스트 결과를 참조 값으로 사용하십시오. 그것은 샌드박스에서 프로그램을 실행하는 속도를 제한 할 수 있습니다. 하지만 실행 속도는 또한 매우 중요한 요소입니다.

    • 2, 다양한 매개 변수 옵션 제어, 이것은 테스트되는 프로그램의 매개 변수가 아니라 샌드박스 시스템의 매개 변수가 요구된다. 예를 들어: 거래소의 설정 (미래?A 주식? 외환?), 테스트 중인 거래소의 시뮬레이션 계정 정보, 거래소의 절차 수수료, 발생할 수 있는 슬라이드 포인트 비율, 시간 범위 제어 등.

    • 3, 프로그램의 매개 변수를 조정: 때때로 노인백은 많은 백업 매개 변수를 가지고 있으며, 어느 것이 더 좋은지 시도하려고합니다. 좋은 샌드박스 시스템은 많은 미리 설정된 매개 변수를 받아서 스스로 실행하고 결과를 분석하여 최상의 것을 보여줍니다.

    • 4, 오류 테스트: 프로그램 시뮬레이션이 실행되는 동안은 종종 바람이 부드럽고, 바람이 평온합니다. 그것은 바닷속의 바닷속 (?? 얼마나 큰 파도가있을 수 있습니까?), 실제로는 예상치 못한 깊은 바다와 다양한 알려지지 않은 폭풍이 언제든지 발생하기 때문입니다. 그러면 모래 상자 시스템은 바닷속에서 자동으로 몇 가지 큰 파도를 만들어서 최악의 환경을 최대한 시뮬레이션해야합니다. (모든 종류의 잘못된 데이터, 네트워크 오류보고, 심지어 논리적으로 불가능한 데이터도 방출합니다.)

    • 5 차트 표시: 차트는 분석에 유용한 많은 데이터를 기록할 수 있습니다. 예를 들어, 수익 차트, 가격 차이 곡선 등.

  • 그리고 우리는 샌드박스 시스템을 가지고 있습니다. 우리는 JS에서 간단한 코드를 작성하기 시작했습니다.

    • 1, CTP 상품 선물 자동화 프로그램의 일반적인 구조 노인 백인이 사용하는 밑면에는 함수가 포괄되어 있습니다.exchange.IO("status")미래에셋 회사의 전면 서버와 연결되는지 확인하기 위해. 여기서 실행 문제를 참조하십시오: 미래에셋 회사의 전면 서버? 거래소가 아닌가요? 노인은 대답합니다. 상품 선물은 CTP 프로토콜을 사용하며, 연결 구조는: 선물 회사 고객의 단말 프로그램 (노백 코드) ----> 선물 회사 전면 서버-------> 거래소 서버 다시 본문으로 돌아가면, 상품 선물 시장을 휴식할 때 선물 회사 전면 서버에 연결이 불가능한 경우 (시장을 휴식한 후 일정 시간 후 선물 회사의 전면 서버가 종료되는 경우) 또는 어떤 상황으로 인해 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

      이 그래프에서 볼 수 있듯이, 우리는 100W의 재검토 계좌 자금을 설정했습니다.

      img

    • 이 프로그램에서 자신의 계정 정보 데이터를 어떻게 얻을 수 있을까요?exchange.GetAccount()이 간단한 문장을 시도해보세요.

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

      그리고 이 모든 것은MainLoop()이 함수에는exchange.GetAccount();

      아무 것도 표시되지 않습니다. ! 정답 함수는 실행되었지만 로그 인쇄 함수는 호출되지 않습니다. 이것은 또한 포장 된 로그 출력 함수입니다.Log(), 함수 매개 변수는 다양한 변수를 출력하는 것입니다. 여러 개의 오점 간격을 전달 할 수 있습니다.. (코드를 작성할 때 문자열에 중국어 입력 방식을 입력 할 수 있습니다. 나머지 코드를 작성 할 때 반드시 영어로 전환하는 것을 기억하십시오.

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

      img

      메인루프는 계속 실행되고 (간격 1초 전 Sleep 함수) 따라서 회수 시스템 로그에서 모든 출력은 모형 계정 정보입니다.
    • 다음으로 모래 상자에서 다른 데이터를 요청합니다. 노백은 이전에 종종 스 ن트 스틸이 상품 선물 품종에 관심을 가지고있었습니다. 동시에 주택 가격에도 관심이 있습니다.

      먼저 어떤 종류의 시장을 이해해야하는지 알아야합니다. 예를 들어, 螺纹钢1705 계약.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},... 타임: 시간표, 밀리 초의 시간. 오픈: 오픈 가격 、High: 최고 가격 、Low: 최저 가격 、Close: 종료 가격 、Volume: 거래량

      인쇄된 티커 변수 값 (물질): 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 프로토콜의 필드에 대한 설명을 참조하십시오.)) { CombinationType :0, CreateDate:20160414 DeliveryMonth: 5 DeliveryYear:1705 EndDelivDate:20170522 ExchangeID: SHFE, ExchangeInstID: rb1705, ExpireDate:20170515 InstLifePhase:49, Instrument ID : rb1705 , InstrumentName: rb1705, 이스트레이딩: 1 LongMarginRatio: 0.06, MaxLimitOrderVolume :500, MaxMarginSideAlgorithm :48 MaxMarketOrderVolume :30, 1minLimitOrderVolume 1minLimitOrderVolume 1 MinMarketOrderVolume :1, OpenDate:20160517 OptionsType :0, PositionDateType :49, PositionType :50, PriceTick: 1 ProductClass:49, ProductID: rb, Short Margin Ratio: 0.06 StartDelivDate:20170516 스트라이크 프라이스 : 0 "UnderlyingInstrID" 문: UnderlyingMultiple: 0 VolumeMultiple :10 ♪ ♪

    • 그리고 마지막으로 우리는 샌드박스 안에 있는 로봇을 움직이게 했습니다.

      여기에 상품 선물의 개념을 조금 소개합니다. 선물에 있는 다채권 계약 (看 계약) 또는 빈 채권 계약 (看跌 계약) 모두 오픈 포지션이라고 불립니다.

평행 거래란 선물 거래자가 보유한 선물 계약의 품종 코드, 수 및 배달 달과 동일한 종류의 선물 계약을 구매하거나 판매하는 것을 의미합니다. 그러나 거래 방향이 반대되는 선물 계약을 구매하거나 판매하는 행위를 의미합니다. 선물 거래자는 마지막 거래일 종료 전에 구매한 선물 계약을 판매하거나 판매된 선물 계약을 다시 구매하는 선택권을 가지고 있으며, 역방향의 선물 거래는 원래의 선물 계약을 오프셋하여 선물 거래를 종료하고 만료 시 물리적 배달을 할 의무가 해제됩니다. ``

##### 所以在期货市场做买卖就有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 원작


더 많은