যখন একটি পরিমাণগত ট্রেডিং কৌশল লেখার সময়, কে-লাইন ডেটা ব্যবহার করে, প্রায়শই এমন ঘটনা ঘটে যেখানে অ-মানক চক্র কে-লাইন ডেটা প্রয়োজন হয়। উদাহরণস্বরূপ, 12-মিনিট চক্র কে-লাইন ডেটা এবং 4-ঘন্টা কে-লাইন চক্র ডেটা প্রয়োজন। সাধারণত এই ধরনের অ-মানক চক্রগুলি সরাসরি উপলব্ধ নয়। সুতরাং আমরা কীভাবে এই জাতীয় চাহিদা মোকাবেলা করব?
অ-মানক চক্র কে লাইন ডেটা ছোট চক্রের ডেটা একত্রিত করে প্রাপ্ত করা যেতে পারে। এটি চিত্র করুন, একাধিক চক্রের সর্বোচ্চ মূল্য একাধিক চক্র কে লাইন সংশ্লেষণের পরে সর্বোচ্চ মূল্য হিসাবে গণনা করা হয়, এবং সর্বনিম্ন মূল্য সংশ্লেষণের পরে সর্বনিম্ন মূল্য হিসাবে গণনা করা হয়, এবং খোলার মূল্য পরিবর্তন হয় না। কে-লাইনের কাঁচামালের ডেটা প্রথম খোলার মূল্য সংশ্লেষিত হয়। বন্ধের মূল্য কে-লাইনের শেষ কাঁচামালের ডেটা বন্ধের দামের সাথে মিলে যায়। সময় খোলার মূল্য k লাইনের সময় ব্যবহার করে। লেনদেনের ভলিউম যোগ করা এবং গণনা করা কাঁচামালের ডেটা ব্যবহার করে।
চিত্রের মতঃ
আসুন উদাহরণস্বরূপ ব্লকচেইন সম্পদ বিটিসি_ইউএসডিটি নিই এবং ১ ঘন্টাকে ৪ ঘণ্টায় সংমিশ্রণ করি।
সময় | সর্বোচ্চ | খোলা | সর্বনিম্ন | বন্ধ করুন |
---|---|---|---|---|
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 |
চারটি এক ঘণ্টার চক্রের তথ্য একক চার ঘণ্টার চক্রের তথ্যে একত্রিত করা হয়।
উদ্বোধনী মূল্য হল প্রথম K লাইন উদ্বোধনী মূল্য 00:00 সময়ঃ 11382.57 বন্ধের মূল্য হল শেষ k লাইন বন্ধের মূল্য 03:00: 11384.71 তাদের মধ্যে সর্বোচ্চ মূল্য খুঁজে বের করতে হবেঃ 11447.07 সর্বনিম্ন মূল্য তাদের মধ্যে সর্বনিম্ন মূল্য খুঁজে পেতে হয়ঃ 11365.51
দ্রষ্টব্যঃ চীনের কমোডিটি ফিউচার মার্কেট একটি সাধারণ ট্রেডিং দিনে বিকেল ৩ টায় বন্ধ হয়।
৪ ঘণ্টার চক্রের শুরু সময় হল প্রথম ১ ঘণ্টার কে-লাইনের শুরু সময়, অর্থাৎ ২০১৯.৮.১২ 00:00
সমস্ত 1 ঘন্টা k লাইনের ভলিউমের যোগফল এই 4 ঘন্টা k লাইনের ভলিউম হিসাবে ব্যবহৃত হয়।
৪ ঘণ্টার একটি কে-লাইন সংশ্লেষিত হয়:
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.
}
}
আসলে, কে লাইন সংশ্লেষণ করার জন্য, আপনার দুটি জিনিস দরকার। প্রথমটি হল কাঁচামালের তথ্য, অর্থাৎ একটি ছোট চক্রের কে-লাইন ডেটা। এই উদাহরণে এটিvar r = exchange.GetRecords()
ছোট চক্র K লাইন তথ্য পেতে.
দ্বিতীয়টি হল সংশ্লেষণ চক্রের আকার নির্ধারণ করা, আমরা এটি করার জন্য GetNewCycleRecords ফাংশন অ্যালগরিদম ব্যবহার করি, তারপর আপনি অবশেষে একটি সংশ্লেষিত কে-লাইন অ্যারে কাঠামোর ডেটা ফেরত দিতে পারেন।
অনুগ্রহ করে জেনে রাখুনঃ
লক্ষ্য চক্রটি K রেখার চক্রের চেয়ে কম হতে পারে না যা আপনি GetNewCycleRecords ফাংশনে ডেটার জন্য একটি কাঁচামাল হিসাবে পাস করেছেন। কারণ আপনি একটি বড় চক্র দ্বারা ছোট চক্রের ডেটা সংশ্লেষণ করতে পারবেন না। শুধুমাত্র বিপরীত উপায়।
লক্ষ্য চক্রকে
উদাহরণস্বরূপঃ
১২ মিনিটের চক্রের কে-লাইন প্রতি ঘণ্টায় ০ঃ০ থেকে শুরু হয়, প্রথম চক্রটি ০০ঃ০০ঃ০০ ~ ০০ঃ১২ঃ০০, এবং দ্বিতীয় চক্রটি ০০ঃ১২ঃ০০ ~ ০০ঃ২৪ঃ০০, তৃতীয় চক্রটি ০০ঃ২৪ঃ০০ ~ ০০ঃ৩৬ঃ০০, চতুর্থ চক্রটি ০০ঃ৩৬ঃ০০ ~ ০০ঃ৪৮ঃ০০, পঞ্চম চক্রটি ০০ঃ৪৮ঃ০০ ~ ০ঃ১ঃ০০ঃ০০, যা ঠিক এক ঘন্টা সম্পন্ন হয়েছে।
যদি এটি ১৩ মিনিটের একটি চক্র হয়, তবে এটি এমন একটি চক্র হবে যা বন্ধ হয় না। এই ধরনের চক্র দ্বারা গণনা করা ডেটা অনন্য নয় কারণ সংশ্লেষিত ডেটা সংশ্লেষিত ডেটার শুরু পয়েন্টের উপর নির্ভর করে ভিন্ন।
এটাকে বাস্তব বাজারে চালান:
কন্ট্রাস্ট এক্সচেঞ্জ চার্ট
আমি সমস্ত কে লাইনগুলির জন্য সর্বোচ্চ মূল্যের চলমান গড় গণনা করতে চাই। আমার কি করা উচিত?
সাধারণত, আমরা গড় মূল্যের গড় ব্যবহার করে চলমান গড় গণনা করি, কিন্তু কখনও কখনও সর্বোচ্চ মূল্য, সর্বনিম্ন মূল্য, খোলার মূল্য এবং তাই ব্যবহার করার জন্য চাহিদা আছে।
এই অতিরিক্ত চাহিদার জন্য, এক্সচেঞ্জ.গেট রেকর্ডস ()) ফাংশন দ্বারা ফেরত দেওয়া K লাইন ডেটা সরাসরি সূচক গণনা ফাংশনে পাস করা যাবে না।
উদাহরণস্বরূপঃ
দ্যtalib.MA
চলমান গড় সূচক গণনা ফাংশন দুটি পরামিতি আছে, প্রথমটি হল তথ্য যা পাস করা প্রয়োজন, এবং দ্বিতীয়টি হল সূচক চক্র প্যারামিটার।
উদাহরণস্বরূপ, নিচের মত সূচকগুলো গণনা করতে হবে।
কে লাইন চক্র ৪ ঘন্টা।
এক্সচেঞ্জ মার্কেটের কোটেশন চার্টে, একটি গড় রেখা নির্ধারণ করা হয়েছে, যার চক্র প্যারামিটার ৯।
হিসাবকৃত তথ্য উৎস সর্বোচ্চ দাম প্রতি বার ব্যবহার করা হয়।
অর্থাৎ, এই চলমান গড় রেখাটি নয়টি 4-ঘন্টা চক্র কে-লাইন বারের সর্বোচ্চ গড় মূল্যের গড়ের সমন্বয়ে গঠিত।
আসুন আমরা নিজেরাই একটি ডেটা তৈরি করি এবং দেখি এটি এক্সচেঞ্জের ডেটার সাথে একই কিনা।
var highs = []
for (var i = 0 ; i < r2.length ; i++) {
highs.push(r2[i].High)
}
যেহেতু আমাদের চলমান গড় সূচকটির মান পেতে প্রতিটি বারের সর্বোচ্চ মূল্য গণনা করতে হবে, তাই আমাদের এমন একটি অ্যারে তৈরি করতে হবে যেখানে প্রতিটি ডেটা উপাদানের জন্য প্রতিটি বারের সর্বোচ্চ মূল্য রয়েছে।
আপনি দেখতে পাচ্ছেন যেhighs
ভেরিয়েবলটি প্রাথমিকভাবে একটি খালি অ্যারে, তারপর আমরা r2 কে-লাইন ডেটা ভেরিয়েবল অতিক্রম করি (r2 মনে নেই? উপরে 4-ঘন্টা কে-লাইন সংশ্লেষিত প্রধান ফাংশনের কোডটি দেখুন) ।
r2 (যেমন r2[i] উচ্চ, i 0 থেকে r2 দৈর্ঘ্য - 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
উপরের কোডটি পরীক্ষা চালানোর জন্য কৌশলটিতে অনুলিপি করা যেতে পারে,
FMZ Quant প্ল্যাটফর্মে ইতিমধ্যেই একটি প্যাকেজ ইন্টারফেস রয়েছে, যথা
exchange.GetRecords
ফাংশন, K-লাইন তথ্য পেতে.
নিম্নলিখিত তথ্য প্রাপ্তির জন্য এক্সচেঞ্জের কে-লাইন ডেটা ইন্টারফেসের সরাসরি অ্যাক্সেসের উপর দৃষ্টি নিবদ্ধ করে, কারণ কখনও কখনও আপনাকে আরও কে লাইন পেতে প্যারামিটার নির্দিষ্ট করতে হবে, প্যাকেজটিGetRecords
ইন্টারফেস সাধারণত 100k লাইন ফেরত দেয়। যদি আপনি একটি কৌশল সম্মুখীন যা প্রাথমিকভাবে 100K-লাইন চেয়ে বেশি প্রয়োজন, আপনি সংগ্রহ প্রক্রিয়া অপেক্ষা করতে হবে।
যত তাড়াতাড়ি সম্ভব কৌশলটি কার্যকর করার জন্য, আপনি একটি ফাংশন ক্যাপসুল করতে পারেন, সরাসরি এক্সচেঞ্জের কে লাইন ইন্টারফেসে অ্যাক্সেস করতে পারেন, এবং আরও কে লাইন ডেটা পেতে পরামিতি নির্দিষ্ট করতে পারেন।
উদাহরণস্বরূপ হুবি এক্সচেঞ্জে বিটিসি_ইউএসডিটি ট্রেডিং জুটি ব্যবহার করে আমরা এই প্রয়োজনীয়তা বাস্তবায়ন করিঃ
এক্সচেঞ্জের এপিআই ডকুমেন্টেশন খুঁজুন এবং কে-লাইন ইন্টারফেসের বর্ণনা দেখুনঃ
https://huobiapi.github.io/docs/spot/v1/en/#get-klines-candles
পরামিতিঃ
নাম | প্রকার | এটা কি দরকার? | বর্ণনা | মূল্য |
---|---|---|---|---|
প্রতীক | স্ট্রিং | সত্য | ট্রেডিং জুটি | বিটিসিএসটি, ইথবিটিসি... |
সময়কাল | স্ট্রিং | সত্য | তথ্যের সময় গ্রানুলারিটি প্রদান করে, যা প্রতিটি k লাইনের সময় ব্যবধান | ১ মিনিট, ৫ মিনিট, ১৫ মিনিট, ৩০ মিনিট, ৬০ মিনিট, ১ দিন, ১ মাস, ১ সপ্তাহ, ১ বছর |
আকার | পূর্ণসংখ্যা | মিথ্যা | ডাটা লাইন সংখ্যা 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
৩০০, অর্থাৎ,records
কে লাইন ডাটা বার ৩০০।