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




|وقت | زیادہ | کھلا | کم | بند | |- |- |- |- |-| |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

آپ دیکھ سکتے ہیں کہ ڈیٹا مطابقت رکھتا ہے۔
ابتدائی خیالات کی تصدیق کرنے کے بعد، آپ اس ضرورت کو ابتدائی طور پر نافذ کرنے کے لیے کچھ کوڈ لکھنا شروع کر سکتے ہیں۔
کوڈ کو براہ راست جاری کریں، کوڈ صرف حوالہ کے لیے ہے:
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 ارے ڈھانچے کا ڈیٹا آخر میں واپس کیا جا سکتا ہے۔
واضح رہے کہ:
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-لائن کی سب سے زیادہ قیمت کی متحرک اوسط کا حساب لگانا چاہتا ہوں، مجھے کیا کرنا چاہیے؟
عام طور پر، ہم موونگ ایوریج بنانے کے لیے بند ہونے والی قیمتوں کی اوسط کا حساب لگا کر موونگ ایوریج کا حساب لگاتے ہیں، لیکن بعض اوقات سب سے زیادہ قیمت، سب سے کم قیمت، اوپننگ پرائس وغیرہ کا حساب لگانے کی ضرورت ہوتی ہے۔
اس وقت، آپ صرف نہیں کر سکتے ہیںexchange.GetRecords() فنکشن کے ذریعے واپس آنے والا K-line ڈیٹا براہ راست اشارے کیلکولیشن فنکشن میں منتقل کیا جاتا ہے۔
مثال کے طور پر:
talib.MA موونگ ایوریج انڈیکیٹر کیلکولیشن فنکشن میں دو پیرامیٹرز ہوتے ہیں پہلا پیرامیٹر وہ ڈیٹا ہوتا ہے جسے پاس کرنے کی ضرورت ہوتی ہے، اور دوسرا پیرامیٹر انڈیکیٹر پیریڈ پیرامیٹر ہوتا ہے۔
مثال کے طور پر، ہم درج ذیل انڈیکیٹرز کا حساب لگانا چاہتے ہیں۔

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

آپ دیکھ سکتے ہیں کہ اعداد و شمار میں ماؤس کی پوزیشن پر حرکت پذیر اوسط اشارے کی قدریں ہیں۔11466.9289
مندرجہ بالا کوڈ کو ٹیسٹ چلانے کی حکمت عملی میں کاپی کیا جا سکتا ہے “لائن ڈرائنگ لائبریری” کو چیک کرنا یاد رکھیں اور اسے محفوظ کریں!
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 انٹرفیس کی تفصیل دیکھیں:

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画线类库


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