跳转至

Trend cBot

策略概述

Trend cBot 实施了一种策略,其中使用两个移动平均线 (MA) 来检测趋势并做出交易决策。 该算法计算快速 MA 和慢速 MA,比较它们随时间变化的值,并识别交叉点以生成买入或卖出信号。

由于 Trend cBot 依赖 MA 交叉来检测动量变化,它在具有明确且持续趋势的市场中最为有效。 换句话说,该算法在表现出强劲方向性运动的交易品种上表现良好,无论是向上还是向下。

cBot 创建

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

Trend 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
using cAlgo.API;
using cAlgo.API.Indicators;

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

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

        [Parameter("Source", Group = "Moving Average")]
        public DataSeries SourceSeries { get; set; }

        [Parameter("Slow Periods", Group = "Moving Average", DefaultValue = 10)]
        public int SlowPeriods { get; set; }

        [Parameter("Fast Periods", Group = "Moving Average", DefaultValue = 5)]
        public int FastPeriods { get; set; }


        private MovingAverage slowMa;
        private MovingAverage fastMa;
        private const string label = "Sample Trend cBot";

        protected override void OnStart()
        {
            fastMa = Indicators.MovingAverage(SourceSeries, FastPeriods, MAType);
            slowMa = Indicators.MovingAverage(SourceSeries, SlowPeriods, MAType);
        }

        protected override void OnTick()
        {
            var longPosition = Positions.Find(label, SymbolName, TradeType.Buy);
            var shortPosition = Positions.Find(label, SymbolName, TradeType.Sell);

            var currentSlowMa = slowMa.Result.Last(0);
            var currentFastMa = fastMa.Result.Last(0);
            var previousSlowMa = slowMa.Result.Last(1);
            var previousFastMa = fastMa.Result.Last(1);

            if (previousSlowMa > previousFastMa && currentSlowMa <= currentFastMa && longPosition == null)
            {
                if (shortPosition != null)
                    ClosePosition(shortPosition);

                ExecuteMarketOrder(TradeType.Buy, SymbolName, VolumeInUnits, label);
            }
            else if (previousSlowMa < previousFastMa && currentSlowMa >= currentFastMa && shortPosition == null)
            {
                if (longPosition != null)
                    ClosePosition(longPosition);

                ExecuteMarketOrder(TradeType.Sell, SymbolName, VolumeInUnits, label);
            }
        }

        private double VolumeInUnits
        {
            get { return Symbol.QuantityToVolumeInUnits(Quantity); }
        }
    }
}
 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
import clr

clr.AddReference("cAlgo.API")

# Import cAlgo API types
from cAlgo.API import *

# Import trading wrapper functions
from robot_wrapper import *

class SampleTrendcBot():
    Label = "Sample Trend cBot"

    def on_start(self):
        self.volume_in_units = api.Symbol.QuantityToVolumeInUnits(api.Quantity)
        self.fastMa = api.Indicators.MovingAverage(api.SourceSeries, api.FastPeriods, api.MAType)
        self.slowMa = api.Indicators.MovingAverage(api.SourceSeries, api.SlowPeriods, api.MAType)

    def on_tick(self):
        longPosition = api.Positions.Find(self.Label, api.SymbolName, TradeType.Buy)
        shortPosition = api.Positions.Find(self.Label, api.SymbolName, TradeType.Sell)

        currentSlowMa = self.slowMa.Result.Last(0)
        currentFastMa = self.fastMa.Result.Last(0)
        previousSlowMa = self.slowMa.Result.Last(1)
        previousFastMa = self.fastMa.Result.Last(1)

        if previousSlowMa > previousFastMa and currentSlowMa <= currentFastMa and longPosition is None:
            if shortPosition is not None:
                api.ClosePosition(shortPosition)
            api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, self.volume_in_units, self.Label)
        elif previousSlowMa < previousFastMa and currentSlowMa >= currentFastMa and shortPosition is None:
            if longPosition is not None:
                api.ClosePosition(longPosition)
            api.ExecuteMarketOrder(TradeType.Sell, api.SymbolName, self.volume_in_units, self.Label)

指标集成

移动平均线是一种流行的技术指标,它平滑价格数据以识别特定时期内的趋势。 移动平均指标包括 Simple Moving Average (SMA)Exponential Moving Average (EMA)Time SeriesTriangularWeightedWelles Wilder SmoothingHull 等。

Trend cBot 使用两个 MA 来监控市场趋势:

  • 快速 MA – 对价格变化反应更快,通常代表短期趋势。
  • 慢速 MA – 对价格变化反应较慢,代表长期趋势。

cBot 关注快速 MA 和慢速 MA 之间的交叉事件,并使用它们生成信号:

  • 买入信号 – 当慢速 MA 从下方穿过快速 MA 时,被视为上升动量,并生成买入信号。
  • 卖出信号 – 当快速 MA 从下方穿过慢速 MA 时,被视为下降动量,并生成卖出信号。

如果在相反的交易头寸开放时生成新信号,例如在卖出头寸开放时生成买入信号,cBot 将关闭现有头寸并打开新头寸。 此设置确保一次只开放一个头寸。

计算和逻辑

初始设置

cBot 在 OnStart() 方法中初始化两个 MA,该方法在 cBot 启动时调用。

MA 使用不同周期在数据系列上计算。 fastMA 使用 FastPeriods 计算,而 slowMA 使用 SlowPeriods 计算。

实时MA计算

交易决策的主要逻辑在OnTick()方法中执行,该方法在每次接收到新的跳动点(价格数据)时被调用。 两个MA使用cTrader内置公式为选定的MAType持续计算,并在每个跳动点上更新。

