English Русский Español Deutsch 日本語 Português
preview
您应当知道的 MQL5 向导技术(第 39 部分):相对强度指数

您应当知道的 MQL5 向导技术(第 39 部分):相对强度指数

MetaTrader 5交易系统 |
455 1
Stephen Njuki
Stephen Njuki

概述

在上一篇文章中,我们开始考察在向导汇编智能系统的自定义信号类中使用布林带。我们考察了预期 8 种可能设置中的 6 种,这些自定义信号类中的设置,在交易者称量做多和做空条件时很实用。因为该文章篇幅太长,最后两个设置,以及所有可能的布林带设置、或模式的组合测试,我们当时只是略有提及。因此,我们继续考察形态 6。


下行或上行趋势之后轨道变宽

我们的第七种设置,标记为形态 6,主要的铰链是围绕波动性上升。布林带上下轨之间敞口的扩张总是被视为波动性上升的迹象。在这种形态的情况下,因这种波动性上升是在趋势末尾才会到来,价格行为中的大量拉锯是行情的特征,这就会推断出先前趋势待定逆转的假设。

因此,在解释该设置时,走牛之后上下轨之间的敞口扩张被视为走熊信号,而走熊后类似的敞口扩宽则示意做多。因此,这是一个对比信号,寻找与近期主导趋势相对的机会开仓。我们按如下方式实现该形态的 MQL5 版本:

//+------------------------------------------------------------------+
//| Check for Pattern 6.                                             |
//+------------------------------------------------------------------+
bool CSignalBollingerBands::IsPattern_6(ENUM_POSITION_TYPE T)
{  m_bands.Refresh(-1);
   m_close.Refresh(-1);
   m_high.Refresh(-1);
   m_low.Refresh(-1);
   if(Gap(StartIndex()) > Gap(StartIndex() + 1) && Gap(StartIndex() + 1) > Gap(StartIndex() + 2))
   {  if(T == POSITION_TYPE_BUY && m_close.GetData(StartIndex() + 2) < m_close.GetData(StartIndex() + 3) && m_close.GetData(StartIndex() + 3) < m_close.GetData(StartIndex() + 4))
      {  return(true);
      }
      else if(T == POSITION_TYPE_SELL && m_close.GetData(StartIndex() + 2) > m_close.GetData(StartIndex() + 3) && m_close.GetData(StartIndex() + 3) > m_close.GetData(StartIndex() + 4))
      {  return(true);
      }
   }
   return(false);
}

从我们上面的代码中可见,检查扩宽的波动性是看涨和看跌设置的先决条件。一旦检查通过,我们就会参考波动性扩张开始时的先前趋势,而非当前趋势。我们不要看当前趋势,因为如上所述,在如此波动的环境中,方向并不明确,但波动性飙升之前的趋势往往更加清晰。

因此,当前趋势不明朗的状况下,总是存在突破延续的风险,价格并不像人们预期的那样逆转,而是简单地自这个“盘整区”突破,并延续波动性飙升之前的先前趋势。因此,这需要与成交量分析相辅相成,这样,如果轨道随着交易量的下降而扩张,则可当作确认趋势逆转论点。如果交易量没有收缩,那么交易者最好等待更合适的逆转点。正如我们在上一篇文章的形态 2 中看到的那样,这是我们论文的大部分内容。

如前所述,交易量信息很难获取,这就是为什么我们主要依赖价格柱线范围作为代理的原因。我们在下面看到的 RSI 等替代指标也可用来确认超买和超卖价格点。来自向导汇编的智能系统的测试,我们得到以下结果:

r_6_ol

c_6_ol


轨道方向和角度变化

我们研究布林带的最后一个形态与上/下轨道之间的偏斜有关。当下轨的上升速度快于上轨,上升速度等于或大于布林带的偏差输入参数的倍数时,我们将其解释为看涨信号。这是因为这种设置排列预示着向上突破,贯穿上轨阻力位。以实际价格突破的形式进行确认,可以补充该信号,从而令入场点更清晰。看跌设置是这一点的镜像,如果高轨的下降速度比低轨快,则低轨充当即将被突破的支撑。再有,确认该突破的信号,诸如当价格收盘后低于下轨线。我们的 MQL5 实现如下:

