获取K线数据
引言
在开始编写我们的指标脚本或者策略脚本之前,我们首先要搞定一件事情,那就是正确的获取K线数据。
关于K线
K线,或者K棒,是蜡烛图(Candlestick Chart)的一种代称,最早由日本人发明。每个蜡烛图包含了一定时间段内的四个价格点,即开盘价、最高价、最低价和收盘价,我想大家应该非常熟悉了。根据这四个价格就可以计算出K线的实体部分,影线以及涨跌幅度。
关于K线的来历,比较符合逻辑的说法是它源于日语“罫線”(けいせん)中罫的读音”kei“。而“罫線”就是日本人对于蜡烛图的正式称呼,蜡烛图这个说法其实是美国人根据其形状重新命名的。
K线的表示方法
在Pine Script中,开盘价、最高价、最低价和收盘价分别用open, high, low, close来表示,它们是系统内置的变量。需要注意的是它们并不是某个数值,而是由很多个数值组合而成的序列。为了更好的理解这些与时间相关的序列数据,Pine Script引入了历史运算符”[]“,用它来表示任意一个时刻,也就是任意一根K线之前的历史数据。请注意,这是一个相对的概念,当我们从任意一根K线往后看时,都有着不同的历史数据。
举个例子,以图中绿色方框标记的这根K线为例。
我们把这根被绿色方框标记的K线数被记作0,那么这根K线的开盘价就是open[0],最高价是high[0],最低价是low[0],收盘价是close[0],默认情况下标记为0的K线是可以省略历史运算符的。那么这根K线的价格也可以写作open, high, low, close。往右开始往左数,分别是前1根K线,前2根K线到前n根K线。获取它们数值的方法就是open[n],high[n],low[n],close[n]。
如何定位初始K线
如何对K线进行定位呢?换句话说,我要怎么确认那一根是初始K线呢?答案是不需要。我们可以用下面这段代码来帮助理解。
//@version=5
indicator("我的脚本")
var table my_table = na
my_table := table.new(position.middle_left, 4, 2, bgcolor = color.gray, border_width = 1, border_color = color.red, frame_width = 1, frame_color = color.blue)
table.cell(my_table, 0, 0, text = 'open', text_color = color.white, text_size = size.large, width = 6, height = 20)
table.cell(my_table, 0, 1, text = str.tostring(math.round_to_mintick(open[0])), text_color = color.white, text_size = size.large, width = 6, height = 20)
table.cell(my_table, 1, 0, text = 'high', text_color = color.white, text_size = size.large, width = 6, height = 20)
table.cell(my_table, 1, 1, text = str.tostring(math.round_to_mintick(high[0])), text_color = color.white, text_size = size.large, width = 6, height = 20)
table.cell(my_table, 2, 0, text = 'low', text_color = color.white, text_size = size.large, width = 6, height = 20)
table.cell(my_table, 2, 1, text = str.tostring(math.round_to_mintick(low[0])), text_color = color.white, text_size = size.large, width = 6, height = 20)
table.cell(my_table, 3, 0, text = 'close', text_color = color.white, text_size = size.large, width = 6, height = 20)
table.cell(my_table, 3, 1, text = str.tostring(math.round_to_mintick(close[0])), text_color = color.white, text_size = size.large, width = 6, height = 20)
将这段代码添加到图表,它的效果是在副图表上创建一个表格。代码中的历史运算符是0,所以表格内显示的就是初始K线的数据,其中收盘价会随着当前价格的变化而变化,因为这根K线并没有完成。
将时间周期切换成1分钟,可以看到这个数据里面的数据永远都是最新一根K线的数据。假设我们连续观察10根K线,始初K线就会更改10次。如果我们指定脚本程序只在这10根K线中运行,初始K线就是一个相对概念,每根K线都会成为初始K线。
Pine Script是一个基于时间序列的框架,任何一段脚本的运行都有一个开始时间和结束时间。在这段期间内,每根K线上程序只会单独运行一次。程序在那根K线上执行,这根K线就是初始K线。此时我们执行历史运算符就能获取相对应的数据。这样做的好处是我们只需要关注K线价格之间的相对关系,时间的改变所带来的问题交给系统来处理就好了(本质上,它们是一个抽象出来的对象关系)。
价格比较
搞清楚基本逻辑之后,我们就可以使用关系运算符来处理不同的K线数据了。
- 判断当前K线是涨还是跌
//@version=5
indicator(title="Higher closes", overlay=true)
closeHigher = close > close[1]
bgcolor(closeHigher ? color.green : na)
当前K线收盘价如果大于前一根K线的收盘价,变量closeHigher的值则为真,反之则为假。我们可以使用函数bgcolor将这根K线的背景用绿色标示出来。
- 判断当前K线价格不变
//@version=5
indicator(title="Unchanged closes", overlay=true)
closeUnchanged = close == close[1]
bgcolor(closeUnchanged ? color.green : na)
”==“用于判断当前K线的收盘价是否等于前一根K线的收盘价。
- 判断当前K线是否创出前高
//@version=5
indicator(title="Higher high", overlay=true)
higherHigh = high > ta.highest(high[1], 5)
bgcolor(higherHigh ? color.green : na)
在这里,我们使用了ta.highest函数来判断前5根K线的最高价。由于是从high[1]开始的,所以不包括当前K线的最高价。假设当前最高价high > 之前5根K线的最高价,higherHigh的值则为真。然后会被bgcolor将这根K线标示出来。
- 判断当前K线是否创出前低
//@version=5
indicator(title="Lower low", overlay=true)
lowerLow = low < ta.lowest(low[1], 5)
bgcolor(lowerLow ? color.red : na)
和最高价一样,low[1]会过滤掉当前K线low[0],此时会被红色标记K线的背景色。
- 判断多根K线之前的关系
我们可以使用and运算符来判断多根K线之间的关系。
twoLowerCloses = close[1] < close[2] and close < close[1]
twoLowerCloses表示连续三根K线的收盘价之间的关系。当前K线的收盘价小于前一根K线的收盘价,并且前一根K线的收盘价小于第前两根K线的收盘价,此时twoLowerCloses的值为真,反之则为假。
lowerHigherClose = close[1] < close[2] and close > close[1]
lowerHigherClose表示当前K线的收盘价大于前一根K线,并且前一根K线的收盘价close[1]小于第前两根K线的收盘价close[2]。
upUpDownCloses = close[2] > close[3] and close[1] > close[2] and close < close[1]
and和and是可以累加的,它可以用来判断更多K线之间的关系。
- 得到实体部分的涨幅
rise = (close – close[1]) / close[1]
rise表示当前K线相对于前一根K线收盘价的涨幅
实时价格比较
在之前的表格程序中,当K线没有完成的时候,收盘价的价格会随着实时价格的跳动不断跳动。此时我们用close比较就有可能会得到不断变化的结果,最终的结果要到这根K线完成之后才能确定,解决的方法也很简单。
closeHigher = barstate.isconfirmed and close > close[1]
barstate.isconfirmed就是系统内置的专门用来判断K线是否完成的函数。但是假如你需要使用收盘价来判断是否止盈止损,这个时候你就要慎用这个函数,那样可能会错过平仓的时机。
总结
使用历史运算符”[]“可以获取任一时刻K线之前的历史数据。我们可以使用关系运算符对不同的K线价格进行判断,还可以结合比较条件,组合在一起之后形成相对复杂的规则用于判断市场行情走势。在特定情况下,为了确保K线已经完成,可以使用barstate.isconfirmed进行判断。
good!!!