avatar of 发明者量化-小小梦 发明者量化-小小梦
tập trung vào tin nhắn riêng tư
4
tập trung vào
1271
Người theo dõi

Hướng dẫn bạn từng bước để viết phiên bản Python của hàm tổng hợp K-line

Được tạo ra trong: 2019-12-21 09:38:26, cập nhật trên: 2024-12-15 15:59:54
comments   4
hits   2836

Hướng dẫn bạn từng bước để viết phiên bản Python của hàm tổng hợp K-line

Hướng dẫn bạn từng bước để viết phiên bản Python của hàm tổng hợp K-line

Khi viết và sử dụng các chiến lược, một số dữ liệu chu kỳ K-line không phổ biến thường được sử dụng. Tuy nhiên, các sàn giao dịch và nguồn dữ liệu không cung cấp dữ liệu cho những giai đoạn này. Nó chỉ có thể được tổng hợp bằng cách sử dụng dữ liệu từ các chu kỳ hiện có. Thuật toán tổng hợp đã có phiên bản JavaScript (Liên kết), trên thực tế, việc chuyển mã JavaScript sang phiên bản Python rất đơn giản. Tiếp theo, chúng ta hãy viết phiên bản Python của thuật toán tổng hợp K-line.

Phiên bản JavaScript

  function GetNewCycleRecords (sourceRecords, targetCycle) {    // K线合成函数
      var ret = []
      
      // 首先获取源K线数据的周期
      if (!sourceRecords || sourceRecords.length < 2) {
          return null
      }
      var sourceLen = sourceRecords.length
      var sourceCycle = sourceRecords[sourceLen - 1].Time - sourceRecords[sourceLen - 2].Time

      if (targetCycle % sourceCycle != 0) {
          Log("targetCycle:", targetCycle)
          Log("sourceCycle:", sourceCycle)
          throw "targetCycle is not an integral multiple of sourceCycle."
      }

      if ((1000 * 60 * 60) % targetCycle != 0 && (1000 * 60 * 60 * 24) % targetCycle != 0) {
          Log("targetCycle:", targetCycle)
          Log("sourceCycle:", sourceCycle)
          Log((1000 * 60 * 60) % targetCycle, (1000 * 60 * 60 * 24) % targetCycle)
          throw "targetCycle cannot complete the cycle."
      }

      var multiple = targetCycle / sourceCycle


      var isBegin = false 
      var count = 0
      var high = 0 
      var low = 0 
      var open = 0
      var close = 0 
      var time = 0
      var vol = 0
      for (var i = 0 ; i < sourceLen ; i++) {
          // 获取 时区偏移数值
          var d = new Date()
          var n = d.getTimezoneOffset()

          if (((1000 * 60 * 60 * 24) - sourceRecords[i].Time % (1000 * 60 * 60 * 24) + (n * 1000 * 60)) % targetCycle == 0) {
              isBegin = true
          }

          if (isBegin) {
              if (count == 0) {
                  high = sourceRecords[i].High
                  low = sourceRecords[i].Low
                  open = sourceRecords[i].Open
                  close = sourceRecords[i].Close
                  time = sourceRecords[i].Time
                  vol = sourceRecords[i].Volume

                  count++
              } else if (count < multiple) {
                  high = Math.max(high, sourceRecords[i].High)
                  low = Math.min(low, sourceRecords[i].Low)
                  close = sourceRecords[i].Close
                  vol += sourceRecords[i].Volume

                  count++
              }

              if (count == multiple || i == sourceLen - 1) {
                  ret.push({
                      High : high,
                      Low : low,
                      Open : open,
                      Close : close,
                      Time : time,
                      Volume : vol,
                  })
                  count = 0
              }
          }
      }

      return ret 
  }

