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

پروگرام شدہ ٹریڈنگ میں K-line ڈیٹا پروسیسنگ پر ایک مختصر بحث

میں تخلیق کیا: 2019-08-13 11:11:38, تازہ کاری: 2023-10-20 20:06:13
comments   8
hits   4628

پروگرام شدہ ٹریڈنگ میں K-line ڈیٹا پروسیسنگ پر ایک مختصر بحث

پروگرام شدہ ٹریڈنگ میں K-line ڈیٹا پروسیسنگ پر ایک مختصر بحث

پروگرامیٹک ٹریڈنگ کی حکمت عملی لکھتے وقت، K-line ڈیٹا کا استعمال کرتے ہوئے، اکثر کچھ غیر معیاری مدت K-line ڈیٹا استعمال کرنے کی ضرورت ہوتی ہے، جیسے 12 منٹ کی مدت K-line ڈیٹا، 4 گھنٹے کی مدت K-line ڈیٹا، عام طور پر اس قسم کی غیر معیاری مدت براہ راست حاصل نہیں کی جا سکتی۔ تو ہم ایسے مطالبات کا کیا جواب دیتے ہیں؟ جواب ضرور ہے کہ کوئی راستہ ہے۔ غیر معیاری سائیکل چھوٹے چکروں سے ڈیٹا کو ملا کر اور ترکیب کر کے حاصل کیا جا سکتا ہے آپ تصور کر سکتے ہیں کہ ترکیب کے بعد سب سے کم قیمت کو سب سے کم قیمت کے طور پر شمار کیا جاتا ہے۔ قیمت تبدیل نہیں ہوگی، ترکیب شدہ K-لائن کے خام مال کے ڈیٹا کی پہلی ابتدائی قیمت استعمال کی جاتی ہے، اختتامی قیمت ترکیب شدہ K-لائن کے خام مال کے ڈیٹا کی آخری اختتامی قیمت کے مساوی ہے، یہ وقت ہے۔ ابتدائی قیمت کا، اور تجارتی حجم کا حساب خام مال کے ڈیٹا کے لین دین کے حجم کو جمع کرکے کیا جاتا ہے۔ جیسا کہ تصویر میں دکھایا گیا ہے:

  • ### خیالات

ہم بلاکچین اثاثہ مارکیٹ BTC_USDT کو ایک مثال کے طور پر لیتے ہیں اور 1 گھنٹے کو 4 گھنٹے میں ترکیب کرتے ہیں۔

پروگرام شدہ ٹریڈنگ میں K-line ڈیٹا پروسیسنگ پر ایک مختصر بحث

پروگرام شدہ ٹریڈنگ میں K-line ڈیٹا پروسیسنگ پر ایک مختصر بحث

پروگرام شدہ ٹریڈنگ میں K-line ڈیٹا پروسیسنگ پر ایک مختصر بحث

پروگرام شدہ ٹریڈنگ میں K-line ڈیٹا پروسیسنگ پر ایک مختصر بحث

|وقت | زیادہ | کھلا | کم | بند | |- |- |- |- |-| |2019.8.12 00:00|11447.07|11382.57|11367.2|11406.92| |2019.8.12 01:00|11420|11405.65|11366.6|11373.83| |2019.8.12 02:00|11419.24|11374.68|11365.51|11398.19| |2019.8.12 03:00|11407.88|11398.59|11369.7|11384.71|

ان چار 1-گھنٹہ سائیکلوں کے ڈیٹا کو 4-گھنٹہ سائیکل ڈیٹا میں ملایا جاتا ہے، ابتدائی قیمت پہلی 00:00 وقت کی ابتدائی قیمت ہے: 11382.57۔ اختتامی قیمت آخری ہے، یعنی 03:00: 11384.71 پر اختتامی قیمت سب سے زیادہ قیمت یہاں کی سب سے زیادہ قیمت ہے: 11447.07 یہاں سب سے کم قیمت ہے: 11365.51 4-گھنٹے سائیکل کا آغاز وقت 00:00 ہے، 1-گھنٹہ K-لائن کا ابتدائی وقت، یعنی 2019.8.12 00:00 تجارتی حجم کا خلاصہ ہر 1 گھنٹے میں کیا جا سکتا ہے (بنیادی طور پر اس بات کا مشاہدہ کرنے کے لیے کہ قیمت کی ترکیب کیسے کی جاتی ہے، جو کہ تجارتی حجم کے اعداد و شمار میں نہیں دکھایا گیا ہے)۔