//+------------------------------------------------------------------+
//| Check for Pattern 7.                                             |
//+------------------------------------------------------------------+
bool CSignalBollingerBands::IsPattern_7(ENUM_POSITION_TYPE T)
{  m_bands.Refresh(-1);
   m_close.Refresh(-1);
   m_high.Refresh(-1);
   m_low.Refresh(-1);
   if
   (
      T == POSITION_TYPE_BUY &&
      Lower(StartIndex()) > Lower(StartIndex() + 1) &&
      Lower(StartIndex() + 1) > Lower(StartIndex() + 2) &&
      Upper(StartIndex()) >= Upper(StartIndex() + 1) &&
      Upper(StartIndex() + 1) >= Upper(StartIndex() + 2) &&
      Lower(StartIndex()) - Lower(StartIndex() + 2) >= m_deviation * (Upper(StartIndex()) - Upper(StartIndex() + 2))
   )
   {  return(true);
   }
   else if
   (
      T == POSITION_TYPE_SELL &&
      Upper(StartIndex()) < Upper(StartIndex() + 1) &&
      Upper(StartIndex() + 1) < Upper(StartIndex() + 2) &&
      Lower(StartIndex()) <= Lower(StartIndex() + 1) &&
      Lower(StartIndex() + 1) <= Lower(StartIndex() + 2) &&
      Upper(StartIndex() + 2) - Upper(StartIndex()) >= m_deviation * (Lower(StartIndex() + 2) - Lower(StartIndex()))
   )
   {  return(true);
   }
   return(false);
}

如上所述,这个来源可配合价格突破确认来补充,读者可做到这一点,因为完整的源代码附在文章底部。当我们采用输入映射来测试我们汇编好的智能系统时,采用 80 的形态,其严格对应于第 8 个形态,我们得到以下结果:

r_7_ol

c_7_ol

这是来自仅用形态 7 的最优运行之一。然而,如前所述,我们修改了自定义信号,打破惯例,允许同时使用多个形态。因此,如果我们进行几次优化运行,寻找形态的最佳组合,及其各自的开盘/收盘阈值,我们会获得许多合理的测试结果,其中我们得到以下结果:

r_all_ol

c_all_ol

这些结果均有不同,据此情况采用布林带的多种形态,这可能是合理的,前提是请记住,这些信号在适配不同行情环境时,它们也会相互抵消。这令该系统更加难以证明或交叉验证,不过如果可以通过品质良好的测试数据来达成这一点,供系统能在将来取用。在输入映射中筛选出该布林带自定义信号类形态的做多和做空条件,与我们下面 RSI 自定义类的条件相同。做多条件的典型清单(简单地镜像做空条件)分享如下:

//+------------------------------------------------------------------+
//| "Voting" that price will grow.                                   |
//+------------------------------------------------------------------+
int CSignalRSI::LongCondition(void)
{  int result  = 0, results = 0;
//--- if the model 0 is used and "Price Crossing the Upper Band or the Lower Band"
   if(((m_patterns_used & 0x01) != 0) && IsPattern_0(POSITION_TYPE_BUY))
   {  result += m_pattern_0;
      results++;
   }
//--- if the model 1 is used and "Price Bouncing Off Lower Band or Upper Band "
   if(((m_patterns_used & 0x02) != 0) && IsPattern_1(POSITION_TYPE_BUY))
   {  result += m_pattern_1;
      results++;
   }
//--- if the model 2 is used and "Price Squeeze Followed by a Breakout Above Upper Band or Below Lower Band "
   if(((m_patterns_used & 0x04) != 0) && IsPattern_2(POSITION_TYPE_BUY))
   {  result += m_pattern_2;
      results++;
   }
//--- if the model 3 is used and "Price Double Bottoms Near Lower Band or Double Top Near Upper Band "
   if(((m_patterns_used & 0x08) != 0) && IsPattern_3(POSITION_TYPE_BUY))
   {  result += m_pattern_3;
      results++;
   }
//--- if the model 4 is used and "Price Bounces Off the Middle Band from Above & Bounce Off from Below "
   if(((m_patterns_used & 0x10) != 0) && IsPattern_4(POSITION_TYPE_BUY))
   {  result += m_pattern_4;
      results++;
   }
//--- if the model 5 is used and "Volume Divergence at Lower Band or Upper Band  "
   if(((m_patterns_used & 0x20) != 0) && IsPattern_5(POSITION_TYPE_BUY))
   {  result += m_pattern_5;
      results++;
   }
//--- if the model 6 is used and "Bands Widening After Downtrend or After Uptrend "
   if(((m_patterns_used & 0x40) != 0) && IsPattern_6(POSITION_TYPE_BUY))
   {  result += m_pattern_6;
      results++;
   }
//--- if the model 7 is used and "Bands Orientation and Angle Changes "
   if(((m_patterns_used & 0x80) != 0) && IsPattern_7(POSITION_TYPE_BUY))
   {  result += m_pattern_7;
      results++;
   }
//--- return the result
   if(results > 0)
   {  return(int(round(result / results)));
   }
   return(0);
}

