English Русский Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
学习如何设计一款布林带(Bollinger Bands)交易系统

学习如何设计一款布林带(Bollinger Bands)交易系统

MetaTrader 5交易 | 26 四月 2022, 10:34
3 414 12
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

概述

在交易领域,有很多工具和方法可用来帮助我们实现交易目标。这些工具可根据市场条件或状况来使用。 

方法之一是波带交易。 波带交易的主要概念是在波带的两条边界之间进行交易,据判定的波带买入和卖出,并从中获益。 其中一个工具是布林带指标。 该指标是技术分析和交易领域最流行或最常用的指标之一。

在本文中,我将与大家分享关于这个布林带指标的信息,从而增强我们对它是什么、我们如何计算它、以及我们如何使用它对我们有利的理解。之后,您将能够根据自己的策略以自己喜欢的方式使用它。 接下来,我将与大家分享我们如何通过准确而简单的方式,基于这个布林带指标来设计一款交易系统。 因此,我们将涵盖以下主题:

    1. 布林带定义
    2. 布林带策略
    3. 布林带策略系统设计
    4. 结束语
    5. 参考

      我们将学习布林带,它测量数据在其平均值附近的离散度。该指标由约翰·博林格(John Bollinger)创造。 它由围绕 20 天移动平均线的两条波段构成,以测量数据(价格)在其均值(20 天移动平均线)周围的离散度。 

      布林带指标似乎与轨道线指数相同,因为它在价格周围也有两条波带。 但事实并非如此,因为布林带和轨道线之间的区别在于,布林带指标并没有以固定百分比绘制于移动平均线之外位置,因布林带指标的计算允许根据移动平均线的标准偏差扩张或收缩。 我们将在布林带定义章节或主题中了解这些,以及其它细节。

      我们还将学习如何通过一些方式来使用布林格带策略,从而令我们的交易富有竞争力、并从中受益,这些肯定都会在布林带策略章节里涉及。

      然后我们将进入本文最有趣的部分:如何准确可靠地在算法交易系统中运用这些策略,这是我们将在布林带策略蓝图和体系设计部分要探讨的内容。


      请注意: 
      • 本文中的所有代码都将以 MQL5 编写,并将在 MetaTrader 5 上执行。
      • 如果您想练习和提高学习能力,我建议您自行编写和执行代码。
      • 因此,您需要 MetaTrader 5 终端来执行代码,需要 MQL5 的 MetaEditor 来编写代码,下面的示意图就是为它们准备的。

      在设备上下载并安装 MetaTrader 5 之后,您可从以下链接下载:https://www.metatrader5.com/zh/download。 之后,您会发现 MetaTrader 5 窗口与下图相同:

      MT5 平台


      当您打开 MetaTrader 5 终端时,您可以按 F4 打开 MetaEditor,或者单击工具菜击,然后我们可以选择 MetaQuotes 语言编辑器。 以下示意图显示了如何从 MetaTrader 5 打开 MetaEditor,并编写代码:

      Metaeditor 打开 1


      Metaeditor 打开 2

      下图显示打开 MetaEditor 编辑器窗口: 

      Metaeditor 窗口


      下图显示了如何创建新文件来编写您的代码:

      Metaeditor - 新建文件

      1. 打开新建文件来编写智能交易系统
      2. 打开新建文件来编写自定义指标
      3. 打开新建文件来编写脚本

      更多相关信息,您可以通过以下链接阅读我之前的文章:https://www.mql5.com/zh/articles/10293

      正如我经常提到的,在不同的事件中,编程或编码是一种神奇的工具,它令我们能够自动、准确地完成动作,从而让我们的生活变得轻松、顺利。 因此,在这类领域投资的一个重要目标就是,学习如何以适当的方式使用它,在生活的不同领域得到期望的目标。
      说到交易,我需要想象一下,当您给电脑下达指令,让它替您做事;在您预期的时刻,电脑会毫无异议地遵照执行您的指令;如此,您就有时间去做任何其它事情,生活将会多么轻松愉快。 这是一种令人惊叹的生活方式,因此,以适合自己的方式,体会编码或编程的乐趣将是一个重要的目标,即便您为自己编码、或请别人为您编码。

      免责声明

      这篇文章的所有内容都是为了教学目的,而非为了其它目的。 因此,您应对根据本文内容采取的任何行动负责,因为本文内容不保证任何结果。

      那么,我们通读文章来了解更多关于这个有趣的话题和指标。

      布林带定义

      波带交易的概念历史悠久、有趣,并在许多策略里所采用。波带交易主要基于在某种趋势指标之上和之下构建波带。 

      例如,我们可以基于移动平均线或轨道线,并按百分比距其上下偏移。 此外,还有两条平行线形成通道,分别位于价格上方和下方,可用于检测转折点。 但所有这些方法都是固定的,不会依据价格变动做出反应。 换句话说,它们不会随着价格波动而扩张或收缩。

      布林带可以做到这一点,这在于它实现的具体算法。 我们将在本章节中看到指标计算的细节。

      下图显示了轨道线指标的示例,及其依据价格的显示方式:

      EURUSDH1 - 轨道线

      正如您在前一张图片中所见,我们有两条围绕价格的波带:下波带围绕着最低价位,上波带围绕着最高价位。 所以,我们需要知道的主要思想是,有很多方法是基于历史上的交易波带,最常见的是百分比波带。 

      依据交易波带的思路也开发出很多工具。 其中一个开发出的工具就是用于交易波带的布林带指标。 它不同于前面提到的方法,因为它的算法能够进行扩张和收缩。

      布林带指标由 John Bollinger 于 20 世纪 80 年代初创建,他是金融市场和交易领域广受欢迎的专家之一。 他是一位 CFA(特许金融分析师)和 CMT(特许市场技术员)。

      布林带指标是一款流行的技术指标,它衡量波动性,可以根据市场情况进行扩张和收缩。 它可用于所有金融市场,如股票、外汇......等等。现在,我们来谈谈布林带的构造:

      就像我们之前提到的,交易波带的概念是从衡量一些趋势指标的中心开始的。 然后我们在这些衡量值的上下构造波带。 对于布林带指标,趋势中心的衡量是简单移动平均值,波带则由移动标准偏差的波动性度量确定。

      布林带指标:

      • 它衡量数据在其平均值(移动平均值)周围的离散度。
      • 它是一个波动性指标。
      • 布林带和轨道线(或任何以固定百分比的交易波带)方法之间的区别在于,其它指标采用或高于或低于移动平均线的特定百分比,但布林带采用的是移动平均线的标准偏差。
      • 波动性增加时,波带自动扩张,波动性降低时,波带则自动收缩。 这样的动态特性令它们即使采用标准设置也能适用于不同的证券。
      • 布林带是一款交易工具,可用于判定交易的入场和离场点。
      • 波带通常用于判定超买和超卖状况。
      • 它可以用来识别 M 形顶部和 W 形底部,或者判定趋势的强度。
      下面的公式显示了如何计算布林带:

      BB 计算

      现在我们来看一个计算布林带的示例:
        假设我们有 20 个交易日的收盘价,如下表所示:
             天数   
             收盘价 $  
          1 20
          2 30
          3 35
           4 30 
           5 40 
          6 45
          7 50
          8 55
          9 40
          10 45
          11 50
          12 35
          13 40
          14 50
          15 60
          16 65
          17 70
          18 60
          19 70
          20 75

          BB 计算

          因此,布林带的计算将如下所示:

             BB 计算示例


            BB 计算示例 1


            调整设置:

            现在,如果有人问我们是否可以通过任何其它方式调整布林带的设置,从而适用于我们的策略或交易计划,答案是肯定的,我们当然可以这样做,尤其是经过调整和测试,它能给我们带来优良的结果。 我们还必须知道,布林建议对标准偏差乘数做一些小的调整。 我们还必须知道,改变移动平均线的周期会影响标准偏差的计算周期。 布林还建议,如果我们采用 50 周期的简单移动平均线,则将标准偏差乘数增加到 2.1;如果我们采用 10 周期的简单移动平均线,则将其减少到 1.9。 

            如今,在当前世界中,我们不需要手动计算它,因为在 MetaTrader 5 中已经为我们准备好了内置指标。 下图展示了如何将其添加或将指标附加到图表上。 在 MetaTrader 5 中选择插入菜单:

            1- BB 指标插入

            然后选择指标,再选择趋势,之后选择布林带:

            2- BB 指标插入

            选择布林带指标后,将显示指标窗口参数。 它显示指标的默认参数。 它具有以下可调参数:

            1.    Period 是为移动平均线选择周期。

            2.    Deviations 是为波带选择上下偏差参数。

            3.    Apply to: 选择将采用的价格类型(收盘价、开盘价、最高价、最低价、中间价、典型价格和加权收盘价)参数。

            4.    Style: 选择指标的样式(指标线条的颜色、形状和宽度)。

            5.    Shift: 设置应用指标的移位值。

            就像我之前提到的,我们可以根据交易者的输入和策略来调整这些设置。


            3- BB 参数

            现在,我们在价格图表上绘制了布林带指标,其显示方式与下图相同:


            EURUSDH1 - BB


            正如我们在前一张图片上所见,被两条波带(布林带)包围,价格较低的波带低于移动平均线(平均值),而价格较高的波带高于移动平均线(平均值)和价格。 

            布林带策略

            此刻,我们将讨论布林带策略,我们将知道如何运用它,并从中受益。

            我们可以利用不同市场条件、或不同市场走势的布林带,如上升趋势、下降趋势和横盘。 在每一种市场条件下,我们都可以运用众多策略,但在这里我们只提其中的一些。

            • 上升趋势期间

            首先,我们需要了解在上升趋势中价格如何随移动平均线移动,因为我们可以发现价格在上升趋势中的大部分时间都在其均值(移动平均线)之上移动。

            所以,我们会发现,在上升趋势中,价格大部分时间在移动平均线和波带上边界之间移动。 这意味着,因受买方支配,价格会出现更高的低点和更高的高点。

            上升趋势

            上升趋势


            此刻,布林带可以帮助我们识别这种上升趋势,因为我们可以发现价格在移动平均线和波带上边界之间移动。 下图就是一个示例:正如您从中清楚地看到的,绿色区域的价格在上升趋势中移动,并在移动平均线和上限之间移动:

            EURUSDWeekly - BB 上升趋势

            我们将在这里提到的所需策略是:
            • 当价格上穿移动平均线时买入,目标将是波带上限。
              • 价格 > 均线 = 做多,波带上限 = 目标

            EURUSDWeekly - BB 上行策略

            • 下跌趋势期间

            首先,我们需要了解在下跌趋势中价格如何随移动平均线移动,因为我们可以发现价格在下跌趋势中的大部分时间都在其均值(移动平均线)之下移动。

            所以,我们会发现,在下跌趋势中,价格大部分时间在移动平均线和波带下边界之间移动。 这意味着,因受卖方支配,价格会出现更低的高点和更低的低点。

            下跌趋势

            下跌趋势

            此刻,布林带可以帮助我们识别这种下跌趋势,因为我们可以发现价格在移动平均线和波带下边界之间移动。 下图就是一个示例,我们可以清楚地发现,红色区域的价格呈下跌趋势,并在移动平均线和波带下限之间移动:

            EURUSDDaily - BB 下跌趋势

            我们将在这里提到的所需策略是:
            • 当价格下穿移动平均线时做空,目标将是波带的下限。
              • 价格 < 均线 = 做空,波带下限 = 目标

            EURUSDDaily - BB 下跌策略

            • 横盘期间

            首先,我们需要了解价格在横盘期间是如何变动的,因为我们可以发现横盘是除了上升趋势和下跌趋势之外的任何走势。

            横盘表示买方和卖方之间的平衡,因为他们中的一方无法完全支配市场。 以下图片是一些横盘走势的示例:

            横盘 1

            横盘 2

            横盘 3

            横盘 4

            下面是一个横盘的真实例子,因为我们可以清楚地发现,绿色区域的价格横向移动,没有明确的上升或下跌方向:

             横盘 


            之前示意图是横盘走势的示例,比我提到的更多,但横盘走势的概念是除了上升和下跌趋势之外的任何走势。


            现在,我们需要知道横盘走势将如何影响移动平均线,因为价格在移动平均线附近游走,故它会随机上穿或和下穿均线。 下图就是一个示例:

             横盘均线

            那么,价格如何随波林带移动呢? 价格在波带下限和上限之间波动,下图就是一个示例:

            GBPUSD1H - BB 横盘

            据我们所知,价格在波带下限和上限之间波动,横盘期间的策略是在下限做多,目标是上限,或在上限做空,目标是下限。
            • 价格位于下限 = 做多,波带上限 = 目标
            • 价格位于上限 = 做空,波带下限 = 目标

            GBPUSD1H - BB 横盘策略


            在上图中:
            • 我们可以在波带下限做多,在波带上限获利了结。
            • 我们可以在上限做空,在下限获利了结。

            布林带策略系统设计

            在这个有趣的部分,我们将学习如何基于布林带指标编写算法交易系统。 我们还将学习如何创建之前提到的三种交易策略(上升趋势、下跌趋势和横盘策略)。

            您可以随心所欲地设计自己的交易系统,从简单的到先进的交易系统。 例如,您可以创建并设计一个简单的交易系统,它会根据一个简单的概念生成一个简单的信号,然后您再根据这个信号采取行动;或者您可以创建并设计一个高级交易系统,它不仅会为您提供简单的信号,而且会根据相关概念的组合给出一个高级信号,并自动执行。 有很多不同的方式。 在本文中,我们将讨论一个简单的交易系统 — 我们创建它只是为了学习这个概念。 基于这些知识,您就能开发类似的系统,或者按照自己的方式设计自己的交易系统。 我希望这篇文章对您有用,并帮助您达成交易或投资目标。

            首先,我们要学习如何设计一个纯布林带代码,该代码允许在图表上显示三个注释,分别为移动平均值、波带上限值和下限值。

            以下是执行此操作的代码:

            //+------------------------------------------------------------------+
            //|                                       Simple Bollinger Bands.mq5 |
            //|                                  Copyright 2022, MetaQuotes Ltd. |
            //|                                             https://www.mql5.com |
            //+------------------------------------------------------------------+
            
            //+------------------------------------------------------------------+
            //| Expert tick function                                             |
            //+------------------------------------------------------------------+
            void OnTick()
              {
               //create an array for several prices
               double MiddleBandArray[];
               double UpperBandArray[];
               double LowerBandArray[];
               
               //sort the price array from the cuurent candle downwards
               ArraySetAsSeries(MiddleBandArray,true);
               ArraySetAsSeries(UpperBandArray,true);
               ArraySetAsSeries(LowerBandArray,true);
               
               //define Bollinger Bands
               int BollingerBands = iBands(_Symbol,_Period,20,0,2,PRICE_CLOSE);
               
               //copy price info into the array
               CopyBuffer(BollingerBands,0,0,3,MiddleBandArray);
               CopyBuffer(BollingerBands,1,0,3,UpperBandArray);
               CopyBuffer(BollingerBands,2,0,3,LowerBandArray);
               
               //calcualte EA for the cuurent candle
               double MiddleBandValue=MiddleBandArray[0];
               double UpperBandValue=UpperBandArray[0];
               double LowerBandValue=LowerBandArray[0];
               
               //comments
               Comment("MiddleBandValue: ",MiddleBandValue,"\n",
               "UpperBandValue: ",UpperBandValue,"\n","LowerBandValue: ",LowerBandValue,"\n");
               
              }
            //+------------------------------------------------------------------+
            

            现在,在编写并编译代码之后,我们必须确保代码没有错误或警告,如下图所示:

            1- SBB - 无错误

            然后从导航窗口中找到该文件,并将其拖放到图表上,或双击该文件加以执行,并将其附加到图表上,如下图所示:

             2- SBB - 文件


            3- SBB 执行窗口


            下图展示的是运行我们程序的图表:

            4- SBB 附加到图表

            现在,我们将学习如何设计简单的布林带策略。
              策略 1:
                • 上升趋势波林带策略蓝图: 
                • 价格 > 均线 = 做多,波带上限 = 盈利目标, 或 = 无信号

                上升趋势波林带策略蓝图:

                以下是执行此操作的代码:

                //+------------------------------------------------------------------+
                //|                                          Uptrend BB strategy.mq5 |
                //|                                  Copyright 2022, MetaQuotes Ltd. |
                //|                                             https://www.mql5.com |
                //+------------------------------------------------------------------+
                //+------------------------------------------------------------------+
                //| Expert tick function                                             |
                //+------------------------------------------------------------------+
                void OnTick()
                  {
                   //define Ask, Bid
                   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
                   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
                   
                   //create an array for several prices
                   double MiddleBandArray[];
                   double UpperBandArray[];
                   double LowerBandArray[];
                   
                   //sort the price array from the cuurent candle downwards
                   ArraySetAsSeries(MiddleBandArray,true);
                   ArraySetAsSeries(UpperBandArray,true);
                   ArraySetAsSeries(LowerBandArray,true);
                   
                   //define Bollinger Bands
                   int BollingerBands = iBands(_Symbol,_Period,20,0,2,PRICE_CLOSE);
                   
                   
                   //copy price info into the array
                   CopyBuffer(BollingerBands,0,0,3,MiddleBandArray);
                   CopyBuffer(BollingerBands,1,0,3,UpperBandArray);
                   CopyBuffer(BollingerBands,2,0,3,LowerBandArray);
                   
                   //calcualte EA for the cuurent candle
                   double MiddleBandValue=MiddleBandArray[0];
                   double UpperBandValue=UpperBandArray[0];
                   double LowerBandValue=LowerBandArray[0];
                   
                   //giving buy signal when price > MA
                   if (
                      (Ask>=MiddleBandArray[0])
                   && (Ask<UpperBandArray[0])
                      )
                         {
                         Comment("BUY");
                         }
                    
                   //check if we have a take profit signal      
                   if (
                      (Bid>=UpperBandArray[0])
                      )
                         {
                         Comment("TAKE PROFIT");
                         }  
                   
                      //check if we have no signal      
                   if (
                      (Ask<MiddleBandArray[0])
                      )
                         {
                         Comment("NO SIGNAL");
                         }  
                  }
                //+------------------------------------------------------------------+

                以下屏幕截图显示了该策略的信号:

                上升趋势 BB - 做多


                上升趋势 BB - 止盈

                上升趋势 BB - 无信号

                接下来,我们需要执行以下步骤:
                • 确保您的代码没有错误或警告
                • 找到文件
                • 通过拖放或双击要附加在图表上的文件来执行代码

                5- UBB - 无错误

                 6- UBB 文件


                7- UBB 执行窗口


                下图展示的是代码执行后的图表。 此处是图表上运行的程序:

                8- UBB 附加到图表

                  策略 2:
                    • 下跌趋势波林带策略蓝图:
                    • 价格 < 均线 = 做空,波带下限 = 目标

                    下跌趋势 BB 策略蓝图:

                    以下是执行此操作的代码:

                    //+------------------------------------------------------------------+
                    //|                                        Downtrend BB strategy.mq5 |
                    //|                                  Copyright 2022, MetaQuotes Ltd. |
                    //|                                             https://www.mql5.com |
                    //+------------------------------------------------------------------+
                    //+------------------------------------------------------------------+
                    //| Expert tick function                                             |
                    //+------------------------------------------------------------------+
                    void OnTick()
                      {
                       //define Ask, Bid
                       double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
                       double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
                       
                       //create an array for several prices
                       double MiddleBandArray[];
                       double UpperBandArray[];
                       double LowerBandArray[];
                       
                       //sort the price array from the cuurent candle downwards
                       ArraySetAsSeries(MiddleBandArray,true);
                       ArraySetAsSeries(UpperBandArray,true);
                       ArraySetAsSeries(LowerBandArray,true);
                       
                       //define Bollinger Bands
                       int BollingerBands = iBands(_Symbol,_Period,20,0,2,PRICE_CLOSE);
                       
                       
                       //copy price info into the array
                       CopyBuffer(BollingerBands,0,0,3,MiddleBandArray);
                       CopyBuffer(BollingerBands,1,0,3,UpperBandArray);
                       CopyBuffer(BollingerBands,2,0,3,LowerBandArray);
                       
                       //calcualte EA for the cuurent candle
                       double MiddleBandValue=MiddleBandArray[0];
                       double UpperBandValue=UpperBandArray[0];
                       double LowerBandValue=LowerBandArray[0];
                       
                       //giving sell signal when price < MA
                       if (
                          (Bid<=MiddleBandArray[0])
                       && (Bid>LowerBandArray[0])
                          )
                             {
                             Comment("SELL");
                             }
                        
                       //check if we have a take profit signal      
                       if (
                          (Ask<=LowerBandArray[0])
                          )
                             {
                             Comment("TAKE PROFIT");
                             }  
                       
                          //check if we have no signal      
                       if (
                          (Bid>MiddleBandArray[0])
                          )
                             {
                             Comment("NO SIGNAL");
                             }  
                      }
                    //+------------------------------------------------------------------+

                    下面的屏幕截图显示了该策略产生的信号:

                    下跌趋势 BB - 做空

                    下跌趋势 BB - 止盈

                    下跌趋势 BB - 无信号


                    接下来,我们再次执行以下步骤(如屏幕截图所示):
                    • 确保您的代码没有错误或警告
                    • 找到文件
                    • 通过拖放或双击要附加在图表上的文件来执行代码

                     9- DBB - 无错误

                     10- DBB 文件


                     11- DBB 执行窗口


                    下图展示的是代码执行后,以及代码在图表上的显示方式,或程序如何附加到图表上:

                     12- DBB 附加到图表



                      策略 3:
                        • 横盘布林带策略蓝图:
                        • 价格位于下限 = 做多,波带上限 = 目标
                        • 价格位于上限 = 做空,波带下限 = 目标

                        13- 横盘 BB 策略蓝图


                        以下是执行此操作的代码:

                        A-   当触及波带下限时生成做多信号,

                        //+------------------------------------------------------------------+
                        //|                                     Buy sideways BB strategy.mq5 |
                        //|                                  Copyright 2022, MetaQuotes Ltd. |
                        //|                                             https://www.mql5.com |
                        //+------------------------------------------------------------------+
                        //+------------------------------------------------------------------+
                        //| Expert tick function                                             |
                        //+------------------------------------------------------------------+
                        void OnTick()
                          {
                           //define Ask, Bid
                           double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
                           double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
                           
                           //create an array for several prices
                           double MiddleBandArray[];
                           double UpperBandArray[];
                           double LowerBandArray[];
                           
                           //sort the price array from the cuurent candle downwards
                           ArraySetAsSeries(MiddleBandArray,true);
                           ArraySetAsSeries(UpperBandArray,true);
                           ArraySetAsSeries(LowerBandArray,true);
                           
                           //define Bollinger Bands
                           int BollingerBands = iBands(_Symbol,_Period,20,0,2,PRICE_CLOSE);
                           
                           
                           //copy price info into the array
                           CopyBuffer(BollingerBands,0,0,3,MiddleBandArray);
                           CopyBuffer(BollingerBands,1,0,3,UpperBandArray);
                           CopyBuffer(BollingerBands,2,0,3,LowerBandArray);
                           
                           //calcualte EA for the cuurent candle
                           double MiddleBandValue=MiddleBandArray[0];
                           double UpperBandValue=UpperBandArray[0];
                           double LowerBandValue=LowerBandArray[0];
                           
                           //giving buy signal when price > MA
                           if (
                              (Ask<=LowerBandArray[0])
                              )
                                 {
                                 Comment("BUY");
                                 }
                            
                           //check if we have a take profit signal      
                           if (
                              (Bid>=UpperBandArray[0])
                              )
                                 {
                                 Comment("TAKE PROFIT");
                                 }  
                           
                          }
                        //+------------------------------------------------------------------+
                        

                        该策略产生的信号:

                        做多信号 - 横盘 BB

                        做多止盈信号 - 横盘 BB


                        以下步骤(如下面的屏幕截图所示):
                        • 确保您的代码没有错误或警告
                        • 找到文件
                        • 通过拖放或双击要附加在图表上的文件来执行代码

                        13- BSBB - 无错误

                         14- BSBB 文件


                        15- BSBB 执行窗口


                        下图展示的是代码执行后,以及代码在图表上的显示方式,或程序如何附加到图表上:


                         16- BSBB 附加到图表

                        B-   当触及波带上限时生成做空信号,

                        以下是执行此操作的代码:
                        //+------------------------------------------------------------------+
                        //|                                    Sell sideways BB strategy.mq5 |
                        //|                                  Copyright 2022, MetaQuotes Ltd. |
                        //|                                             https://www.mql5.com |
                        //+------------------------------------------------------------------+
                        //+------------------------------------------------------------------+
                        //| Expert tick function                                             |
                        //+------------------------------------------------------------------+
                        void OnTick()
                          {
                           //define Ask, Bid
                           double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
                           double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
                           
                           //create an array for several prices
                           double MiddleBandArray[];
                           double UpperBandArray[];
                           double LowerBandArray[];
                           
                           //sort the price array from the cuurent candle downwards
                           ArraySetAsSeries(MiddleBandArray,true);
                           ArraySetAsSeries(UpperBandArray,true);
                           ArraySetAsSeries(LowerBandArray,true);
                           
                           //define Bollinger Bands
                           int BollingerBands = iBands(_Symbol,_Period,20,0,2,PRICE_CLOSE);
                           
                           
                           //copy price info into the array
                           CopyBuffer(BollingerBands,0,0,3,MiddleBandArray);
                           CopyBuffer(BollingerBands,1,0,3,UpperBandArray);
                           CopyBuffer(BollingerBands,2,0,3,LowerBandArray);
                           
                           //calcualte EA for the cuurent candle
                           double MiddleBandValue=MiddleBandArray[0];
                           double UpperBandValue=UpperBandArray[0];
                           double LowerBandValue=LowerBandArray[0];
                           
                           //giving sell signal when price < MA
                           if (
                              (Bid>=UpperBandArray[0])
                              )
                                 {
                                 Comment("SELL");
                                 }
                            
                           //check if we have a take profit signal      
                           if (
                              (Ask<=LowerBandArray[0])
                              )
                                 {
                                 Comment("TAKE PROFIT");
                                 }  
                          }
                        //+------------------------------------------------------------------+
                        

                        以下是此策略生成的信号的屏幕截图:

                        做空信号 - 横盘 BB

                        做空止盈信号 - 横盘 BB


                        以下步骤(如下面的屏幕截图所示):
                        • 确保您的代码没有错误或警告
                        • 找到文件
                        • 通过拖放或双击要附加在图表上的文件来执行代码

                         17- SSBB - 无错误


                         18- SSBB 文件


                         19- SSBB 执行窗口


                        下图展示的是代码执行后,以及代码在图表上的显示方式,或程序如何附加到图表上:

                        20- SSBB 附加到图表


                        结束语

                        波带交易的概念非常好,因为它让我们对即将到来的走势有一个明确的预期,即利用这一走势,并从中受益。波带交易有很多方法,比如布林带,就像我们所知道的,它是一个很好的工具或方法,因为它可以随着价格走势而扩张和收缩,且我们可以在所有市场条件或趋势中使用它。

                        就像我之前提到的,在本文中,我尝试分享布林带指标的概念,我们如何计算它来增强对它的理解,并通过布林带指标提到简单的交易策略,然后学习如何为这些简单的策略设计简单的交易系统。

                        现在,您就可以制定或设计适合自己交易风格的策略。 我希望这篇文章对您和您的交易有所帮助。


                        参考

                        • 由约翰·布林格开发的布林带
                        • https://www.bollingerbands.com/about-us
                        • https://www.investopedia.com/trading/using-bollinger-bands-to-gauge-trends
                        • https://school.stockcharts.com/doku.php?id=technical_indicators:bollinger_bands



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

                        最近评论 | 前往讨论 (12)
                        Mohamed Abdelmaaboud
                        Mohamed Abdelmaaboud | 7 4月 2022 在 13:04
                        Vadzim Bandarevich #:

                        嗨^大家好!我刚刚发现图片中的一个错误。请看我的附件中的正确图片!


                        你好,Vadzim。

                        谢谢你的评论。你是正确的,因为这是一个错误,它必须是价格<=下限带,因为这是我们等待关闭已开空头头寸的信号。

                        已经考虑过了,调整已经发出。


                        谢谢。

                        Mohamed

                        kman080
                        kman080 | 25 4月 2022 在 12:29
                        早上好,先生,你的工作如何,请你帮助我们设计一个由一目了然的Kinko Hyo的交易系统,谢谢你的回答。
                        Mohamed Abdelmaaboud
                        Mohamed Abdelmaaboud | 26 4月 2022 在 08:57
                        kman080 #:
                        早上好,先生,你的工作如何,请你帮助我们设计一个一目了然的交易系统,谢谢你的回复。

                        你好,kman080。

                        谢谢你的意见,我会努力做到这一点。

                        Jacobo Israel Salas
                        Jacobo Israel Salas | 29 4月 2022 在 08:34
                        非常好,我非常感谢你,我没有像你那样先进的知识,但在我现在的水平上使用指标非常有帮助,我在那里学习,我真的很佩服你的知识深度,非常感谢你。
                        Mohamed Abdelmaaboud
                        Mohamed Abdelmaaboud | 29 4月 2022 在 11:01
                        Jacobo Israel Salas #:
                        非常好,我非常感谢你,我没有像你那样先进的知识,但在我现在所处的水平上使用指标,对我的学习非常有帮助,我真的很佩服他们的知识深度,非常感谢你。

                        谢谢你的评论,我很高兴听到这篇文章对你有帮助。

                        一项智能交易系统失败原因分析 一项智能交易系统失败原因分析
                        本文针对货币数据进行了一次分析,从而能更好地理解为什么智能交易系统在某些时段表现良好,而在其它时段表现不佳。
                        在 MQL 应用程序中运用 CCanvas 类 在 MQL 应用程序中运用 CCanvas 类
                        本文研究在 MQL 应用程序中运用 CCanvas 类。 原理会伴随着详细的解释和示例,从而彻底理解 CCanvas 的基础知识。
                        DoEasy 函数库中的图形(第九十七部分):独立处理窗体对象移动 DoEasy 函数库中的图形(第九十七部分):独立处理窗体对象移动
                        在本文中,我将研究实现鼠标独立拖动任何窗体对象。 此外,我还将在该函数库里补充错误消息和之前在终端和 MQL5 中实现的新成交属性。
                        MVC 设计范式及其应用(第 2 部分):三个组件之间相互作用示意图 MVC 设计范式及其应用(第 2 部分):三个组件之间相互作用示意图
                        本文是前一篇文章中所讨论主题的延续和完善:MQL 程序中的 MVC 范式。 在本文中,我们将研究范式的三个组件之间可能的相互作用的示意图。