图片缩略图

技术指标

version 1.4.0.0 (10.8 KB) by 内特·詹森
一个单一的功能,可以计算27个不同的技术指标
4.5
23日评级

31下载

更新2013年5月24日

视图版本历史

查看许可证

indicator是一个技术分析工具,用于计算各种技术指标。技术分析是基于对过去价格走势的考察对未来金融价格走势的预测。大多数技术指标需要至少一个变量参数。如果没有提供这些参数,则使用默认值。

包括的指标有:

动力:
商品频道指数
变动率
相对强度指数
快速随机振荡器
慢随机振荡器
KDJ指标
威廉R %
Aroon
真正的力量指数
趋势:
简单移动平均
指数移动平均线
移动平均收敛发散
Wildmer DMI (ADX)
T3
卷:
地卷
查金资金流量
力指数
货币流量指数
波动性:
波林格区间
凯尔特纳渠道
平均正确范围
波动率
最高的高,最低的低
其他:
锯齿形
价格比较
轴心点系统
停车倒车

版本:1.1.3 (05/24/2013)
作者:Nate Jensen
创建日期:2011年10月10日
历史:
2011年10月25日v1.0: 21个指标的首次发布
- v1.1 03/04/2012: 23个指标,固定日期转换问题
—v1.1.1 03/25/2012: 24个指示灯
- v1.1.2 03/21/2013: 25个指标
v1.1.3 05/24/2013: 27个指示器,bug修复

引用作为