在这两种条件下,我们利用按位运算来检查所用形态的输入映射是否允许采用给定形态。正如我们在布林带中所见,这 8 种形态各有其独特的指数 1、2、4、8、10、20、40 和 80。由于所用形态的输入映射是 0 - 255 范围内的整数,因此我们只需检查是否基于输入值,选择了这些形态中的每一个。例如,输入映射值 107 意味着仅选择模式 0、1、3、5 和 6。我们上次运行布林带时,除了其它阈值外,我们主要针对该输入映射进行优化。我们现在考察查看下面的 RSI,继续我们的文章。 


相对强弱指数

RSI 是一款非常流行的震荡指标,相当多的交易者在交易和平仓时都依赖它。如文章摘要和分享链接中所述,它是一个跟踪价格变化率的指数,此为预测给定价格趋势的任何未决逆转。如果您退一步思考,从 2002 年 6 月到现在,技术上,欧元兑美元一直在 0.95 到 1.60 之间波动,可以说在接下来的 22 年里,它可能仍保持在这个区间内。这些是可观的巨大变动,因为它们代表了很多点数;然而,它与股票指数不同的是,股票指数比之 2002 年的水平几乎都是上涨。故此,当一个外汇对超买或超卖时,先发制人的重要性仍是许多交易者的一项重要技能。其公式由下式给出:

其中:

  • RS 是相对强弱,定义为指定期间内平均收益与平均亏损的比率:

计算这些平均收益/亏损的时间段是 RSI 指标的输入参数。以 MQL5 实现这一点,已由函数库代码处理。保持上一篇文章的主题,我们看看 RSI 更多的 8 种形态。我们按类似于上一篇文章中的模式来查看这些形态中的每一个,其中测试每个单独形态的测试结果与该形态的描述一起呈现。我们采用外汇对 USDJPY 的 2023 年日线时间帧进行测试。


超买/超卖水平(传统)

RSI 的形态 0 是分别低于或高于振荡指标水平 30 和 70 的传统突破。这是该指标的主要运用方式,鉴于该振荡器的受欢迎程度,它必须立足于一个可靠的设置。故此,跌破 30 水平表明证券超卖,通常预示着看涨入场,而突破 70 则含义相反。我们在自定义信号类中实现这一点,如下所示:

//+------------------------------------------------------------------+
//| Check for Pattern 0.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_0(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   if(T == POSITION_TYPE_BUY && Base(StartIndex()) <= 30.0)
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex()) >= 70.0)
   {  return(true);
   }
   return(false);
}

利用向导汇编的智能系统进行测试运行,此处此处有些关于如何使用所附代码创建智能系统的指南,我们得到以下结果:

r_0

c_0

像大多数震荡指标一样,RSI 的这种传统运用并非没有缺陷,就如在趋势行情中,震荡指标可以长时间保持在 70 水平以上(牛市时)、或在熊市境况保持在 30 水平以下。这往往意味着该振荡器可与其它指标(如移动平均线)、甚至 MACD 等振荡器相结合,以便正确建立现阶段信号。此外,在应对高度波动的资产时,将这些 70/30 的震荡指标水平定制到 80/20 可能更合适,从而避免过早开立证券持仓。