ترکیب شدہ 4 گھنٹے کی K-لائن یہ ہے: ہائی: 11447.07 کھلا: 11382.57 کم: 11365.51 موصول ہوا: 11384.71 وقت: 2019.8.12 00:00

پروگرام شدہ ٹریڈنگ میں 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 
    }

    // 测试
    function main () {
        while (true) {
            var r = exchange.GetRecords()                           // 原始数据,作为合成K线的基础K线数据,例如要合成4小时K线,可以用1小时K线作为原始数据。
            var r2 = GetNewCycleRecords(r, 1000 * 60 * 60 * 4)      // 通过 GetNewCycleRecords 函数 传入 原始K线数据 r , 和目标周期, 1000 * 60 * 60 * 4 即 目标合成的周期 是4小时K线数据。

            $.PlotRecords(r2, "r2")                                 // 策略类库栏 可以勾选画线类库,调用 $.PlotRecords 画线类库 导出函数 画图。
            Sleep(1000)                                             // 每次循环间隔 1000 毫秒,防止访问K线接口获取数据过于频繁,导致交易所限制。
        }
    }

درحقیقت، K-line کی ترکیب کے لیے، دو چیزوں کی ضرورت ہوتی ہے، پہلی خام مال کا ڈیٹا، یعنی ایک چھوٹی مدت کا K-line ڈیٹا۔var r = exchange.GetRecords() حاصل کردہ چھوٹی مدت کے لائن ڈیٹا۔ دوسرا ترکیب کی مدت کو واضح طور پر بیان کرنا ہے، یعنی K-line ڈیٹا کی ترکیب کے لیے ہدف کی مدت۔ پھر، GetNewCycleRecords فنکشن کے الگورتھم کے ذریعے، ایک ترکیب شدہ K-line ارے ڈھانچے کا ڈیٹا آخر میں واپس کیا جا سکتا ہے۔ واضح رہے کہ:

    1. ہدف کا سائیکل K-line کے اس سائیکل سے کم نہیں ہو سکتا جسے آپ ڈیٹا کے خام مال کے طور پر GetNewCycleRecords فنکشن میں داخل کرتے ہیں۔ اس کی وجہ یہ ہے کہ چھوٹے سائیکل سے ڈیٹا کی ترکیب کے لیے چھوٹے سائیکل کا استعمال کرنا ناممکن ہے۔
    1. مقرر کردہ ہدف کی مدت ایک بند مدت ہونی چاہیے۔ سائیکل بندش کیا ہے؟ سیدھے الفاظ میں، ایک گھنٹہ یا ایک دن کے اندر، ٹارگٹ سائیکل ٹائم رینجز کو ایک ساتھ ملا کر ایک بند لوپ بنایا جاتا ہے۔ مثال: مثال کے طور پر، 12 منٹ کے سائیکل کی K-لائن ہر گھنٹے کے 0:00 سے شروع ہوتی ہے (مثال کے طور پر 0:00 لیں)، اور پہلا سائیکل ہے00:00:00 ~ 00:12:00، دوسرا سائیکل ہے00:12:00 ~ 00:24:00، تیسرا چکر ہے۔00:24:00 ~ 00:36:00، چوتھا چکر ہے۔00:36:00 ~ 00:48:00، پانچواں چکر ہے۔00:48:00 ~ 01:00:00 ، جو مکمل 1 گھنٹہ بناتا ہے۔

    اگر یہ 13 منٹ کا سائیکل ہے، تو یہ ایک کھلا سائیکل ہے، اور اس طرح کے چکر میں شمار کیا جانے والا ڈیٹا منفرد نہیں ہے، کیونکہ ترکیب شدہ ڈیٹا کی ترکیب کے نقطہ آغاز کے لحاظ سے مختلف ہوگا۔

