我正在尝试将指标从MQL4(Metatrader语言)转换为Matlab。布林带代码如下:
for(int i=Bars;i>=0;i--)
{
BANDS=iBands(Symbol(),0,20,2,1,0,1,i+1);
}
iBands()documentation将8个输入列为:
symbol
timeframe
period
deviation
bands_shift
applied_price
mode
shift
除了bands_shift
和shift
之外,我了解所有这些内容。问题:如果i = Bars
是整个数据范围,为什么i+1
不会产生超出范围的错误?据我所知,这是一个20周期的代码,2个标准偏差布林带。对于给定的时间间隔,相关的布林带是否为前一时间间隔计算的值(因此在第四个逗号后的1
)?那么i+1
做了什么?鉴于此代码,我将如何在matlab中实现?我的尝试,使用this移动标准偏差和this移动平均线:
moving_average = movemean(EURUSD_closes(1:end-1),20); %end-1 in order to shift by 1
moving_average = [NaN; moving_average]; %adding NaN to make BANDS the length of price
moving_std = movestd(EURUSD_closes(1:end-1),20,'backward');
moving_std = [NaN; moving_std1];
BANDS = moving_average + 2*moving_std;
我认为这不会提供与MQL4代码相同的输出。任何提示肯定会受到赞赏!
答案 0 :(得分:2)
由于我对布林带的了解很少,看起来你可能会遇到实施问题。你在MATLAB中尝试过Bollinger函数的输出吗?
对于窗口大小小于20的边缘情况,布林带可能已经有所不同。您可能需要联系MQL4作者来检查所使用的公式。我注意到我在Python中实现的差异以及Google财经中的指标。不过,如果你已经正确实现了窗口大小为20的值,你会看到相同的值。
答案 1 :(得分:1)
如何理解iBars+1
和“缺少”Out of Range Error
MQL4在“反向TimeDOMAIN索引”空间中工作。因此, iBar
显示历史TimeSeriesDataSET的“深度”,而最新(实时)栏的索引为 [0] 。
始终 [0] 。
这意味着,对于任何技术指标的计算,编码人员必须以这种方式安排处理。
这也意味着,对于任何新的条形图,数据存储层的内部表示必须以某种方式将所有 DataCELL一个“移位”到“左”(在TimeDOMAIN中向后移动)朝着历史)的方向为一个新的酒吧制作一个“空格”,其中索引仍为[0](TimeDOMAIN中的 Now 时刻)。
虽然“物理”移动DataSTORE的所有当前“深度”将是绝对的资源浪费(时间,CPU,......),数据存储层工作更智能,调整每个上的索引头新的bar事件加上使用某种形式的弹性DataSTORE容量规划/按需重新调整大小,以便在DataSTORE持续增长期间最小化mem-alloc。
这意味着,对Out of Range Error
的测试不支持MQL4语言的用户代码命名空间。
如何理解bands_shift
和shift
。
调用iBands()
必须说明哪一个Bar要求函数计算结果。
shift
为此提供输入。该指数符合上述规则。
一旦布林带计算完成,人们可能希望将曲线偏移一定量的条形图 - 在TimeDOMAIN中转换图形{+ N <&lt;离开| -N&gt;&gt;正确} - 以便可视化图形满足一个人的期望或愉悦。
bands_shift
为此图表ad-hoc转移提供输入。
另请注意,Google,Y!Finance,MATLAB和MQL4图表之间观察到的差异只需要出现并说明其他(未知)细节,这些细节难以从屏幕上显示的线条中解码。
applied_price := { PRICE_CLOSE | ... | ..._TYPICAL | ..._WEIGHTED }
提供了一个输入,用于选择进入布林线计算的适当类型的价格。
mode := { MODE_UPPER | MODE_MAIN | MODE_LOWER }
提供接收{upper_band |的输入布林带的轴| lower_band} PriceDOMAIN值。因此,“懒惰方法”是将iBands()调用三次以获得树线 - 布林线,或者多次调用光谱色的布林带热图。