正如上面介绍中曾提到的,在区间震荡或盘整行情中使用这种形态无疑是理想的,而且震荡指标水平也可作为何时持仓离场的可靠指南,因为它们指出曾讨论过的行情过度。


RSI 失败摇摆(逆转)

第二种形态虽然一开始与形态 0 非常相似,但确又不同,因为它在测试其关键水平之后,会在振荡器中寻找中轴。这令它更清晰。看涨信号是测试 30 水平,然后突破该水平,而看跌的入场标志是上涨至 70 上方,随后收盘价低于它。我们的 MQL5 实现如下:

//+------------------------------------------------------------------+
//| Check for Pattern 1.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_1(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   if(T == POSITION_TYPE_BUY && Base(StartIndex() + 1) < 30.0 && Base(StartIndex()) > 30.0)
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex() + 1) > 70.0 && Base(StartIndex()) < 70.0)
   {  return(true);
   }
   return(false);
}

针对形态 1 的可交易性进行测试运行,为我们给出以下结果:

r_1

c_1

形态 1,失败摇摆,偏向于提供比简单地高于或低于关键振荡指标阈值更强的信号,因为它会们确认市场情绪的偏转,而这是由多个 RSI 移动所确认的。它们示意市场情绪正在逆转,无需一定要得到价格确认。最后一点,有论调说,RSI 的失败摇摆比 RSI 与价格方向的背离更可靠,其也可是 RSI 信号,正如我们在下面强调的那样。


RSI 背离(看涨/看跌背离)

当 RSI 沿给定方向移动,而价格往相反方向移动时,就会出现形态 2,再次示意行情走势潜在偏移。该背离信号,即当前上升趋势、或下降趋势可能正在减弱,如此这般反转可能迫在眉睫。这些背离或许是看涨、或看跌,当价格造就更低的低点,而 RSI 造就的低点较高时,即示意看涨背离;如果价格创出更高的高点,但 RSI 创出的高点较低,则示意看跌背离。为在我们的自定义信号类中就该形态进行编码,我们使用以下清单:

//+------------------------------------------------------------------+
//| Check for Pattern 2.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_2(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   m_close.Refresh(-1);
   if(T == POSITION_TYPE_BUY && 
   Close(StartIndex()) < Close(StartIndex() + 1) && 
   Close(StartIndex() + 1) < Close(StartIndex() + 2) && 
   Base(StartIndex()) > Base(StartIndex() + 1) && 
   Base(StartIndex() + 1) > Base(StartIndex() + 2)
   )
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && 
   Close(StartIndex()) > Close(StartIndex() + 1) && 
   Close(StartIndex() + 1) > Close(StartIndex() + 2) && 
   Base(StartIndex()) < Base(StartIndex() + 1) && 
   Base(StartIndex() + 1) < Base(StartIndex() + 2)
   )
   {  return(true);
   }
   return(false);
}

测试运行由向导汇编的智能系统,仅用形态 2,其中我们要求形态所用的输入映射为 4,为我们给出以下结果:

r_2

c_2

上述形态 1 中已提到的 RSI 背离没那么有弹性,不过其主要用途是作为价格逆转的早期预警指标。它们在趋势行情、或存在非常强劲趋势的状况下尤为重要。不过,它们产生的背离信号可能示意回调、而非逆转,这就是为什么有论调说它们不那么可靠。出于该原因,它往往需移动平均线,以及支撑/阻力趋势线等附加指标来补充。

因此,过滤掉假背离信号的需求在这里非常重要。能有帮助的是依靠更大的时间帧,尽管这些时间帧在生成信号方面效率较低,但往往更可靠。同样值得注意的是隐藏的背离。这些当作趋势延续的邮戳,看涨延续推断是从价格创出更高的低点,而 RSI 创出更低的低点;而隐藏的看跌背离是从价格创出更低的高点,以及 RSI 创出更高的高点得出结论。


RSI 上穿/下穿中线(50 水平)

