کیو لائن ڈیٹا کا استعمال کرتے ہوئے مقداری تجارتی حکمت عملی لکھتے وقت ، اکثر ایسے معاملات ہوتے ہیں جہاں غیر معیاری سائیکل کیو لائن ڈیٹا کی ضرورت ہوتی ہے۔ مثال کے طور پر ، 12 منٹ کے سائیکل کیو لائن ڈیٹا اور 4 گھنٹے کے کیو لائن سائیکل ڈیٹا کی ضرورت ہوتی ہے۔ عام طور پر ایسے غیر معیاری سائیکل براہ راست دستیاب نہیں ہوتے ہیں۔ تو ہم ایسی ضروریات سے کیسے نمٹتے ہیں؟
غیر معیاری سائیکل K لائن کے اعداد و شمار کو چھوٹے سائیکل کے اعداد و شمار کو جوڑ کر حاصل کیا جاسکتا ہے۔ اس کی تصویر بنائیں ، متعدد سائیکلوں میں سب سے زیادہ قیمت کو متعدد سائیکل K لائن ترکیب کے بعد سب سے زیادہ قیمت کے طور پر شمار کیا جاتا ہے ، اور سب سے کم قیمت کو ترکیب کے بعد سب سے کم قیمت کے طور پر شمار کیا جاتا ہے ، اور افتتاحی قیمت میں کوئی تبدیلی نہیں آتی ہے۔ 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 |
چار ایک گھنٹے کے سائیکلوں کے اعداد و شمار کو ایک چار گھنٹے کے سائیکل کے اعداد و شمار میں ملایا جاتا ہے۔
افتتاحی قیمت 00:00 وقت پر پہلی K لائن کی افتتاحی قیمت ہے: 11382.57 اختتامی قیمت 03:00: 11384.71 پر آخری K لائن اختتامی قیمت ہے سب سے زیادہ قیمت ان میں سے سب سے زیادہ قیمت تلاش کرنے کے لئے ہے: 11447.07 سب سے کم قیمت ان میں سے سب سے کم قیمت تلاش کرنا ہے: 11365.51
نوٹ: عام تجارتی دن میں چین کی خام مال فیوچر مارکیٹ 15:00 بجے بند ہوئی
4 گھنٹے کے سائیکل کا آغاز کا وقت پہلی 1 گھنٹے کی لائن کا آغاز کا وقت ہے ، یعنی 2019.8.12 00:00
تمام 1 گھنٹے k لائن کے حجم کا مجموعہ اس 4 گھنٹے k لائن حجم کے طور پر استعمال کیا جاتا ہے.
ایک 4 گھنٹے کی لائن تیار کی جاتی ہے:
High: 11447.07
Open: 11382.57
Low: 11365.51
Close: 11384.71
Time: 209.8.12 00:00
آپ دیکھ سکتے ہیں کہ اعداد و شمار مستقل ہیں۔
ابتدائی خیالات کو سمجھنے کے بعد، آپ دستی طور پر کوڈ لکھ سکتے ہیں ضروریات کو پورا کرنے کے لئے.
یہ کوڈ صرف حوالہ کے لئے ہیں:
function GetNewCycleRecords (sourceRecords, targetCycle) { // K line synthesis function
var ret = []
// First get the source K line data cycle
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++) {
// Get the time zone offset value
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
}
// test
function main () {
while (true) {
var r = exchange.GetRecords() // Raw data, as the basic K-line data of the synthesize K line. for example, to synthesize a 4-hour K-line, you can use the 1-hour K-line as the raw data.
var r2 = GetNewCycleRecords(r, 1000 * 60 * 60 * 4) // Pass the original K-line data r through the GetNewCycleRecords function, and the target cycles, 1000 * 60 * 60 * 4, ie the target synthesis cycle is 4 hours K-line data .
$.PlotRecords(r2, "r2") // The strategy class library bar can be selected by check the line class library, and calling the $.PlotRecords line drawing class library to export the function drawing.
Sleep(1000) // Each cycle is separated by 1000 milliseconds, preventing access to the K-line interface too much, resulting in transaction restrictions.
}
}
دراصل، K لائن کو ترکیب کرنے کے لئے، آپ کو دو چیزوں کی ضرورت ہے۔ پہلا خام مال کا ڈیٹا ہے، یعنی ایک چھوٹا سا سائیکل کا K لائن کا ڈیٹا۔ اس مثال میں یہ ہےvar r = exchange.GetRecords()
چھوٹے سائیکل K لائن ڈیٹا حاصل کرنے کے لئے.
دوسرا یہ ہے کہ ہم ترکیب کے دورانیے کا سائز معلوم کریں، ہم اس کے لئے GetNewCycleRecords فنکشن الگورتھم استعمال کرتے ہیں، پھر آپ آخر میں ایک ترکیب شدہ K لائن صف کی ساخت کے اعداد و شمار واپس کر سکتے ہیں.
براہ کرم نوٹ کریں:
ہدف سائیکل K لائن کے سائیکل سے کم نہیں ہوسکتا ہے جسے آپ نے ڈیٹا کے خام مال کے طور پر حاصل نیو سائیکل ریکارڈز فنکشن میں منظور کیا ہے۔ کیونکہ آپ چھوٹے سائیکل ڈیٹا کو بڑے سائیکل سے ترکیب نہیں کرسکتے ہیں۔ صرف اس کے برعکس۔
ہدف سائیکل کو
مثلاً:
12 منٹ کے سائیکل کی K لائن ہر گھنٹے 0: 0 سے شروع ہوتی ہے ، پہلا سائیکل 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 00 ~ 01: 00:00 ، جو بالکل ایک مکمل گھنٹہ ہے۔
اگر یہ 13 منٹ کا سائیکل ہے تو ، یہ ایک ایسا سائیکل ہوگا جو بند نہیں ہوگا۔ اس طرح کے سائیکل کے ذریعہ شمار کردہ اعداد و شمار منفرد نہیں ہیں کیونکہ مرتب کردہ اعداد و شمار مرتب کردہ اعداد و شمار کے آغاز کے نقطہ پر منحصر ہے۔
اسے حقیقی مارکیٹ میں چلائیں:
برعکس تبادلہ چارٹ
میں تمام K لکیروں کے لئے سب سے زیادہ قیمت کا اوسط حساب کرنا چاہتا ہوں۔ مجھے کیا کرنا چاہئے؟
عام طور پر، ہم بندش کی قیمتوں کی اوسط کا استعمال کرتے ہوئے چلتی اوسط کا حساب لگاتے ہیں، لیکن کبھی کبھی سب سے زیادہ قیمت، سب سے کم قیمت، افتتاحی قیمت اور اسی طرح کا استعمال کرنے کی مانگ ہوتی ہے.
ان اضافی مطالبات کے لئے ، ایکسچینج.گیٹ ریکارڈز (()) فنکشن کے ذریعہ واپس آنے والے K لائن ڈیٹا کو براہ راست اشارے کے حساب کے فنکشن میں منتقل نہیں کیا جاسکتا ہے۔
مثلاً:
کےtalib.MA
چلتی اوسط اشارے کے حساب کی تقریب میں دو پیرامیٹرز ہیں، پہلا ڈیٹا ہے جو منتقل کرنے کی ضرورت ہے، اور دوسرا اشارے سائیکل پیرامیٹر ہے.
مثال کے طور پر، ہم ذیل میں دکھایا گیا ہے کے طور پر اشارے کا حساب کرنے کی ضرورت.
K لائن سائیکل 4 گھنٹے ہے.
ایکسچینج مارکیٹ کے کوٹیشن چارٹ پر، 9 کے سائیکل پیرامیٹر کے ساتھ ایک اوسط لائن مقرر کی گئی ہے.
اعداد و شمار کا حساب لگایا گیا ذریعہ فی بار سب سے زیادہ قیمت کا استعمال کر رہا ہے.
یعنی یہ حرکت پذیر اوسط لائن نو 4 گھنٹے کے سائیکل K لائن بار کی سب سے زیادہ اوسط قیمت کے اوسط پر مشتمل ہے۔
آئیے ایک ڈیٹا خود بناتے ہیں تاکہ دیکھیں کہ کیا یہ تبادلے کے ڈیٹا کے ساتھ بھی ایسا ہی ہے۔
var highs = []
for (var i = 0 ; i < r2.length ; i++) {
highs.push(r2[i].High)
}
چونکہ ہمیں حرکت پذیر اوسط اشارے کی قدر حاصل کرنے کے لئے ہر بار کی سب سے زیادہ قیمت کا حساب لگانے کی ضرورت ہے ، لہذا ہمیں ایک صف بنانے کی ضرورت ہے جس میں ہر ڈیٹا عنصر میں ہر بار کے لئے سب سے زیادہ قیمت ہے۔
آپ دیکھ سکتے ہیں کہhighs
متغیر ابتدائی طور پر ایک خالی صف ہے، پھر ہم r2 k-لائن ڈیٹا متغیر (r2 یاد نہیں ہے؟ یاد رکھیں؟ اوپر 4 گھنٹے K-لائن کی ترکیب کرتا ہے کہ اہم تقریب میں کوڈ کو دیکھو).
r2 کے ہر بار کی سب سے زیادہ قیمت پڑھیں (یعنی r2 [i].High، i 0 سے r2 تک ہوتی ہے.length - 1) ، پھر میں دھکاhighs
اس طرح ہم صرف ایک ڈیٹا کی ساخت کی تعمیر ہے کہ K لائن ڈیٹا بار کے ساتھ ایک سے ایک کے مطابق.
اس وقت،highs
پاس کر سکتے ہیںtalib.MA
چلتی اوسط کا حساب کرنے کے لئے تقریب.
مکمل مثال:
function main () {
while (true) {
var r = exchange.GetRecords()
var r2 = GetNewCycleRecords(r, 1000 * 60 * 60 * 4)
if (!r2) {
Continue
}
$.PlotRecords(r2, "r2") // Draw the K line
var highs = []
for (var i = 0 ; i < r2.length ; i++) {
Highs.push(r2[i].High)
}
var ma = talib.MA(highs, 9) // use the moving average function "talib.MA" to calculate the moving average indicator
$.PlotLine("high_MA9", ma[ma.length - 2], r2[r2.length - 2].Time) // Use the line drawing library to draw the moving average indicator on the chart
Sleep(1000)
}
}
بیک ٹسٹ:
آپ دیکھ سکتے ہیں کہ ماؤس پوائنٹ کی پوزیشن کی اوسط اشارے کی قیمت ہے 11466.9289
مندرجہ بالا کوڈ کو ٹیسٹ چلانے کے لئے حکمت عملی میں کاپی کیا جا سکتا ہے،
ایف ایم زیڈ کوانٹ پلیٹ فارم میں پہلے سے ہی ایک پیکڈ انٹرفیس ہے ، یعنی
exchange.GetRecords
فنکشن، K لائن کے اعداد و شمار حاصل کرنے کے لئے.
مندرجہ ذیل ڈیٹا حاصل کرنے کے لئے تبادلہGetRecords
انٹرفیس عام طور پر 100K لائنوں کو واپس کرتا ہے۔ اگر آپ کو ایسی حکمت عملی کا سامنا کرنا پڑتا ہے جس میں ابتدائی طور پر 100K لائنوں سے زیادہ کی ضرورت ہوتی ہے تو ، آپ کو جمع کرنے کے عمل کا انتظار کرنے کی ضرورت ہے۔
حکمت عملی کو جلد از جلد کام کرنے کے لیے، آپ کسی فنکشن کو انکیپسول کر سکتے ہیں، براہ راست ایکسچینج کے K لائن انٹرفیس تک رسائی حاصل کر سکتے ہیں، اور مزید K لائن ڈیٹا حاصل کرنے کے لیے پیرامیٹرز کی وضاحت کر سکتے ہیں۔
مثال کے طور پر ہوبی ایکسچینج پر BTC_USDT ٹریڈنگ جوڑی کا استعمال کرتے ہوئے ، ہم اس شرط کو نافذ کرتے ہیں:
ایکسچینج API دستاویزات تلاش کریں اور K لائن انٹرفیس کی وضاحت دیکھیں:
https://huobiapi.github.io/docs/spot/v1/en/#get-klines-candles
پیرامیٹرز:
نام | قسم | کیا یہ ضروری ہے | تفصیل | قدر |
---|---|---|---|---|
علامت | سٹرنگ | سچ | ٹریڈنگ جوڑی | Btcusdt، ethbtc... |
مدت | سٹرنگ | سچ | اعداد و شمار کی وقت کی گرانولرٹی لوٹاتا ہے، جو ہر کلو لائن کا وقت وقفہ ہے | 1 منٹ، 5 منٹ، 15 منٹ، 30 منٹ، 60 منٹ، 1 دن، 1 ماہ، 1 ہفتے، 1 سال |
سائز | عدد | غلط | اعداد و شمار کی K لائنوں کی تعداد لوٹاتا ہے | [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")
}
آپ کو یہ لاگ ان پر دیکھ سکتے ہیں، پرنٹrecords.length
ہے 300، یعنی، کی تعدادrecords
K لائن ڈیٹا بار 300 ہے.