文章 "MQL5 酷宝典 - 创建的环形缓存用于快速计算滑动窗口中的指标" - 页 4

 
Otto Pauser:

这篇文章很棒,他很会编程!

如果德文翻译不那么糟糕就好了!!!!!

您好、

非常感谢您的提示。翻译已经更正。

致以最诚挚的问候

 

您好,瓦西里-索科洛夫

您利用环形缓冲器创建的指标显示不清楚,我猜是 ChangeValue 方法不起作用,或者是我误解了什么?

 
Savio Araujo:

我已经看到了。我检查了你提供的示例。它们显示了我在处理市场运行时更新数值时遇到的相同问题。请查看您提供的随机指标。添加新值不成问题,但当我们尝试在 CRiMaxMin 类中使用 Stoch.ChangeLast() 或 OnChangeValue() 时,它却不起作用。它不会相应地改变值。如果您能检查一下或发送一个工作代码示例,那将非常好。

谢谢。

您做得很好,非常感谢作者。萨维奥,也许你看到的错误就在这里:

int RingBuffer::iToRealInd(int iIndex)

{

   if(iIndex >= iNumElements() || iIndex < 0)

      return iBufferSize-1; //previous bug was caused by no -1 here

...

我在最后一行的引号中加了-1;之前没有这个值,它会导致返回不正确的索引。请注意,我根据自己的编程风格更改了变量/方法名称,但想法是一样的。

 
为什么 CRiStoch 没有名为 ChangeValue 的方法?
 
brisully:

非常感谢作者。萨维奥,也许你看到的错误就在这里:

int RingBuffer::iToRealInd(int iIndex)

{

   if(iIndex >= iNumElements() || iIndex < 0)

      return iBufferSize-1; //previous bug was caused by no -1 here

...

我在最后一行引号中加上了-1;之前没有,会导致返回不正确的索引。请注意,我根据自己的编程风格更改了变量/方法名称,但想法是一样的

我尝试了您的更正,但仍然无法正确更新。似乎缺少了什么,而且当我试图在形成新的条形图时运行环形缓冲区 时,我找不到问题所在。当市场运行时,高低线完全混淆。在处理旧数据时,代码运行得非常好、非常快,但在形成新的条形图时,新数据到达时,代码就无法运行了。

 
瓦西里,谢谢你的代码!
请允许我发表一些意见:

1.在 void CRiMaxMin::OnChangeValue(int index, double del_value, double new_value) 类中,在方法 "OnChangeValue" 的第
行。
if(m_min_ind >= 0 && new_value >= GetValue(m_min_ind))
      m_min_ind = index;

图片: 错字?




2.在搜索数组的最小和最大元素时,如果完全作为环形缓冲区使用(当新元素开始写入数组开头时),min 和 mah 的定义是错误的。最小值大于最大值。在一个数组中。使用标准方法(ArrayMinimum 和 ArrayMaximum)一切正常。
图片: 最小值大于最大值

某个地方的索引出错了。我自己解决不了。如果有人能解决,那就太好了。我附上了一个测试顾问。

#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include  <RingBuffer\RiMaxMin.mqh>

input group "通过环形缓冲器检查是真的"
input bool ringBuffer=true;


input group "缓冲区大小"。
input int pTest=10;

double minValue,maxValue;
int minIndex,maxIndex,lastIndex,indArr;

double arr[];

CRiMaxMin minMaxTest;

int OnInit()
  { 
   if(ringBuffer)minMaxTest.SetMaxTotal(pTest);
   else  
      {
      indArr=-1;
      lastIndex=pTest-1;
      ArraySetAsSeries(arr,true);
      ArrayResize(arr,pTest);
      }
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
   
   
  }

void OnTick()
  {
   if(ringBuffer)
      {
      minMaxTest.AddValue(rand());
      minIndex=minMaxTest.MinIndex();
      minValue=minMaxTest.GetValue(minIndex);
      //minValue=minMaxTest.MinValue();
      maxIndex=minMaxTest.MaxIndex();
      maxValue=minMaxTest.GetValue(maxIndex);
      //maxValue=minMaxTest.MaxValue();
      }
   else
      {
      //arr[0]=rand();
      /ArrayCopy(arr,arr,1,0,lastIndex);
      indArr++;
      if(indArr>lastIndex)indArr=0;
      arr[indArr]=rand();
      minIndex=ArrayMinimum(arr,0,pTest);
      minValue=arr[minIndex];
      //minValue=arr[ArrayMinimum(arr,0,pTest)];
      maxIndex=ArrayMaximum(arr,0,pTest);
      maxValue=arr[maxIndex]; 
      //maxValue=arr[ArrayMaximum(arr,0,pTest)];
      }  
   Alert("minValue ",DoubleToString(minValue)," --  maxValue ",DoubleToString(maxValue));
   if(minValue>maxValue)
      {
      Alert("最小值 > 最大值 !!!");
      Print("最小值 > 最大值 !!!");
      ExpertRemove();
      }
  }
附加的文件:
 
我向您道歉。Min 和 Max 是正确的。是我自己想多了。
 
这正是我所需要的。感谢你提供的代码和如此详细的文章。优化极值搜索 的想法非常好!
 

ToRealInd(int index) 中有一处错误。

应该是
if(index >= GetTotal() || index < 0)
返回 m_max_total-1