avatar of 发明者量化-小小梦 发明者量化-小小梦
پر توجہ دیں نجی پیغام
4
پر توجہ دیں
1271
پیروکار

آپ کو قدم بہ قدم K-line سنتھیسس فنکشن کا Python ورژن لکھنا سکھائیں۔

میں تخلیق کیا: 2019-12-21 09:38:26, تازہ کاری: 2024-12-15 15:59:54
comments   4
hits   2839

آپ کو قدم بہ قدم K-line سنتھیسس فنکشن کا Python ورژن لکھنا سکھائیں۔

آپ کو قدم بہ قدم K-line سنتھیسس فنکشن کا Python ورژن لکھنا سکھائیں۔

حکمت عملی لکھتے اور استعمال کرتے وقت، کچھ غیر معمولی K-لائن سائیکل ڈیٹا اکثر استعمال کیا جاتا ہے۔ تاہم، تبادلے اور ڈیٹا کے ذرائع ان ادوار کے لیے ڈیٹا فراہم نہیں کرتے ہیں۔ یہ صرف موجودہ سائیکلوں سے ڈیٹا کا استعمال کرتے ہوئے ترکیب کیا جا سکتا ہے. ترکیب الگورتھم کے پاس پہلے سے ہی جاوا اسکرپٹ ورژن ہے (لنک)، درحقیقت، جاوا اسکرپٹ کوڈ کو ازگر ورژن میں پورٹ کرنا بہت آسان ہے۔ اگلا، آئیے K-line ترکیب الگورتھم کا ایک ازگر ورژن لکھتے ہیں۔

جاوا اسکرپٹ ورژن

  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 
  }

اگر جاوا اسکرپٹ الگورتھم ہے، تو اس کا ترجمہ اور پیتھون لائن میں ٹرانسپلانٹ کیا جا سکتا ہے جب JavaScript کے بلٹ ان فنکشنز یا موروثی طریقوں کا سامنا ہو، تو صرف Python میں متعلقہ طریقے تلاش کریں، لہذا ٹرانسپلانٹیشن نسبتاً آسان ہے۔ الگورتھم منطق بالکل یکساں ہے، صرف JavaScript فنکشن کالvar n = d.getTimezoneOffset()جب ازگر پر پورٹ کیا جائے تو، ازگر کی ٹائم لائبریری کا استعمال کریں۔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)                                             

ٹیسٹ

ہوبی مارکیٹ چارٹ آپ کو قدم بہ قدم K-line سنتھیسس فنکشن کا Python ورژن لکھنا سکھائیں۔

مصنوعی 4 گھنٹے کے چارٹ کی بیک ٹیسٹنگ آپ کو قدم بہ قدم K-line سنتھیسس فنکشن کا Python ورژن لکھنا سکھائیں۔

مندرجہ بالا کوڈ کو صرف ایک سیکھنے کے حوالے کے طور پر استعمال کیا جاتا ہے، اگر کسی مخصوص حکمت عملی میں استعمال کیا جائے، تو براہ کرم اپنی ضروریات کے مطابق اس میں ترمیم اور جانچ کریں۔ اگر آپ کے پاس بہتری کے لیے کوئی خرابیاں یا تجاویز ہیں، تو براہ کرم ایک پیغام چھوڑیں، آپ کا بہت بہت شکریہ o^_^o