跳转至

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() 方法中使用指定的 Source 和 Periods 参数进行初始化,该方法在 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 代码并实施波动性指标,以防止强劲趋势并过滤掉非反转信号。