Nếu có thuật toán JavaScript, nó có thể được dịch và chuyển đổi sang Python từng dòng. Khi gặp các hàm dựng sẵn hoặc phương thức cố hữu của JavaScript, chỉ cần tìm các phương thức tương ứng trong Python, do đó việc chuyển đổi tương đối dễ dàng. Logic thuật toán hoàn toàn giống nhau, chỉ có lệnh gọi hàm JavaScriptvar n = d.getTimezoneOffset()Khi chuyển sang Python, hãy sử dụng thư viện thời gian của Pythonn = time.altzonethay thế. Những điểm khác biệt khác chỉ nằm ở cú pháp ngôn ngữ (chẳng hạn như việc sử dụng vòng lặp for, sự khác biệt trong các giá trị Boolean, sự khác biệt trong việc sử dụng logic and, logic not, logic or, v.v.).

Mã Python được ghép lại:

import time

def GetNewCycleRecords(sourceRecords, targetCycle):
    ret = []

    # 首先获取源K线数据的周期
    if not sourceRecords or len(sourceRecords) < 2 : 
        return None

    sourceLen = len(sourceRecords)
    sourceCycle = sourceRecords[-1]["Time"] - sourceRecords[-2]["Time"]

    if targetCycle % sourceCycle != 0 :
        Log("targetCycle:", targetCycle)
        Log("sourceCycle:", sourceCycle)
        raise "targetCycle is not an integral multiple of sourceCycle."

    if (1000 * 60 * 60) % targetCycle != 0 and (1000 * 60 * 60 * 24) % targetCycle != 0 : 
        Log("targetCycle:", targetCycle)
        Log("sourceCycle:", sourceCycle)
        Log((1000 * 60 * 60) % targetCycle, (1000 * 60 * 60 * 24) % targetCycle)
        raise "targetCycle cannot complete the cycle."
    
    multiple = targetCycle / sourceCycle

    isBegin = False
    count = 0 
    barHigh = 0 
    barLow = 0 
    barOpen = 0
    barClose = 0 
    barTime = 0 
    barVol = 0 

    for i in range(sourceLen) : 
        # 获取时区偏移数值
        n = time.altzone        

        if ((1000 * 60 * 60 * 24) - (sourceRecords[i]["Time"] * 1000) % (1000 * 60 * 60 * 24) + (n * 1000)) % targetCycle == 0 :
            isBegin = True

        if isBegin : 
            if count == 0 : 
                barHigh = sourceRecords[i]["High"]
                barLow = sourceRecords[i]["Low"]
                barOpen = sourceRecords[i]["Open"]
                barClose = sourceRecords[i]["Close"]
                barTime = sourceRecords[i]["Time"]
                barVol = sourceRecords[i]["Volume"]
                count += 1
            elif count < multiple : 
                barHigh = max(barHigh, sourceRecords[i]["High"])
                barLow = min(barLow, sourceRecords[i]["Low"])
                barClose = sourceRecords[i]["Close"]
                barVol += sourceRecords[i]["Volume"]
                count += 1

            if count == multiple or i == sourceLen - 1 :
                ret.append({
                    "High" : barHigh,
                    "Low" : barLow,
                    "Open" : barOpen,
                    "Close" : barClose,
                    "Time" : barTime,
                    "Volume" : barVol,
                })
                count = 0
    
    return ret 

# 测试
def main():
    while True:
        r = exchange.GetRecords()
        r2 = GetNewCycleRecords(r, 1000 * 60 * 60 * 4)      

        ext.PlotRecords(r2, "r2")                                 
        Sleep(1000)                                             

Bài kiểm tra

Biểu đồ thị trường Huobi Hướng dẫn bạn từng bước để viết phiên bản Python của hàm tổng hợp K-line

Kiểm tra lại biểu đồ tổng hợp 4 giờ Hướng dẫn bạn từng bước để viết phiên bản Python của hàm tổng hợp K-line

Mã trên chỉ được sử dụng làm tài liệu tham khảo học tập. Nếu sử dụng trong một chiến lược cụ thể, vui lòng sửa đổi và kiểm tra theo nhu cầu của bạn. Nếu bạn có bất kỳ LỖI hoặc đề xuất cải tiến nào, vui lòng để lại tin nhắn, cảm ơn bạn rất nhiều o^_^o