内特·詹森(2021)。技术指标(//www.tatmou.com/matlabcentral/fileexchange/33430-technical-indicators), MATLAB中央文件交换。检索.

意见及评分(62)

斯楠伊斯兰教

劳塔罗Parada

梁马

丹尼尔塔

你的包装太棒了
但我需要帮助找到常规背离价格和Macd指标
你能帮我吗?

nirav迪亚

“没有足够的输入参数。

指示器错误(第173行)
observ=尺寸(vin,1,varagin);”

如何使用它?

前街盛食物

大家好,我在使用代码的时候发现了一些问题。

当我尝试在Matlab中运行代码时,它显示了这一点
“没有足够的输入参数。

指示器错误(第173行)
observ=尺寸(vin,1,varagin);”

我该怎么做才能改正这个问题?谢谢!

卡斯帕Walhout

在你的RSI计算中有一个bug(类似于在默认的Matlab函数中,你似乎已经用作这个函数的基础)。

相对强弱指数应以相对强弱指数以前的值为基础,而不仅仅是股票的价格(http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:relative_strength_index_rsi).为了解决这个问题,for循环应该被替换为:

For i1 = period:size(diffdata, 1)
如果i1 == period
%收益/损失
totalGain = sum(advances((i1 - (period-1)):i1));
Totaloss=总和(减少((i1-(第1期)):i1));
其他的
%收益/损失基于以前的值
totalGain = (totalGainPrev*(period-1) + advances(i1))/period;
totaloss=(totalossprev*(第1期)+下跌(第1期))/期间;
结束
%计算肢体重复性劳损症
rs=总增益。/totaloss;
trsi(i1)=100-(100/(1+rs));

totalGainPrev = totalGain;
totalLossPrev = totalLoss;
结束

Krzysztof Fajst

你好,

我相信有一个小虫在慈
子程序,即一些第一个单词可以是nan。所以我添加了这一行来删除它。

Krzysztof

真强度指数
tsi = 100 * ema2. / ema4;
——> new line tsi(isnan(tsi))=100;

尤纳

在adx中,它有一个错误:
adx(2 *期)=总和(dmx(期+ 1:2 *期))/ (2 * period-period-1);

它需要是一个平均值,然后除以N-1,而不是n,所以最后可以换成均值或者去掉-1。

注:一些站点计算adx开关ema,而非开关平滑ma。

这种Cihan

你能检查一下SAR的计算结果吗?这似乎和转移瘤有不同的结果。

内特·詹森

来自,

谢谢你!

这是正确的,该函数适用于(1)一次库存。我会调查一下,看看我能得出什么结论,但不能保证。

目前,您可以通过使用For循环来解决这个问题。我知道,这不是最快的办法,但确实有效。

瓦姆西

你好,

感谢大家为这些指标付出的努力,期待更多!

刚刚对指示器有个疑问。如果我正确地阅读了函数-它们只适合一个列或一个股票?

需要添加的一个强大功能是输入一个完整的列导向矩阵,比如说所有标准普尔500指数股票。

让我知道你的想法。

干杯

尤纳

谢你

内特·詹森

Fuad,

没有问题。我很高兴我的代码对你有用。

我做的事。请查看我的其他提交到交易所,在这里:
//www.tatmou.com/matlabcentral/fileexchange/32992-figure-pixel-resize-function

内特

Fuad

嗨,内特,谢谢分享。

在预览图像中显示的图表有代码吗?如果能像你一样在我的图表底部画出指示器,那就太好了……

非常感谢,

Fuad

内特·詹森

让我查一下哈,看看能帮上什么忙。

谢谢你的评分!

雷李

你好,Nate,你能把自适应移动平均(例如Kaufman, fractral, Jurik)和Andrew’s Pitchfork添加到这个函数中吗?

内特·詹森

珍,

你能换个说法吗?我不太明白你的意思。

你好,

请问你知道如何计算这些规则的收益吗?

谢谢

内特·詹森

乔治,

你应该这样格式化你的代码,

输出电压=指标(嗨,瞧,cl, kdj, k, d)

在那里,

Vout =输出向量
嗨=高价
低价
收盘价
k = % k的周期数
d = % d的周期数

为了提取fpctk, fpctd和jline,请使用以下代码:

fpctk =输出电压(:1);
fpctd =输出电压(:,2);
jline =输出电压(:3);

请注意:
1.所有输入必须垂直定向
2.所有输出都是垂直方向返回的
3.此代码旨在用于数百或数千个数据点。通常你不能对一个单点使用任何这些函数。对于每个hi、lo和cl输入,这个函数至少需要比k或d输入的最大值多1个数据点。

HTH,
内特

内特·詹森

谢谢你的反馈,Alejandro!我很高兴你一切顺利。

目前,我没有访问Matlab来进行这个更改,但一旦我做了,我会添加您的建议。

乔治徐

内特:

如何在KDJ上使用代码?请

比如说,我有滴答数据(滴答[30000]),并且喜欢KDJ(9,2,3)。谢谢,

我试过了,但出错了。

______________________________
>> [fpctk,fpctd,jline] =指标([2500,2490,2495],'kdj',9,2);
???使用==>指示器时出错
输出参数太多。

亚历杭德罗Leija

内特,我非常感谢你分享你的代码因为它很好用,节省了我很多时间。

我一直在处理这些指标,发现你的肢体重复性劳损症之间的差异计算和另一个非常受欢迎的版本(用于平台如MT4),第二个和后续totalGain / totalLoss值取决于其先前的值提供一个平滑的结果类似,在指数移动平均线。这里有详细的解释:http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:relative_strength_index_rsi

以下对代码的修改提供了平滑的RSI:

计算非nan收盘价格的相对强弱指数。忽略第一non-nan
%vin b/c它是一个参考点。考虑任何主要的NAN
%可能存在于vin向量中。
tsi = nan(size(diffdata, 1)-numLeadNans, 1); / /数据
%预分配总增益和总损耗使用'trsi'大小作为参考。
totalGain = 0(大小(trsi, 1), 1);
totalLoss = 0(大小(trsi, 1), 1);
%第一个值与其他值不同
totalGain(时期)=总和(进步(1:周期))/时期;
totalLoss(时期)=总和(下降(1:时间))/时期;
%随后的总增益/损失值
对于i1=周期+1:大小(trsi,1)
totalGain (i1) = (totalGain (i1-1) *(1) +进步(i1)) /时期;
totalLoss (i1) = (totalLoss (i1-1) *(1) +下降(i1)) /时期;
结束
计算RS和RSI
rs=总增益。/totaloss;
For i2 = period:size(trsi,1)
trsi(i2)=100-(100/(1+rs(i2));
结束

一个改进可以是在公式中添加一个“方法选项”,从两个版本的RSI中选择一个;一种是原始的RSI版本另一种是平滑的RSI版本。

Ruilong

内特-我想感谢你分享你的交易基础技术指标的收集。
但是指标(价格、't3',周期、volfact)的结果与在TA库中使用相同函数得到的结果不同。

莱昂纳多Hermoso

这是我用的另一个

函数[velocidade]=velocidade(价格、管道大小、周期)
%这个指标计算价格速度。我是根据
%pyshics公式速度v = v0 +at
%pipsize用于外汇或变化很小的数据,如0.001
%,在这种情况下,您应该使用0.001作为pipsize。
velocidade =(((2。*(价格-[0(期间,1),价格(1:尺寸(价格,1)时期,:))))/时期。^ 2)。/ pipSize)。*时期;

结束

内特·詹森

列奥纳多没有问题。我很高兴您能够很好地使用我的代码,感谢您的分享,您的辛勤工作。

莱昂纳多Hermoso

莱昂纳多Hermoso

内特,非常感谢你。

我在这里使用另一个指标,即斐波那契带,我使用您的工作在matlab中开发这个指标,下面是代码。

再次谢谢大家

function [upperband1,upperband2,upperband3,upperband4,lowerband1,lowerband2,lowerband3,lowerband4] = fibo(high,low,close,periodsEma,periodsAtr)输出说明
%这将使用Atr(真实平均值)计算fibonacciBands
%范围)。
%的指标
教育津贴=指标(关闭、ema的periodsEma);
atr =指标(高、低,关闭,atr, periodsAtr);

上攻= ema + atr.*1.62;
= ema + atr.* 0.99;
= ema + atr.*4.62;
上频带4=ema+atr;
= ema - atr.*1.62;
= ema - atr.*2.62;
= ema - atr.*4.62;
= ema - atr;
结束

内特·詹森

嗨,马克,

谢谢你的分享。非常感谢您的努力,我希望其他人会发现您的工作有帮助。

内特

马克

内特-我想感谢你分享你的交易基础技术指标的收集。

我想与您和您的追随者分享类似的工作,希望有些人可能会发现它的赞美和有用。因为它不是一个文件提交直接到Mathworks,我真的不能创建我自己的线程。

我为函数的开源TAL库创建了一个C++ MeX的可包装器。

可在的存储库中找到http://www.openAlgo.org

内特,
非常感谢。

内特·詹森

问题已经修复,更新应该很快就会出现。我还添加了两个指标。

这个例子应该是:
加载一个.mat
输出电压=指标([dis_HIGH、dis_LOW dis_CLOSE],“fsto”,14日,3);
fpctk =输出电压(:1);
fpctd =输出电压(:,2);
阴谋(1:长度(fpctk) fpctk, ' b ', 1:长度(fpctd) fpctd, ' g ')
标题:迪士尼的快速随机分析

FSTO和SSTO函数也有错误。

内特·詹森

荷西,

谢谢你指出这个问题!我今晚会上传一个补丁。

我为这个错误感到抱歉。

内特

我不明白发生了什么。我在用你的例子!!!

加载一个.mat
[fpctk,fpctd]=指示器([dis_高,dis_低,dis_闭],'fsto',14,3)

错误使用指标
输出参数太多。

内特·詹森

哈,

我刚刚根据要求添加了KDJ指标。它应该很快就会出现,这取决于Matlab批准我的提交所需的时间。

这个指标有点让人困惑。我不确定哪个方法是正确的,所以我输入了三个不同的方法。只需取消您希望使用的任何方法的注释。

方法# 1:
J=3*FastK-2*FastD;

方法# 2:
J=ema(K,周期);

方法# 3:
J = 3*SlowK - 2*SlowD;

希望会有帮助!

内特

雷李

你能把KDJ添加到下一个版本吗?

内特·詹森

谢谢李陆!

我将尝试使用mex函数,但不幸的是,我对它们没有很多经验,所以不能保证。

我同意你的观点,这个函数作为优化器是很慢的。我建议把你感兴趣的各个指标都拿出来,把它们变成它们自己的功能。然后尝试优化这些语句,这样你就不会陷入“Switch”语句的困境。

李陆

出色的工作!
我想用它来做优化,但是有点慢。
如果它能进入mex功能,那就太棒了,这样速度会快得多。

内特·詹森

随时都可以!再次感谢。

附庸风雅的

非常有效。谢谢。

内特·詹森

如果你看第680行,
ema6 =[南(5 *时期1,1);ema (ema5 (~ isnan (ema5)),期间,observ-5 *期+ 1)];
请注意,ema6的输入向量大小必须至少为“5*period-1”。在您的情况下,输入的周期为20,因此,输入向量大小至少需要5*20-1(或99)。请增大输入向量的大小,或减小周期。
谢谢你的夸奖!

是的,在我的代码中有很多这样的计算你可以用一种或另一种方法来计算ema或者用sma / ema。这只是个人意见的问题。谢谢你的评价!

彼得

注意到随机延迟是用EMA计算的,我的TA程序是用SMA计算的,所以有一点差异。

附庸风雅的

嗨,Nate,我试过t3指示灯,收到一条错误消息:

>> t3 =指标(A, 't3', 20, 0.7);
???使用==> plus时出错
矩阵维数必须一致。

错误在==>指标在689
t3 = c1 * ema6 + c2 * ema5 + c3 * ema4 + c4 * ema3;

你知道问题出在哪里吗?我知道Matlab,所以很难破译代码。SMA和其他东西都很好用。为努力工作干杯。

内特·詹森

抱歉耽误了,我终于添加了真实力指数。工作已经疯狂的忙碌,不幸的是,这被移到了优先级列表的下面。

我想指出的是,我在tsi中包含了两种计算ema的方法。第一种方法与Mike的方法非常相似,是基于维基百科对ema的解释。第二种方法是基于Matlab对ema的解释。要选择其中一个或另一个,只需注释您不希望使用的方法。默认方法基于维基百科。

内特·詹森

再次感谢迈克!

我将在本周末查看您的代码,希望在周日之前完成一些工作。

迈克

内特,
我有一些时间,所以我编写了真实强度指数(TSI)。可能不是最有效的代码,我不知道它是否正确地处理NaN,但基本上它适用于您的程序。我迅速检查了输出结果,它看起来是正确的。这里是:

tsi -真强度指数
%tsi=指示器(cl、‘tsi’、快、慢)

case 'tsi' %真强度指数
%的输入数据
近= vin (: 1);

变量参数输入
如果isempty(变长度输入宗量)
fast=3;
慢=14;
其他的
快=变长度输入宗量{1};
slow=varargin{2};
结束

动量= [0;(关闭(2:结束,1))-关闭(1:end-1, 1)];

slowEma = 0;
fastAbsEma = 0;
fastEma = 0;
slowAbsEma = 0;
输出电压= 0;

For I = uint16([2:size(动量,1)])
slowEma(1) =(动量(我,1)。*(2.0 /(1 +慢))+(1 -(2.0 /(1 +慢)))。* slowEma(1张));
fastEma(i,1)=(slowEma(i,1)。*(2.0./(1+fast))+(1-(2.0./(1+fast))).*fastEma(i-1,1));
slowAbsEma (1) = (abs(动量(我,1))。*(2.0 /(1 +慢))+(1 -(2.0 /(1 +慢)))。* slowAbsEma(1张));
fastAbsEma(我,1)= (slowAbsEma(我,1)。*(2.0 /(1 +快速))+(1 -(2.0 /(1 +快速)))。* fastAbsEma(1张));

if(fastAbsEma(i,1)==0)
vout(i,1)=0;
其他的
vout(i,1) = 100 .* fastEma(i,1) ./ fastAbsEma(i,1);
结束
结束

内特·詹森

谢谢你迈克!

我可以把它放进去。

迈克

哦,我看到你加了这些:
mfi -资金流动指数
atr -平均真实范围

太好了!谢谢你!

是否有编制真实实力指数(TSI)的计划?

迈克

内特·詹森

问题已经解决,新文件很快就会出现。

我决定使用Matlab的datvecmx函数来计算年、月和日,而不是试图自己计算出来。我最初认为我可以编写一个脚本,比Matlab的内置函数更快地计算日期,但现在我甚至不能正确地计算这些值,比Matlab快得多。

内特·詹森

我忘了这个问题。问题的出现是因为我没有正确评估闰年。我会试着在一两天内把它修好。

布鲁诺Pajusco

首先,我用标普交易所的价格运行这个函数得到了最后4000次观测的误差。我也尝试过使用其他市场数据的较小子集,甚至使用由随机变量构建的虚假市场数据,但错误仍然存在。你可以试着用你自己的数据运行它,因为我怀疑你会得到相同的错误,但如果你想让我给你发送日期的实际值,打开,高,低,关闭价格,我需要你的电子邮件地址。

布鲁诺

内特·詹森

布鲁诺,

你能给我举个例子说明你是如何得到这个错误的吗?你可以把引发错误的输入信息发邮件给我,我看看能不能复制出来。

迈克,

谢谢你的积极反馈!

迈克

伟大的代码,易于使用,并有很好的文档!非常感谢。不用从头开始编写代码,节省了我很多时间。

注意:在2008或更早版本的Matlab上运行此命令时,不支持波浪号(~)输出参数。金宝app只需将其更改为一个哑值(例如“val”),错误就会消失。搜索“~”并更改行:407、408、802、811、858、867。//www.tatmou.com/help/techdoc/matlab_prog/bresuxt-1.html#br67dkp-1

布鲁诺Pajusco

内特,我在评估枢轴点的时候遇到了一个问题。这个问题似乎与您从Matlab串行日期计算出年、月和日的代码有关。特别地,我对以下代码块有问题:

%转换Matlab时间年,月,和天
temp_var1=楼层(日期);%的完整天数
temp_var2 = temp_var1/365.242199;年数%
年=地板(temp_var2);满年数%
If (4*(year/4-floor(year/4)) == 0) &…如果是闰年
(100*(年份/100楼层(年份/100))~=0)。。。
|(400*(年份/400楼层(年份/400))==0%#正常<和2,或2>
温度变量3=地板((温度变量2年)*366);%一年中的完整天数
月= cum_days1 (temp_var3);%确定月
日=临时变量3日(月);%确定日
如果是正常年份,则不然。
临时变量3=楼层((临时变量2年)*365);%全年天数
月= cum_days2 (temp_var3);%确定月
一天= temp_var3-cum_days4(月);%确定一天
结束

在构造变量month时,代码会抛出以下异常:

下标指标必须是实正整数或逻辑数。

指示灯错误(第967行)
月= cum_days2 (temp_var3);%确定月”

我不知道为什么会出现这种情况,但当我构造类似于temp_var3 cum_days2的变量并运行该代码块时,它似乎比运行函数时快乐得多。什么好主意吗?

布鲁诺

内特·詹森

Krzysztof,

我建议你简单地写一个新的ema代码,包括以前的ema值,你应该被设置。下面应该做你想做的,

函数vout = ema(vin,prev_ema)

k = 2 /(滞后+ 1);
= vin * k;
oneK = 1 k;

vout = kvin + (prev_ema * oneK);

结束

Krzysztof Fajst

你好,

我做了更多的调查,我认为基于tsmovavg的解决方案有一个主要的缺点,即不能用于实时应用。假设你有10k条棒,然后计算ema。比一个新的酒吧来了,并再次计算一万将是非常昂贵的时间-计算最后一个酒吧容易得多。

但在本例中,这段代码无法工作,因为它使用的不是x-1数据
对于初始值(第一次ema计算的最后一个数据点),将使用一些平均值。

换句话说,这意味着在10k+1条线上计算的ema值将与在最后一条线上计算的ema值不同,这不应该是一种情况。

过滤器溶液似乎可以

Krzysztof

内特·詹森

Krzysztof,

我使用的方法是Matlab使用自己的移动平均函数'tsmovavg'来计算ema的方法。这并不是说这个方法是正确的,但这就是我使用它的原因。

我简单地把它与谷歌的ema在他们的财务页面和结果是一样的。

我建议坚持我所拥有的。

内特

Krzysztof Fajst

看起来EMA至少有2个版本的代码。
EMA用这个函数的算法计算,EMA用这个代码计算

%将周期转换为指数百分比
ep = 2 /(时间+ 1);

%计算均线
=过滤器(ep, [1 - (1-ep)],数据,数据(1)* (1-ep));

不幸的是,他们给出了不同的结果。哪一个是正确的?

Krzysztof

MATLAB版本兼容性
创建R2012a
与任何版本兼容
平台兼容性
窗户 macOS Linux

社区寻宝

在MATLAB Central中查找宝藏,了解社区如何帮助您!

开始狩猎!