最低和最高函数返回什么 - 页 2

 
ñ
无法回复(我不在)。发布你需要解析的代码来谈论一件事。
ZS 在那个之字形不是一个错误,而是一个错字(与MT3中的代码相比),我只发现了这个错字,没有纠正其他的东西。
 
Vladislav,由于某些原因,你的代码不能在所有的时间框架上 工作。它在一些时间框架内有效,但在另一些时间框架内则无效。这很奇怪,它是有效的。
 
Rosh,这里是来自codebase.mql4.com的代码。我也有一个。如果有可能与整个世界一起克服它,我将非常感激。我不会是唯一的人。提前感谢您的帮助。

我现在已经积累了大量的这些或其他的编辑。他们的工作相当好。然而,第一条射线--从零条或任何一条第一条开始的射线--在识别极值的功能上出现了错误。而且指标工作不稳定。

//+------------------------------------------------------------------+
//| 自定义移动平均线.mq4|
//| Copyright © 2005, MetaQuotes Software Corp.
//|https://www.metaquotes.net/|
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#属性链接"https://www.metaquotes.net/

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- 指标参数
外部intDepth=12。
Extern inttern ExtDeviation=5;
Extern inttern ExtBackstep=3;
//---- 指示器缓冲区
双倍ExtMapBuffer[]。
双倍ExtMapBuffer2[]。

//+------------------------------------------------------------------+
//|自定义指标初始化功能
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(2)。
//---- 绘图设置
SetIndexStyle(0,DRAW_SECTION)。
//---- 指示器缓冲区的映射
SetIndexBuffer(0,ExtMapBuffer)。
SetIndexBuffer(1,ExtMapBuffer2)。
SetIndexEmptyValue(0,0.0)。
//---- 指标短名称
IndicatorShortName("ZigZag("+ExtDepth+", "+ExtDeviation+", "+ExtBackstep+")")。
//---- 初始化完成
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int shift,back,lasthighpos,lastlowpos。
double val,res;
双层Curlow,Curhigh,lasthigh,lastlow。

for(shift=Bars-ExtDepth; shift>=0; shift--)
{
val=Low[Lowest(NULL,0,MODE_LOW,ExtDepth,shift)]。
如果(val==lastlow)val=0.0。
否则
{
lastlow=val。
如果((Low[shift]-val)>(ExtDeviation*Point)) val=0.0。
否则
{
for(back=1; back<=ExtBackstep; back++)
{
res=ExtMapBuffer[shift+back]。
如果((res!=0)&&(res>val))ExtMapBuffer[shift+back]=0.0。
}
}
}
ExtMapBuffer[shift]=val。
//----高
val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)]。
如果(val==lasthigh)val=0.0。
否则
{
lasthigh=val;
如果((val-High[shift])>(ExtDeviation*Point)) val=0.0。
否则
{
for(back=1; back<=ExtBackstep; back++)
{
res=ExtMapBuffer2[shift+back]。
如果((res!=0)&&(res<val))ExtMapBuffer2[shift+back]=0.0。
}
}
}
ExtMapBuffer2[shift]=val。
}

// 最后切割
lasthigh=-1; lasthighpos=-1。
lastlow=-1; lastlowpos=-1。

for(shift=Bars-ExtDepth; shift>=0; shift--)
{
curlow=ExtMapBuffer[shift]。
curhigh=ExtMapBuffer2[shift]。
如果((curlow==0)&&(curhigh==0)) 继续。
//---
如果(curhigh!=0)
{
if(lasthigh>0)
{
if(lasthigh<curhigh) ExtMapBuffer2[lasthighpos]=0;
否则ExtMapBuffer2[shift]=0。
}
//---
if(lasthigh<curhigh || lasthigh<0)
{
lasthigh=curhigh。
lasthighpos=shift。
}
lastlow=-1。
}
//----
如果(curlow!=0)
{
如果(lastlow>0)
{
如果(lastlow>curlow)ExtMapBuffer[lastlowpos]=0。
否则ExtMapBuffer[shift]=0。
}
//---
如果((curlow<lastlow)|(lastlow<0))
{
lastlow=curlow。
Lastlowpos=shift。
}
lasthigh=-1。
}
}

for(shift=Bars-1; shift>=0; shift--)
{
如果(shift>=Bars-ExtDepth)ExtMapBuffer[shift]=0.0。
否则
{
res=ExtMapBuffer2[shift]。
如果(res!=0.0) ExtMapBuffer[shift]=res。
}
}
}
 
