Chơi JavaScript với người già - tạo ra một đối tác mua bán

Tác giả:Giấc mơ nhỏ, Tạo: 2017-03-06 10:41:40, Cập nhật: 2017-10-11 10:36:53

Bạn có thể chơi với một người đàn ông và một người đàn bà JavaScript để tạo ra một đối tác bán hàng.

Sinh ra trong hộp cát

  • Hệ thống hộp cát

    Trong quá trình tìm kiếm trên mạng, bạn sẽ thấy rằng giao dịch chứng khoán tài chính bằng chương trình máy tính được gọi là giao dịch lập trình, giao dịch định lượng. Các trình độ toán học cũ cũng ở cấp đại học, và số liệu thống kê chỉ có một số khái niệm cơ bản: phân bố chính thức, kỳ vọng, tích hợp, v.v. Không dám nói rằng mình được định lượng nhiều nhất trong việc học lập trình, định lượng. Trong quá trình học lập trình, định lượng, hoặc thực hành.

    Theo quan điểm của ông, một hộp cát hữu ích cần có những điều sau đây:

    • Một, tối đa mô phỏng chuỗi thời gian thực tế, tức là chuỗi thời gian khi chạy chương trình trong hộp cát nên gần với tình huống thực tế nhất có thể, dựa trên mức độ dấu chấm, để kết quả thử nghiệm có giá trị tham chiếu. Có thể dẫn đến tốc độ chạy của chương trình trong hộp cát bị giới hạn, nhưng tốc độ chạy cũng là một yếu tố quan trọng, không bao giờ tôi thử nghiệm một chương trình trong một ngày, điều này đòi hỏi cao hơn đối với hệ thống hộp cát.

    • 2, Các tùy chọn tham số khác nhau được kiểm soát, điều này không yêu cầu các tham số của chương trình được thử nghiệm, mà là các tham số của hệ thống hộp cát. Ví dụ: cài đặt của sàn giao dịch (tiền tương lai?

    • 3, điều chỉnh các tham số của chương trình: đôi khi người già có một loạt các tham số dự phòng, muốn thử xem một chút tốt hơn. Một hệ thống hộp cát tốt có thể chấp nhận một loạt các tham số đặt trước, và sau đó tự chạy, phân tích kết quả, hiển thị tốt nhất.

    • 4, thử nghiệm lỗi: khi chạy mô phỏng chương trình thường hoạt động trơn tru, gió im lặng, đó là bởi vì trong bồn tảo có thể có bao nhiêu làn sóng lớn?), trong khi thực tế là đại dương sâu không thể lường trước được, các cơn bão không xác định bất cứ lúc nào xảy ra.

    • 5, biểu đồ hiển thị: biểu đồ có thể ghi lại nhiều dữ liệu hữu ích để phân tích, chẳng hạn như biểu đồ lợi nhuận, đường cong chênh lệch giá, v.v.

  • Chúng tôi có một hệ thống hộp cát ở trên tay, và chúng tôi đã viết một số mã đơn giản bằng JS.

    • 1, CTP Cơ cấu chung của các chương trình tự động hóa tương lai hàng hóa Lớp dưới sử dụng một hàm đã được gói.exchange.IO("status")Để xác định liệu máy chủ phía trước của công ty tương lai có kết nối hay không. Người già trả lời: Các hợp đồng tương lai hàng hóa sử dụng giao thức CTP, cấu trúc kết nối là: phần mềm đầu cuối của khách hàng công ty tương lai (mã trắng cũ) ------> máy chủ phía trước của công ty tương lai ------> máy chủ sàn giao dịch Trở lại vấn đề chính, khi giao dịch tương lai hàng hóa ngừng hoạt động, không thể kết nối với máy chủ phía trước của công ty giao dịch tương lai ((sau khi ngừng hoạt động một thời gian nhất định, máy chủ phía trước của công ty giao dịch tương lai sẽ tắt); hoặc một số tình huống gây ra việc cắt kết nối của CTP. Để đối phó với những tình huống này, các chương trình thông thường phải phân biệt thời gian để xác định tình trạng kết nối, tránh thực hiện một số hoạt động khi không kết nối, gây ra vấn đề.

      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次数据。
          }
      }
      

      Hãy chạy vào trong hộp cát:

      img img

      Bạn có thấy trên hình, chúng tôi đã đặt số tiền trong tài khoản kiểm tra lại 100W không?

      img

    • Làm thế nào để có được thông tin tài khoản của mình trong chương trình, vì nó được đóng gói dưới cùng, làm cho một hàmexchange.GetAccount()Hãy thử một câu đơn giản này nhé.

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

      Chỉ có một trong những tùy chỉnhMainLoop()Viết vào hàmexchange.GetAccount();

      Kết quả là không có gì hiển thị. Ồ! đúng hàm đã chạy, nhưng không gọi hàm in nhật ký. Đây cũng là hàm xuất nhật ký được đóng gói.Log(), Các tham số hàm là để đầu ra các biến, có thể truyền nhiều khoảng cách bằng dấu phẩy.( Khi viết mã ngoài các chuỗi trong đó có thể nhập bằng cách nhập bằng tiếng Trung, phần còn lại của việc viết mã phải nhớ chuyển đổi tiếng Anh, người già trắng sẽ bỏ qua cái hố này, lãng phí nhiều thời gian để phát hiện ra là nhập bằng cách nhập bằng tiếng Trung ký hiệu.

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

      img

      MainLoop được thực hiện liên tục (khoảng 1 giây dựa trên chức năng Sleep) vì vậy tất cả đầu ra của hệ thống log là thông tin tài khoản giả.
    • Sau đó, trong hộp cát, yêu cầu một số dữ liệu khác, trước đây, ông đã thường chú ý đến loại hàng hóa tương lai thép vít, vì đồng thời cũng chú ý đến giá nhà.

      Trước tiên, bạn cần phải biết thị trường loại nào để hiểu, ví dụ như hợp đồng thép vít 1705. Vâng, hợp đồng được mã hóa trên sàn giao dịch: rb1705 (kiến thức về tương lai tôi cũng tự lấp đầy bộ não của Baidu), hãy sử dụngexchange.SetContractType("rb1705")Ngoài ra, tôi muốn biết tại thời điểm này hợp đồng rb1705 có thể được gọi (vì đó là điểm thời gian trong hệ thống truy cập lại).exchange.GetTicker()Sau đó, tôi muốn biết số liệu thống kê chu kỳ giá lịch sử của hợp đồng này.exchange.GetRecords()ĐặtMainLoopBạn có thể thay đổi hàm:

      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

      Chọn một phần của records Giá trị của biến ((Array type): [Tạm dịch: {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},... Thời gian: Thời gian, tỉ giây. Open: giá mở, High: giá cao nhất, Low: giá thấp nhất, Close: giá đóng, Volume: khối lượng giao dịch

      Giá trị của các biến ticker được in (vật): {High:3090.5,Low:3088.5,Sell:3090.5,Buy:3088.5,Last:3089.5,Volume:100} High: giá cao nhất hiện tại Low: giá thấp nhất hiện tại Sell: giá bán Buy: giá mua Last: giá giao dịch cuối cùng Volume: giao dịch gần đây

      Thông tin về hợp đồng rb1705: ((có thể xem mô tả về trường trong giao thức CTP.)) {C:$0000FF} CombinationType : 0, CreateDate:20160414 DeliveryMonth: 5, DeliveryYear:1705, EndDelivDate:20170522 ExchangeID : SHFE ExchangeInstID: rb1705, ExpireDate:20170515 InstLifePhase:49, Instrument ID: rb1705, InstrumentName: rb1705, Có thể bạn sẽ nhận được một số thông tin khác. Trong khi đó, các nhà phân tích khác cũng cho biết rằng, các nhà phân tích khác cũng có thể làm điều này. MaxLimitOrderVolume : 500, Có thể bạn sẽ thấy một số hình ảnh của bạn. MaxMarketOrderVolume :30, MinLimitOrderVolume : 1 MinMarketOrderVolume :1, OpenDate:20160517 OptionsType : 0, PositionDateType :49, PositionType :50, Có thể bạn sẽ thấy một số hình ảnh trên Facebook. ProductClass:49, ProductID: rb, Short Margin Ratio : 0.06, StartDelivDate:20170516 StrikePrice: 0, + "UnderlyingInstrID": + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + VolumeMultiple :10 ♪ ♪

    • Cuối cùng, chúng tôi cho robot hoạt động trong hộp cát.

      Ở đây giới thiệu một chút khái niệm về tương lai hàng hóa, trong hợp đồng tương lai, dù là mua hợp đồng đa cổ phiếu (contract look up) hoặc mua hợp đồng không cổ phiếu (contract down) đều được gọi là mở cổ phiếu, để phân biệt: mua hợp đồng đa cổ phiếu được gọi là mở cổ phiếu, mua hợp đồng không cổ phiếu được gọi là mở cổ phiếu. Tương tự như vậy, thỏa thuận đa cổ phiếu được giữ và thỏa thuận không cổ phiếu được giữ đều được gọi là thỏa thuận, để phân biệt: thỏa thuận đa cổ phiếu được gọi là nhiều cổ phiếu, thỏa thuận không cổ phiếu được gọi là thỏa thuận không cổ phiếu.

Đặt chung là hành động của một nhà giao dịch tương lai mua hoặc bán các hợp đồng tương lai với cùng một mã giống, số lượng và tháng giao hàng nhưng theo hướng giao dịch ngược lại. Các nhà giao dịch tương lai có cơ hội bán các hợp đồng tương lai mua trước khi kết thúc ngày giao dịch cuối cùng hoặc mua lại các hợp đồng tương lai được bán để có được một số tiền bằng nhau. Các giao dịch tương lai theo hướng ngược lại để phá vỡ các hợp đồng tương lai ban đầu, kết thúc giao dịch tương lai và loại bỏ nghĩa vụ giao hàng vật chất khi hết hạn. ``

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

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

Trước khi viết bài này, hãy gửi cho tôi lời khuyên và ý kiến của bạn, nếu bạn thấy thú vị, bạn có thể chia sẻ với những người yêu thích chương trình và thương mại.

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

Các lập trình viên LittleDream


Thêm nữa