اصل ڈسک چلائی گئی تھی: پروگرام شدہ ٹریڈنگ میں K-line ڈیٹا پروسیسنگ پر ایک مختصر بحث

ایکسچینج چارٹس کا موازنہ کریں۔ پروگرام شدہ ٹریڈنگ میں K-line ڈیٹا پروسیسنگ پر ایک مختصر بحث

  • ## مطلوبہ ڈیٹا ڈھانچہ بنانے کے لیے K-line ڈیٹا استعمال کریں۔

گروپ کے اراکین اکثر سوالات پوچھتے ہیں: میں ہر K-لائن کی سب سے زیادہ قیمت کی متحرک اوسط کا حساب لگانا چاہتا ہوں، مجھے کیا کرنا چاہیے؟

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

مثال کے طور پر: talib.MA موونگ ایوریج انڈیکیٹر کیلکولیشن فنکشن میں دو پیرامیٹرز ہوتے ہیں پہلا پیرامیٹر وہ ڈیٹا ہوتا ہے جسے پاس کرنے کی ضرورت ہوتی ہے، اور دوسرا پیرامیٹر انڈیکیٹر پیریڈ پیرامیٹر ہوتا ہے۔ مثال کے طور پر، ہم درج ذیل انڈیکیٹرز کا حساب لگانا چاہتے ہیں۔ پروگرام شدہ ٹریڈنگ میں K-line ڈیٹا پروسیسنگ پر ایک مختصر بحث

K-لائن سائیکل 4 گھنٹے ہے۔ ایکسچینج چارٹ پر، 9 کے موونگ ایوریج پیریڈ پیرامیٹر کے ساتھ ایک موونگ ایوریج سیٹ کیا گیا ہے۔ اور حساب کے لیے ڈیٹا سورس ہر بار کی سب سے زیادہ قیمت پر سیٹ ہے۔ پروگرام شدہ ٹریڈنگ میں K-line ڈیٹا پروسیسنگ پر ایک مختصر بحث یعنی، یہ حرکت پذیری اوسط 9 4-hour K-line بارز کی سب سے زیادہ قیمتوں کی اوسط ہے، جو انڈیکیٹر موونگ ایوریج کو تشکیل دیتی ہے۔

آئیے خود کچھ ڈیٹا بناتے ہیں اور دیکھتے ہیں کہ کیا یہ ایکسچینج کے چارٹ کے حساب سے حساب کتاب کے برابر ہے۔

  var highs = []
  for (var i = 0 ; i < r2.length ; i++) {
      highs.push(r2[i].High)
  }

چونکہ موونگ ایوریج انڈیکیٹر اخذ کرنے کے لیے ہمیں ہر بار کی سب سے زیادہ قیمتوں کی اوسط کا حساب لگانا ہوگا۔ اس کے بعد آپ کو پہلے ایک سرنی بنانے کی ضرورت ہے، جس میں ہر ڈیٹا عنصر ہر بار کی سب سے زیادہ قیمت کے مساوی ہو۔ آپ دیکھ سکتے ہیں کہ ہائیز متغیر ابتدائی طور پر ایک خالی صف ہے، اور پھر ہم r2 کینڈل سٹک ڈیٹا متغیر کو عبور کرتے ہیں (r2 یاد نہیں ہے؟ اوپر 4 گھنٹے کی کینڈل اسٹک کو سنتھیسائز کرنے کے مرکزی فنکشن میں کوڈ کو دیکھیں)۔ r2 کے ہر بار کی سب سے زیادہ قیمت پڑھیں (یعنی r2[i].High , i کی حد 0 سے r2.length - 1 تک ہوتی ہے ) اور پھر اسے بلندیوں میں دھکیل دیتی ہے۔ اس طرح، ڈیٹا کا ڈھانچہ بنایا جاتا ہے جو K-line ڈیٹا بار کے ساتھ ایک دوسرے سے مطابقت رکھتا ہے۔

