将MQL4 ibands()转换为Matlab

时间:2014-02-04 20:06:06

标签: matlab mql4

我正在尝试将指标从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_shiftshift之外,我了解所有这些内容。问题:如果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代码相同的输出。任何提示肯定会受到赞赏!

2 个答案:

答案 0 :(得分:2)

由于我对布林带的了解很少,看起来你可能会遇到实施问题。你在MATLAB中尝试过Bollinger函数的输出吗?

对于窗口大小小于20的边缘情况,布林带可能已经有所不同。您可能需要联系MQL4作者来检查所使用的公式。我注意到我在Python中实现的差异以及Google财经中的指标。不过,如果你已经正确实现了窗口大小为20的值,你会看到相同的值。

除非您非常确定FEX代码,否则应使用stdmean进行实施。

答案 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_shiftshift

调用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()调用三次以获得树线 - 布林线,或者多次调用光谱色的布林带热图。 enter image description here