垂直线。 - 页 4

 

我还在学习指标的复杂性,有一些问题。我在OnInit()中重置了指标缓冲区,但由于某些原因,缓冲区在指标编译时没有被重置。对于逻辑来说,编译后每个缓冲区 应该有一个完整的单元 。我在哪里犯了错?

int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorHistogram_2Buffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
//--- установим пустое значение
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);

   ArrayInitialize(ColorHistogram_2Buffer1,0);
   ArrayInitialize(ColorHistogram_2Buffer2,0);
   ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);

   Print("-INITALIZATION-");

   false;
//---
   return(INIT_SUCCEEDED);
  }
      if(rates_total-8==i)// || rates_total-5==i || rates_total-2==i)
        {
         ColorHistogram_2Buffer1[i]=high[i];
         ColorHistogram_2Buffer2[i]=low[i];
         ColorHistogram_2Colors[i]=0;
        }


.
附加的文件:
 
Nauris Zukas:

我还在学习指标的复杂性,有一些问题。我在OnInit()中重置了指标缓冲区,但由于某些原因,缓冲区在指标编译时没有被重置。对于逻辑来说,编译后每个缓冲区 应该有一个完整的单元 。我在哪里犯了错?

在OnInit中,指标缓冲区 的长度为零。


这就是为什么他们可以对你做任何事情--这一切在他们看来都是死人的工作。

而当代码执行切换到OnCalculate时,大小立即变成等于rate_total。

并且在数组的所有单元中都有 "垃圾"。也可能有旧指标计算的遗留物。

 
Alexey Viktorov:

在OnInit中,指标缓冲区 的长度为零。


这就是为什么你可以对它们为所欲为,它们是一个致命的诱因。

而当代码执行传递到OnCalculate时,大小立即变成等于rate_total。

并且阵列中的所有单元格都有 "垃圾"。可能有一些是旧的指标计算遗留下来的。

非常感谢你,我都拿到了,而且成功了!是这样做的。

bool ResetOnInit=false;
int OnInit()
  {   
   ResetOnInit=false;
   return(INIT_SUCCEEDED);
  }
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(!ResetOnInit)
     {
      ArrayInitialize(ColorHistogram_2Buffer1,0);
      ArrayInitialize(ColorHistogram_2Buffer2,0);
      ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);
      ResetOnInit=true;
     }
  }
 
Nauris Zukas:

非常感谢你,这一切都解决了!我是这样做的。

为什么要给一个变量赋值两次?

bool ResetOnInit=false;
int OnInit()
  {   
   ResetOnInit=false;
   return(INIT_SUCCEEDED);
  }

还有一个问题:为什么我需要这一切?毕竟,通过循环中的所有条形,无论如何,数组的所有单元格都必须被填充一些东西。除非指标应该只显示当前的位置,但这样的话,数组 必须在每个柱子上被初始化,而不是只在开始的时候。

 
Alexey Viktorov:

为什么要给一个变量赋值两次?

我不确定OnInit()是否会模仿图形的所有动作,例如改变taimfreims。改变了taimfreim的复位(刚刚检查过),但也许还有别的原因,所以我把第二条放在OnInit()中以确定。但如果不是,那我就不放在那里了。
 
Alexey Viktorov:

而问题是:我们为什么需要这一切?毕竟,通过循环中的所有条形,无论如何,数组的所有单元格都必须被填满东西。除非指标应该只显示当前的位置,但这样的话,数组应该 在每个柱子上都被初始化,而不是只在开始时。

在这个例子中,我只是想了解如何重置缓冲区。但在将来(在我现在正在做的指标中),我既需要保留以前的单元格,也需要添加新的单元格。就在这一点上,我开始了工作。可以说--第一次测试。

 
Nauris Zukas:
我不确定OnInit()是否模仿了图表的所有动作,例如改变taimfreims。改变了taimfreim的复位(现在检查过了),但也许还有别的原因,所以我把第二条放在OnInit()中以确定。但如果不是,那我就不放在那里了。

啊。嗯,是的,当图表周期 改变时,全局水平变量没有被初始化。? "我认为...记不清楚了。

一般来说,你可以不使用那个额外的bool变量。

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(prev_calculated == 0)
     {
      ArrayInitialize(ColorHistogram_2Buffer1,0);
      ArrayInitialize(ColorHistogram_2Buffer2,0);
      ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);
     }
  }
 
Alexey Viktorov:

而在一般情况下,你可以不使用这个额外的bool变量。

是的,没错,甚至更好,谢谢你。

 

你能告诉我,为什么如果周期超过30分钟,会返回这样一个奇怪的数字?

Print("PERIOD: ",Period()); 

KP 0 14:33:22.423 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,M30)PERIOD: 30

GG 0 14:33:24.402 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,H1) PERIOD: 16385

RJ 0 14:33:25.675 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,H4) PERIOD: 16388
 
Nauris Zukas:

你能告诉我为什么如果周期超过30分钟,它就会返回这样一个奇怪的数字?

在MT5中,周期值不等于分钟数,就像在MT4中。

原因: