跳转至

RSI cBot

策略概述

RSI cBot 实现了一种基于动量的简单反转交易策略,依赖于 Relative Strength Index (RSI) 作为其关键指标。

RSI cBot 根据反映市场动量并确定超买或超卖条件的 RSI 值自动进行买卖。 该 cBot 被编码为在开新仓之前关闭现有仓位,这确保了在任何时候只有一个相关仓位是开放的。

当 RSI 低于 30 时,市场被视为超卖,cBot 会开买入仓位。 买入信号基于价格在市场达到超卖条件后会上涨的预期。

当 RSI 高于 70 时,市场被视为超买,cBot 会开卖出仓位。 卖出信号基于价格在市场超买后会下跌的预期。

基于 RSI 指标的策略最适合 cBot 可以根据 RSI 信号进行反转交易的市场。

cBot 创建

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

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

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

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

        [Parameter("Periods", Group = "RSI", DefaultValue = 14)]
        public int Periods { get; set; }

        private RelativeStrengthIndex rsi;

        protected override void OnStart()
        {
            rsi = Indicators.RelativeStrengthIndex(Source, Periods);
        }

        protected override void OnTick()
        {
            if (rsi.Result.LastValue < 30)
            {
                Close(TradeType.Sell);
                Open(TradeType.Buy);
            }
            else if (rsi.Result.LastValue > 70)
            {
                Close(TradeType.Buy);
                Open(TradeType.Sell);
            }
        }

        private void Close(TradeType tradeType)
        {
            foreach (var position in Positions.FindAll("SampleRSI", SymbolName, tradeType))
                ClosePosition(position);
        }

        private void Open(TradeType tradeType)
        {
            var position = Positions.Find("SampleRSI", SymbolName, tradeType);
            var volumeInUnits = Symbol.QuantityToVolumeInUnits(Quantity);

            if (position == null)
                ExecuteMarketOrder(tradeType, SymbolName, volumeInUnits, "SampleRSI");
        }
    }
}
 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
import clr

clr.AddReference("cAlgo.API")

# Import cAlgo API types
from cAlgo.API import *

# Import trading wrapper functions
from robot_wrapper import *

class SampleRSIcBot():
    def on_start(self):
        self.rsi = api.Indicators.RelativeStrengthIndex(api.Source, api.Periods)

    def on_tick(self):
        if self.rsi.Result.LastValue < 30:
            self.close_position(TradeType.Sell)
            self.open_position(TradeType.Buy)
        elif self.rsi.Result.LastValue > 70:
            self.close_position(TradeType.Buy)
            self.open_position(TradeType.Sell)

    def close_position(self, tradeType):
        for position in api.Positions.FindAll("SampleRSI", api.SymbolName, tradeType):
            api.ClosePosition(position)

    def open_position(self, tradeType):
        position = api.Positions.Find("SampleRSI", api.SymbolName, tradeType)
        volumeInUnits = api.Symbol.QuantityToVolumeInUnits(api.Quantity)
        if position is None:
            api.ExecuteMarketOrder(tradeType, api.SymbolName, volumeInUnits, "SampleRSI")

指标集成

Relative Strength Index (RSI) 是 RSI cBot 中使用的主要指标。 RSI 是一个动量振荡器,用于衡量价格变动的速度和变化。 它的范围在 0 到 100 之间,用于识别市场中的超买或超卖条件。

基于其对超买或超卖条件的评估,RSI 决定 cBot 是买入还是卖出。 RSI cBot 不依赖任何其他指标或因素,例如移动平均线或交易量;它仅使用 RSI 水平作为交易信号。

cBot 专注于两个关键阈值:

  • RSI < 30 表示市场超卖并触发买入订单。
  • RSI > 70 表示市场超买并触发卖出订单。

cBot 通过在每个新跳动点上检查 RSI 值来持续监控 RSI 值。 这确保了算法在 RSI 进入超卖或超买区域时始终准备好行动。

逻辑

初始设置

RSI 指标在 OnStart() 方法中使用指定的 SourcePeriods 参数进行初始化,该方法在 cBot 启动时调用。 计算使用 cTrader 内置的指标公式完成。

条件监控

交易的逻辑条件在 OnTick() 方法中执行,该方法在每次接收到新跳动点(价格更新)时调用。 如果 RSI < 30,则生成买入信号。 如果 RSI > 70,则生成卖出信号。

仓位管理

在 cBot 根据生成的信号开新仓之前,Close() 方法会检查并关闭所有带有 "SampleRSI" 标签的相反仓位。 此设置确保在任何时候只有一个交易对给定交易品种是活跃的。

交易执行

Open() 方法检查是否已经存在基于生成信号(买入或卖出)的相同类型的仓位。 如果未找到仓位,cBot 会使用指定的数量和在方法中传递的其他参数开新仓。