形态 3 专注于 RSI 中点,即 50 水平,认定任何下穿该水平都是看跌,而任何向上突破该水平都是看涨。默认情况下,RSI 接近 50 水平应当是表明不存在明确的信号,因此,正如人们所料,在该水平的任何交叉都只是暗示性的,通常需要确认,或者它们充当支持功能,作为其它趋势指标的过滤器。

若正“保持中立观望”,中线交叉既可作为趋势延续指标,亦可作为趋势逆转指标。如果 RSI 上穿 50,是看涨信号,确认看涨趋势延续;同样当 RSI 下穿,是看跌信号,确认看跌趋势延续。当 RSI 从下方突破 50 障碍,然后回落至下方时,确认反转看跌;而看涨则是在中线上呈相反的 U 形态。我们按如下方式实现形态 3:

//+------------------------------------------------------------------+
//| Check for Pattern 3.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_3(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   m_close.Refresh(-1);
   m_high.Refresh(-1);
   m_low.Refresh(-1);
   if(T == POSITION_TYPE_BUY && Base(StartIndex() + 1) < 50.0 && Base(StartIndex()) > 50.0)
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex() + 1) > 50.0 && Base(StartIndex()) < 50.0)
   {  return(true);
   }
   return(false);
}

仅用该形态测试运行,其中所用形态的输入参数分配为 8,结果如下:

r_3

c_3

中线交叉是迄今为止所有已研究形态的过度简化,这反过来又令其成为潜在信号中最不肯定的。因此,挂单搭配该类信号很常见,且它们跨越多个时间帧中使用也很常见。甚至,形态 3 也可用于尾随止损,对于多头持仓,只要 RSI 高于 50 中线,交易者就会持仓,而一旦它跌破该水平,就要平仓离场。反向设置则适用于空头持仓。


RSI 趋势线突破

形态 4 可能是我们在本文中看到的 8 种形态中最复杂的,在于它研究的是沿 RSI 的波峰或波谷,以及它们各自趋势线的突破。按照这种形态设置,如果 RSI 中的下降波峰之后,RSI 上升突破了波峰的趋势线,则解释为看涨信号。相较之,RSI 低谷上升,然后当前 RSI 读数突破、或跌破这些低谷的趋势线,则被视为看跌信号的指标。我们将其列出如下:

//+------------------------------------------------------------------+
//| Check for Pattern 4.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_4(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   if(T == POSITION_TYPE_BUY && 
   Base(StartIndex()) > Base(StartIndex() + 1) && 
   Base(StartIndex() + 1) < Base(StartIndex() + 2) && 
   Base(StartIndex() + 2) > Base(StartIndex() + 3) && 
   Base(StartIndex() + 3) < Base(StartIndex() + 4) && 
   Base(StartIndex() + 4) > Base(StartIndex() + 2) && 
   Base(StartIndex()) >= 2.0*Base(StartIndex() + 2)-Base(StartIndex() + 4)
   )
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && 
   Base(StartIndex()) < Base(StartIndex() + 1) && 
   Base(StartIndex() + 1) > Base(StartIndex() + 2) && 
   Base(StartIndex() + 2) < Base(StartIndex() + 3) && 
   Base(StartIndex() + 3) > Base(StartIndex() + 4) && 
   Base(StartIndex() + 4) < Base(StartIndex() + 2) && 
   Base(StartIndex()) <= 2.0*Base(StartIndex() + 2)-Base(StartIndex() + 4)
   )
   {  return(true);
   }
   return(false);
}

注意,我们不一定要寻找 RSI 的最后一个真实波峰或波谷,而是检查在最近 5 个 RSI 读数中是否有一连串波峰(看涨信号)、或波谷(看跌信号)。如果仅在最后 5 个 RSI 值内的检查为正值,那么我们只需检查趋势线的突破。再者,我们不会深入研究连接这些波峰、或波谷的实际线的几何形状,而只看跨越这两个极值点的 RSI 变化。如果它没有按照当前 RSI 读数相同的速度延续,我们将其解释为突破趋势线,因为如果保持波峰线、或波谷线,那么当前读数将与序列中的前值一样远离最后一个波谷或波峰。仅用该形态 4 进行测试,其中形态输入为 10,得到以下结果:

