您应当知道的 MQL5 向导技术(第 56 部分):比尔·威廉姆斯(Bill Williams)分形
概述
比尔·威廉姆斯的分形指标在已知收集品中一个关键且重要的指标。它主要识别所交易品种价格动作中的逆转点。基于分形的概念,作为一个重现的 5-柱线形态,如果 5-柱线的中间柱线最高价是最高点,往往被标记为看跌;如果中间柱线的最低价是最低点,则被标记为看涨。我们会像以往的 MQL5 向导文章一样,考察该指标的一些可用形态。
同向的连续分形
对于我们的第一个形态,形态-0,多头形态定义为一连串多头分形低点在/或接近前低点的位置。这通常被解读为市场此刻正在寻找支撑。重点要注意,连续分形低点是指低点之间没有分形高点。这是一个重要指标,因为典型形态是分形高点紧随分形低点交替出现。不过,对于看涨形态,这被认为表明不同买家在相似的价位入场,这再度夯实了在上涨前会有一个积累阶段的观点。
相较之,多个连续看跌分形高点可能映射出价格无法突破的阻力位。这种强烈的抵触(或在较大时间帧反复抵触)往往意味着强烈的卖压,以及可能的下跌趋势持续或开始。
我们实现的 MQL5 版本形态-0 如下:
//+------------------------------------------------------------------+ //| Check for Pattern 0. | //+------------------------------------------------------------------+ bool CSignalFractals::IsPattern_0(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && FractalLow(X() + 1) != 0.0 && FractalLow(X()) != 0.0) { return(true); } else if(T == POSITION_TYPE_SELL && FractalHigh(X() + 1) != 0.0 && FractalHigh(X()) != 0.0) { return(true); } return(false); }
默认情况下,内置指标套件中包含比尔·威廉姆斯分形指标。它需要做一些调整,在于它的上边界/高点、和下边界/点低缓冲区的很多数值在初次用到时会产生无效数字错误。因此,我们创建一个修改版,引入两个函数:FractalHigh 和 FractalLow。两者的代码清单如下:
double FractalHigh(int ind) { // m_high.Refresh(-1); if(m_high.MaxIndex(ind, 5) == ind) { return(m_high.GetData(ind)); } return(0.0); }
double FractalLow(int ind) { // m_low.Refresh(-1); if(m_low.MinIndex(ind, 5) == ind) { return(m_low.GetData(ind)); } return(0.0); }
在形态-0 函数中,我们 在检查看多信号时,简单地据前两根连续柱线调用 FractalLow 函数,或寻找看跌形态时同样调用 FractalHigh。如果需要过滤更多假信号,读者可增加连续柱线的数量来自定义。正如通常情况,在它们可获信任前,较少交易需要覆盖更长区间测试。我们针对该指标所有形态的测试,都依据 GBPUSD 的 2024 年 H4 时间帧执行,而形态已据 2023 年做过优化了。形态-0 的前向漫游为我们给出以下报告。

形态-0示意强劲趋势延续。因此,如果当时已获利了结,它有助于顺应盛行趋势重新开仓。
分形趋势突破
我们的第二个形态-1,看涨形式的定义首先参照一个曾作为阻力的看跌分形。看涨形态出现在价格逆势而上,果断突破这个分形高点之时。该突破被解读为买方压倒卖方,令原阻力位折返为支撑位,暗示趋势逆转。如果它发生在一个更宽的看涨趋势中,这也可能是强劲趋势的延续,而在小的时间帧内这并不明显。
看跌版本形态-1 则如预期般恰恰相反。看涨的低点分形之后,紧随价格将跌破分形低点。该突破被视为卖方掌控局面、为下跌趋势奠定基础的信号。我们的 MQL5 实现如下:
//+------------------------------------------------------------------+ //| Check for Pattern 1. | //+------------------------------------------------------------------+ bool CSignalFractals::IsPattern_1(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && FractalHigh(X() + 1) != 0.0 && Close(X()) > FractalHigh(X() + 1)) { return(true); } else if(T == POSITION_TYPE_SELL && FractalLow(X() + 1) != 0.0 && Close(X()) < FractalLow(X() + 1)) { return(true); } return(false); }
在我们上面的代码中,我们检查的是上一根柱线上的分形点,然后将当前收盘价与该分形的价格进行比较。正如逻辑论调,分形高点(看跌分形)与看涨形态相关,分形低点对看跌形态亦如此。
基于 2023 年开盘和收盘阈值进行优化,前瞻测试则从 2024年开始,为我们给出以下结果:

形态-1 之所以高出一筹,是因为与延续形态-0 不同,这可以作为逆反。有因于此,最好将它和其它指标配合使用。
分形内部(最低价的低点,最高价的高点)
形态-2 的看涨形式定义为看涨分形(波段低点)接近之前较宽分形范围。价格动作往往在该范围内压缩,低位分形几乎形成一条直线。故此,当价格移至该狭窄范围上方时,即确认看涨倾向,因为买方将价格推离盘整区域。
而翻过来说,随着看跌分形形成,如果摆动高点在先前的看跌分形范围内形成集群,这类似标记犹豫不决的阶段。一旦价格跌破该范围下限,则支撑失效,突破下行将确认看跌走势。这是我们实现的该方法 MQL5 版本:
//+------------------------------------------------------------------+ //| Check for Pattern 2. | //+------------------------------------------------------------------+ bool CSignalFractals::IsPattern_2(ENUM_POSITION_TYPE T) { CArrayDouble _buffer; if(T == POSITION_TYPE_BUY) { for(int i = 0; i < m_periods; i++) { if(FractalLow(X() + i) != 0.0) { _buffer.Add(FractalLow(X() + i)); } } if(_buffer[_buffer.Maximum(0, _buffer.Total())] - _buffer[_buffer.Minimum(0, _buffer.Total())] <= fabs(Close(X()) - Close(X() + 10))) { return(true); } } else if(T == POSITION_TYPE_SELL) { for(int i = 0; i < m_periods; i++) { if(FractalHigh(X() + i) != 0.0) { _buffer.Add(FractalHigh(X() + i)); } } if(_buffer[_buffer.Maximum(0, _buffer.Total())] - _buffer[_buffer.Minimum(0, _buffer.Total())] <= fabs(Close(X()) - Close(X() + 10))) { return(true); } } return(false); }
实现这一形态需要,正如我们每次的方式,会用到一个数组标准类。这是因为我们正寻找的是覆盖固定区间的分形点,而我们能提取的数量是不确定的。据此,我们还需要了解这些分形点的标准差含义。
因为我们的数组类不像向量数据类型那样提供标准差函数,亦因计算密集,故我们选择取这些点的范围来替代。为了感知它们的范围是否被压缩,我们会将其与收盘价趋势的量级进行比较,如果更小,则我们得到确认。
严格来说,这是一个粗略的评估,在于在趋势行情中,当收盘价格变化量级较大时,任何一组分形点范围都会通过该测试。这就是为什么建议读者做一些修改,譬如说比较分形点范围、或其标准差与绝对值。该数值能通过优化来精调。
由向导汇编的智能系统经优化后,据 USDJPY 对,H4 时间帧,运行测试,为我们给出以下结果:

形态-2 为压缩形态,示意突破潜力。在多时间帧中,当时间帧较大时,您会得到较小的分形,通常意味着在扩张之前会出现挤压。
分形背离与价格动作
价格动作背离是我们的形态-3。对于该形态,当价格产生一个低点最低价(持续下行压力的指示),然而对应的看涨分形(波段低点)高于前一波段时,就会见到看涨背离。该背离被解读为看涨,理由是尽管价格下跌,但底部支撑正在增强,暗示看涨逆转马上到来。
另一方面,看跌背离是指价格形成更高的最高价,而看跌分形高点低于之前的高点。该设定通常表明尽管价格在上行,阻力仍在挤压价格,这可能是购买力下降、及您转下行的预警。我们实现的 MQL5 版本如下:
//+------------------------------------------------------------------+ //| Check for Pattern 3. | //+------------------------------------------------------------------+ bool CSignalFractals::IsPattern_3(ENUM_POSITION_TYPE T) { CArrayDouble _buffer; if(T == POSITION_TYPE_BUY) { for(int i = 0; i < m_periods; i++) { if(FractalLow(X() + i) != 0.0) { _buffer.Add(FractalLow(X() + i)); } if(_buffer.Total() >= 2) { break; } } if(_buffer[0] > _buffer[1] && Low(X()) < Low(X() + 1)) { return(true); } } else if(T == POSITION_TYPE_SELL) { for(int i = 0; i < m_periods; i++) { if(FractalHigh(X() + i) != 0.0) { _buffer.Add(FractalHigh(X() + i)); } if(_buffer.Total() >= 2) { break; } } if(_buffer[0] < _buffer[1] && High(X()) > High(X() + 1)) { return(true); } } return(false); }
编写形态-3 代码还需用到 MQL5 IDE 中可用的标准数组类。主要原因已在形态-2 中提及,不过在本例中我们仅寻找两个分形点,而非覆盖输入参数 “m_periods” 设定周期内的集合。我们结合这两个分形点,和两个价格点极值来确立潜在信号,如上论调。
优化后的前向漫游测试,采用与前述形态类似的品种、时间帧、和测试周期,为我们呈现如下报告:

双胞对立分形(您转区域)
双胞对立分形构成了我们的形态-4。该形态的看涨形式涉及放置两个雷同的分形,一个看涨(在低位)、及一个看跌(在高位)。这两者交错形成了一个犹豫不决的区域。当价格从看涨分形反弹,并升至看跌分形之上时,看涨信号确认。
若看跌形式,序列是一个看涨分形,紧随一个看跌分形。如果价格从看跌(高位)分形反弹,并跌破看涨分形,则卖出信号确认。我们的 MQL5 版本代码如下:
//+------------------------------------------------------------------+ //| Check for Pattern 4. | //+------------------------------------------------------------------+ bool CSignalFractals::IsPattern_4(ENUM_POSITION_TYPE T) { bool _1 = (FractalHigh(X() + 1) != 0.0 && FractalLow(X() + 1) != 0.0); bool _2 = (FractalHigh(X() + 2) != 0.0 && FractalLow(X() + 2) != 0.0); if(_1 || _2) { if(T == POSITION_TYPE_BUY) { if((_1 && Close(X()) > FractalHigh(X() + 1)) || (_2 && Close(X()) > FractalHigh(X() + 2))) { return(true); } } else if(T == POSITION_TYPE_SELL) { if((_1 && Close(X()) < FractalLow(X() + 1)) || (_2 && Close(X()) < FractalLow(X() + 2))) { return(true); } } } return(false); }
我们的代码用到两个布尔值来检查双胞分形形态。我们已选用 2 个布尔值,因为这种独特形态的影响可能会略微拖后(与滞后对立)。每个数值标记最后一根完整柱线,或其前一根柱线。如果找到该形态,我们只需检查收盘价是否跌破了上面解读的任何关键价位。
该形态优化后的前向漫游测试为我们给出以下报告:

连续出现的看涨和看跌分形也凸显出市场的另一个犹豫不决点。因此,两侧的突破信号就作为形态-4的信号。
分形确认波段高点 & 低点
对于该形态,即形态-5,我们考察覆盖一连串柱线的价格动作,其与分形基准的相对性。看涨形式定义为看涨分形(往往是潜在支撑位)设定,且后续价格动作并未显著跌破该价位。如果价格继续从该价位反弹,这就强化了其为看涨支撑区域的观点。
相较之,如果设定了一个分形高点,且后续价格动作未超过分形的高点基准,则看跌波段形式确立。此处的论调是,持续无法突破分形区的高位,强化了其作为阻力区间的角色,因此是看跌情绪的信号。我们实现的 MQL5 版本如下:
//+------------------------------------------------------------------+ //| Check for Pattern 5. | //+------------------------------------------------------------------+ bool CSignalFractals::IsPattern_5(ENUM_POSITION_TYPE T) { vector _std; _std.Init(5); _std.Fill(0.0); if(T == POSITION_TYPE_BUY && FractalLow(X() + m_periods) != 0.0) { if(_std.CopyRates(m_symbol.Name(), m_period, 4, 0, m_periods) && _std.Std() <= fabs(Close(X()) - Close(X() + m_periods))) { return(true); } } else if(T == POSITION_TYPE_SELL && FractalHigh(X() + m_periods)) { if(_std.CopyRates(m_symbol.Name(), m_period, 2, 0, m_periods) && _std.Std() <= fabs(Close(X()) - Close(X() + m_periods))) { return(true); } } return(false); }
我们上面的代码不仅用来复制所需的汇率缓冲区,还高效地提取其标准差。我们取该偏离,和收盘价距盛行趋势的量级进行比较,就如我们对形态-2 所做的那样。因此,形态-2 中浮现的瑕疵和注意事项于此均适用,故读者可自由修改附带的代码。
据上述类似的品种、窗口和时间帧优化后,运行一次向前测试,为我们给出如下报告:

在本系列中,之前我未做前向漫游测试,但由于测试窗口非常小,我们现在将其纳入作为标准。而会缺失的是覆盖训练期间的优化运行,因为两者同时进行会让文章过于拥挤。
分形失效波段
形态-6 专注于价格动作突破分形价位“失败”。对于看涨,在牛市分形波段之后,如果价格尝试向下突破且失败,即拒绝新低并快速逆转向上,这往往示意卖方已耗尽,买方需要介入。
相较之,对于看跌,当形成分形高点,并尝试突破该分形高位但失败时,这种“波段失败”被视为卖方掌控局势的信号,价格很可能头朝下跌趋势。MQL5 版本实现如下:
//+------------------------------------------------------------------+ //| Check for Pattern 6. | //+------------------------------------------------------------------+ bool CSignalFractals::IsPattern_6(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && FractalLow(X() + 2) != 0.0) { if(Low(X() + 1) <= FractalLow(X() + 2) && Close(X()) >= High(X() + 2)) { return(true); } } else if(T == POSITION_TYPE_SELL && FractalHigh(X() + 2) != 0.0) { if(High(X() + 1) >= FractalHigh(X() + 2) && Close(X()) <= Low(X() + 2)) { return(true); } } return(false); }
就编码而言,这是我们最直接了当的形态之一。如上论调,我们简单地将之前的最低价与其前的分形低点比较,然后比较收盘价与前一看涨时的两根柱线高点。我们在看跌时,遵照反向过程。至于历史回溯要选择多久,可由读者自行考虑。
在优化后进行前向漫游测试,正如形态0-5 同样的开仓和平仓阈值 ,为我们呈现如下报告:

若后续蜡烛未超过分形高位(或低位),往往被视为抵触。这是趋势耗尽的强烈信号。
围绕移动平均线的分形聚集
我们的第八个形态-7,结合了分形指标与移动平均线。对于看涨设置,当一连串分形低位聚集在移动平均线附近(例如 50-周期均线),这被视为移动平均线充当强支撑位的信号。因此,这些分形低位偏向为买方提供入场机会,一旦价格决定性突破最近的阻力位,甚至移动平均线,这就确认了看涨观点。
同样,看跌形式是指多个分形高位聚集在移动平均线周围,而此刻移动平均线充当阻力位。价格在这些价位反复遭抵触,且明显跌破支撑或移动平均线,则确认看跌倾向。MQL5 版本实现如下:
//+------------------------------------------------------------------+ //| Check for Pattern 7. | //+------------------------------------------------------------------+ bool CSignalFractals::IsPattern_7(ENUM_POSITION_TYPE T) { CArrayDouble _buffer; if(T == POSITION_TYPE_BUY) { for(int i = 1; i < m_periods; i++) { if(FractalLow(X() + i) != 0.0) { _buffer.Add(fabs(FractalLow(X() + i) - MA(X() + i))); } } if(_buffer[_buffer.Maximum(0, _buffer.Total())] <= fabs(Close(X() + 1) - Close(X() + m_periods)) && Close(X() + 1) <= MA(X() + 1) && Close(X()) > MA(X())) { return(true); } } else if(T == POSITION_TYPE_SELL) { for(int i = 1; i < m_periods; i++) { if(FractalHigh(X() + i) != 0.0) { _buffer.Add(fabs(FractalHigh(X() + i) - MA(X() + i))); } } if(_buffer[_buffer.Maximum(0, _buffer.Total())] <= fabs(Close(X() + 1) - Close(X() + m_periods)) && Close(X() + 1) >= MA(X() + 1) && Close(X()) < MA(X())) { return(true); } } return(false); }
形态-7 如同形态-2、形态-3,也用到数组类,但这次是记录分形点与移动平均线之间的缝隙大小。如上论调,我们正在寻找尽可能缩小该缺口的状况,这就是为什么我们从缓冲区内取所有缝隙点的最大值。我们再次将这一量级与盛行趋势进行比较,故提醒读者如上其它形态所述进行调整,譬如形态-6。
按照上述形态优化时所用的品种和输入设置进行前向漫游测试,为我们给出如下报告:

当许多分形在移动平均线附近固定时,它暗示存在一个枢轴区域,并依聚集突破确认延续或逆转。
分形缝隙形态
对于形态-8,看涨信号是当看涨分形低位处于价格缝隙附近(通常在高波动性、或新闻驱动的价格动作期间)。在这种状况下,更细充当支撑区。缝隙处存在分形,则被解读为买家把该区域视作一个机会。一旦缺口被“填补”或维持,很可能会出现上行。
看跌形式还指当一个看跌分形高点出现在价格缝隙附近,或上端开放位置。在这种状况下,缝隙代表了一个阻力位。分形的存在表明卖方正在防守该价位,如果价格开始下行,则会锁定看跌趋势。我们实现的 MQL5 版本如下:
//+------------------------------------------------------------------+ //| Check for Pattern 8. | //+------------------------------------------------------------------+ bool CSignalFractals::IsPattern_8(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && FractalLow(X() + 2) != 0.0) { if(Low(X() + 1) > High(X() + 2) && Close(X()) >= High(X() + 2)) { return(true); } } else if(T == POSITION_TYPE_SELL && FractalHigh(X() + 2) != 0.0) { if(High(X() + 1) < Low(X() + 2) && Close(X()) <= Low(X() + 2)) { return(true); } } return(false); }
对于形态-8,我们只是对价格缺口感兴趣,故我们的上述实现几乎和形态-6 一样直接了当。
按照与上面类似的品种和测试环境设置进行前瞻漫游测试,USDJPY 的 2023 年 H4 时间帧,给出如下:

价格缺口与分形突破的巧合始终放大价格走势。不过,这种设置在新闻驱动的事件中更为常见。
分形排列与斐波那契级别
我们的最终形态是把分形和斐波那契级别结合。当低位分形与关键的斐波那契回撤级别重合时,就会出现看涨排列。在分形所识别支撑、与斐波那契级别重合,强化了支撑区域的强度。因此,这一双重确认充当了健壮的看涨信号 — 如果价格维持该级别。通常,这可能是反弹或趋势延续的信号。
在看跌形式中,高位分形与关键的斐波那契回撤级别排列。这种排列会在那一点强化阻力。如果价格难以突破斐波那契区域,取而代之从重合区向下反转,则看跌信号确认。两种设置的 MQL5 版本编码如下:
//+------------------------------------------------------------------+ //| Check for Pattern 9. | //+------------------------------------------------------------------+ bool CSignalFractals::IsPattern_9(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && FractalLow(X()) != 0.0) { if(Is_Fibo_Level(X())) { return(true); } } else if(T == POSITION_TYPE_SELL && FractalHigh(X()) != 0.0) { if(Is_Fibo_Level(X())) { return(true); } } return(false); }
如何为我们的最终形态编码有些难以构思,因为这在手工交易中始终显而易见,但遇到自动化却是困难重重。我们该如何“绘制”和标记斐波那契级别?我们设计了一个底层函数来帮助我们实现这一点,我们称其为 “Is_Fibo_Level()”。其代码给出如下:
bool Is_Fibo_Level(int ind) { double _r=0.0; vector _h,_l; int _size = 3 * PeriodSeconds(PERIOD_MN1) / PeriodSeconds(m_period); _h.Init(_size); _l.Init(_size); if(_h.CopyRates(m_symbol.Name(),m_period,2,0,_size) && _l.CopyRates(m_symbol.Name(),m_period,4,0,_size)) { _r = _h.Max()-_l.Min(); if(_l.Min()-ATR(ind) <= Close(ind) && Close(ind) <= _l.Min()+ATR(ind)) { return(true); } else if(_l.Min()+(0.236*_r)-ATR(ind) <= Close(ind) && Close(ind) <= _l.Min()+(0.236*_r)+ATR(ind)) { return(true); } else if(_l.Min()+(0.382*_r)-ATR(ind) <= Close(ind) && Close(ind) <= _l.Min()+(0.382*_r)+ATR(ind)) { return(true); } else if(_l.Min()+(0.5*_r)-ATR(ind) <= Close(ind) && Close(ind) <= _l.Min()+(0.5*_r)+ATR(ind)) { return(true); } else if(_l.Min()+(0.618*_r)-ATR(ind) <= Close(ind) && Close(ind) <= _l.Min()+(0.618*_r)+ATR(ind)) { return(true); } else if(_h.Max()-ATR(ind) <= Close(ind) && Close(ind) <= _h.Max()+ATR(ind)) { return(true); } } return(false); }
该函数简单地从过去三个月的价格里抽样,一个任意的时间区间显然无法像手工设置那样捕捉关键价位。人们总说,“布丁的证据在于吃“,故大概过于纠结于我们手工的视角,或许就不能转化为交易绩效,这也是我们将其开发成形态-9 的原因,我们简单地寻找分形点与该函数级别之间的重合。ATR 也被用来设定我们非常底层的级别宽度,故如果有三个月窗口内的波动率较低这样的事件,出现大量重叠在所难免。对于感兴趣的读者,这可作为修改时的起点。
如我们针对其它五种形态所做的那样,前向漫游测试为我们给出这样的报告:

因此,这一形态可作为关键逆转区域的确认。在这些系列中,每当我们查看形态时,也考虑过不只用一个形态的选项(如上述 9 种形态),也可将所有形态组合运用。
组合形态
附带的代码涵盖了我们所有 9 种形态,均以自定义信号类的形式。我们在 MQL5 向导中用该类来汇编智能系统。这里和这里都有关于如何操作的指南。我们上述进行的单一形态优化和测试,基于分配输入参数映射 — 使用一种特殊索引,形式为 2 的幂次方,幂值是形态的索引。故形态-5 是 2^5,其结果是 32,形态-7 就是 128,依此类推。当配合多个形态交易时,这个输入作为一张映射图,而非指向特定形态的指针。我们有 9 个形态,故参数的最大值是 2^9,即 512 减一(因为我们从零开始计数)。
如果我们据开盘和收盘阈值来优化最佳形态组合,那么我们的最佳输入设置如下:

据训练数据运行测试,为我们给出以下报告:


而前向漫游测试,到来年 2024 年,为我们给出以下结果:


我认为这些结果印证了之前文章中强调的观点,即组合多种形态需要交易者具备专业知识。他需要非常具体地组合形态。从优化运行中应当不能寻出答案。我们已考察了各个形态的前瞻测试。这是基于一年如此长度的测试区间,而过去的绩效并不代表未来结果。我还要说,选择信号形态时需要有针对性的方式,而这与平均化对立。
时间帧的重要性
分形的解读高度主观化,取决于所用的时间帧。较高时间帧如 H4、日报、和周线能提供更强、且更可靠的信号,因为它们偏重过滤大量市场杂音。这些时间帧上的分形往往标记着关键支撑和阻力位,而这是机构和长线交易者所关注的。信号生成的形式非常缓慢,这对许多交易者来说可能令人沮丧,但它们一旦形成,往往是高置信度的设置。
翻过另一面,M15、M20、M30 等较低时间帧的出现频率更高,但由于短期价格波动,可靠性较低。它们最适合剥头皮策略,因为更有利快速反应。不过,作为规则,它们更容易出现假突破,需要额外的过滤器来提升准确度。
还有中性时间帧 H1、H2,纸面上应能在两者之间找到折中。邀请读者去探究这一切的真实性;然而,最佳实践表明,在较长时间帧内组合分形效果良好。
结束语
分形在流动性高、且机构兴趣强烈的市场中趋于坚定的存在。低成交量价格尖刺必然会产生假分形,并很快被否定,这就是为何交易量分析、或足迹图表能增加基于分形的决策信心。
话尽于此,我们已考察了这个非常“关键”指标的 9 个独立形态,虽然它在较短时间帧上存在主要缺点,但如果耐心地在较长时间帧内使用,可能会产生有趣的结果,正如我们从某些形态 1 年期的前向漫游测试中所见。
| 文件 | 描述 |
|---|---|
| SignalWZ_56.mqh | 信号类文件 |
| WZ_56.mq5 | 智能系统展品的包含文件 |
本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/17334
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
本文由网站的一位用户撰写,反映了他们的个人观点。MetaQuotes Ltd 不对所提供信息的准确性负责,也不对因使用所述解决方案、策略或建议而产生的任何后果负责。
MQL5 简介(第 16 部分):利用技术图表形态构建 EA 交易
MQL5 中的高级订单执行算法:TWAP、VWAP 和冰山订单
MQL5交易工具(第二部分):为交互式交易助手添加动态视觉反馈
突破机器学习的局限(第一部分):缺乏可互操作的度量指标