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

Tác giả:Giấc mơ nhỏ, Tạo: 2017-03-13 12:53:50, Cập nhật: 2017-10-11 10:37:32

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.

Một hướng dẫn về việc viết một robot định lượng bằng JS:https://www.fmz.com/bbs-topic/705(Trước Mark)
  • Các vấn đề liên quan đến việc sử dụng dữ liệu này trong giao dịch định lượng

    • Dữ liệu K là gì:

      Biểu đồ K được sử dụng bởi các thương gia thị trường lúa mì Nhật Bản để ghi lại hoạt động và biến động giá của thị trường lúa mì, sau đó được giới thiệu vào thị trường chứng khoán và thị trường tương lai do cách đánh dấu tinh tế độc đáo của nó. Hiện nay, phương pháp phân tích biểu đồ này đặc biệt phổ biến ở Trung Quốc và trên toàn khu vực Đông Nam Á. (Tìm từ Baidu)

      Không có biểu đồ cụ thể để giải thích, chúng ta hãy xem cấu trúc dữ liệu của các đường K được định nghĩa bằng ngôn ngữ JS:

      {
          Time    :   1487034000000, // 一个时间戳, 精确到毫秒,与Javascript的 new Date().getTime() 得到的结果格式一样
          Open    :   3425,          // 开盘价
          High    :   3446,          // 最高价
          Low     :   3423,          // 最低价
          Close   :   3438,          // 收盘价
          Volume  :   177657.99,     // 交易量
      }
      

      Chúng ta hãy xem dữ liệu được lấy khi gọi chức năng GetRecords: (nhớ gọi exchange.SetContractType trước); rõ ràng là loại hợp đồng cần vận hành)

      [
          {"Time":1487034000000,"Open":3425,"High":3446,"Low":3423,"Close":3438,"Volume":177657.9999999999},
          {"Time":1487035800000,"Open":3438,"High":3448,"Low":3382,"Close":3385,"Volume":494882},
          {"Time":1487037600000,"Open":3385,"High":3398,"Low":3383,"Close":3394,"Volume":83656.00000000015}
      ]
      

      Dữ liệu đường K có thể thấy là một mảng các đối tượng, mỗi đối tượng là một Bar đường K, bao gồm giá cao nhất trong chu kỳ Bar, giá thấp nhất, giá mở (tức là giá khi đường K bắt đầu), giá đóng (tức là giá khi đường K kết thúc), giao dịch (tức là giao dịch trong chu kỳ); và chu kỳ này là chu kỳ đường K. Ví dụ, dữ liệu trong mảng trên sẽ xác định được K là bao nhiêu vòng quay? Bạn chỉ có thể tính toán sai với 2 Bar: 1487035800000 - 1487034000000 Kết quả là: 1800000, đơn vị của giá trị này là milliseconds, vì vậy đổi lại: 1800000 / 1000 / 60 = 30 (phút), chu kỳ đường K này là 30 phút.

      Câu hỏi đầu tiên thường xuất hiện là: Khi sử dụng dữ liệu đường K, chiều dài mảng bị bỏ qua. Điều này dẫn đến sự tràn ngập truy cập mảng (BUG như vậy rất phổ biến khi viết các chương trình C trước đây). Vì vậy, chúng ta cần phải đánh giá nó trước khi sử dụng đường K. Ví dụ như lấy đường K: exchange.SetContractType ((rb1705); // Chuyển đổi cài đặt cho thép vít 1705 hợp đồng. var records = exchange.GetRecords ((); // lấy dữ liệu chu kỳ K-line mặc định của hợp đồng rb1705 thép vít. Dữ liệu K-bar có thể được thu thập cụ thể dựa trên API của sàn giao dịch. Vì vậy, nếu cần nhiều K-bar hơn, bạn phải để chương trình thu thập trong một thời gian.

      if(records.length < n){    // n 就是我们限定的 n线数量。
          return;                // 当前函数返回。
      }
      

      Câu hỏi thứ hai thường xuất hiện là: Dữ liệu của Bar cuối cùng của dòng K, ngoại trừ thuộc tính Time, Open và Close, các thuộc tính khác có thể thay đổi, đặc biệt là trong thời gian thực. Những người mới bắt đầu sẽ gặp nhiều khó khăn khi xử lý đường K vì không hiểu điều này. Ví dụ, trong chương trước, nói về đường chéo đường ngang. Sử dụng Bar đầu tiên hoặc Bar thứ hai?

      Câu hỏi thứ ba: Thời điểm bắt đầu của chu kỳ là một giờ bắt đầu với một số milliseconds và một giá trị 0. Thời điểm được đại diện là ngày 1 tháng 1 năm 1970 (để xác định khi viết chương trình cụ thể, bạn cũng cần phải xem xét vùng thời gian). Bạn có thể sử dụng câu nói sau:W3schoolBạn có thể thử nghiệm trong hệ thống Sandbox BotVS:

      var arr = new Date(0);
      

      Hình ảnh:

      Thu Jan 01 1970 08:00:00 GMT+0800 (CST) // được hiển thị theo khu vực thời gian 8 Đông Giá trị này được tích lũy từ năm 1970 đến nay (từng 1 giây tăng 1000, vì 1 giây là 1000 millisecond), vì vậy con số này đã khá lớn. Đây là một mẹo nhỏ: vì timestamp là duy nhất trong mỗi Bar trong K-line xác định chu kỳ K-line, bạn có thể xác định nhận được dữ liệu K-line mới nhất ngay khi timestamp thay đổi. Điều này cũng hữu ích trong việc xử lý dữ liệu K-line thực tế.

  • 2, Tiêu chuẩn gọi chi tiết, các vấn đề thường gặp, đáp ứng chu kỳ, giá trị trả về, tham số

    Một số hàm chỉ số cũng được sử dụng khi lập trình hoặc viết các chính sách định lượng. Một thư viện chỉ số hữu ích hơn là thư viện talib, có nhiều phiên bản khác nhau.

    Trong khi đó, các nhà nghiên cứu cũng cho biết, trong một số trường hợp, các công cụ này có thể được sử dụng để tạo ra các chỉ số khác nhau.

    • Đầu tiên, các tham số chu kỳ (chỉ số tham số, khác biệt với chu kỳ đường K, chu kỳ đường K là bao nhiêu, các chỉ số được tính toán chu kỳ đường K là bao nhiêu, ví dụ như 30 phút đường K được tính toán là chỉ số MACD của chu kỳ 30 phút, các tham số là chu kỳ tham số) đặt quá lớn, K đường dữ liệu không đủ dài: Ví dụ, chỉ số MACD mô tả:

      MACD(Records[Close],Fast Period = 12,Slow Period = 26,Signal Period = 9) = [Array(outMACD),Array(outMACDSignal),Array(outMACDHist)]
      

      Khi sử dụng, nếu parameter cycle được đặt vào 12,26,9, chúng ta nhập K-line data records để tính toán các chỉ số, và mã viết như sau:

      var macd = talib.MACD(records, 12, 26, 9);
      

      Nếu các dữ liệu được truyền vào thời điểm này là quá nhỏ, tính toán sẽ như sau:

      [
        [null,null,null,null,null,null,null,null,null,null,null,null,null],
        [null,null,null,null,null,null,null,null,null,null,null,null,null],
        [null,null,null,null,null,null,null,null,null,null,null,null,null]
      ]
      

      Điều này là do không có đủ dữ liệu K-line, chỉ số tính toán sẽ gây ra BUG nếu sử dụng, vì vậy chúng tôi đã thêm một điều kiện hạn chế trước khi thực hiện:

      while(!records || records.length < 50){
          records = exchange.GetRecords();
          Sleep(1000);
      }
      

      Sau đó, bạn có thể nhảy ra khỏi vòng lặp cho đến khi có đủ 50 K-thread.img

      Người đọc cẩn thận có thể thấy lý do tại sao dữ liệu được tính toán bởi chỉ số này là một mảng hai chiều (tức là mỗi phần tử của một mảng là một mảng khác), vì chỉ số MACD được tính toán không phải là một dòng mà là ba dòng: dif, dea, cột lượng macd. Vì vậy, các giá trị trả về của mỗi chỉ số có thể khác nhau hoặc cần xem mô tả của chỉ số.

      [
        [null,null,null,null,null,null,null,null,数据...],
        [null,null,null,null,null,null,null,null,数据...],
        [null,null,null,null,null,null,null,null,数据...]
      ]
      

      Một vài lần, một số chỉ số đã bị lỗi do không chú ý đến cấu trúc trả về.

    • Thứ hai, tính toán hàm chỉ số sử dụng đường trung bình khác nhau hoặc các thuật toán chỉ số khác nhau dẫn đến kết quả khác nhau.

      Trong khi đó, chỉ số RSI của STOCH là rất rõ ràng, mô tả như sau:

      STOCHRSI(Records[Close],Time Period = 14,Fast-K Period = 5,Fast-D Period = 3,Fast-D MA = 0) = [Array(outFastK),Array(outFastD)]
      

      Giá trị này được tính toán khác biệt rõ rệt so với các thuật toán khác, chỉ số này đã được cung cấp mã thuật toán của riêng tôi trong chương đầu của loạt bài này. Nguyên nhân có thể là do hệ thống đường thẳng sử dụng không phù hợp, một số thư viện sử dụng thuật toán MA, một số sử dụng EMA. Một số chỉ số được tính toán lặp đi lặp lại mỗi ngày, và nếu số lượng dữ liệu đường thẳng K được cung cấp khác nhau, có thể tính toán khác nhau.

  • 3, API xử lý sai

    • Cannot read property length of null Đây là một trong những lỗi xuất hiện thường xuyên nhất.

      Điều này là do API đôi khi có lỗi thu thập dữ liệu hoặc không thu thập dữ liệu vì nhiều lý do. Khi đó, một số API thu thập dữ liệu lấy giá trị null. Dữ liệu này thường là cấu trúc matrix, thường cần truy cập chiều dài của matrix.

      Tất cả các cuộc gọi API đều cần xử lý lỗi, thậm chí đôi khi cần kiểm tra xem dữ liệu có ổn hay không (đôi khi có dữ liệu bất thường); chương trình của chúng tôi chỉ có thể đảm bảo tính chính xác trong mã của mình, nhưng thông tin dữ liệu chạy trên mạng không thể đảm bảo tính chính xác 100% (không thể tránh được việc mất gói), vì vậy dữ liệu thu được phải được xử lý sai và lọc tất cả các dữ liệu bất thường.

      Vì không có việc chỉnh sửa một bước, không có việc chỉnh sửa điểm ngắt, không có việc giám sát giá trị biến, v.v. Tôi thường DEBUG bằng cách đơn giản nhất là Logos. Đối với việc sử dụng Log để xuất thông tin văn bản hợp lý trong quá trình chương trình, logs xuất trình phân tích. Có thể hiểu được quá trình chạy của chương trình, hoặc có thể kết hợp với try, catch, throw JS để xử lý BUG, nhưng lời khuyên của tôi là đừng sử dụng nó cho đến khi phải sử dụng sự bắt giữ ngoại lệ. Đối với DEBUG, sử dụng Log-Method nguyên bản nhất là một trải nghiệm thực sự, và điều này rất hiệu quả từ góc độ phát triển khả năng DEBUG.

Trước khi viết điều này, chào đón độc giả để lại cho tôi một lời nhắn! để đưa ra các đề xuất và ý kiến, nếu bạn cảm thấy thú vị, bạn có thể chia sẻ với nhiều bạn bè yêu thích chương trình yêu thích giao dịch

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

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


Thêm nữa