r_4

c_4

如所分享来源所示,本文所用的 RSI 趋势线突破仅在 RSI 最后 5 次读数中参考或检查该形态。更全面的方式,如寻找 RSI 的分形、或波峰/波谷点,能产生更有趣的结果。


RSI 超买/超卖区域,配合移动平均线确认

形态 5 只是形态 0 与移动平均线确认的组合。因此,在定义做多条件时,上述形态 0 概括的看涨条件成立,再加上价格高于移动平均线;而类似地,做空条件也会伴随价格低于移动平均线,从而确认做空开仓。仅通过该调整,我们将其定义为 MQL5 函数,如下所示:

//+------------------------------------------------------------------+
//| Check for Pattern 5.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_5(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   m_close.Refresh(-1);
   m_ma.Refresh(-1);
   if(T == POSITION_TYPE_BUY && Base(StartIndex()) < 30.0 && Close(StartIndex()) > m_ma.Main(StartIndex()))
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex()) > 70.0 && Close(StartIndex()) < m_ma.Main(StartIndex()))
   {  return(true);
   }
   return(false);
}

仅用该形态的独占测试运行(其中所用形态的输入映射为 20)会得到以下结果:

r_5

c_5


RSI 双底/双顶形态

这种形态也与形态 1 有些相似,因为它需要测试 RSI 振荡器的 70 & 30 关键水平。然而,不同于只需要一个波峰或波谷的形态 1,形态 6 需要 2 个这样的波峰或波谷,随后两次跌破 30 线,每次都从该水平反弹,这意味着看涨信号。同样,双峰高于 70 水平,然后收盘价低于该水平则被视为看跌信号。我们的 MQL5 实现如下:

//+------------------------------------------------------------------+
//| Check for Pattern 6.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_6(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   if(T == POSITION_TYPE_BUY && Base(StartIndex()) < 30.0 && 
   Base(StartIndex()) > Base(StartIndex() + 1) && 
   Base(StartIndex() + 1) < Base(StartIndex() + 2) && 
   Base(StartIndex() + 2) > Base(StartIndex() + 3) && 
   Base(StartIndex() + 3) < Base(StartIndex() + 4)
   )
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex()) > 70.0 && 
   Base(StartIndex()) < Base(StartIndex() + 1) && 
   Base(StartIndex() + 1) > Base(StartIndex() + 2) && 
   Base(StartIndex() + 2) < Base(StartIndex() + 3) && 
   Base(StartIndex() + 3) > Base(StartIndex() + 4)
   )
   {  return(true);
   }
   return(false);
}

仅用该形态 6 进行测试,它要求我们的形态输入参数为 40,会得到以下结果:

r_6

c_6


搭配多时间帧 RSI

我们的最后一个形态 7,简单地采用传统和最流行的 RSI 的形态 0,并将其应用在多个时间帧。因此,其看涨和看跌条件与我们在上面在形态 0 中看到的相同。我们的自定义信号类会就此而采用额外输入参数,帮助构建第二个附加时间帧的 RSI 句柄。为了有效测试目的,并避免在较短时间帧内可能普遍存在的价格噪音,我们的第二个时间帧将大于默认测试时间帧。该段代码分享如下:

//+------------------------------------------------------------------+
//| Check for Pattern 7.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_7(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   m_rsi_alt.Refresh(-1);
   if(T == POSITION_TYPE_BUY && Base(StartIndex()) <= 30.0 && Alt(StartIndex()) <= 30.0)
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex()) >= 70.0 && Alt(StartIndex()) >= 70.0)
   {  return(true);
   }
   return(false);
}

仅用输入映射为 80 的形态来测试该形态,结果如下:

r_7

c_7

正如我们分享布林带那样,在上面的结论中,我们也有这个自定义信号类的多形态选项。如同布林带,我们优化了用于映射从 0 到 255 的整数的输入形态,以期找到可能非常适合 RSI 振荡器的理想形态组合。我们的优化运行得到 189 的形态映射。在二进制格式中,其为 10111101,这意味着在我们的优化运行中,“不合适”的是形态 1、和形态 6(RSI 失败摇摆,和双顶/底部),当然这是针对 USDJPY 货币对的,并且没有进行交叉验证。无论如何,测试结果分享如下:

