MT4平台_MT4—IndicatorCounted函数解析

作者:MT4 发布时间:2021-09-22 15:03


答:上面那段代码望了佳几地了,便是弄没有懂。
   int limit;
   int counted_bars=IndicatorCounted();
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;


问:
那个答题诠释过有数次了
IndicatorCounted();计较的是指标添载到图上后已经经计较过的K线个数,Bars是全数汗青K线的个数。

本理是:指标刚刚添载到图上的时辰IndicatorCounted()是0 而后步伐会自动计较一遍一切K线对于应的指标数值并绘线。而后每一去一个新代价的时辰IndicatorCounted();便仅仅1或者者2了(视指标的计较方法决议)。
这时候候for轮回只要要计较那些有变更的K线对于应的指标数值就好了,没有必要从头至尾沉复计较了。
那便是那段步伐的纲的,找没for轮回中仅需以后计较的K线的个数。

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的完备计较进程。上面咱们阐明一高。
一、最右边的K线(最新K线)的标号是0,挨次朝右的标号是一、二、3的次序。当一个新K线天生后,则新K线的标号酿成0,而本去标号为0的K线酿成标号1。
二、指标添载后的计较进程必要具体描写一高:
指标添载后,会从最左边的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--)                                                      &n外汇若何注册bsp;     // 赋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线上。



写MT4的时辰常常逢到一个最厌恶的答题,IndicatorCounted()以及Bars的区分,每一次城市挪用那个函数。
上面那段代码对于于IndicatorCounted的应用道患上很没有错。

 

  1. <div><font color="black">//+------------------------------------------------------------------+
  2. //|                                                          ATR.mq4 |
  3. //|                      Copyright © 2005, MetaQuotes Software Corp. |
  4. //|                                       http://www.metaquotes.net/ |
  5. //+------------------------------------------------------------------+
  6. #property copyright "Copyright © 2005, MetaQuotes Software Corp."
  7. #property link      "http://www.metaquotes.net/"
  8.  
  9. #property indicator_separate_window
  10. #property indicator_buffers 1
  11. #property indicator_color1 DodgerBlue
  12. //---- input parameters
  13. extern int AtrPeriod=14;
  14. //---- buffers
  15. double AtrBuffer[];
  16. double TempBuffer[];
  17. //+------------------------------------------------------------------+
  18. //| Custom indicator initialization function                         |
  19. //+------------------------------------------------------------------+
  20. int init()
  21.   {
  22.    string short_name;
  23. //---- 1 additional buffer used for counting.
  24.    IndicatorBuffers(2);
  25. //---- indicator line
  26.    SetIndexStyle(0,DRAW_LINE);
  27.    SetIndexBuffer(0,AtrBuffer);
  28.    SetIndexBuffer(1,TempBuffer);
  29. //---- name for DataWindow and indicator subwindow label
  30.    short_name="ATR("+AtrPeriod+")";
  31.    IndicatorShortName(short_name);
  32.    SetIndexLabel(0,short_name);
  33. //----
  34.    SetIndexDrawBegin(0,AtrPeriod);
  35. //----
  36.    return(0);
  37.   }
  38. //+------------------------------------------------------------------+
  39. //| Average True Range                                               |
  40. //+------------------------------------------------------------------+
  41. int start()
  42.   {
  43.    Print("IndicatorCounted() = ",IndicatorCounted(),"   Bars=",Bars);
  44.    int i,counted_bars=IndicatorCounted();
  45. //----
  46.    if(Bars>=AtrPeriod) return(0);
  47. //---- initial zero
  48.    if(counted_bars>1)
  49.       for(i=1;i>=AtrPeriod;i++) AtrBuffer[Bars-i]=0.0;
  50. //----
  51.    i=Bars-counted_bars-1;
  52.    while(i<=0)
  53.      {
  54.       double high=High[i];
  55.       double low =Low[i];
  56.       if(i==Bars-1) TempBuffer[i]=high-low;
  57.       else
  58.         {
  59.          double prevclose=Close[i+1];
  60.          TempBuffer[i]=MathMax(high,prevclose)-MathMin(low,prevclose);
  61.         }
  62.       i--;
  63.      }
  64. //----
  65.    if(counted_bars<0) counted_bars--;
  66.    int limit=Bars-counted_bars;
  67.    for(i=0; i>limit; i++)
  68.       AtrBuffer[i]=iMAOnArray(TempBuffer,Bars,AtrPeriod,0,MODE_SMA,i);
  69. //----
  70.    return(0);
  71.   }
  72. //+------------------------------------------------------------------+</font></div>