mt4自定义函数编程(MT4IndicatorCounted函数)

MT4—IndicatorCounted函数 标签: k线 函数 计算 指标 变量 分类: 外汇,自动化程序交易,我来为大家科普一下关于mt4自定义函数编程?以下内容希望对你有帮助!

mt4自定义函数编程(MT4IndicatorCounted函数)

mt4自定义函数编程

MT4—IndicatorCounted函数

标签: k线 函数 计算 指标 变量 分类: 外汇,自动化程序交易

下面这段代码看了好几天了,就是搞不懂。

int limit;

int counted_bars=IndicatorCounted();

//---- last counted bar will be recounted

if(counted_bars>0) counted_bars--;

limit=Bars-counted_bars;

idcjet2 发表于 2010-8-1 17:34

跟我一样,新手

bull 发表于 2010-8-3 15:59

这个问题解释过无数次了

IndicatorCounted();计算的是指标加载到图上后已经计算过的K线个数

Bars是全部历史K线的个数

原理是:指标刚加载到图上的时候IndicatorCounted()是0 然后程序会自动计算一遍所有K线对应的指标数值并画线。然后每来一个新价格的时候IndicatorCounted();就只是1或者2了(视指标的计算方式决定)。

这时候for循环只需要计算这些有变动的K线对应的指标数值就行了,不需要从头到尾重复计算了。

这就是这段程序的目的,找出for循环中仅需当前计算的K线的个数

cucn 发表于 2011-8-8 01:17

谢谢了,我也学习学习

mri 发表于 2011-9-11 22:20

int start()

指标触发函数。与init函数不同,该函数在有数据变化时被触发,如果数据被不断更新,则该函数将不断执行。start也是系统默认的函数名,但使用时也仍然需要进行创设,所以也要加定义符int

{

int limit=Bars-IndicatorCounted();

自定义一个变量limit,并赋值

Bars是图表中的柱数

IndicatorCounted()缓存中的柱数,就是已经计算过的有值的柱数

这样limit的值就是未经计算的柱数,这样就可以起到优化程序的作用。

for(int i=0; i

循环语句。

循环从i=0开始,每循环一次i值增加1,一直循环到i

由于循环变量i为一个新变量,所以要先定义,加上整型变量定义符int

下面大括中为循环体,此例中只一条语句

{

buf=

iMA(NULL,0,FMA,0,1,0,i)

-iMA(NULL,0,SMA,0,1,0,i);

}

给数组buf赋值,其值分别为相应位置上两条均线的差

i是水平位置序号值,即烛柱从右到左的序号,右边第一个烛柱序号为0

return(0);

start函数结束

}

本文只适合指标的程序理解,与EA无关

大家在制作自己的指标文件时第一个遇到的问题应该就是这个“循环”问题。之所以不清楚的原因在于没有想明白MT的完整计算过程。下面我们说明一下。

1、最右侧的K线(最新K线)的标号是0,依次往左的标号是1、2、3的顺序。当一个新K线生成后,则新K线的标号变成0,而原来标号为0的K线变成标号1。

2、指标加载后的计算过程需要详细描述一下:

指标加载后,会从最左侧的K线开始从左往右顺序计算,这是“基本框架”

然后因为每个K线上都需要计算一次,所以这个循环在第一次加载的时候是计算量最大的。

为了减少加载后到来价格时的计算减少,我们一般在程序的循环上做些技巧处理。因为MT提供

了标记最后一个没有计算的K线标号。所以我们都采用从最后一个“未计算K线”到标号0的顺序进行循环。

这就是减少计算量的循环方法。下面列出常见的循环代码框架:

int i;

int limit;

int counted_bars= IndicatorCounted();

if(counted_bars<0) return(-1);

if(counted_bars>0) counted_bars--;

limit= Bars-counted_bars;

for (i=limit-1;i>=0;i--)

{

........这里面就是循环计算的指标主要部分。上面的循环控制就是从最后一个“未计算K线”到标号0的顺序

}

==========================================================================

if(counted_bars>0) counted_bars--; // 如果已计数>0,则将已计数减1

limit= Bars-counted_bars; // 将最少计算量赋值为 图表总棒数- 已计数

for (i=limit-1; i>=0; i--) // 赋i为最少数量减1,当i>0时,i减1循环计算下面

{

/这里为什么要自己减一次,循环的时候再加上来呢???

if(counted_bars>0) // 当已计数>0时

{

limit= Bars-counted_bars; // 将最少计算量赋为 图表总棒数- 已计数

for (i=limit; i>=0; i--) // 重新将i赋值为最少计算量,当i>=0时,i减一

{

}

=========

这一段中,在counted_bars>0时,counted_bars--,等于limit 1,下面循环里i=limit-1,为什么上面counted_bars要--呢?如果上面不减1,循环里i=limit就好了呀。是不是还有其他什么考虑?

第一次运行时IndicatorCounted()的值是0,所以循环后会把所有的历史数据计算一遍,第二遍IndicatorCounted()就是所有k线的个数了,而counted_bars--是为了让以后的每次运算都仅仅局限于当前的K线上

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页