跳转至

Breakout cBot

策略概述

Breakout cBot 利用符号价格突破预定义支撑或阻力水平的时机进行交易。

此 cBot 通过比较Bollinger Bands顶部和底部之间的距离与用户定义的阈值来监控价格整合,然后执行以下操作:

  • 如果符号价格在指定周期内保持在盘整范围内,cBot 将市场识别为盘整状态。
  • 如果价格突破顶部带,它将开立买入头寸。 如果价格跌破底部带,它将开立卖出头寸。
  • 开仓时,它会应用用户定义的止损和止盈值。

cBot 利用盘整阶段后的突破走势,使其适合具有明显盘整期和急剧方向性走势的市场或符号。

cBot 创建

了解如何通过我们的分步指南使用 C# 或 Python 创建 cBot。

Breakout cBot 代码可在我们的公共 C# 和 Python 代码库中找到。 相同的代码在 cTrader Windows 或 Mac 的算法创建向导中作为模板提供,或者您可以简单地复制并使用以下代码片段:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None, AddIndicators = true)]
    public class SampleBreakoutcBot : Robot
    {
        [Parameter("Quantity (Lots)", Group = "Volume", DefaultValue = 1, MinValue = 0.01, Step = 0.01)]
        public double Quantity { get; set; }

        [Parameter("Stop Loss (pips)", Group = "Protection", DefaultValue = 20, MinValue = 1)]
        public int StopLossInPips { get; set; }

        [Parameter("Take Profit (pips)", Group = "Protection", DefaultValue = 40, MinValue = 1)]
        public int TakeProfitInPips { get; set; }

        [Parameter("Source", Group = "Bollinger Bands")]
        public DataSeries Source { get; set; }

        [Parameter("Band Height (pips)", Group = "Bollinger Bands", DefaultValue = 40.0, MinValue = 0)]
        public double BandHeightPips { get; set; }

        [Parameter("Bollinger Bands Deviations", Group = "Bollinger Bands", DefaultValue = 2)]
        public double Deviations { get; set; }

        [Parameter("Bollinger Bands Periods", Group = "Bollinger Bands", DefaultValue = 20)]
        public int Periods { get; set; }

        [Parameter("Bollinger Bands MA Type", Group = "Bollinger Bands")]
        public MovingAverageType MAType { get; set; }

        [Parameter("Consolidation Periods", Group = "Bollinger Bands", DefaultValue = 2)]
        public int ConsolidationPeriods { get; set; }

        BollingerBands bollingerBands;
        string label = "Sample Breakout cBot";
        int consolidation;

        protected override void OnStart()
        {
            bollingerBands = Indicators.BollingerBands(Source, Periods, Deviations, MAType);
        }

        protected override void OnBar()
        {
            var top = bollingerBands.Top.Last(1);
            var bottom = bollingerBands.Bottom.Last(1);

            if (top - bottom <= BandHeightPips * Symbol.PipSize)
            {
                consolidation = consolidation + 1;
            }
            else
            {
                consolidation = 0;
            }

            if (consolidation >= ConsolidationPeriods)
            {
                var volumeInUnits = Symbol.QuantityToVolumeInUnits(Quantity);
                if (Ask > top)
                {
                    ExecuteMarketOrder(TradeType.Buy, SymbolName, volumeInUnits, label, StopLossInPips, TakeProfitInPips);
                    consolidation = 0;
                }
                else if (Bid < bottom)
                {
                    ExecuteMarketOrder(TradeType.Sell, SymbolName, volumeInUnits, label, StopLossInPips, TakeProfitInPips);
                    consolidation = 0;
                }
            }
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import clr

clr.AddReference("cAlgo.API")

# Import cAlgo API types
from cAlgo.API import *

# Import trading wrapper functions
from robot_wrapper import *

class SampleBreakoutcBot():
    Label = "Sample Breakout cBot"
    def on_start(self):
        self.bollingerBands = api.Indicators.BollingerBands(api.Source, api.Periods, api.Deviations, api.MAType)

    def on_bar(self):
        top = self.bollingerBands.Top.Last(1)
        bottom = self.bollingerBands.Bottom.Last(1)

        if top - bottom <= api.BandHeightPips * api.Symbol.PipSize:
            self.consolidation += 1
        else:
            self.consolidation = 0

        if self.consolidation >= api.ConsolidationPeriods:
            volumeInUnits = api.Symbol.QuantityToVolumeInUnits(api.Quantity)
            if api.Ask > top:
                api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, volumeInUnits, self.Label, api.StopLossInPips, api.TakeProfitInPips)
                self.consolidation = 0 
            elif api.Bid < bottom:
                api.ExecuteMarketOrder(TradeType.Sell, api.SymbolName, volumeInUnits, self.Label, api.StopLossInPips, api.TakeProfitInPips)
                self.consolidation = 0 

指标集成

Bollinger Bands 指标是 Breakout cBot 所采用策略的核心。

该 cBot 使用 Bollinger Bands 的宽度(上轨和下轨之间的距离)来识别盘整期。 当布林带较窄(表明波动性较低)时,cBot 将其视为盘整期。

如果上轨和下轨之间的差值小于或等于指定阈值(BandHeightPips),则盘整计数器(consolidation)增加。 cBot 需要一定数量的连续盘整期(ConsolidationPeriods)才会考虑潜在的突破。

cBot 通过以下方式监控并解读价格的突破:

  • 看涨突破 - 如果卖价超过 Bollinger Bands 的顶部,cBot 将其解释为看涨突破并执行买入订单。
  • 看跌突破 - 如果买价低于 Bollinger Bands 的底部,cBot 将其解释为看跌突破并执行卖出订单。

执行交易后,盘整计数器重置为零。

计算和逻辑

Bollinger Bands 设置

\[ B_{\text{top}} = MA + (D \times \sigma), \quad B_{\text{bottom}} = MA - (D \times \sigma) \]

\(B_{\text{top}}\) – 上轨

\(B_{\text{bottom}}\) – 下轨

\(MA\) – 移动平均线

\(D\) – 偏差数量

\(\sigma\) – 标准偏差

盘整条件

\[ \text{如果 } (B_{\text{top}} - B_{\text{bottom}}) \leq (H \times P), \text{ 则 } C_{\text{counter}} = C_{\text{counter}} + 1 \]

否则,

\[ C_{\text{counter}} = 0 \]

\(H\) – 布林带高度(点)

\(P\) – 点值

\(C_{\text{Counter}}\) – 盘整计数器

盘整期检查

如果盘整计数器大于盘整期,则执行突破逻辑。

突破逻辑

如果卖价大于上轨,则下达买入订单。 如果买价小于下轨,则下达卖出订单。

参数

参数 单位 定义 提示
数量 手 每笔交易的交易量。 风险偏好较低的交易者可以从较低的金额开始,以最小化潜在损失。

风险承受能力较高的用户可以设置更高的金额,以追求更大的利润。
止损 点 交易将自动关闭以防止进一步损失的点数。 风险厌恶的交易者可以设置严格的止损值以限制潜在损失。

能够承受市场波动的用户可以设置更宽的止损值,允许交易在关闭前有更多的喘息空间。
止盈 点 交易将自动关闭以防止进一步损失的点数。 偏好快速退出的交易者可以使用较低的止盈值,以利用短期波动。

目标较长期趋势的用户可以设置较高的止盈值,以便交易可以运行更长时间。
布林带高度 点 Bollinger Bands 在盘整阶段的最大宽度,使 cBot 能够识别低波动性时期。 专注于紧密盘整的交易者可以使用较低的带高度值,以瞄准低波动性时期的主要突破。

习惯于较宽范围的用户可以使用增加的带高度值,使 cBot 能够将稍宽的盘整视为潜在的设置。
Bollinger Bands 偏差 — 用于计算 Bollinger Bands 宽度的标准偏差值。 专注于紧密盘整的交易者可以使用较低的带高度值,以瞄准低波动性时期的主要突破。

习惯于较宽范围的用户可以使用增加的带高度值,使 cBot 能够将稍宽的盘整视为潜在的设置。
Bollinger Bands 周期 — 用于计算 Bollinger Bands 的周期数。 专注于短期市场波动的交易者可以使用较小的周期,这使得 Bollinger Bands 对最近的价格变化更加敏感。

对长期趋势感兴趣的用户应考虑较大的周期,这会使 Bollinger Bands 平滑并降低其对短期波动的敏感性。
盘整周期 — 在考虑突破交易之前,必须满足盘整标准的连续柱数。 寻找更频繁交易的交易者可以减少盘整周期,使 cBot 能够更快地进入交易。

偏好确认突破的用户可以增加盘整周期,以确保价格在采取行动之前在盘整范围内停留更长时间。

应用

趋势市场

Breakout cBot 在趋势市场(上涨或下跌)中表现良好。 在此类市场中,突破通常与盘整期后的整体趋势一致,导致大幅价格波动。

用例

考虑一个场景,其中 EURUSD 处于强劲的上升趋势中,但暂时在窄幅范围内盘整。 Bollinger Bands 收窄,表明波动性降低。 cBot 检测到这种盘整并等待突破。 随着趋势恢复,价格突破上方 Bollinger Band。 cBot 执行买入订单,利用趋势的延续。

最佳实践

  • 使用较大的周期。 cBot 在趋势市场中的较大周期(1小时、4小时等) 上特别有效。 这种设置有助于捕捉产生更高回报的显著价格波动。
  • 避免短盘整周期。 在强劲的趋势市场中,您可能希望避免导致短盘整周期的设置,因为它们可能导致假突破。

形态后的突破

cBot 可用于交易图表形态的突破,这些形态通常会导致强劲的价格波动,例如三角形、旗形或三角旗形。 这些形态通常会导致盘整阶段,随后是突破。

用例

考虑一个场景,其中 EURGBP 符号在1小时图表上形成对称三角形形态。 随着三角形收窄,Bollinger Bands 也收紧,表明波动性降低。 该cBot识别出三角形态内的盘整。 一旦价格突破上方 Bollinger Band 并退出三角形形态,cBot 执行买入订单以捕捉突破。

最佳实践

  • 将 cBot 与其他形态结合。 手动识别重要的图表形态,然后在形态完成后使用 cBot 自动化突破交易。
  • 延长盘整周期。 对于形成时间较长的形态,考虑增加盘整周期,以确保 cBot 仅在形态完全形成后触发。

新闻后交易

cBot 在重大经济新闻、事件或公告发布的日子里可能有效。 在某些新闻发布后,一些市场需要时间来盘整,因为交易者消化信息。 当市场方向变得明确时,可能会发生突破。

用例

考虑一个场景,在美国发布后。 非农就业数据公布后,JPYUSD货币对进入盘整状态,交易者正在评估报告的影响。 Bollinger Bands收窄,表明波动性较低。 cBot识别出这种盘整状态并等待突破。 当市场确定方向时(例如,由于数据优于预期导致美元走强),价格突破下方Bollinger Band。 cBot执行卖出订单以捕捉这一走势。

最佳实践

  • 监控经济日历。 配置cBot在重要经济数据发布前后运行。 确保调整盘整期设置以捕捉新闻发布后的盘整阶段,然后等待突破。
  • 调整止损。 由于新闻事件后波动性增加,考虑扩大止损以应对市场在突破完全形成前的潜在波动。

摘要

Breakout cBot 使交易者能够利用市场波动性、高交易量和增加的活动。 虽然cBot在执行突破策略时效率很高,但其对Bollinger Bands的依赖可能会在某些市场条件下导致性能问题。

根据特定货币对和您的交易偏好定制Breakout cBot可以显著提高其有效性。 通过将您自己的策略融入cBot并修改其代码以使其能够使用其他指标,您可以进一步提高其准确性和性能。