cBot检索MA的当前值和先前值,然后进行交叉条件判断。 cBot比较MA的当前值和先前值,以确定是否发生了交叉:

  • 上升趋势检测 – 如果 slowMA 从下方穿过 fastMA,则被视为上升动量,并生成买入信号。
  • 下降趋势检测 – 如果 fastMA 从下方穿过 slowMA,则被视为下降动量,并生成卖出信号。

交易执行

检测到交叉后,cBot根据生成的信号执行交易:

  • 买入信号的交易执行 – cBot 检查并关闭任何空头(卖出)头寸。 然后开立新的买入头寸。
  • 卖出信号的交易执行 – cBot 检查并关闭任何多头(买入)头寸。 然后开立新的卖出头寸。

参数

参数 单位 定义 提示
数量 每笔交易的交易量。 专注于小幅价格波动的剥头皮交易者可能会选择小手数以最小化风险,同时在短时间内进行多次交易。

持有头寸时间较长的摆动交易者可能会使用大手数,因为他们预期市场会有大幅波动,并希望最大化潜在收益。
MA类型 移动平均线的类型。 在波动较小的市场中,交易者可能更喜欢SMA,因为它更有效地平滑价格数据,并减少cBot被短期波动误导的机会。

在波动较大的市场中,用户可能更喜欢EMA,因为它能够快速反应价格变化并捕捉早期趋势反转。
来源 用于计算移动平均线的价格数据。 可用选项包括收盘价、开盘价、最高价和最低价。 保守的交易者可能会使用收盘价作为来源,因为它代表蜡烛的最终价格,并且往往更可靠。

更激进的交易者可能会选择最高价或最低价,如果他们希望在价格范围的极端点捕捉趋势反转或突破机会。
慢速周期 用于计算慢速移动平均线的周期数。 日内交易者可能会设置较低的值,以专注于短期趋势并在一天内捕捉频繁的机会。

针对长期趋势的交易者可能会设置较高的值,以确保 cBot 仅在存在强劲且确认的趋势时进入交易。
快速周期 用于计算快速移动平均线的周期数。 寻求快速进出场的交易者可能会设置较低的值,以确保 cBot 对短期价格变动做出快速反应。

跟随更广泛市场趋势的交易者可能会设置较高的值,以减少错误信号的数量并专注于实质性的价格变动。

应用

趋势市场

趋势 cBot 在价格走势一致且持续的趋势市场中表现良好。 在此类市场中,移动平均线通常能捕捉到趋势,使交叉成为有效的买入和卖出信号指标。

用例

考虑一个场景,其中 EURUSD 处于强劲的看涨趋势中,导致其图表上每日高点和更高的低点。 移动平均线交叉检测到趋势,cBot 在快速 MA 向上交叉慢速 MA 时发出买入信号。

最佳实践

  • 在较长周期交易时,为 MA 使用高周期值,以避免噪音并捕捉持续趋势。
  • 在波动性相对较低的商品(例如黄金)趋势市场中,使用简单移动平均线以确保过滤掉较小的价格波动。

高波动性资产

经历急剧且显著价格变动的资产往往受益于 cBot 在选择合适的移动平均线时对快速移动趋势的响应能力。

用例

考虑一个场景,其中比特币处于加密牛市或季节的中间。 BTC 经历快速的价格波动,有时在几天内趋势向上数千美元。 cBot 通过在快速 MA 向上交叉慢速 MA 时进入多头头寸来利用急剧的上升趋势。

最佳实践

  • 使用指数移动平均线,以便 cBot 对最近的价格变化做出更快的反应。
  • 考虑设置较短的快速和慢速周期以捕捉早期动量。

摆动交易

持有头寸数天或数周的摆动交易者在使用合适的设置时,受益于 cBot 检测中期趋势的能力。 移动平均线交叉为具有周期性价格波动的市场中的交易提供了清晰的进出场点。

用例

考虑一个场景,其中摆动交易者识别出 GBPUSD 的周期性趋势,并在 4 小时图表上使用 cBot 捕捉持续数天的趋势。 当快速 MA 向上交叉慢速 MA 时,cBot 进入买入头寸,持有直到趋势反转。

最佳实践

为快速和慢速 MA 使用中等长度的周期,以确保 cBot 忽略较小的波动,同时捕捉重要的市场变动。

突破策略

Trend cBot 在价格突破盘整区间并进入新趋势的突破事件中非常有用。 当突破发生时,移动平均线交叉可以预示强劲走势的开始。

用例

考虑一种情景,某只主要股票在几天或几周内在一个狭窄的范围内交易,预计会出现突破。 可以部署 cBot 来捕捉突破。 当股票价格突破阻力位时,快速 MA 上穿慢速 MA,触发买入信号。

最佳实践

为快速 MA 周期使用较低的值,使 cBot 能够尽早捕捉趋势,从而为交易提供有利的入场点。

摘要

Trend cBot 遵循基于移动平均线交叉的简单数学过程,以检测趋势变化并执行交易。 通过比较快速和慢速 MA 的当前值和先前值,cBot 决定买入或卖出,确保仓位始终与检测到的趋势一致。

当 cBot 与其他指标结合使用时,可能会提高性能。 Relative Strength Index (RSI)Moving Average Convergence Divergence (MACD) 可以过滤掉虚假信号并确认趋势强度。 例如,在根据 MA 交叉采取行动之前,可以使用 RSI 检查超买或超卖情况。

使用 cBot 的可自定义参数,您可以微调算法以适应您的交易需求和风险承受能力。 此外,您可以使用不同的值、设置和数据对 cBot 进行回测,以找到特定交易品种和时间周期的最佳或盈利参数组合。