Vladislav,由于某些原因,你的代码不能在所有的时间框架上工作。它在一些时间框架内有效,但在另一些时间框架内则无效。这很奇怪,它是有效的。<br / translate="no">


它在其他时间框架上有效,但在其他时间框架上则无效。这对我来说似乎很有效。是的,而且这不是我的代码--从标准供应看来是这样的。至少我在所有版本的MT中都是如此。
 
Vladislav,很明显,这不是你的代码。我的快递里有我提供的代码。
在哪些时间段不显示。BC - Brezan。
GBP-CHF
在M1和M15上没有显示。它显示在所有其他地方。
EUR-USD
它没有显示 - m1, m5
AUD-USD - 全部显示。
我不知道为什么会出现这种情况。

也许,你有Slava在夏天重做的代码。但我不喜欢他的重做。有些问题在那里没有得到解决。
================
GODZILLA(尼古拉)干得不错。但它只解决了两个问题。
1)在每个刻度 上重新计算。他大幅减少了
2)增加了一个去除驼峰的算法。驼峰的出现主要是由于一个柱子上同时出现了最小值和最大值。之字形的算法只留下高点。这往往会导致连续做出几个高点。

我有一些指标改进的变体被GODZILL修复。悬在空中的疙瘩已经被消除。然而,我想在前两条射线中,极值搜索的函数的不正确操作仍然存在。正是因为这个问题,我在这里提出了这个话题。

然而,也许搜索功能可以正常工作,但对这一功能却没有明确的描述。这就是为什么它被错误地使用。
 
我把它显示在指定对的所有t/f上。我不记得这段代码是从哪里来的--我以为是在197年的构建交付中--出于某种原因,我在所有的MT中都有这个代码:)。我明天会检查的。
 
惭愧地说,我以前从未对人字形认真感兴趣 :)。nen的 帖子中的代码 18.10.06 17:46
我还搞不清楚。在我看来应该是这样的......
// val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)]; highpos=Highest(NULL,0,MODE_HIGH,ExtDepth,shift); val=High[highpos]; if(MathAbs(val-lastlow) < Point) val=0。0; // if(val=lasthigh) val=0.0; else { lasthigh=val; if(highpos!=shift) val=0.0; // if((val-High[shift])>(ExtDeviation*Point)) val=0.0; else{ ...


这里,"额外的 "旧代码被注释掉了。虽然我可能还没有完全理解 "之 "字形的想法。在任何情况下,这段代码都不会产生悬空的极值。如果这个代码变体适合,但它不是我发明的:),我为缺乏参考而道歉。

 
诚实的,谢谢你。我看看效果如何。但主题标题中的问题并没有消失。仅仅是 "之 "字形就揭示了寻找极值的函数的 "不可理解的 "工作问题。highpos=Highest(NULL,0,MODE_HIGH,ExtDepth,shift);这一行有助于找到一个极值。然而,在人字形代码中运行时,Highest函数返回的高位索引往往是随机的。与真实的酒吧位置有偏差。换句话说,高位数将是,比如说,15。但事实上,酒吧将有一个不同的指数:13或16或其他的东西。所以你会得到不同的结果。因此,小参数值和 "小 "时间段(1分钟、5分钟......)的Zigzag开始工作不稳定。

好吧。不要在意 "之 "字形。问题不是关于 "之 "字形的。问题是,MQ4语言的功能 应该稳定地、可预测地工作。

这就是主要的问题。搜索功能不仅在ZigZag中使用。但也在许多其他指标上。

人字形是一个特殊的情况。但这有助于突出问题。许多指标都是基于人字形的。之字形的工作不稳定。这对任何人来说都不是一个秘密。许多人不得不花时间为自己的需要编制自己的人字形。浪费了多少时间。徒劳无功。因为对问题的根源缺乏了解。
 
诚实,你的话:惭愧地说,.....nen的帖子18.10.06 17:46中的代码还没有理解。

这些是金玉良言。你不是第一个这样说的人。尽管如此,"之 "字形背后的想法和这段代码中部分实现的想法是非常好的。必须将这些想法付诸实施。
 
2nen:
当我们在计算指标 时移动窗口(shift,shift+ExtDepth),新极值的出现可能既与新价格有关,也与旧极值离开窗口有关。这一点需要得到处理。为了这个目的,我的插入包含一行if(highpos!=shift) val=0.0; .标准代码中是如何做到这一点的,我不明白。从我的版本中缺失的悬空极值来看,它要么做得不正确,要么根本就没有做。
那么 "之 "字形的不稳定性究竟是什么?
原因: