Tangan mengajar anda menulis fungsi gabungan K-line dalam Python.

Penulis:Mimpi kecil, Dicipta: 2019-12-21 09:38:26, Dikemas kini: 2023-10-17 21:24:05

img

Tangan mengajar anda menulis fungsi gabungan K-line dalam Python.

Dalam penulisan dan penggunaan dasar, data kitaran K yang tidak biasa digunakan. Walau bagaimanapun, bursa dan sumber data tidak menyediakan data kitaran ini. Hanya boleh disintesis dengan menggunakan data yang sudah ada. Algoritma sintesis sudah mempunyai versi JavaScript.PautanPada masa yang sama, kita juga akan membuat perisian untuk mengedit kod JavaScript untuk versi Python. Kemudian kita akan menulis algoritma penjumlahan K-line untuk versi Python.

Versi 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 
  }

Terdapat algoritma JavaScript, untuk Python sebenarnya boleh dipindahkan secara berturut-turut, menghadapi fungsi terbina dalam JavaScript, atau kaedah terbina dalam, yang sesuai untuk mencari kaedah yang sesuai di Python, jadi pemindahan masih lebih mudah. Algoritma logiknya sama, hanya panggilan fungsi JavaScript.var n = d.getTimezoneOffset()Apabila anda memindahkan ke Python, anda akan dapat menggunakan laman web di laman web anda.n = time.altzoneSebaliknya; perbezaan lain hanya berkaitan dengan tatabahasa (contohnya penggunaan putaran for, perbezaan nilai boolean, perbezaan penggunaan logik dan, logik bukan, logik atau, dan lain-lain...)

Kod Python selepas pemindahan:

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)                                             

Ujian

Grafik pasaran mata wangimg

Mengumpul semula grafik 4 jamimg

Kod di atas hanya digunakan sebagai rujukan pembelajaran, jika digunakan dalam strategi tertentu, sila ubah, uji jika perlu. Jika ada bug atau cadangan untuk penambahbaikan, sila tinggalkan komen, terima kasih o^_^o


Berkaitan

Lebih lanjut

Khotbah/upload/asset/30da6ebb64b8003b1686.jpg Ahaa, guru Dream Dream lebih mahir daripada saya.

KhotbahFungsi pyresample digunakan untuk menyusun semua baris.

Mimpi kecilZhan, saya tidak boleh Python, saya hanya pelajar pemula.

Mimpi kecil666 sedang dipelajari.