我的指标在我换到新的时间框架图时就消失了 - 页 3

 

嗨,SDC。

我知道了。非常感谢。

如果有100巴,总费率从0到99开始。

在开始时,pre_cal =0 --> limit=100 bar - 0 =100。

for(int=1 to limit=100; I++)

在最后,I=100(索引值),没有这样的条形图100。

因此,为了使最大的I=99,我把limit-1。

我想知道是否有更好的方法。

此外,让我困惑的是,在许多其他指标中,我使用同样的方法,没有这样的超出范围 的问题。

另外,谢谢你的专家标签。

鑫科FX


   int limit=rates_total-prev_calculated;
   if(limit<=0) limit=2;
//---
 
 for(int i=1;i<limit-1  ;i++)
{  if((High[i]-Low[i])==0) continue;

   if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50     ) 
      boring[i]=Close[i];
 
scfx:

此外,让我困惑的是,在许多其他指标中,我使用同样的方法,没有这种超出范围的问题。



在B600之前,超出范围 并不是 一个严重的错误
 
scfx:.

因此,为了使最大的I=99,我把limit-1。

我想知道是否有更好的方法。

你的代码现在将绘制从第1条开始的图表历史,没有错误,但它不会绘制任何新条。有很多方法来编写代码,这取决于你希望它做什么。看看metaeditor中的指标,看看MQ的编码者是怎么做的。当你能读懂他们的代码并理解每一行的原因时,你创建指标 将没有问题。

 

我现在明白了,SDC。

就我个人而言,当我阅读该文件时很难想象。我还是不确定为什么prev_calculated= Total_rates -1。

所以我在这里做了一个数字的例子。我希望它能帮助像我这样的新人。

通常情况下,我们看到。

Limit= rates_total- prev_calculated; //(no-1)

或者

for(i=1;i<limit;i++) 或 for(i=1;i<=limit;i++)

重要的 是要确保LIMIT>=1。在我的情况下,LIMIT=0,因此,当新的tick进入时,指标没有被REFESHED。

为什么呢,让我们看看。(我认为至少在我的情况下,原因是prev_calculated。)

假设我在图表上有100个柱子的情况下附加了这个指标。以下是变量值。

第一个数值表
变量
Total_rates 100
Bar的索引 0-99
prev_calculated 0
Limit 100
Loop i value 1-99

一切都很好。从第1条到图表的开头,数值将首次显示出来。已经计算了多少条?这 是我错误的关键点,我不是100%清楚。

当新条形图开始时,图表上现在有101条。指标没有在已经关闭的条上更新,现在是第1条。

第二张数值表
变量
Total_rates 101
Bar的索引 0-100
prev_calculated 99 OR 100 (见下文)
Limit2 OR 1
循环i值1至1 OR 1至0

根据第一张表,指标计算出99条(因为它从1到99循环)。
然而,文件中说:"但如果不是第一次调用start(),将返回等于Bars-1的值"。)因此,它将返回101-1=100。
,这一个柱子的不同导致了麻烦。如果系统返回100作为prev_calculated。
你可以看到,如果prev_calculated=99,循环将工作。
然而,看起来prev_calculated=100,因此循环将不工作,因为limit=0或-1取决于。
谁能帮我看看这种情况下prev_calculated= Bars-1背后的逻辑?

所以解决方案很清楚:使for(i=1; ___这里的这个必须大于1 for (<)或大于或等于1 for (<=)__; i++)。在我最后的代码中,它等于0。

   int pcal=prev_calculated;
   
   if(prev_calculated>0)
   pcal--; 
      
   int limit=rates_total-pcal;
   for(int i=1;i<=limit  ;i++)	//it is <=


//--------------OR ------------------------

  int limit=rates_total-prev_calculated-1;
  if(limit<=0) limit=2; //NOT limit

for(int i=1;i<=limit  ;i++) //it is <=

我希望这对你有帮助。

SCFX

 

prev_calculated == rates_total

scfx:

我现在明白了,SDC。

就我个人而言,当我阅读文件时很难想象。我仍然不确定为什么prev_calculated=Total_rates -1。

SCFX

创建一个新的指标,把这段代码放在启动函数 中,把它附在1分钟的图表上,观察刻度线到来时的警报。

Alert("rt = ",rates_total,"  pc = ",prev_calculated);

你会看到rate_total是当前的条数。

prev_calculated是上一个tick的条数。

 
SDC:

prev_calculated == rates_total

创建一个新的指标,把这段代码放在启动函数中,把它附在1分钟的图表上,观察刻度线到来时的警报。

你会看到rate_total是当前的条数。

prev_calculated是上一个tick的条数。


哇,这很奇怪。

在之前发布的链接中,他们说,如果:BUT如果不是第一次调用start(),将返回等于Bars-1的值。

为什么会返回Bars(Rate_totals)。

 

是的,我知道他们这么说,但这并不完全准确。

实际发生的情况是这样的。

rates_total ==当前tick到达时的总条数。 prev_calculated ==前一个tick到达时的总条数。

图表中的条数 指示器状态 速率-总数 prev-calculated 速率_总数-前次计算的
1000 装载时首次运行 1000 0 1000
1000 下一个刻度 1000 1000 0
1000 下一个刻度线 1000 1000 0
1001 新条形图的第一个刻度线 1001 1000 1
1001 下一个刻度线 1001 1001 0
1001 下一个刻度线 1001 1001 0

因此,你有3个主要的prev-calculated与rate_total的状态。 指标加载,条形图中间的ticks,新条形图第一个tick。

prev_calculated == 第一次运行时为0,因为在指标加载后没有前一个tick。

此外,如果改变图表或添加历史记录,prev_calculated会重新设置为零。

OnCalculate的返回值不被使用,但最好使用默认的return(rate_total),以备他们修复。

 
图表中的条形图 指标状态 率-总数 前期计算的 总数-前值-计算的比率
1000 装载时首次运行 1000 0 1000
而1000条并不存在。

我知道新文档是怎么说的。如果你按他们的方法做,你必须测试prev_calculated 是否为零,并将rates_total - prev_calculated 调低一个。这就是回到递减指标_counted的 混乱状态。
int OnCalculate(const int rates_total,
                const int prev_calculated, ...){
   #define LOOKBACK 1 // iMA(... iBar+1)
   int indicator_counted = prev_calculated;
   if(indicator_counted < LOOKBACK) indicator_counted = LOOKBACK;
   for(iBar = rates_total - 1 - indicator_counted; i>=0 i--){
      Buffer[iBar] = ...;
   }
   return(rates_total - 1); // Recalculate bar zero next tick.
}
显示指标的进度 - MQL4论坛
 

做return( rates_total - 1 )是没有意义的,prev_calculated的值就像return(rate_total)一样,不管你告诉它要返回什么。

 
SDC: 做return( rates_total - 1 )是没有意义的,prev_calculated的值就像return(rate_total)一样,不管你告诉它要返回什么。
你在服务台发布了这个问题 吗?