Type/to search
8
Follow
1376
Followers
আপনাকে ধাপে ধাপে শেখান কিভাবে কে-লাইন সংশ্লেষণ ফাংশনের একটি পাইথন সংস্করণ লিখতে হয়
Original
Created 2019-12-21 09:38:26  Updated 2024-12-15 15:59:54
 4
 3391

img

আপনাকে ধাপে ধাপে শেখান কিভাবে কে-লাইন সংশ্লেষণ ফাংশনের একটি পাইথন সংস্করণ লিখতে হয়

কৌশলগুলি লেখার এবং ব্যবহার করার সময়, কিছু অস্বাভাবিক কে-লাইন চক্র ডেটা প্রায়শই ব্যবহার করা হয়। যাইহোক, এক্সচেঞ্জ এবং ডেটা উত্সগুলি এই চক্রগুলির জন্য ডেটা সরবরাহ করে না। সংশ্লেষণ শুধুমাত্র বিদ্যমান চক্র থেকে তথ্য ব্যবহার করে করা যেতে পারে. সংশ্লেষণ অ্যালগরিদমের ইতিমধ্যে একটি জাভাস্ক্রিপ্ট সংস্করণ রয়েছে (লিঙ্ক), আসলে, জাভাস্ক্রিপ্ট কোডের একটি অংশ পাইথন সংস্করণে প্রতিস্থাপন করা খুবই সহজ। এর পরে, আসুন কে-লাইন সংশ্লেষণ অ্যালগরিদমের একটি পাইথন সংস্করণ লিখি।

জাভাস্ক্রিপ্ট সংস্করণ

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()পাইথনে পোর্ট করার সময়, পাইথনে টাইম লাইব্রেরি ব্যবহার করুনn = time.altzoneপ্রতিস্থাপন অন্যান্য পার্থক্য শুধুমাত্র ভাষার সিনট্যাক্সে (যেমন লুপের ব্যবহার, বুলিয়ান মানের পার্থক্য, লজিক্যাল AND, লজিক্যাল নয়, লজিক্যাল OR, ইত্যাদির ব্যবহারে পার্থক্য)।

পোর্টেড পাইথন কোড:

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)

পরীক্ষা

হুওবি মার্কেট চার্ট
img

ব্যাকটেস্টিং সিন্থেটিক 4-ঘন্টা চার্ট
img

উপরের কোডটি শুধুমাত্র শেখার রেফারেন্স হিসেবে ব্যবহার করা হয়েছে। যদি কোন নির্দিষ্ট কৌশলে ব্যবহার করা হয়, তাহলে অনুগ্রহ করে আপনার প্রয়োজন অনুসারে এটি পরিবর্তন করুন এবং পরীক্ষা করুন।
আপনার যদি উন্নতির জন্য কোন বাগ বা পরামর্শ থাকে, দয়া করে একটি বার্তা দিন, আপনাকে অনেক ধন্যবাদ o^_^o

Related Recommendations
Comment
All comments (4)

    img 啊哈 ,梦梦老师技术比我高。截图给梦梦老师参考。

    7 years ago

    赞,我Python 不行,只是初学。

    7 years ago

    py 用resample函数 一行搞定了。

    7 years ago

    666 学习下。

    7 years ago
  • 1
Forums
PINE Language
Get the app
iPhone Download
© 2015 - ∞ INVENTOR PTE LTD (SG)