English Русский Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
preview
学习如何基于牛市力量设计交易系统

学习如何基于牛市力量设计交易系统

MetaTrader 5交易 | 5 十二月 2022, 16:41
1 142 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

概述

这是来自我们系列讲义的新篇章,我们将学习一个新的可能对我们交易有利的技术工具。 我们学习有关牛市力量指标,它是能给我们深入了解牛市测量的技术指标之一,正如我们将在本文中看到的那样。 故此,我们将详细学习此技术指标,并通览以下主题了解该技术工具:

  1. 牛市力量定义
  2. 牛市力量策略
  3. 牛市力量策略蓝图
  4. 牛市力量交易系统
  5. 结束语

我们将学习什么是牛市力量指标,它测量什么,如何手工计算它,从而了解其背后的主要概念,如此我们通览牛市力量定义的主题来学习它。 理解了该指标的基本概念之后,我们将要学习如何在一些简单的策略里运用它,这些策略可强化我们的交易结果,而这需通览牛市力量策略主题来学习。 之后,我们会为每个策略设计一个分步蓝图,来帮助我们为每个策略创建一个交易系统,这部分可通览牛市力量策略蓝图的主题来学习。 然后,我们将为每个提及的策略创建一个交易系统,可在 MetaTrader 5 交易平台中执行,来帮助我们自动生成信号。

我们将利用 MetaTrader 5 交易终端,并以 MetaQuotes 语言 5 (MQL5) 编写代码。 如果您想学习如何下载和使用它们,您可以阅读以前文章中的《在 MetaEditor 中编写 MQL5 代码》的主题,从中学到更多信息。 如果您想提高编码技能,并更好地理解它,我建议您把自己阅读的内容加以应用。

编程的重要性与日俱增,而这种情况更助长了学习这一重器的紧要性。 编程的这种重要性来自编程的益处,而且有很多。 针对交易编程最重要的益处是,它可以帮助我们编码或创建程序,代替我们完成重复劳动,节省时间,它还为我们提供了更精准的结果,就像我们期望的那样,它有助于我们避免导致我们交易亏损结果的情绪。

免责声明:所有信息“按原样”提供仅用于教学目的,并非出于交易目的或建议。 这些信息不能保证任何结果。 如果您选择在您的任何交易账户上使用这些材料,您将自行承担风险,您是唯一的责任人。

现在,我们从本文的主题开始。

牛市力量定义

在本主题中, 我们将详细辨别牛市力量指标,来理解其背后的主要概念。 牛市力量指标与我们在上一篇文章《学习如何依据熊市力量设计交易系统》中提到的熊市力量相反。 牛市力量是由亚历山大·埃尔德(Alexander Elder)开发的,它衡量市场的看涨程度,也可以观察多头变得疲软,来示意空头是否参与了游戏。 它是一个振荡器指标,围绕零轴上下起伏。 因此,该指标也让我们认识到驱动市场走势的最重要因素,这就是需求和供给。

我们如何手工计算这个指标,那就是我们要辨别以下步骤:

  • 获取最高值(特定时间段内的最大值)。
  • 获取指数移动平均值 EMA。
  • 获取最高点和指数移动平均线之间的差值。

牛市力量 = 高点值 - EMA

多头控制市场时,他们大多数时候都会不断将市场推向更高的价位。 故此,我们用公式中的高点值来计算牛市力量,因为我们需要衡量这些多头,然后我们将得到这个高点和 EMA 之间的差值,从而获得一个振荡器指标,该值围绕我们之前提到的零轴振荡,当我们发现牛市力量值接近零轴,并变得低于前值时,我们可得到多头变疲软的迹象。

此指标与另外的趋势指标一同配合使用更佳,因为它将提供更有效的洞察力,就像我们将在本文中提到的策略之所为一样。 这个概念很有帮助,也是技术分析的特色之一,因为我们能够利用众多概念来获得更多见解,并从不同的角度观察金融产品,在我们制定决策时给予更重的份量。

