নীতিগুলি লেখার সময় প্রায়শই কিছু অস্বাভাবিক কে-লাইন চক্রের ডেটা ব্যবহার করা হয়; তবে এক্সচেঞ্জ এবং ডেটা উত্সগুলি এই চক্রগুলির ডেটা সরবরাহ করে না; কেবলমাত্র ইতিমধ্যে চক্রযুক্ত ডেটা ব্যবহার করে সংশ্লেষণ করা যায়। সংশ্লেষণ অ্যালগরিদম ইতিমধ্যে একটি জাভাস্ক্রিপ্ট সংস্করণ রয়েছে।লিঙ্ক), আসলে জাভাস্ক্রিপ্ট কোডের একটি অংশকে পাইথন সংস্করণে পোর্ট করা সহজ। এরপরে আমরা পাইথন সংস্করণে একটি কে-লাইন সংশ্লেষণ অ্যালগরিদম লিখেছি।
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
}
জাভাস্ক্রিপ্ট অ্যালগরিদম আছে, যা পাইথনের জন্য লাইন-বাই-লাইন অনুবাদ পোর্ট করতে পারে, জাভাস্ক্রিপ্টের অন্তর্নির্মিত ফাংশন বা অন্তর্নির্মিত পদ্ধতির সাথে দেখা করতে পারে, যা পাইথনে সংশ্লিষ্ট অনুসন্ধানের জন্য সংশ্লিষ্ট হয়, তাই পোর্ট করা তুলনামূলকভাবে সহজ।
অ্যালগরিদম লজিক সম্পূর্ণ একই, শুধু জাভাস্ক্রিপ্ট ফাংশন কলvar n = d.getTimezoneOffset()
Python এর Time Repository-এ থাকা ফাইলগুলোতে,n = time.altzone
পরিবর্তে; অন্যান্য পার্থক্য শুধুমাত্র ভাষার ব্যাকরণগত দিক ((যেমন ফর লুপের ব্যবহার, বুল মানের পার্থক্য, লজিক এবং, লজিক না, লজিক বা এর ব্যবহারের পার্থক্য ইত্যাদি...) ।) ।
import time
def GetNewCycleRecords(sourceRecords, targetCycle):
ret = []
# 首先获取源K线数据的周期
if not sourceRecords or len(sourceRecords) < 2 :
return None
sourceLen = len(sourceRecords)
sourceCycle = sourceRecords[-1]["Time"] - sourceRecords[-2]["Time"]
if targetCycle % sourceCycle != 0 :
Log("targetCycle:", targetCycle)
Log("sourceCycle:", sourceCycle)
raise "targetCycle is not an integral multiple of sourceCycle."
if (1000 * 60 * 60) % targetCycle != 0 and (1000 * 60 * 60 * 24) % targetCycle != 0 :
Log("targetCycle:", targetCycle)
Log("sourceCycle:", sourceCycle)
Log((1000 * 60 * 60) % targetCycle, (1000 * 60 * 60 * 24) % targetCycle)
raise "targetCycle cannot complete the cycle."
multiple = targetCycle / sourceCycle
isBegin = False
count = 0
barHigh = 0
barLow = 0
barOpen = 0
barClose = 0
barTime = 0
barVol = 0
for i in range(sourceLen) :
# 获取时区偏移数值
n = time.altzone
if ((1000 * 60 * 60 * 24) - (sourceRecords[i]["Time"] * 1000) % (1000 * 60 * 60 * 24) + (n * 1000)) % targetCycle == 0 :
isBegin = True
if isBegin :
if count == 0 :
barHigh = sourceRecords[i]["High"]
barLow = sourceRecords[i]["Low"]
barOpen = sourceRecords[i]["Open"]
barClose = sourceRecords[i]["Close"]
barTime = sourceRecords[i]["Time"]
barVol = sourceRecords[i]["Volume"]
count += 1
elif count < multiple :
barHigh = max(barHigh, sourceRecords[i]["High"])
barLow = min(barLow, sourceRecords[i]["Low"])
barClose = sourceRecords[i]["Close"]
barVol += sourceRecords[i]["Volume"]
count += 1
if count == multiple or i == sourceLen - 1 :
ret.append({
"High" : barHigh,
"Low" : barLow,
"Open" : barOpen,
"Close" : barClose,
"Time" : barTime,
"Volume" : barVol,
})
count = 0
return ret
# 测试
def main():
while True:
r = exchange.GetRecords()
r2 = GetNewCycleRecords(r, 1000 * 60 * 60 * 4)
ext.PlotRecords(r2, "r2")
Sleep(1000)
মুদ্রা বাজারের চার্ট
চার ঘণ্টার চার্ট পুনরায় পরীক্ষা করুন
উপরের কোডটি কেবলমাত্র শিক্ষার রেফারেন্স হিসাবে ব্যবহৃত হয়, যদি এটি নির্দিষ্ট কৌশলগুলিতে ব্যবহৃত হয় তবে প্রয়োজন অনুসারে সংশোধন বা পরীক্ষা করুন। যদি কোন বাগ বা উন্নতির পরামর্শ থাকে, তাহলে মন্তব্য করতে স্বাগতম, অনেক ধন্যবাদ o^_^o
উপদেশ/upload/asset/30da6ebb64b8003b1686.jpg আহা, ড্রিম ড্রিম টিচার আমার চেয়ে বেশি টেকনিক্যাল। স্ক্রিনশটটি ড্রিম ড্রিম টিচারকে রেফারেন্স দিন।
উপদেশpyresample ফাংশন দিয়ে একটি লাইন তৈরি করা হয়েছে।
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নজং, আমি পাইথন জানি না, আমি কেবল শিক্ষানবিস।
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্ন৬৬৬ শিখছি।