参数 单位 定义 提示
数量 每笔交易的交易量。 保守的交易者可能会选择较小的交易手数以最小化风险。

激进的交易者可能会选择较大的交易手数以最大化潜在收益,尽管风险也更高。
来源 RSI 指标的数据源。 可用选项包括收盘价、开盘价、最高价和最低价。 收盘价通常用于 RSI 计算,因为它反映了蜡烛图中最重要的价格点。 然而,交易者可以尝试不同的数据系列,并选择最适合市场条件的系列。

最高价或最低价可以帮助识别极端价格波动,而中位数或典型价格则提供了更平衡的视角。
周期 用于计算 RSI 的周期数(蜡烛数)。 默认值 14 是该指标的标准值或常用设置。 短线交易者或希望从短期价格波动中获利的交易者(例如,在 5 分钟图表上)可能会选择较短的周期。 此设置使 RSI 更加敏感,导致其更频繁地生成买入和卖出信号。

波段或长期交易者(例如,在 1 小时图表上)可能更喜欢较大的 RSI 周期。 此设置降低了 RSI 的敏感性,使其更加平滑,更能抵抗快速价格波动。 过滤掉噪音后,RSI 专注于主要市场趋势,并生成较少的信号。

应用

区间震荡(横盘)市场

在区间震荡市场中,价格在阻力位(上边界)和支撑位(下边界)之间波动。 此类事件非常适合基于 RSI 的策略,因为它们提供了许多超买和超卖的情况。 由于价格在区间震荡市场中触及支撑位或阻力位时经常反转方向,RSI 更有可能提供准确的信号。

用例

考虑一种情况,EURUSD 反复在 1.1000 和 1.1200 之间移动。 cBot 可以通过在超卖(RSI < 30)时接近下边界买入并在超买(RSI > 70)时接近上边界卖出来展示良好的表现。

最佳实践

  • 专注于在低波动期间进行交易。 当市场没有显著趋势时,RSI 指标表现更好。
  • 检查价格图表,寻找价格在明确区间内波动的时期。
  • 监控突破。 如果价格显著超出区间,停止 cBot 并重新评估市场状况。

低波动市场

低波动市场的特点是价格波动小且缺乏主要趋势。 RSI 在此类环境中特别有用,因为它可以在不受强烈方向性趋势影响的情况下识别短期市场失衡。

在低波动环境中,价格往往在超买和超卖水平之间波动,为 cBot 提供了频繁的交易机会。

用例

股票指数如 S&P 500 可能会出现低波动时期,其价格在窄幅区间内移动。 在此类时期,cBot 利用小幅反转。 当 RSI 跌破 30 时,它进入买入头寸;当 RSI 升至 70 以上时,它进入卖出头寸。

最佳实践

  • 使用波动性指标来确定市场何时进入低波动阶段。
  • 调整手数和 RSI 周期,使指标能够有效瞄准小幅价格变化。
  • 使用额外的风险管理策略,如止损,以防止意外的市场波动。

强劲趋势后的盘整市场

在强劲的上升或下降趋势之后,市场通常会进入一个盘整阶段,价格趋于稳定。 交易者随后获利了结或等待新的市场方向,盘整期成为基于 RSI 交易策略的理想时机。

在强劲趋势后的盘整期内,RSI 指标可以识别市场何时进入超买或超卖区域。 RSI cBot 随后可以在盘整期内捕捉反转点。

用例

考虑一种情况,蓝筹股在经历大幅上涨或下跌后进入盘整。 股价开始在一个狭窄的范围内波动。 cBot 随后在此阶段检测到超买(RSI > 70)或超卖(RSI < 30)条件,并据此进行交易。

最佳实践

  • 在强劲趋势后,等待市场开始盘整后再运行 cBot。
  • 监控长期支撑位和阻力位,以确保市场真正进入盘整,而不是准备再次突破。

总结

RSI 指标是 cBot 策略的核心,它驱动所有买入和卖出决策。 虽然 cBot 能够有效地使用该指标在超卖和超买市场中利用反转机会,但其依赖单一算法也带来了虚假信号和市场背景有限的风险。

能够为关键参数指定值并选择数据源,使用户能够根据个人交易风格、风险承受能力和市场条件调整 RSI cBot。 无论您是短线交易者、波段交易者还是长期投资者,调整 cBot 参数都可以更好地与您的策略保持一致,并增加成功的机会。

交易者可以使用不同的值、设置和数据对 cBot 进行回测,以找到适合所选交易品种和时间周期的最佳或盈利参数组合。 此外,cTrader 用户可以修改 cBot 代码并实施波动性指标,以防止强劲趋势并过滤掉非反转信号。