اس مقام پر، متحرک اوسط کا حساب لگانے کے لیے talib.MA فنکشن میں ہائیز کو منتقل کیا جا سکتا ہے۔

مکمل مثال:

  function main () {
      while (true) {
          var r = exchange.GetRecords()
          var r2 = GetNewCycleRecords(r, 1000 * 60 * 60 * 4)
          if (!r2) {
              continue
          }

          $.PlotRecords(r2, "r2")                                               // 画出K线

          var highs = []
          for (var i = 0 ; i < r2.length ; i++) {
              highs.push(r2[i].High)
          }

          var ma = talib.MA(highs, 9)                                           // 用均线指标函数 talib.MA 计算 均线指标
          $.PlotLine("high_MA9", ma[ma.length - 2], r2[r2.length - 2].Time)     // 使用画线类库把均线指标画在图表上

          Sleep(1000)
      }
  }

بیک ٹیسٹ رن:

پروگرام شدہ ٹریڈنگ میں K-line ڈیٹا پروسیسنگ پر ایک مختصر بحث

آپ دیکھ سکتے ہیں کہ اعداد و شمار میں ماؤس کی پوزیشن پر حرکت پذیر اوسط اشارے کی قدریں ہیں۔11466.9289

مندرجہ بالا کوڈ کو ٹیسٹ چلانے کی حکمت عملی میں کاپی کیا جا سکتا ہے “لائن ڈرائنگ لائبریری” کو چیک کرنا یاد رکھیں اور اسے محفوظ کریں!

  • ## ڈیجیٹل کرنسی مارکیٹ میں K-line ڈیٹا کیسے حاصل کیا جائے۔

Inventor Quantitative Trading Platform میں پہلے سے ہی ایک پیکڈ انٹرفیس ہے، یعنی exchange.GetRecords فنکشن، جو K-line ڈیٹا حاصل کر سکتا ہے۔ مندرجہ ذیل ڈیٹا حاصل کرنے کے لیے ایکسچینج K-line ڈیٹا انٹرفیس تک براہ راست رسائی پر توجہ مرکوز کرتا ہے، کیونکہ بعض اوقات آپ کو مزید K-لائنز، encapsulated GetRecords انٹرفیس حاصل کرنے کے لیے پیرامیٹرز کی وضاحت کرنے کی ضرورت ہوتی ہے۔ عام طور پر 100 واپس کیے جاتے ہیں۔ اگر حکمت عملی کے لیے ابتدائی طور پر 100 سے زیادہ K-لائنز درکار ہیں، تو آپ کو جمع کرنے اور انتظار کرنے کی ضرورت ہے۔ حکمت عملی کو جلد از جلد چلانے کے لیے، آپ خود ایک فنکشن کو انکیپسلیٹ کر سکتے ہیں، ایکسچینج K-line انٹرفیس تک براہ راست رسائی حاصل کر سکتے ہیں، اور مزید K-line ڈیٹا حاصل کرنے کے لیے پیرامیٹرز کی وضاحت کر سکتے ہیں۔

مثال کے طور پر Huobi کے BTC_USDT تجارتی جوڑے کو لے کر، ہم اس ضرورت کو نافذ کرتے ہیں:

ایکسچینج کی API دستاویز تلاش کریں اور K-line انٹرفیس کی تفصیل دیکھیں: پروگرام شدہ ٹریڈنگ میں K-line ڈیٹا پروسیسنگ پر ایک مختصر بحث

  https://api.huobi.pro/market/history/kline?period=1day&size=200&symbol=btcusdt

پیرامیٹر: |پیرامیٹر کا نام | قسم | مطلوبہ | تفصیل | قدر | |-|-|-|-|-| |symbol|string|true|Trading pair|btcusdt, ethbtc…| |پیریوڈ|سٹرنگ|ٹرو |size|integer|false|K-line ڈیٹا کی تعداد واپس کریں۔[1, 2000]|