如今,我们不需要手工计算这个指标,因为它已在 MetaTrader 5 交易终端中内置,我们需要做的就是点击插入 --> 指标 --> 振荡器 --> 牛市力量,将其插入图表之中。 我们也可浏览下图看到这一点:

牛市力量插入

选择指标后,我们会看到其以下参数窗口:

 牛市力量参数

1 - 确定将在计算中采用的周期。

2 - 确定牛市力量柱线的颜色。

3 - 确定牛市力量柱线的宽度。

确定这些参数,并按“确定”后,我们会见到指标插入到图表中,如下所示:

 牛市力量加载

正如我们在上一张图表中下部一样,我们将指标附加到图表上,其柱线围绕零轴振荡,就像我们提到的一样,若数值高于零轴时,这意味着多头控场,且当它接近并变得低于零轴时,这意味着它们变得疲软。 当多头变疲软时,我们可以看到空头入场参与游戏,并不断将价格推向低位来控制市场,或者至少,市场由于多头、空头之间的胶着而处于平衡。

牛市力量策略

在这一部分中,我们将学习如何在简单的策略里运用牛市力量,这些策略则根据该指标的基本概念使用。 以下是这些策略及其条件。 我需要在此确认,这些以教学为主要宗旨的策略是为了理解指标背后的主要概念,以及我们该如何运用它,因此您必须在实盘账户上使用它们之前全面测试,从而确保您的交易能因其受益。

    • 策略一: 牛市力量走势

      根据该策略,我们需要根据当期和前期牛市力量值的位置来得到信号。 如果当期值大于前期值,这将是牛市力量指标上升的信号。 反之亦然,如果当期值低于前期值,这将是牛市力量下降的信号。

      简言之,它将与以下相同:

      当期牛市力量 > 前期牛市力量 --> 牛市力量正在上升

      当期牛市力量 < 前期牛市力量 --> 牛市力量正在下降

        • 策略二:牛市力量 - 强劲或背离

          基于该策略,我们需要评估四个值来获得一个信号,通知我们是否存在强劲走势或背离,这些值是当期高点、前期高点、牛市力量、和前前牛市力量。 如果当期高点高于前期高点,当期牛市力量值高于前期,我们视其为强劲走势的信号。 若是另一种情况下,如果当期高点高于前期高点,而当期牛市力量值低于前期值,我们视其为看跌背离的信号。

          简言之,它将与以下相同:

          当期高点 > 前期高点,且当期牛市力量 > 前期牛市力量 --> 强势走势

          当期高点 < 前期高点,且当期牛市力量 > 前期牛市力量 --> 看跌背离

            • 策略三: 牛市力量信号

              根据该策略,我们需要一个可用于获取买入和卖出信号的信号,我们将根据该策略评估四个值来做到这一点。 这四个值是当期牛市力量、零轴、当期收盘价、和当期指数移动平均线。 如果当期牛市力量低于零轴,当期收盘价低于指数移动平均线,我们视其为卖出信号。 如果当期牛市力量大于零轴,当期收盘价大于指数移动平均线,则这是买入信号。

              简言之,它将与以下相同:

              当期牛市力量 < 零轴,且当期收盘价 < EMA --> 卖出

              当期牛市力量 > 零轴,且当期收盘价 > EMA --> 买入

              牛市力量策略蓝图

              在本主题中,我们将为每个提到的策略设计一个分步蓝图,来帮助我们规划思路,并轻松、顺畅地创建我们的交易系统。

              • 策略一: 牛市力量走势

              我们需要计算机检查每次跳价时的两个数值,这些值在创建之后就会确定,它们是当期牛市力量和前期牛市力量。 我们要求程序检查这些数值,来了解每一个的位置。 如果当期牛市力量值大于前期,我们要求程序或智能系统在图表上的注释里返回以下信号,每个值占据单独一行:

              • 牛市力量正在上升
              • 牛市力量值
              • 牛市力量前期值

              我们还需要考虑另一种场景。 如果当期牛市力量值低于前期值,我们要求智能系统返回一条注释,其中包含以下值,且每个值都在单独的行中:

              • 牛市力量正在下降
              • 牛市力量值
              • 牛市力量前期值。

              以下是基于该策略的交易系统的简单蓝图:

               牛市力量走势蓝图

              • 策略二:牛市力量 - 强劲或背离

              基于该策略,我们要求交易系统检查四个数值,它们是当期高点、前期高点、当期和前期牛市力量值。 之后,我们要求判定当期高值是否高于前期,同时当期牛市力量值高于前期,我们要求交易系统在图表上返回一条注释信号,包含以下数值,每个数值都在单独的行中:

              • 强劲走势
              • 当期高点值
              • 前期高点值
              • 当期牛市力量值
              • 前期牛市力量值

              在另一种场景下,如果当期高值高于前期,同时当期牛市力量值低于前期,我们要求交易系统在图表上返回含有以下数值的注释信号:

              • 看跌背离
              • 当期高点值
              • 前期高点值
              • 当期牛市力量值
              • 前期牛市力量值

              以下是直观地以简单形式绘制的蓝图,来帮助我们基于该策略创建交易系统。

                 牛市力量 - 强劲或背离

              • 策略三: 牛市力量信号

              基于该策略,我们需要创建一个交易系统,在每次跳价时检查四个数值,它们是当期牛市力量、零轴、当期收盘价、和当期指数移动平均线。 我们需要判定当期牛市力量是否低于零轴,同时如果当期收盘价低于指数移动平均线,我们要求智能系统在图表上返回含有以下数值的注释信号,且每个数值都在单独的行中:

              • 卖出信号
              • 当期收盘价
              • 当期 EMA 值
              • 当期牛市力量值

              在另一种情况下,如果当期牛市力量高于零轴,同时当期收盘价高于指数移动平均线,我们要求交易系统返回含有以下数值的注释信号:

              • 买入信号
              • 当期收盘价
              • 当期 EMA 值
              • 当期牛市力量值

              以下是一个简单的分步蓝图,归纳我们的思路,并创建基于该策略的交易系统。

               牛市力量信号蓝图

              牛市力量交易系统

              在本主题中,我们将学习如何为每个拟议的策略创建交易系统,但我们将基于牛市力量创建一个简单的交易系统,以便在图表上返回注释信号,其中包含牛市力量的当期值,并以其作为所有策略的基础。

              以下是创建该交易系统的代码。

              第一步:我们将为 “bullpower” 创建一个 double 类型的数组:

              double bullpowerArray[];

              第二步:我们将调用 “ArraySetAsSeries” 函数为这个创建的数组设置排序,并返回一个布尔值。

              ArraySetAsSeries(bullpowerArray,true);

              第三步:我们为 “bullpowerDef” 创建一个整数型变量,我们调用 “iBullsPower” 函数定义牛市力量指标,并返回指标的句柄。 参数为:

              symbol: 我们采用 (_Symbol) 对应当前应用的品种名称。

              period: 我们采用 (_Period) 对应当前时间帧周期。

              ma_period: 我们采用 13 作为移动均线周期。

              int bullpowerDef = iBullsPower(_Symbol,_Period,13);

              第四步: 我们调用 “CopyBuffer” 函数从牛市力量指标中获取数据,并填充已创建数组。 该函数参数:

              indicator_handle: 这是指标句柄,我们将取用(bullpowerDef)里的值。     

              buffer_num: 指标缓冲区编号,我们将采用(0)。

              start_pos: 数据起始位置,我们将采用(0)。         

              count: 要复制的数量,我们将采用(3)。                

              buffer[]: 所需复制的目标数组,我们将取用(bullpowerArray)。

              CopyBuffer(bullpowerDef,0,0,3,bullpowerArray);

              第五步:我们创建 “bullpowerVal” 变量之后,调用 “NormalizeDouble” 函数返回双精度类型值。 该函数参数:

              value: 我们将取用(bullpowerArray[0]) 作为常规化数字。

              digits: 我们将采用 (6) 作为小数点之后的数字长度。

              double bullpowerVal = NormalizeDouble(bullpowerArray[0],6);

              第六步:我们将调用 Comment 函数在图表上生成含有当前牛市力量值的注释:

              Comment("Bull's Power Value is ",bullpowerVal);

              以下是之前步骤的完整代码:

              //+------------------------------------------------------------------+
              //|                                          Simple Bull's Power.mq5 |
              //|                                  Copyright 2022, MetaQuotes Ltd. |
              //|                                             https://www.mql5.com |
              //+------------------------------------------------------------------+
              #property copyright "Copyright 2022, MetaQuotes Ltd."
              #property link      "https://www.mql5.com"
              #property version   "1.00"
              //+------------------------------------------------------------------+
              void OnTick()
                {
                 double bullpowerArray[];
              
                 ArraySetAsSeries(bullpowerArray,true);
              
                 int bullpowerDef = iBullsPower(_Symbol,_Period,13);
              
                 CopyBuffer(bullpowerDef,0,0,3,bullpowerArray);
              
                 double bullpowerVal = NormalizeDouble(bullpowerArray[0],6);
              
                 Comment("Bull's Power Value is ",bullpowerVal);
              
                }
              //+------------------------------------------------------------------+

              再往后,我们编译此代码,并在导航器窗口中查看此代码的智能系统,如下所示:

               牛市力量导航器

              双击这个简单牛市力量,并在 MetaTrader 5 终端上执行它,我们将看到它的窗口与以下内容相同:

              简单牛市力量窗口

              按下“确定”后,我们会发现智能系统附加到图表上,如下所示:

               简单牛市力量加载

              正如我们在右上角的上一张图表中所见,智能系统已经加载到图表之中。 现在,我们已准备好在图表上接收更新含有当前牛市力量值的自动注释,且与以下测试示例相同: 

               简单牛市力量信号

              正如我们在左上角的上一张图表中所见,我们得到含有当期牛市力量值的注释。

              • 策略一: 牛市力量走势

              以下是基于该策略创建的交易系统的完整代码:

              //+------------------------------------------------------------------+
              //|                                         Bulls Power Movement.mq5 |
              //|                                  Copyright 2022, MetaQuotes Ltd. |
              //|                                             https://www.mql5.com |
              //+------------------------------------------------------------------+
              #property copyright "Copyright 2022, MetaQuotes Ltd."
              #property link      "https://www.mql5.com"
              #property version   "1.00"
              //+------------------------------------------------------------------+
              void OnTick()
                {
                 double bullpowerArray[];
              
                 ArraySetAsSeries(bullpowerArray,true);
              
                 int bullpowerDef = iBullsPower(_Symbol,_Period,13);
              
                 CopyBuffer(bullpowerDef,0,0,3,bullpowerArray);
              
                 double bullpowerVal = NormalizeDouble(bullpowerArray[0],6);
                 double bullpowerPrevVal = NormalizeDouble(bullpowerArray[1],6);
              
                 if(bullpowerVal>bullpowerPrevVal)
                   {
                    Comment("Bull's Power is rising","\n",
                            "Bull's Power Value is ",bullpowerVal,"\n",
                            "Bull's Power Previous Value is ",bullpowerPrevVal);
                   }
              
                 if(bullpowerVal<bullpowerPrevVal)
                   {
                    Comment("Bull's Power is declining","\n",
                            "Bull's Power Value is ",bullpowerVal,"\n",
                            "Bull's Power Previous Value is ",bullpowerPrevVal);
                   }
                }
              //+------------------------------------------------------------------+

              代码中的区别与以下内容相同:

              定义当期牛市力量值的 “bullpowerVal”,和前期牛市力量值的 “bullpowerPrevVal”:

                 double bullpowerVal = NormalizeDouble(bullpowerArray[0],6);
                 double bullpowerPrevVal = NormalizeDouble(bullpowerArray[1],6);

              策略条件:

              正在上升的情况:

                 if(bullpowerVal>bullpowerPrevVal)
                   {
                    Comment("Bull's Power is rising","\n",
                            "Bull's Power Value is ",bullpowerVal,"\n",
                            "Bull's Power Previous Value is ",bullpowerPrevVal);
                   }

              正在下降的情况:

                 if(bullpowerVal<bullpowerPrevVal)
                   {
                    Comment("Bull's Power is declining","\n",
                            "Bull's Power Value is ",bullpowerVal,"\n",
                            "Bull's Power Previous Value is ",bullpowerPrevVal);
                   }

              编译后,我们将在导航器窗口中找到该智能系统:

               牛市力量导航器

              将其拖放到所需的图表上,我们会找到与以下内容相同的窗口:

               牛市力量走势窗口

              按“确定”后,我们会发现智能系统附着在图表上:

               牛市力量走势加载

              正如我们在图表右上角的上一张图表中所见,我们的智能系统已附加到图表上,现在我们就能得到与以下内容相同的信号。

              当期数据上升的情况:

               牛市力量走势 - 上升 - 当期数据

              正如我们在之前图表上半部分中看到的,我们得到生成的上升信号,当期牛市力量值,以及前期牛市力量值。 在数据窗口中,我们可以发现牛市力量的当期值。

              与前期数据一起上升:

               牛市力量走势 - 上升 - 前期数据

              正如我们在上一张图表中所见,我们在数据窗口中仅能找到牛市力量前期值的差值。

              当期数据下降:

              牛市力量走势 - 下降 - 当期数据

              正如我们在之前图表上半部分中看到的,我们得到生成的下降信号,当期牛市力量值,以及前期牛市力量值。 在数据窗口中,我们可以发现牛市力量的当期值。

              前期数据下降的情况:

               牛市力量走势 - 下降 - 前期数据

              正如我们在上一张图表中所见,我们在数据窗口中仅能找到牛市力量最后数值的差值。

              • 策略二:牛市力量 - 强劲或背离

              以下是基于该策略创建的交易系统的完整代码:

              //+------------------------------------------------------------------+
              //|                          Bull's Power - Strong or Divergence.mq5 |
              //|                                  Copyright 2022, MetaQuotes Ltd. |
              //|                                             https://www.mql5.com |
              //+------------------------------------------------------------------+
              #property copyright "Copyright 2022, MetaQuotes Ltd."
              #property link      "https://www.mql5.com"
              #property version   "1.00"
              //+------------------------------------------------------------------+
              void OnTick()
                {
                 double bullpowerArray[];
                 MqlRates priceArray[];
              
                 ArraySetAsSeries(bullpowerArray,true);
                 int Data=CopyRates(_Symbol,_Period,0,3,priceArray);
              
                 int bullpowerDef = iBullsPower(_Symbol,_Period,13);
              
                 CopyBuffer(bullpowerDef,0,0,3,bullpowerArray);
              
                 double bullpowerVal = NormalizeDouble(bullpowerArray[0],6);
                 double bullpowerPrevVal = NormalizeDouble(bullpowerArray[1],6);
              
                 double currentHighVal=NormalizeDouble(priceArray[2].high,6);
                 double prevHighVal=NormalizeDouble(priceArray[1].high,6);
              
                 if(currentHighVal>prevHighVal && bullpowerVal>bullpowerPrevVal)
                   {
                    Comment("Strong Move","\n",
                            "Current High Value is ",currentHighVal,"\n",
                            "Previous High Value is ",prevHighVal,"\n",
                            "Bull's Power Value is ",bullpowerVal,"\n",
                            "Bull's Power Previous Value is ",bullpowerPrevVal);
                   }
              
                 if(currentHighVal>prevHighVal && bullpowerVal<bullpowerPrevVal)
                   {
                    Comment("Bearish divergence","\n",
                            "Current High Value is ",currentHighVal,"\n",
                            "Previous High Value is ",prevHighVal,"\n",
                            "Bull's Power Value is ",bullpowerVal,"\n",
                            "Bull's Power Previous Value is ",bullpowerPrevVal);
                   }
                }
              //+------------------------------------------------------------------+

              此代码中的差异与下同:

              创建两个数组,bullpowerArray 和 priceArray:

                 double bullpowerArray[];
                 MqlRates priceArray[];

              为这些创建的数组设置排序,对于bullpowerArray,我们调用 “ArraySetAsSeries” 函数,就像我们之前学到的那样。 对于 priceArray,我们则调用 “CopyRates” 函数来获取 “MqlRates” 型历史数据,其参数为:

              • symbol name: 我们采用 (_Symbol)
              • timeframe: 我们采用 (_Period)
              • start time: 我们采用 (0)
              • stop time: 我们采用 (3)
              • rates array: 我们取用 (priceArray)
                 ArraySetAsSeries(bullpowerArray,true);
                 int Data=CopyRates(_Symbol,_Period,0,3,priceArray);

              调用 “NormalizeDouble” 函数定义牛市力量和高点的当期和前期值。

                 double bullpowerVal = NormalizeDouble(bullpowerArray[0],6);
                 double bullpowerPrevVal = NormalizeDouble(bullpowerArray[1],6);
              
                 double currentHighVal=NormalizeDouble(priceArray[2].high,6);
                 double prevHighVal=NormalizeDouble(priceArray[1].high,6);

              策略的条件

              强势走势的情况:

                 if(currentHighVal>prevHighVal && bullpowerVal>bullpowerPrevVal)
                   {
                    Comment("Strong Move","\n",
                            "Current High Value is ",currentHighVal,"\n",
                            "Previous High Value is ",prevHighVal,"\n",
                            "Bull's Power Value is ",bullpowerVal,"\n",
                            "Bull's Power Previous Value is ",bullpowerPrevVal);
                   }

              看跌背离的情况:

                 if(currentHighVal>prevHighVal && bullpowerVal<bullpowerPrevVal)
                   {
                    Comment("Bearish divergence","\n",
                            "Current High Value is ",currentHighVal,"\n",
                            "Previous High Value is ",prevHighVal,"\n",
                            "Bull's Power Value is ",bullpowerVal,"\n",
                            "Bull's Power Previous Value is ",bullpowerPrevVal);
                   }

              编译此代码后,我们可在导航器窗口中找到此交易系统的智能系统:

              牛市力量导航器

              双击该智能系统执行,我们将发现其窗口与以下内容相同:

               牛市力量 - 强势或背离窗口

              按“确定”后,我们会发现智能系统已加载,如下所示:

               牛市力量 - 强势或背离加载

              正如我们在右上角所见,智能系统已加载,我们已准备好接收其信号,如下所示。

              当期数据导致强劲走势情况:

              牛市力量 - 强势或背离 - 强劲 - 当期数据

              正如我们在图表上所见,我们得到与期望相同的基于该策略的所需信号,以及带有以下数值的注释:

              • 强劲走势
              • 当期高点值
              • 前期高点值
              • 当期牛市力量值
              • 前期牛市力量值 

              前期数据导致强劲走势情况:

               牛市力量 - 强势或背离 - 强劲 - 前期数据

              正如我们在上一个图表上所见,我们在图表上得到同样的注释信号,所含数值相同,但前期数据窗口有别。

              当期数据看跌背离的情况:

              牛市力量 - 强势或背离 - 看涨背离 - 当期数据

              正如我们在上一张图表中看到的,我们在图表上有一个注释,含有以下数值:

              • 看跌背离
              • 当期高点值
              • 前期高点值
              • 当期牛市力量值
              • 前期牛市力量值  

              前期数据看跌背离的情况:

               牛市力量 - 强势或背离 - 看跌背离 - 前期数据

              正如我们在上一个图表上所见,我们在图表上得到一个数值相同的注释,但此处我们能发现前期数据窗口。

              • 策略三: 牛市力量信号

              以下是基于此策略所创建交易系统的完整代码。

              //+------------------------------------------------------------------+
              //|                                         Bulls' Power signals.mq5 |
              //|                                  Copyright 2022, MetaQuotes Ltd. |
              //|                                             https://www.mql5.com |
              //+------------------------------------------------------------------+
              #property copyright "Copyright 2022, MetaQuotes Ltd."
              #property link      "https://www.mql5.com"
              #property version   "1.00"
              //+------------------------------------------------------------------+
              void OnTick()
                {
                 double bullpowerArray[];
                 double maArray[];
                 MqlRates priceArray[];
              
                 ArraySetAsSeries(bullpowerArray,true);
                 ArraySetAsSeries(maArray,true);
                 int Data=CopyRates(_Symbol,_Period,0,3,priceArray);
              
                 int bullpowerDef = iBullsPower(_Symbol,_Period,13);
                 int maDef = iMA(_Symbol,_Period,13,0,MODE_EMA,PRICE_CLOSE);
              
                 CopyBuffer(bullpowerDef,0,0,3,bullpowerArray);
                 CopyBuffer(maDef,0,0,3,maArray);
              
                 double bullpowerVal = NormalizeDouble(bullpowerArray[0],6);
              
                 double emaVal = NormalizeDouble(maArray[0],6);
              
                 double currentClose=NormalizeDouble(priceArray[2].close,6);
              
                 if(bullpowerVal<0 && currentClose<emaVal)
                   {
                    Comment("Sell Signal","\n",
                            "Current Close Value is ",currentClose,"\n",
                            "Current EMA Value is ",emaVal,"\n",
                            "Bull's Power Value is ",bullpowerVal);
                   }
              
                 if(bullpowerVal>0 && currentClose>emaVal)
                   {
                    Comment("Buy Signal","\n",
                            "Current Close Value is ",currentClose,"\n",
                            "Current EMA Value is ",emaVal,"\n",
                            "Bull's Power Value is ",bullpowerVal);
                   }
                }
              //+------------------------------------------------------------------+

              此代码中的区别:

              创建三个数组,bullpowerArray, maArray, 和 priceArray。

                 double bullpowerArray[];
                 double maArray[];
                 MqlRates priceArray[];

              为这三个创建的数组设置排序。

                 ArraySetAsSeries(bullpowerArray,true);
                 ArraySetAsSeries(maArray,true);
                 int Data=CopyRates(_Symbol,_Period,0,3,priceArray);

              调用 “iBullsPower” 定义牛市力量指标,与我们之前提到的相同,返回由 “iMA” 函数定义的移动平均线指标句柄。

                 int bullpowerDef = iBullsPower(_Symbol,_Period,13);
                 int maDef = iMA(_Symbol,_Period,13,0,MODE_EMA,PRICE_CLOSE);

              调用 “CopyBuffer” 函数填充数组,数据则是从牛市力量和移动平均线指标中获取。

                 CopyBuffer(bullpowerDef,0,0,3,bullpowerArray);
                 CopyBuffer(maDef,0,0,3,maArray);

              定义当前牛市力量、指数移动平均线、和当期收盘价。

                 double bullpowerVal = NormalizeDouble(bullpowerArray[0],6);
                 double emaVal = NormalizeDouble(maArray[0],6);
                 double currentClose=NormalizeDouble(priceArray[2].close,6);

              此策略的条件:

              卖出信号的情况:

                 if(bullpowerVal<0 && currentClose<emaVal)
                   {
                    Comment("Sell Signal","\n",
                            "Current Close Value is ",currentClose,"\n",
                            "Current EMA Value is ",emaVal,"\n",
                            "Bull's Power Value is ",bullpowerVal);
                   }

              买入信号的情况:

                 if(bullpowerVal>0 && currentClose>emaVal)
                   {
                    Comment("Buy Signal","\n",
                            "Current Close Value is ",currentClose,"\n",
                            "Current EMA Value is ",emaVal,"\n",
                            "Bull's Power Value is ",bullpowerVal);
                   }

              编译此代码后,我们可以在导航窗口中找到与以下内容相同的智能系统:

               牛市力量导航器3

              双击该智能系统在图表上执行,我们将发现其窗口与以下内容相同:

               牛市力量信号窗口

              按下“确定”后,我们会发现智能系统附加到图表上,如下所示:

              牛市力量信号加载

              我们能看到牛市力量智能系统的信号已加载到图表的右上角。 然后,我们准备接收基于此交易策略的信号,如下所示:

              卖出信号的情况:

               牛市力量信号 - 卖出

              正如我们在图表上看到的,我们有一个含有以下数值的注释:

              • 卖出信号
              • 当期收盘价
              • 当期 EMA 值
              • 牛市力量值

              买入信号情况:

               牛市力量信号 - 买入

              正如我们在图表上看到的,图表上有我们期望的信号注释,含有以下数值:

              • 买入信号
              • 当期收盘价
              • 当期 EMA 值
              • 牛市力量值

              综上,我们为提到的每个策略都创建了一个交易系统来生成自动信号。

              结束语

              我希望我们前面的主题涵盖了这一指标。 通览牛市力量定义的主题,我们更详尽地学到了什么是牛市力量指标,它衡量什么,我们如何计算它,如何读取它,以及如何插入和使用 MetaTrader 5 内置的牛市力量指标。 之后,我们在一些拟议的简单策略里,基于其背后的基本概念学习如何运用该指标,这些策略的基本宗旨是学习如何运用该指标,您在实盘账户上使用它们之前,必须对其进行测试,从而确保它们适合您的交易风格,并可产生利润。 这些策略与以下内容相同:

              • 牛市力量走势: 此策略可用于判定牛市力量指标的方向是上升还是下降
              • 牛市力量 强劲或背离:它可用来判定我们是否有强劲走势或看跌背离。
              • 牛市力量信号:它可用来为我们生成买入或卖出信号。

              之后,我们为提到的每个策略设计了一个分步蓝图,来帮助我们依据这些蓝图归纳我们的思路,并顺利创建一个交易系统。 然后,我们学习了如何为每个提到的策略创建一个交易系统,以便以 MQL5 编码后自动获取信号,并可在 MetaTrader 5 交易终端上执行。 我希望您能应用并尝试自己编写提到的代码,从而提高您的编码技能,如果您愿意,这将增强和改善您作为程序员的学习曲线。

              我还希望您发现这篇文章对您增强交易和改善交易结果有益。 如果您想阅读更多关于学习如何基于最流行的技术指标设计交易系统的类似文章,您可以阅读我在本系列中的其它篇章,因为我们已在这些文章中分享了许多技术指标,并基于它们设计了交易系统,通过简单的策略揭示它们背后的基本概念。

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

              从头开始开发智能交易系统(第 28 部分):面向未来((III) 从头开始开发智能交易系统(第 28 部分):面向未来((III)
              我们的订单系统有一项任务仍然尚未完成,但我们终将把它搞定。 MetaTrader 5 提供了一个允许创建和更正订单参数值的单据系统。 该思路是拥有一个智能系统,可令相同的票据系统更快、更高效。
              MQL5 中的矩阵和向量操作 MQL5 中的矩阵和向量操作
              MQL5 中引入了矩阵和向量,用于实现数学解决方案的高效操作。 新类型提供了内置方法,能够创建接近数学标记符号的简洁易懂的代码。 数组提供了广泛的功能,但在很多情况下,矩阵的效率要高得多。
              神经网络变得轻松(第二十五部分):实践迁移学习 神经网络变得轻松(第二十五部分):实践迁移学习
              在最晚的两篇文章中,我们开发了一个创建和编辑神经网络模型的工具。 现在是时候通过实践示例来评估迁移学习技术的潜在用途了。
              DoEasy. 控件(第 15 部分):TabControl WinForms 对象 — 多行选项卡标题、选项卡处理方法 DoEasy. 控件(第 15 部分):TabControl WinForms 对象 — 多行选项卡标题、选项卡处理方法
              在本文中,我将继续工作于 TabControl WinForm 对象 — 我将创建一个选项卡字段对象类,令选项卡标题排列几行成为可能,并添加处理对象相应选项卡的方法。