Type/to search
8
Follow
1363
Followers
پروگرام شدہ ٹریڈنگ میں K-line ڈیٹا پروسیسنگ پر ایک مختصر بحث
Discussions
Created 2019-08-13 11:11:38  Updated 2023-10-20 20:06:13
 8
 4974

img

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

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

  • خیالات

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

    img

    img

    img

    img

    وقتزیادہکھلاکمبند
    2019.8.12 00:0011447.0711382.5711367.211406.92
    2019.8.12 01:001142011405.6511366.611373.83
    2019.8.12 02:0011419.2411374.6811365.5111398.19
    2019.8.12 03:0011407.8811398.5911369.711384.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

    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 } // 测试 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 منٹ کا سائیکل ہے، تو یہ ایک کھلا سائیکل ہے، اور اس طرح کے چکر میں شمار کیا جانے والا ڈیٹا منفرد نہیں ہے، کیونکہ ترکیب شدہ ڈیٹا کی ترکیب کے نقطہ آغاز کے لحاظ سے مختلف ہوگا۔

    اصل ڈسک چلائی گئی تھی:
    img

    ایکسچینج چارٹس کا موازنہ کریں۔
    img

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

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

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

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

    K-لائن سائیکل 4 گھنٹے ہے۔
    ایکسچینج چارٹ پر، 9 کے موونگ ایوریج پیریڈ پیرامیٹر کے ساتھ ایک موونگ ایوریج سیٹ کیا گیا ہے۔
    اور حساب کے لیے ڈیٹا سورس ہر بار کی سب سے زیادہ قیمت پر سیٹ ہے۔
    img
    یعنی، یہ حرکت پذیری اوسط 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) } }

    بیک ٹیسٹ رن:

    img

    آپ دیکھ سکتے ہیں کہ اعداد و شمار میں ماؤس کی پوزیشن پر حرکت پذیر اوسط اشارے کی قدریں ہیں۔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 انٹرفیس کی تفصیل دیکھیں:
    img

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

    پیرامیٹر:

    پیرامیٹر کا نامقسممطلوبہتفصیلقدر
    symbolstringtrueTrading pairbtcusdt, ethbtc...
    پیریوڈسٹرنگٹرو
    sizeintegerfalseK-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画线类库

img

img

ہم لاگ میں دیکھ سکتے ہیں کہ records.length 300 ہے، جس کا مطلب ہے کہ ریکارڈ K-line ڈیٹا کی 300 بارز ہیں۔
img

Related Recommendations
Comment
All comments (8)

    贴主能修复一下问题么?无法用3小时或6小时k合成日k

    6 years ago

    好的,抽时间改改。

    6 years ago

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

    这一句有问题,无法用3小时或6小时k合成日k,只能用1小时,2小时,4小时的k线合成日k

    6 years ago

    如果要爬某品种全部的历史数据也能爬么?

    6 years ago

    这是访问交易所接口数据的,交易所给你多少数据就是多少。也就是最近的几百根吧一般来说。

    6 years ago

    感谢回复

    7 years ago

    请问,如果想要超过300根,怎么处理比较好呢?比如1000根K线数据。交易所单次好像支持每次300根。多谢

    7 years ago

    如果 超过交易所接口支持的最大返回数量,这样只能收集数据,等足够K线数据量。

    7 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)