文章 "MQL5 酷宝典 - 创建的环形缓存用于快速计算滑动窗口中的指标" - 页 4 1234 新评论 Anna_A 2017.10.02 10:40 #31 Otto Pauser:这篇文章很棒,他很会编程!如果德文翻译不那么糟糕就好了!!!!!您好、非常感谢您的提示。翻译已经更正。致以最诚挚的问候 Svyatoslav Kucher 2018.06.12 19:47 #32 您好,瓦西里-索科洛夫! 您利用环形缓冲器创建的指标显示不清楚,我猜是 ChangeValue 方法不起作用,或者是我误解了什么? brisully 2019.02.07 21:50 #33 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;之前没有这个值,它会导致返回不正确的索引。请注意,我根据自己的编程风格更改了变量/方法名称,但想法是一样的。 Overweight 2019.02.10 09:26 #34 为什么 CRiStoch 没有名为 ChangeValue 的方法? Savio Araujo 2019.06.24 14:25 #35 brisully:非常感谢作者。萨维奥,也许你看到的错误就在这里: int RingBuffer::iToRealInd(int iIndex) { if(iIndex >= iNumElements() || iIndex < 0) return iBufferSize-1; //previous bug was caused by no -1 here ... 我在最后一行引号中加上了-1;之前没有,会导致返回不正确的索引。请注意,我根据自己的编程风格更改了变量/方法名称,但想法是一样的 我尝试了您的更正,但仍然无法正确更新。似乎缺少了什么,而且当我试图在形成新的条形图时运行环形缓冲区 时,我找不到问题所在。当市场运行时,高低线完全混淆。在处理旧数据时,代码运行得非常好、非常快,但在形成新的条形图时,新数据到达时,代码就无法运行了。 HimOrik 2020.11.24 10:36 #36 瓦西里,谢谢你的代码! 请允许我发表一些意见: 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(); } } 附加的文件: minMaxTest.mq5 4 kb HimOrik 2021.04.25 18:53 #37 我向您道歉。Min 和 Max 是正确的。是我自己想多了。 rapblH_spb 2024.10.04 21:51 #38 这正是我所需要的。感谢你提供的代码和如此详细的文章。优化极值搜索 的想法非常好! rapblH_spb 2024.10.08 12:42 #39 ToRealInd(int index) 中有一处错误。 应该是 if(index >= GetTotal() || index < 0) 返回 m_max_total-1; 1234 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
这篇文章很棒,他很会编程!
如果德文翻译不那么糟糕就好了!!!!!
您好、
非常感谢您的提示。翻译已经更正。
致以最诚挚的问候
您好,瓦西里-索科洛夫!
您利用环形缓冲器创建的指标显示不清楚,我猜是 ChangeValue 方法不起作用,或者是我误解了什么?
我已经看到了。我检查了你提供的示例。它们显示了我在处理市场运行时更新数值时遇到的相同问题。请查看您提供的随机指标。添加新值不成问题,但当我们尝试在 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;之前没有这个值,它会导致返回不正确的索引。请注意,我根据自己的编程风格更改了变量/方法名称,但想法是一样的。
非常感谢作者。萨维奥,也许你看到的错误就在这里:
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" 的第
行。
图片:
2.在搜索数组的最小和最大元素时,如果完全作为环形缓冲区使用(当新元素开始写入数组开头时),min 和 mah 的定义是错误的。最小值大于最大值。在一个数组中。使用标准方法(ArrayMinimum 和 ArrayMaximum)一切正常。
图片:
某个地方的索引出错了。我自己解决不了。如果有人能解决,那就太好了。我附上了一个测试顾问。
ToRealInd(int index) 中有一处错误。
应该是