প্রোগ্রামযুক্ত লেনদেনের কৌশল রচনা করার সময়, কে-লাইন ডেটা ব্যবহার করার জন্য প্রায়শই কিছু অ-স্ট্যান্ডার্ড চক্রের কে-লাইন ডেটা ব্যবহার করার প্রয়োজন হয়, যেমন 12 মিনিটের চক্রের কে-লাইন ডেটা, 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 এর ওপেন মূল্যঃ 11382.57 বন্ধের মূল্য হল শেষটি, যা 03:00 এ বন্ধের মূল্যঃ 11384.71 সর্বোচ্চ মূল্য এখানে সর্বোচ্চ মূল্য খুঁজুনঃ 11447.07 সর্বনিম্ন মূল্য এখানে সর্বনিম্ন মূল্য খুঁজুনঃ 11365.51 4 ঘন্টা চক্রের শুরু সময় 00:00 এই 1 ঘন্টা লাইন K এর শুরু সময় 2019.8.12 00:00 লেনদেনের পরিমাণ প্রতি এক ঘন্টার জন্য যোগ করা হয় (মূলত দামগুলি কীভাবে সংমিশ্রিত হয় তা পর্যবেক্ষণ করা হয়, যা লেনদেনের পরিমাণের তথ্যগুলিতে প্রদর্শিত হয় না) ।
এই চার ঘণ্টার একটি K-ক্লিনিকের সমন্বয় করা হয়েছেঃ উচ্চতাঃ ১১৪৪৭.০৭ খোলাঃ ১১৩৮২.৫৭ নিম্নঃ ১১৩৬৫.৫১ সংগ্রহঃ ১১৩৮৪.৭১ সময়ঃ ১৯.৮.১২ 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-রেখা সংমিশ্রণের জন্য দুটি জিনিস প্রয়োজন, প্রথমটি হ'ল কাঁচামালের ডেটা প্রয়োজন, যা ছোট চক্রের K-রেখা ডেটা, উদাহরণস্বরূপ।var r = exchange.GetRecords()
ক্ষুদ্র চক্রের কে-লাইন ডেটা সংগ্রহ করা হয়; দ্বিতীয়ত, এটি স্পষ্ট করা প্রয়োজন যে কে-লাইন ডেটা সংমিশ্রণের লক্ষ্য চক্রটি কত বড় চক্র হতে হবে।
তারপর GetNewCycleRecords ফাংশনের মাধ্যমে, আপনি শেষ পর্যন্ত একটি সংশ্লেষিত K-রেখাযুক্ত অ্যারে কাঠামোর ডেটা ফিরে পেতে পারেন।
এই ভিডিওতে, আপনি দেখতে পারেন যে,
১। লক্ষ্য চক্রটি আপনার GetNewCycleRecords ফাংশনকে ডাটা র্যাচ হিসাবে পাঠানো K স্ট্রিংয়ের চক্রের চেয়ে ছোট হতে পারে না। এটি একটি ছোট চক্রের সাথে ছোট চক্রের ডেটা সংমিশ্রণ করতে পারে না।
২, নির্ধারিত লক্ষ্য চক্র অবশ্যই চক্র বন্ধ হতে হবে।
চক্র বন্ধ কি?
সহজভাবে বলতে গেলে, লক্ষ্য চক্রের সময়সীমা এক ঘন্টার মধ্যে বা একদিনের মধ্যে একত্রিত হয়ে একটি বন্ধ চক্র গঠন করে।
উদাহরণঃ
উদাহরণস্বরূপ, একটি 12 মিনিটের চক্রের K-রেখা, যা প্রতি ঘন্টার 0 মিনিট 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 ~ 01:00:00
এই ভিডিওটি একটি সম্পূর্ণ ১ ঘণ্টার মত।
যদি ১৩ মিনিটের একটি চক্র হয়, যা একটি অনিবন্ধিত চক্র, তবে এই চক্রের গণনা করা ডেটা অনন্য নয়, কারণ সংশ্লেষিত ডেটার শুরুতে পার্থক্য রয়েছে এবং সংশ্লেষিত ডেটা আলাদা।
এই ভিডিওটি একটি ভিডিওতে দেখা যাচ্ছে।
তুলনা বিনিময় চার্ট
আমার বন্ধুরা প্রায়ই জিজ্ঞেস করে, আমি কি করতে পারি যদি আমি গড় রেখাটি গণনা করি যার মধ্যে প্রতিটি K-রেখার সর্বোচ্চ মূল্য আছে?
সাধারণত আমরা গড় রেখা গণনা করি যা গড় মূল্যের গড় মান, যা গড় রেখা গঠন করে, তবে কখনও কখনও সর্বোচ্চ মূল্য, সর্বনিম্ন মূল্য, খোলার মূল্য ইত্যাদি গণনা করার প্রয়োজন হয়।
এই সময়টাতে আপনি সরাসরি এটি করতে পারবেন না।exchange.GetRecords()
ফাংশন দ্বারা ফেরত দেওয়া K-রেখা তথ্য সরাসরি সূচক গণনা ফাংশনে পাঠানো হয়।
উদাহরণস্বরূপঃtalib.MAসমতল সূচক গণনা ফাংশন দুটি পরামিতি আছে, প্রথম পরামিতি তথ্য যা পাস করা প্রয়োজন হয়, এবং দ্বিতীয় পরামিতি সূচক চক্র পরামিতি হয়। উদাহরণস্বরূপ, আমরা নিচের চিত্রের মত একটি পরিমাপ করতে চাই।
K-রেখা চক্র 4 ঘন্টা। এক্সচেঞ্জ চার্টে, একটি গড় রেখা সেট করা আছে, যার গড় রেখা চক্রের পরামিতি 9। এবং সেট করা গণনা করা ডেটা উত্স প্রতি বার সর্বোচ্চ মূল্য।অর্থাৎ, এই গড় রেখাটি 9টি 4 ঘণ্টার চক্রের K-লাইন Bar এর সর্বোচ্চ মূল্যের গড় গণনা করা গড় মান, যা গঠিত সূচক গড় রেখা।
আমরা নিজেরাই একটি ডেটা গণনা তৈরি করি এবং দেখি যে এটি এক্সচেঞ্জের চার্টগুলির মতো গণনা করে কিনা।
var highs = []
for (var i = 0 ; i < r2.length ; i++) {
highs.push(r2[i].High)
}
যেহেতু প্রতি বারের সর্বোচ্চ মূল্যের গড় গণনা করা হয়, তাই গড় রেখা নির্দেশকটি পাওয়া যায়। তাহলে প্রথমে একটি অ্যারে তৈরি করতে হবে, যেখানে প্রতিটি ডেটা এলিমেন্টের সর্বোচ্চ মূল্য প্রতিটি Bar এর সাথে মিলে যায়। আপনি দেখতে পাচ্ছেন যে highs ভেরিয়েবলটি শুরুতে একটি ফাঁকা অ্যারে, এবং তারপর আমরা r2 এর K-লাইন ডেটা ভেরিয়েবলের মধ্য দিয়ে যাই ((r2 মনে নেই? উপরে 4 ঘন্টা K-লাইন গঠনের মূল ফাংশনের কোডটি দেখুন) ।) r2 এর প্রতি Bar এর সর্বোচ্চ মান (যেমন r2[i].High, i এর মানের পরিসীমা 0 থেকে r2.length - 1 পর্যন্ত) পড়া হয়, তারপর highs-এ ধাক্কা দেওয়া হয়। এটি একটি ডাটা স্ট্রাকচার তৈরি করে যা K-রেখা ডেটা Bar-এর সাথে একের পর এক সম্পর্কিত।
এই সময়ে 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") // 画出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
উপরের কোডটি নীতিমালায় পরীক্ষা চালানোর জন্য অনুলিপি করা যেতে পারে, মনে রাখবেন যে "রেখাচিত্রের শ্রেণীভান্ডার" টিক করুন এবং সংরক্ষণ করুন!
ইনভেন্টররা কোয়ালিফাইড ট্রেডিং প্ল্যাটফর্মের জন্য একটি ইন্টিফেস তৈরি করেছে, যা exchange.GetRecords ফাংশন, যা K-line ডেটা সংগ্রহ করে। নীচে মূলত এক্সচেঞ্জের সরাসরি অ্যাক্সেস করা K-লাইন ডেটা ইন্টারফেস থেকে ডেটা সংগ্রহ করা হয়, কারণ কখনও কখনও আরও K-লাইন, প্যাকেজযুক্ত GetRecords ইন্টারফেস পেতে প্যারামিটার নির্দিষ্ট করা প্রয়োজন। সাধারণত ১০০ টি কার্ড ফেরত দেয়। যদি কৌশলটির প্রাথমিকভাবে ১০০ টিরও বেশি কার্ডের প্রয়োজন হয় তবে অপেক্ষা করা প্রয়োজন। কৌশলটি যত তাড়াতাড়ি সম্ভব কার্যকর করার জন্য, আপনি নিজের একটি ফাংশনকে আবৃত করতে পারেন, সরাসরি এক্সচেঞ্জের কে-লাইন ইন্টারফেসে যেতে পারেন এবং আরও কে-লাইন ডেটা পেতে একটি প্যারামিটার নির্দিষ্ট করতে পারেন।
আমরা এই চাহিদা পূরণ করতে BTC_USDT ট্রেডিং জোড়া ব্যবহার করিঃ
এক্সচেঞ্জের এপিআই ডকুমেন্টেশন খুঁজুন এবং কে-লাইন ইন্টারফেসের বিবরণ দেখুনঃ
https://api.huobi.pro/market/history/kline?period=1day&size=200&symbol=btcusdt
প্যারামিটারঃ
প্যারামিটার নাম | প্রকার | দরকার আছে কি না | বর্ণনা | মান গ্রহণ |
---|---|---|---|---|
প্রতীক | স্ট্রিং | সত্য | লেনদেন | বিটিসিএসটি, ইথবিটিসি... |
সময়কাল | স্ট্রিং | সত্য | এটি ডেটা টাইম গ্রানাইট, অর্থাৎ প্রতিটি টুকরোর সময়সীমা ফেরত দেয়। | ১ মিনিট, ৫ মিনিট, ১৫ মিনিট, ৩০ মিনিট, ৬০ মিনিট, ১ দিন, ১ মাস, ১ সপ্তাহ, ১ বছর |
আকার | পূর্ণসংখ্যা | মিথ্যা | 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")
}
পাইথন সংস্করণ, টোকেন এক্সচেঞ্জ ইন্টারফেসের উদাহরণঃ
#!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画线类库
পাইথন সংস্করণ, বিএনএ এক্সচেঞ্জ অ্যাক্সেস করার জন্য কে-লাইন ইন্টারফেসের উদাহরণঃ
#!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, অর্থাৎ records K লাইন ডেটা বারের সংখ্যা 300।
বামম্যানআপনি কি এই সমস্যার সমাধান করতে পারবেন? আপনি 3 ঘন্টা বা 6 ঘন্টা k দিন গঠিত করতে পারবেন না।
বামম্যানif (((1000 * 60 * 60 * 24) - sourceRecords[i].Time % (1000 * 60 * 60 * 24) + (n * 1000 * 60)) % targetCycle == 0) { isBegin = সত্য } এই বাক্যটির সমস্যা হচ্ছে, আপনি 3 ঘন্টা বা 6 ঘন্টা k-কে সংযুক্ত করতে পারবেন না, আপনি কেবল 1 ঘন্টা, 2 ঘন্টা, 4 ঘন্টা k-কে সংযুক্ত করতে পারবেন।
xis2004যদি আপনি একটি প্রজাতির সমস্ত ঐতিহাসিক ডেটা ক্রল করতে চান, তাহলে কি আপনি তাও করতে পারবেন?
উইলঝ্যাংধন্যবাদ।
উইলঝ্যাংদয়া করে, যদি আপনি 300 বিট চেয়ে বেশি চান, তাহলে কীভাবে এটি পরিচালনা করবেন? উদাহরণস্বরূপ, 1000 কে-লাইন ডেটা।
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নভাল, সময় বের করে পরিবর্তন করুন।
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নএটি এক্সচেঞ্জ ইন্টারফেসের ডেটা অ্যাক্সেস করার জন্য, এক্সচেঞ্জ আপনাকে কত ডেটা দেয় তা বোঝায়। অর্থাৎ সর্বশেষ কয়েকশো বার।
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নযদি এক্সচেঞ্জ ইন্টারফেসের সমর্থিত সর্বাধিক রিটার্নের সংখ্যা অতিক্রম করা হয়, তবে এটি কেবলমাত্র পর্যাপ্ত K-লাইন ডেটা সংগ্রহ করতে পারে।