r_all

c_all


结束语

总之,在本文中,我们验证了 RSI 振荡器,这是一款非常流行的技术指标,强调其信号形态。其中一些形态很常见,很容易与 RSI 相关联,例如传统形态 0,而另一些形态如趋势线突破,形态 4 对某些交易者来说可能很陌生。然而,在排除所有其它情况下测试每个单独的形态,我们的自定义信号类还能自由地利用输入映射作为选择多个形态的掩码,这样开仓或许不一定是由相同形态来管控,或决定何时平仓。 

此外,值得读者探索的是本文中未研究的所有其它形态。我们只用了 8 个形态,这意味着我们所用的形态输入不超过 2 的 8 次幂减 1(255)。如果我们要加上这个数量的形态,并说让它增加到 10,那么我们所用形态的输入映射的范围将从 0 到 2 到 10 次幂,即 1023。可以研究的其他形态包括 RSI 突破策略,如果资产价格升至价格图表上的关键阻力位以上,并且同时突破 RSI 图表上的 70 水平,则该信号与迄今为止研究的形态相反,被解释为强烈看涨和主要趋势的开始。同样,看跌信号也将随之而来,首先是图表价格跌破关键图表阻力位,RSI 也跌破 30。这也与我们在本文中解释 RSI 的方式背道而驰。它的编码取决于交易者对他所交易证券的关键价格图表支撑位和阻力位的了解,因此把它留给读者(交易者)来实现。

本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/15850

附加的文件 |
SignalWZ_39.mqh (19.43 KB)
wz_39.mq5 (8.13 KB)
最近评论 | 前往讨论 (1)
Arber Coku
Arber Coku | 22 9月 2024 在 12:06
您好,
,感谢您与我们分享这个功能,它在一些股票上的效果非常好,就像您在文章中描述的数值一样。

,我找不到在USDJPY 或其他外汇货币对上提供这样的图形,也许我的问题是我没有必要的设置。

,如果您有,能否与我们分享?
构建K线图趋势约束模型(第九部分):多策略EA(第一部分) 构建K线图趋势约束模型(第九部分):多策略EA(第一部分)
今天,我们将探讨如何使用MQL5将多种策略集成到一个EA中。EA不仅仅提供指标和脚本,还允许采用更复杂的交易方法,这些方法能够适应不断变化的市场条件。请阅读本文,带您了解更多。
创建 MQL5-Telegram 集成 EA 交易(第 6 部分):添加响应式内联按钮 创建 MQL5-Telegram 集成 EA 交易(第 6 部分):添加响应式内联按钮
在本文中,我们将交互式内联按钮集成到 MQL5 EA 交易中,允许通过 Telegram 进行实时控制。每次按下按钮都会触发特定的操作,并将响应发送回用户。我们还模块化了函数,以便有效地处理 Telegram 消息和回调查询。
如何使用 Controls 类创建交互式 MQL5 仪表盘/面板(第 2 部分):添加按钮响应。 如何使用 Controls 类创建交互式 MQL5 仪表盘/面板(第 2 部分):添加按钮响应。
在本文中,我们将聚焦于实现按钮的响应,把静态的 MQL5 面板转变为一个交互式工具。我们将探讨如何自动化 GUI 组件的功能,确保它们能够恰当地响应用户的点击操作。最终,我们将建立一个动态界面,提升交互性和交易体验。
在 MQL5 中创建交易管理员面板(第五部分):双因素认证(2FA) 在 MQL5 中创建交易管理员面板(第五部分):双因素认证(2FA)
今天,我们将讨论如何增强当前正在开发的交易管理员面板的安全性。我们将探讨如何在新的安全策略中实施 MQL5,并将 Telegram API 集成到双因素认证(2FA)中。本次讨论将提供有关 MQL5 在加强安全措施方面的应用的宝贵见解。此外,我们还将研究 MathRand 函数,重点关注其功能以及如何在我们构建的安全框架中有效利用它。继续阅读以了解更多信息!