学习如何设计一款布林带(Bollinger Bands)交易系统
概述
在交易领域,有很多工具和方法可用来帮助我们实现交易目标。这些工具可根据市场条件或状况来使用。
方法之一是波带交易。 波带交易的主要概念是在波带的两条边界之间进行交易,据判定的波带买入和卖出,并从中获益。 其中一个工具是布林带指标。 该指标是技术分析和交易领域最流行或最常用的指标之一。
在本文中,我将与大家分享关于这个布林带指标的信息,从而增强我们对它是什么、我们如何计算它、以及我们如何使用它对我们有利的理解。之后,您将能够根据自己的策略以自己喜欢的方式使用它。 接下来,我将与大家分享我们如何通过准确而简单的方式,基于这个布林带指标来设计一款交易系统。 因此,我们将涵盖以下主题:
我们将学习布林带,它测量数据在其平均值附近的离散度。该指标由约翰·博林格(John Bollinger)创造。 它由围绕 20 天移动平均线的两条波段构成,以测量数据(价格)在其均值(20 天移动平均线)周围的离散度。
布林带指标似乎与轨道线指数相同,因为它在价格周围也有两条波带。 但事实并非如此,因为布林带和轨道线之间的区别在于,布林带指标并没有以固定百分比绘制于移动平均线之外位置,因布林带指标的计算允许根据移动平均线的标准偏差扩张或收缩。 我们将在布林带定义章节或主题中了解这些,以及其它细节。
我们还将学习如何通过一些方式来使用布林格带策略,从而令我们的交易富有竞争力、并从中受益,这些肯定都会在布林带策略章节里涉及。
然后我们将进入本文最有趣的部分:如何准确可靠地在算法交易系统中运用这些策略,这是我们将在布林带策略蓝图和体系设计部分要探讨的内容。- 本文中的所有代码都将以 MQL5 编写,并将在 MetaTrader 5 上执行。
- 如果您想练习和提高学习能力,我建议您自行编写和执行代码。
- 因此,您需要 MetaTrader 5 终端来执行代码,需要 MQL5 的 MetaEditor 来编写代码,下面的示意图就是为它们准备的。
在设备上下载并安装 MetaTrader 5 之后,您可从以下链接下载:https://www.metatrader5.com/zh/download。 之后,您会发现 MetaTrader 5 窗口与下图相同:
- 打开新建文件来编写智能交易系统
- 打开新建文件来编写自定义指标
- 打开新建文件来编写脚本
更多相关信息,您可以通过以下链接阅读我之前的文章:https://www.mql5.com/zh/articles/10293
正如我经常提到的,在不同的事件中,编程或编码是一种神奇的工具,它令我们能够自动、准确地完成动作,从而让我们的生活变得轻松、顺利。 因此,在这类领域投资的一个重要目标就是,学习如何以适当的方式使用它,在生活的不同领域得到期望的目标。
说到交易,我需要想象一下,当您给电脑下达指令,让它替您做事;在您预期的时刻,电脑会毫无异议地遵照执行您的指令;如此,您就有时间去做任何其它事情,生活将会多么轻松愉快。 这是一种令人惊叹的生活方式,因此,以适合自己的方式,体会编码或编程的乐趣将是一个重要的目标,即便您为自己编码、或请别人为您编码。
免责声明
这篇文章的所有内容都是为了教学目的,而非为了其它目的。 因此,您应对根据本文内容采取的任何行动负责,因为本文内容不保证任何结果。
那么,我们通读文章来了解更多关于这个有趣的话题和指标。
布林带定义
波带交易的概念历史悠久、有趣,并在许多策略里所采用。波带交易主要基于在某种趋势指标之上和之下构建波带。
例如,我们可以基于移动平均线或轨道线,并按百分比距其上下偏移。 此外,还有两条平行线形成通道,分别位于价格上方和下方,可用于检测转折点。 但所有这些方法都是固定的,不会依据价格变动做出反应。 换句话说,它们不会随着价格波动而扩张或收缩。
布林带可以做到这一点,这在于它实现的具体算法。 我们将在本章节中看到指标计算的细节。
正如您在前一张图片中所见,我们有两条围绕价格的波带:下波带围绕着最低价位,上波带围绕着最高价位。 所以,我们需要知道的主要思想是,有很多方法是基于历史上的交易波带,最常见的是百分比波带。
依据交易波带的思路也开发出很多工具。 其中一个开发出的工具就是用于交易波带的布林带指标。 它不同于前面提到的方法,因为它的算法能够进行扩张和收缩。
布林带指标由 John Bollinger 于 20 世纪 80 年代初创建,他是金融市场和交易领域广受欢迎的专家之一。 他是一位 CFA(特许金融分析师)和 CMT(特许市场技术员)。
布林带指标是一款流行的技术指标,它衡量波动性,可以根据市场情况进行扩张和收缩。 它可用于所有金融市场,如股票、外汇......等等。现在,我们来谈谈布林带的构造:就像我们之前提到的,交易波带的概念是从衡量一些趋势指标的中心开始的。 然后我们在这些衡量值的上下构造波带。 对于布林带指标,趋势中心的衡量是简单移动平均值,波带则由移动标准偏差的波动性度量确定。
布林带指标:
- 它衡量数据在其平均值(移动平均值)周围的离散度。
- 它是一个波动性指标。
- 布林带和轨道线(或任何以固定百分比的交易波带)方法之间的区别在于,其它指标采用或高于或低于移动平均线的特定百分比,但布林带采用的是移动平均线的标准偏差。
- 波动性增加时,波带自动扩张,波动性降低时,波带则自动收缩。 这样的动态特性令它们即使采用标准设置也能适用于不同的证券。
- 布林带是一款交易工具,可用于判定交易的入场和离场点。
- 波带通常用于判定超买和超卖状况。
- 它可以用来识别 M 形顶部和 W 形底部,或者判定趋势的强度。
天数 | 收盘价 $ |
---|---|
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 |
因此,布林带的计算将如下所示:
调整设置:
现在,如果有人问我们是否可以通过任何其它方式调整布林带的设置,从而适用于我们的策略或交易计划,答案是肯定的,我们当然可以这样做,尤其是经过调整和测试,它能给我们带来优良的结果。 我们还必须知道,布林建议对标准偏差乘数做一些小的调整。 我们还必须知道,改变移动平均线的周期会影响标准偏差的计算周期。 布林还建议,如果我们采用 50 周期的简单移动平均线,则将标准偏差乘数增加到 2.1;如果我们采用 10 周期的简单移动平均线,则将其减少到 1.9。
1. Period 是为移动平均线选择周期。
2. Deviations 是为波带选择上下偏差参数。
3. Apply to: 选择将采用的价格类型(收盘价、开盘价、最高价、最低价、中间价、典型价格和加权收盘价)参数。
4. Style: 选择指标的样式(指标线条的颜色、形状和宽度)。
5. Shift: 设置应用指标的移位值。
就像我之前提到的,我们可以根据交易者的输入和策略来调整这些设置。
现在,我们在价格图表上绘制了布林带指标,其显示方式与下图相同:
布林带策略
此刻,我们将讨论布林带策略,我们将知道如何运用它,并从中受益。
我们可以利用不同市场条件、或不同市场走势的布林带,如上升趋势、下降趋势和横盘。 在每一种市场条件下,我们都可以运用众多策略,但在这里我们只提其中的一些。
- 上升趋势期间
首先,我们需要了解在上升趋势中价格如何随移动平均线移动,因为我们可以发现价格在上升趋势中的大部分时间都在其均值(移动平均线)之上移动。
所以,我们会发现,在上升趋势中,价格大部分时间在移动平均线和波带上边界之间移动。 这意味着,因受买方支配,价格会出现更高的低点和更高的高点。
- 当价格上穿移动平均线时买入,目标将是波带上限。
- 价格 > 均线 = 做多,波带上限 = 目标
- 下跌趋势期间
首先,我们需要了解在下跌趋势中价格如何随移动平均线移动,因为我们可以发现价格在下跌趋势中的大部分时间都在其均值(移动平均线)之下移动。
所以,我们会发现,在下跌趋势中,价格大部分时间在移动平均线和波带下边界之间移动。 这意味着,因受卖方支配,价格会出现更低的高点和更低的低点。
- 当价格下穿移动平均线时做空,目标将是波带的下限。
- 价格 < 均线 = 做空,波带下限 = 目标
- 横盘期间
首先,我们需要了解价格在横盘期间是如何变动的,因为我们可以发现横盘是除了上升趋势和下跌趋势之外的任何走势。
横盘表示买方和卖方之间的平衡,因为他们中的一方无法完全支配市场。 以下图片是一些横盘走势的示例:
之前示意图是横盘走势的示例,比我提到的更多,但横盘走势的概念是除了上升和下跌趋势之外的任何走势。
现在,我们需要知道横盘走势将如何影响移动平均线,因为价格在移动平均线附近游走,故它会随机上穿或和下穿均线。 下图就是一个示例:
那么,价格如何随波林带移动呢? 价格在波带下限和上限之间波动,下图就是一个示例:
据我们所知,价格在波带下限和上限之间波动,横盘期间的策略是在下限做多,目标是上限,或在上限做空,目标是下限。
- 价格位于下限 = 做多,波带上限 = 目标
- 价格位于上限 = 做空,波带下限 = 目标
- 我们可以在波带下限做多,在波带上限获利了结。
- 我们可以在上限做空,在下限获利了结。
布林带策略系统设计
在这个有趣的部分,我们将学习如何基于布林带指标编写算法交易系统。 我们还将学习如何创建之前提到的三种交易策略(上升趋势、下跌趋势和横盘策略)。
您可以随心所欲地设计自己的交易系统,从简单的到先进的交易系统。 例如,您可以创建并设计一个简单的交易系统,它会根据一个简单的概念生成一个简单的信号,然后您再根据这个信号采取行动;或者您可以创建并设计一个高级交易系统,它不仅会为您提供简单的信号,而且会根据相关概念的组合给出一个高级信号,并自动执行。 有很多不同的方式。 在本文中,我们将讨论一个简单的交易系统 — 我们创建它只是为了学习这个概念。 基于这些知识,您就能开发类似的系统,或者按照自己的方式设计自己的交易系统。 我希望这篇文章对您有用,并帮助您达成交易或投资目标。
首先,我们要学习如何设计一个纯布林带代码,该代码允许在图表上显示三个注释,分别为移动平均值、波带上限值和下限值。
以下是执行此操作的代码:
//+------------------------------------------------------------------+ //| 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"); } //+------------------------------------------------------------------+现在,在编写并编译代码之后,我们必须确保代码没有错误或警告,如下图所示:
- 上升趋势波林带策略蓝图:
- 价格 > 均线 = 做多,波带上限 = 盈利目标, 或 = 无信号
//+------------------------------------------------------------------+ //| 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"); } } //+------------------------------------------------------------------+以下屏幕截图显示了该策略的信号:
接下来,我们需要执行以下步骤:
- 确保您的代码没有错误或警告
- 找到文件
- 通过拖放或双击要附加在图表上的文件来执行代码
- 下跌趋势波林带策略蓝图:
- 价格 < 均线 = 做空,波带下限 = 目标
以下是执行此操作的代码:
//+------------------------------------------------------------------+ //| 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"); } } //+------------------------------------------------------------------+下面的屏幕截图显示了该策略产生的信号:
- 确保您的代码没有错误或警告
- 找到文件
- 通过拖放或双击要附加在图表上的文件来执行代码
- 横盘布林带策略蓝图:
- 价格位于下限 = 做多,波带上限 = 目标
- 价格位于上限 = 做空,波带下限 = 目标
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"); } } //+------------------------------------------------------------------+该策略产生的信号:
- 确保您的代码没有错误或警告
- 找到文件
- 通过拖放或双击要附加在图表上的文件来执行代码
以下是执行此操作的代码: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"); } } //+------------------------------------------------------------------+以下是此策略生成的信号的屏幕截图:
- 确保您的代码没有错误或警告
- 找到文件
- 通过拖放或双击要附加在图表上的文件来执行代码
结束语
波带交易的概念非常好,因为它让我们对即将到来的走势有一个明确的预期,即利用这一走势,并从中受益。波带交易有很多方法,比如布林带,就像我们所知道的,它是一个很好的工具或方法,因为它可以随着价格走势而扩张和收缩,且我们可以在所有市场条件或趋势中使用它。
就像我之前提到的,在本文中,我尝试分享布林带指标的概念,我们如何计算它来增强对它的理解,并通过布林带指标提到简单的交易策略,然后学习如何为这些简单的策略设计简单的交易系统。
现在,您就可以制定或设计适合自己交易风格的策略。 我希望这篇文章对您和您的交易有所帮助。
参考
- 由约翰·布林格开发的布林带
- 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
嗨^大家好!我刚刚发现图片中的一个错误。请看我的附件中的正确图片!
你好,Vadzim。
谢谢你的评论。你是正确的,因为这是一个错误,它必须是价格<=下限带,因为这是我们等待关闭已开空头头寸的信号。
已经考虑过了,调整已经发出。
谢谢。
Mohamed
早上好,先生,你的工作如何,请你帮助我们设计一个一目了然的交易系统,谢谢你的回复。
你好,kman080。
谢谢你的意见,我会努力做到这一点。
文章发表学习用布林线设计交易系统。
作者:Mohamed Abdelmaaboud
非常好,我非常感谢你,我没有像你那样先进的知识,但在我现在所处的水平上使用指标,对我的学习非常有帮助,我真的很佩服他们的知识深度,非常感谢你。
谢谢你的评论,我很高兴听到这篇文章对你有帮助。