对股票或加密货币市场感兴趣的任何人都已经看到了这些附加条款。 您可能听过经验丰富的交易员的意见,认为它们不起作用以及如何不使用任何东西。 但是它们给了我们很大的帮助,我每天懒洋洋地看一下我的交易终端,看起来就像下面的图片。
它们的排列方式如何? 对谁有用? 在以下情况下,您绝对应该对此熟悉:
- 您在交易中使用它们
- 您打算写一个交易机器人吗
- 您想自己实施交易策略吗

技术指标通常是价格和交易量的窗口,重量或重复函数,以TOHLCV蜡烛阵列(统一时间,开盘价,高价,低价,收盘价,成交量)的格式来自交易所。 各种滤波,最大最小值或其他指标也可以用作后续计算的基础。
移动平均线(SMA)实施指标时,使用功能编程方法非常方便。 例如,移动平均线,它只是收盘价时移动窗口函数的每个值的平均值
function sma($close, window) { return rolling(x => mean(x), window, $close); }
其中mean()函数是平均值,window参数是窗口大小,而rolling()是窗口函数的组合,该函数为数组中的每个当前单元格生成最后n个元素的数组,以及将窗口最小化为一个数字的操作。
function rolling(operation, window, array) { let result = []; for (let i = 0; i < array.length; i++) { if (i + 1 < window) { result.push(NaN); } else { result.push(operation(array.slice(i + 1 - window, i + 1))); } } return result; }
移动平均线是一个滞后指标,有助于确定趋势。 它绘制在价格图表的顶部,通常通常会丢弃第一个值。

通常,考虑一对指示器,将具有短窗口的指示器与具有长窗口的指示器相交的点视为从下方的潜在入口点和从上方的出口点。 在实践中,更经常使用指数加权移动平均值,它使用加权窗口函数来减少延迟效果。
标准偏差(STDEV)如果我们用方差sd()的根替换以前版本中的均值()函数,那么我们将得到一个移动的标准偏差。
function stdev($close, window) { return rolling(x => sd(x), window, $close); }
色散被认为是按通常的方式进行的,大多数情况下未经贝塞尔校正。 由于方差本身是以平方卢布/美元衡量的,因此也使用了方差的根。
布林带(BB)因此,我们已经收到了两个基本指标,可以将它们组合起来并获得新的指标。 例如,如果我们逐点添加移动平均值和标准偏差,然后乘以2,我们将获得布林带的上半部分,如果减去下半部分。

在代码中,它看起来像这样
function bb($close, window, mult) { let middle = sma($close, window); let upper = pointwise((a, b) => a + b * mult, middle, stdev($close, window)); let lower = pointwise((a, b) => a - b * mult, middle, stdev($close, window)); return { lower : lower, upper : upper}; }
其中逐点函数不执行任何其他操作,而是使用给定的操作从两个数组中收集一个元素。
布林线可以帮助确定价格大幅度波动之前的平静,并用作方便地在图表上显示波动率的工具;标准差不能在价格上叠加显示在一张图表上,因此可以方便地将其从移动平均线推迟。
注意事项该指标有一个缺点-它使用指数加权函数。 作为练习,您可以尝试自己进行转换,不要忘记考虑标准偏差也需要进行指数平衡计算。
指数加权移动平均线(EMA)如何减少移动平均滞后? 由于计算时会累加n个最近的收盘价,因此可以理解,可以加一些权重,从而减少旧价格的贡献。 因此,我们得出了加权窗口函数的公式。
如果
并选择某种常数
如果价格小于1,那么我们得到的权重将无限减小,如果同时将最新价格相加。

如果不考虑
尾部贡献,则可以大大简化计算。 通过将窗口大小扩展到全长,可以获得递归定义。
结果,我们需要选择一些价值
作为平滑常数。
可以证明 ,如果你采取
上面的EMA和SMA权重的质心相同。 在代码中,这看起来容易得多。
function ema($close, window, weight = null) { weight = weight ? weight : 2 / (window + 1); let ema = [ mean($close.slice(0, window)) ]; for (let i = 1; i < $close.length; i++) { ema.push($close[i] * weight + ema[i - 1] * (1 - weight)); }; return ema; }
通常,这是相同的移动平均线,但更为敏感。

使用效率取决于您的经验和使用的设置。 例如,在
此站点上,可以很好地选择参数。
移动平均收敛/发散(MACD)1979年,杰拉尔德·阿佩尔(Gerald Appel)提出了价格最简单,同时又有效的指标之一。 它将两个EMA趋势指标转换为一个时刻指标,从两个世界中获取最佳收益。 也就是说,从粗略来讲,他找到了一个导数。 它是在一个单独的窗口中绘制的,该窗口具有两条线和一个直方图,并且没有覆盖,就像以前的那样。 实际上,在单独的窗口中绘制了更多的指示符,但这可能是大约其他时间。

计算公式非常简单,取两个带有短窗口和短窗口的ema,例如26和12个单位,然后减去,结果行将是所需的指标。 从这个差异中以3个单位的步长得出另一个ema,我们获得了一条信号线。 Gerald之后添加的直方图由两个先前结果之间的差计算得出,本质上是加权平均导数。
function macd($close, wshort, wlong, wsig) { let line = pointwise((a, b) => a - b, ema($close, wshort), ema($close, wlong)); let signal = ema(line, wsig); let hist = pointwise((a, b) => a - b, line, signal); return { line : line, signal : signal, hist : hist }; }
指标测试,标准化标准误差有了具有指标含义的准确表格,您可以定性地测试您的计算。 有两种方法可以确定两个函数之间的误差,但是实践表明,归一化的均方误差被认为是
不论大小,效果最佳。 例如,以美元为单位的比特币可能要花费20,000美元,而10美元的差额并不是至关重要的,同时,可以在数个聪中计算一个山寨币。
function nrmse(f, g) { let sqrDiff = pointwise((a, b) => (a - b) * (a - b), f, g); return Math.sqrt(mean(sqrDiff)) / (Math.max(...f) - Math.min(...f)); }
结论因此,您可以在几行中表达基本指标,如果您打算通过机器学习进行分析,然后确定理想的切入点,我建议您注意ZigZag指标,该指标对交易没有用,但对老师而言非常有用。 还应该记住,进行交易时,您需要选择最不同的指标并尝试更改其输入参数。 您可以尝试随时间自动更改它们,因为最有效的参数往往会更改。
使用的来源1.
StockCharts-表中包含验证数据的算法列表
2.
Cryptowatch-调整良好的指标参数
3.
Github-源代码