在FMZ上聽“一根k線的故事”
k線我們天天都在用,不管是分鐘k線,日k線,月k線還是年k線,可以你知道一根k線是怎樣形成的嗎?
一根k線的數(shù)據(jù)結(jié)構是這樣的,它包含一個時間戳,代表k線起始的時間,開盤價,最高價,最低價,收盤價和成交量,我們都很熟悉:
但是,原始的k線是不存在的,每一根k線都是由tick數(shù)據(jù)合成的。
K線是通過將tick數(shù)據(jù)按照一定的時間間隔進行合并而生成的。一種常見的方法來合成K線是這樣的:
確定K線的時間間隔:首先,你需要確定每個K線的時間間隔,例如1分鐘、5分鐘、15分鐘等。這個時間間隔決定了每個K線的時間范圍。
收集tick數(shù)據(jù):從交易所獲取到的tick數(shù)據(jù)包含了每一筆交易的價格、成交量和時間戳等信息。你需要收集足夠多的tick數(shù)據(jù)來生成K線。
分組tick數(shù)據(jù):將收集到的tick數(shù)據(jù)按照時間間隔進行分組。對于每個時間間隔,你需要將對應時間范圍內(nèi)的tick數(shù)據(jù)進行分組。
計算K線數(shù)據(jù):對于每個時間間隔的tick數(shù)據(jù)分組,你可以根據(jù)需要計算K線的開盤價、最高價、最低價、收盤價和成交量等數(shù)據(jù)。常見的計算方法包括:
開盤價:取該時間間隔內(nèi)的第一筆交易的價格作為開盤價。
最高價:取該時間間隔內(nèi)的所有交易的最高價格。
最低價:取該時間間隔內(nèi)的所有交易的最低價格。
收盤價:取該時間間隔內(nèi)的最后一筆交易的價格作為收盤價。
成交量:累加該時間間隔內(nèi)的所有交易的成交量。
生成K線:根據(jù)計算得到的K線數(shù)據(jù),你可以生成相應的K線。每個K線包含了開盤價、最高價、最低價、收盤價和成交量等信息。
需要注意的是,K線的合成方法可能因交易所和數(shù)據(jù)源而異。有些交易所可能提供直接的K線數(shù)據(jù),而無需手動合成。此外,還有其他的K線合成方法,例如基于成交量、價格范圍等的合成方法。具體的合成方法取決于你的需求和數(shù)據(jù)源的特點。
那么你現(xiàn)在知道k線是怎么合成出來了,可是你知道怎么畫一根k線嗎?
前面的圖表設置我們不必于太過于關心,這里我們需要關注的是k線的數(shù)據(jù)是怎樣添加的,讓我們回到交易所接口返回的k線數(shù)據(jù):
我們設置的周期為1分鐘,有沒有感到一點奇怪,為什么最后一根k線的數(shù)據(jù)不是固定的呢,可以看到時間是一樣的,除了開盤價,其他值一直在變動:

只有到了新的時間段(Time),倒數(shù)第二個數(shù)據(jù)才算固定下來。OHLC和成交量都固定下來。

這是因為k線是被合成出來的,當最新的k線周期沒有完成的時候,最后一根k線不是固定的,如果這里你理解了,你就可以明白了k線的數(shù)據(jù)是怎樣添加的了。
循環(huán)語句 for (var j = 0; j < r.length; j++) 遍歷了 r 數(shù)組中的所有元素,該數(shù)組包含了當前品種最新的 K 線數(shù)據(jù)。通過遍歷 r 數(shù)組并將每個元素添加到當前品種對應的系列中,實現(xiàn)了將最新的 K 線數(shù)據(jù)添加到圖表中并刷新的效果。在每次添加完數(shù)據(jù)之后,通過更新 arrLastTime 數(shù)組來記錄最新的時間戳,并用于判斷下一次是否需要添加/更新數(shù)據(jù)。
這里的數(shù)據(jù)添加和更新很有意思,如果上一根k線已經(jīng)走完,就是新的時間戳大于上一個周期的時間戳,表示新的k線已經(jīng)產(chǎn)生,這時候就要增加最新的數(shù)據(jù)。
而如果此時的k線周期還沒有完成,最新的k線數(shù)據(jù)還沒有固定,這時候就要不斷的更新最新的k線數(shù)據(jù),add函數(shù)里最后使用-1進行k線數(shù)據(jù)的更新。
綜上,這個 for 循環(huán)共同實現(xiàn)了將最新的 K 線數(shù)據(jù)添加到對應的系列中,用于刷新圖表并展示最新的數(shù)據(jù)。
這就是一根k線的故事,希望大家有所收獲。