হ্যান্ডশেক আপনাকে একটি পাইথন সংস্করণে কে-লাইন সংশ্লেষণ ফাংশন লিখতে শেখায়

লেখক:ছোট্ট স্বপ্ন, তৈরিঃ 2019-12-21 09:38:26, আপডেটঃ 2023-10-17 21:24:05

img

হ্যান্ডশেক আপনাকে একটি পাইথন সংস্করণে কে-লাইন সংশ্লেষণ ফাংশন লিখতে শেখায়

নীতিগুলি লেখার সময় প্রায়শই কিছু অস্বাভাবিক কে-লাইন চক্রের ডেটা ব্যবহার করা হয়; তবে এক্সচেঞ্জ এবং ডেটা উত্সগুলি এই চক্রগুলির ডেটা সরবরাহ করে না; কেবলমাত্র ইতিমধ্যে চক্রযুক্ত ডেটা ব্যবহার করে সংশ্লেষণ করা যায়। সংশ্লেষণ অ্যালগরিদম ইতিমধ্যে একটি জাভাস্ক্রিপ্ট সংস্করণ রয়েছে।লিঙ্ক), আসলে জাভাস্ক্রিপ্ট কোডের একটি অংশকে পাইথন সংস্করণে পোর্ট করা সহজ। এরপরে আমরা পাইথন সংস্করণে একটি কে-লাইন সংশ্লেষণ অ্যালগরিদম লিখেছি।

জাভাস্ক্রিপ্ট সংস্করণ

  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 
  }

জাভাস্ক্রিপ্ট অ্যালগরিদম আছে, যা পাইথনের জন্য লাইন-বাই-লাইন অনুবাদ পোর্ট করতে পারে, জাভাস্ক্রিপ্টের অন্তর্নির্মিত ফাংশন বা অন্তর্নির্মিত পদ্ধতির সাথে দেখা করতে পারে, যা পাইথনে সংশ্লিষ্ট অনুসন্ধানের জন্য সংশ্লিষ্ট হয়, তাই পোর্ট করা তুলনামূলকভাবে সহজ। অ্যালগরিদম লজিক সম্পূর্ণ একই, শুধু জাভাস্ক্রিপ্ট ফাংশন কলvar n = d.getTimezoneOffset()Python এর Time Repository-এ থাকা ফাইলগুলোতে,n = time.altzoneপরিবর্তে; অন্যান্য পার্থক্য শুধুমাত্র ভাষার ব্যাকরণগত দিক ((যেমন ফর লুপের ব্যবহার, বুল মানের পার্থক্য, লজিক এবং, লজিক না, লজিক বা এর ব্যবহারের পার্থক্য ইত্যাদি...) ।) ।

পাইথন কোডের প্রতিস্থাপনঃ

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)                                             

পরীক্ষা

মুদ্রা বাজারের চার্টimg

চার ঘণ্টার চার্ট পুনরায় পরীক্ষা করুনimg

উপরের কোডটি কেবলমাত্র শিক্ষার রেফারেন্স হিসাবে ব্যবহৃত হয়, যদি এটি নির্দিষ্ট কৌশলগুলিতে ব্যবহৃত হয় তবে প্রয়োজন অনুসারে সংশোধন বা পরীক্ষা করুন। যদি কোন বাগ বা উন্নতির পরামর্শ থাকে, তাহলে মন্তব্য করতে স্বাগতম, অনেক ধন্যবাদ o^_^o


সম্পর্কিত

আরো

উপদেশ/upload/asset/30da6ebb64b8003b1686.jpg আহা, ড্রিম ড্রিম টিচার আমার চেয়ে বেশি টেকনিক্যাল। স্ক্রিনশটটি ড্রিম ড্রিম টিচারকে রেফারেন্স দিন।

উপদেশpyresample ফাংশন দিয়ে একটি লাইন তৈরি করা হয়েছে।

ছোট্ট স্বপ্নজং, আমি পাইথন জানি না, আমি কেবল শিক্ষানবিস।

ছোট্ট স্বপ্ন৬৬৬ শিখছি।