来自一个 "傻瓜 "的问题 - 页 235

 
lazarev-d-m:

改成了这样

似乎是在工作。

你的数组没有被序列化。

这就是为什么它是这样的。

Buffer[i+1]=Buffer[i]+delta;

窥探未来


它不会重新计算0巴--出于同样的原因--你的开始--它不会从0开始。

 
sergeev:

你的数组没有被序列化。

所以,这就是为什么它是这个。

窥视未来。


它不会重新计算0巴,原因与你不从0开始一样。

我的0bar没有按照公式计算。

Buffer[0]=price[0]; 

然后根据价格走势,该指标将追上趋势

例如,如果价格已经远离指标并且不会移动,那么在蜡烛的"期间"指标将赶上价格,这对我来说是一种替代MA的方法。

 

lazarev-d-m:

对我来说,这是对MA的一种替代。

展望未来,你可以安全地把这个替代方案扔进垃圾桶。
 

我的第一个指标。我想把符号的比例从0调整到100。我做得对吗?如何使当前的条形图不被重新计算(在测试器中它会抽动,但在图表中不会。)

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Main"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         MainBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);
   IndicatorSetString(INDICATOR_SHORTNAME,"NormSymbol");
   IndicatorSetInteger(INDICATOR_DIGITS,2);
   ArrayInitialize(MainBuffer, EMPTY_VALUE);

//---
   return(0);
  }
  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
   
   int first,bar,nLowBar=0,nHighBar=0;
   int nVizCount = (int)ChartGetInteger(0, CHART_VISIBLE_BARS);
   if(prev_calculated==0) // проверка на первый старт расчёта индикатора
     {
      first=0; // стартовый номер для расчёта всех баров
     }
   else
     {
      first=prev_calculated-1; // стартовый номер для расчёта новых баров
     }


//---- основной цикл расчёта индикатора
   for(bar=first; bar<rates_total; bar++)
     {
      nLowBar =ArrayMinimum(low, bar, nVizCount);
      nHighBar=ArrayMaximum(high, bar, nVizCount);
      if(nLowBar>0 && nHighBar>0 && high[nHighBar]-low[nLowBar]!=0)
        {
         MainBuffer[bar]=((close[bar] -low[nLowBar])/(high[nHighBar]-low[nLowBar]))*100;
        }
      else
        {
         MainBuffer[bar]=EMPTY_VALUE;
        }
     }

  
//--- return value of prev_calculated for next call

   return(rates_total);
  }
 
Konstantin83: 如何使当前栏不重新计算

记忆当前条形图的开盘时间,并将其与传入条形图的相同值进行比较。只有在数值不匹配时才会重新计算当前条形图的数值。

我会把这个放在初始化块中。

   nVizCount = (int)ChartGetInteger(0, CHART_VISIBLE_BARS);
   

而这些变量将在程序的全局层面上声明。

int first,bar,nLowBar=0,nHighBar=0, nVizCount; 
 
Yedelkin:

记忆当前条形图的开盘时间,并将其与传入条形图的相同值进行比较。只有在数值不匹配时才会重新计算当前条形图的数值。

我会把这个放在初始化块中。

谢谢你。这在一般情况下是正确的吗?
 
Konstantin83: 一般来说,一切都很正确?

我没有注意到其他事情。这些文章建议采用类似的结构。有一个被零除的 检查。

是的,为了避免重新计算,你也可以比较prev_calculated和rate_total,就我的记忆而言。

 
Yedelkin:

我没有注意到其他事情。这些文章建议采用类似的结构。有一个被零除的检查。

是的,为了避免重新计算,你也可以比较prev_calculated和rate_total,就我的记忆而言。

你知道为什么关闭终端并重新启动终端 后,指标不画线吗?如果你切换到另一个时间框架,它就会被画出来。
 
Konstantin83: 你知道为什么关闭带有指标的终端并重新启动终端 后,指标没有画线吗?如果你切换到另一个时间框架,就会被画出来。

终端在启动时需要一些时间来 "起床",将其数据库与服务器同步,等等。如果指标同时启动,可能没有数据用于指标计算。尝试最简单的解决方案:在OnInit()中插入两到三秒的延迟。

好的解决方案是在搜索问题区域时打印所有重要信息。喜欢

if(nLowBar<0) Print("Ошибка, nLowBar=",nLowBar,", prev_calculated=",prev_calculated,", bar=",bar);
 

Yedelkin:

forward666 :需要一个可视化的东西

我还没有找到任何关于真实交易的帮助--只需尝试在模拟账户中开仓和平仓。

这里是:https://www.mql5.com/ru/forum/6343/page96#comment_419028