MT4函数iMA()和 iMAOnArray()的区别误区
请教Okwh先生MT4有函数iMA()和 iMAOnArray()
我对 iMAOnArray()的含义和参数的理解出现问题
先把MT4官方网站的英文说明抄录如下∶
double iMAOnArray( double array[], int total, int period, int ma_shift, int ma_method, int shift)
Calculation of the Moving Average on data stored in a numeric array. Unlike iMA(...), the iMAOnArray function does not take data by symbol name, timeframe, the applied price. The price data must be previously prepared. The indicator is calculated from left to right. To access to the array elements as to a series array (i.e., from right to left), one has to use the ArraySetAsSeries function.
Parameters:
array[] - Array with data.
total - The number of items to be counted. 0 means whole array.
period - Averaging period for calculation.
ma_shift - MA shift
ma_method - MA method. It can be any of the Moving Average method enumeration value.
shift - Index of the value taken from the indicator buffer (shift relative to the current bar the given amount of periods ago).
其中说iMAOnArray()和iMA()的不同之一是iMAOnArray()的计算是“从左到右计算(calculated from left to right.)”
请教Okwh先生∶
“从左到右计算”和“从右到左计算”的结果有什么不同?
为什么那么重要?
以至于 MetaQuotes 公司专门设计了ArrayCopySeries()来实现“从左到右计算”?
在iMA()和iMAOnArray(里的都有参数period和shift它们的含义都很明显
但是这个 ma_shift 的含义是什么?
有人解释说∶
ma_shift -- moves the "result" of the calculation to a different bar. Open a chart, add Moving Average indicator. in properties, a negative shift moves the MA line to the left, a positive shift moves it to the right.
这句话中文的解释是什么?
或者有什么更好的中文解释?
==================================
“从左到右计算”和“从右到左计算”的结果有什么不同?
问题在于,计算机C语言的习惯是 数组下标从0开始,1,2,3,4,5......
而市场价格数据是变化的,为了表示变化的数据序列,MT把数组下标表示为......5,4,3,2,1,0,
并且,0总是对应当前最新数据(即下标、时间、数值三者要永远一一对应),那么每时刻有新数据进来(时间变化),就需要更改MT的数组下标跟数字序列、时间序列的对应关系...... 按MA的计算规矩,计算方法是从MT的数组下标大向小计算(即从过去的时间向现在计算),对于绘制用的指标数组,MT一般会自动进行处理。
但对应用ArrayResize设置的自定义数组,缺省使用的下标记法是C的记法,所以需要设置
ArraySetAsSeries为ture,以指示MT按时间序列规则计算MA,
一般来说,所以使用xxxxOnArray函数的的数组,都必须使用ArraySetAsSeries为ture。
不过一般来说,大部分人不使用自定义数组,所以一般不必管它。(使用ArrayResize的人一般精通C,明白这些,不懂C的一般也不会去使用自定义数组).
SetIndexBuffer设置的数组自动服从此要求,一般没问题,你要主动设置ArraySetAsSeries为ture也行。
至于ma_shift用于对那个指标线的水平平移绘制,不影响计算,但影响绘制的位置,比如本来计算处理0位置的MA值用它ma_shift后会绘制在ma_shift位置, 典型的例子就是Ichimoku指标。 中文解释就是 把平移绘制
希望我说明白了,这涉及计算机的一点专业基础。
也可以不管计算机来理解它。问问自己,要给一一对应的价格序列、时间序列,编号,并且随时更新,那么如何编号?如何使用这种编号?当然事实上你的编的程序是MT软件来调用的,他们需要配合,就要建立写规矩而已。 #property indicator_buffers 1
#property indicator_color1 White
#property indicator_separate_window
double t[4];
double ma[];
int init()
{
SetIndexStyle(0,DRAW_LINE,0,2);
SetIndexBuffer(0,ma);
for (int i = 0; i < 4; i++) t[i] = i;
Print(iMAOnArray(t, 0, 3, 0, MODE_SMA, 1));
}
int start()
{
ma[0] =iMAOnArray(t, 0, 3, 0, MODE_SMA, 0);
ma[1] =iMAOnArray(t, 0, 3, 0, MODE_SMA, 1);
ma[2] =iMAOnArray(t, 0, 3, 0, MODE_SMA, 2);
return(0);
}
输出结果是:1
一条曲线斜向右上 #property indicator_buffers 1
#property indicator_color1 White
#property indicator_separate_window
double t[4];
double ma[];
int init()
{
SetIndexStyle(0,DRAW_LINE,0,2);
SetIndexBuffer(0,ma);
ArraySetAsSeries(t,true);
for (int i = 0; i < 4; i++) t[i] = i;
Print(t[0],t[1]);
Print(iMAOnArray(t, 0, 3, 0, MODE_SMA, 0));
Print(iMAOnArray(t, 0, 3, 0, MODE_SMA, 1));
}
输出结果:01
1
2 当t不是序列数组的时候,应该是把t写成0 1 2 3 ,然后imaonarray 从最大的3开始计算
当t是序列数组,应该把t写成3 2 1 0,然后imaonarray从最右的0开始计算 太好了,刚学会写均线的简单指标,貌似飞狐的SMA与MT4的SMA不一样。。。。怎么编写飞狐的SMA函数呢
SMA(X,N,M),求X的N周期移动平均,M为权重。
算法:
若Y=SMA(X,N,M) 则 Y=(M*X+(N-M)*Y')/N, 其中Y'表示上一周期Y值,N必须大于M。
例如:
SMA(CLOSE,20,1)
表示求20日移动平均价
[[i] 本帖最后由 K_G_Invest 于 2009-2-18 23:30 编辑 [/i]]
页:
[1]