ٹیسٹ کوڈ:

  function GetRecords_Huobi (period, size, symbol) {
      var url = "https://api.huobi.pro/market/history/kline?" + "period=" + period + "&size=" + size + "&symbol=" + symbol
      var ret = HttpQuery(url)

      try {
          var jsonData = JSON.parse(ret)
          var records = []
          for (var i = jsonData.data.length - 1; i >= 0 ; i--) {
              records.push({
                  Time : jsonData.data[i].id * 1000,
                  High : jsonData.data[i].high,
                  Open : jsonData.data[i].open,
                  Low : jsonData.data[i].low,
                  Close : jsonData.data[i].close,
                  Volume : jsonData.data[i].vol,
              })
          }
          return records
      } catch (e) {
          Log(e)
      }
  }  


  function main() {
      var records = GetRecords_Huobi("1day", "300", "btcusdt")
      Log(records.length)
      $.PlotRecords(records, "K")
  }

Python ورژن، Huobi ایکسچینج انٹرفیس تک رسائی کی مثال:

#!python3
import json
import urllib2

def GetRecords_Huobi(period, size, symbol):
    headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
    url = "https://api.huobi.pro/market/history/kline?" + "period=" + period + "&size=" + size + "&symbol=" + symbol
    request = urllib2.Request(url)  
    request.add_header('User-Agent','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6')  
    opener = urllib2.build_opener()  
    f= opener.open(request)  
    ret = f.read().decode('utf-8')  
    
    try :
        jsonData = json.loads(ret)
        
        records = []
        for i in range(len(jsonData["data"]) - 1, -1, -1):
            records.append({
                "Time" : jsonData["data"][i]["id"] * 1000, 
                "High" : jsonData["data"][i]["high"], 
                "Open" : jsonData["data"][i]["open"], 
                "Low" : jsonData["data"][i]["low"], 
                "Close" : jsonData["data"][i]["close"], 
                "Volume" : jsonData["data"][i]["vol"], 
            })
        return records
    except Exception as e:
        Log(e)
        
def main():
    r = GetRecords_Huobi("1day", "300", "btcusdt")
    Log(len(r))
    ext.PlotRecords(r, "K")   # 需要引用Python画线类库


Python ورژن، Binance Exchange کے K-line انٹرفیس تک رسائی کی ایک مثال:

#!python3
import json
import urllib2

def GetRecords_Huobi(period, size, symbol):
    headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
    url = "https://api.binance.com/api/v3/klines?symbol=" + symbol + "&interval=" + period
    request = urllib2.Request(url)  
    request.add_header('User-Agent','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6')  
    opener = urllib2.build_opener()  
    f= opener.open(request)  
    ret = f.read().decode('utf-8')  
    try :
        jsonData = json.loads(ret)
        
        records = []
        for i in range(len(jsonData)):
            records.append({
                "Time" : float(jsonData[i][0]),
                "High" : float(jsonData[i][2]), 
                "Open" : float(jsonData[i][1]), 
                "Low" : float(jsonData[i][3]), 
                "Close" : float(jsonData[i][4]), 
                "Volume" : float(jsonData[i][5]), 
            })
        return records
    except Exception as e:
        Log(e)
        
def main():
    r = GetRecords_Huobi("1m", "300", "BTCUSDT")
    Log(len(r))
    ext.PlotRecords(r, "K")   # 需要引用Python画线类库


پروگرام شدہ ٹریڈنگ میں K-line ڈیٹا پروسیسنگ پر ایک مختصر بحث

پروگرام شدہ ٹریڈنگ میں K-line ڈیٹا پروسیسنگ پر ایک مختصر بحث

ہم لاگ میں دیکھ سکتے ہیں کہ records.length 300 ہے، جس کا مطلب ہے کہ ریکارڈ K-line ڈیٹا کی 300 بارز ہیں۔ پروگرام شدہ ٹریڈنگ میں K-line ڈیٹا پروسیسنگ پر ایک مختصر بحث