跳转至

Martingale cBot

策略概述

Martingale cBot 是一种交易机器人,它实现了 Martingale 策略,这是一种适用于金融市场的经典投注系统。 Martingale 策略由 18 世纪的法国数学家发现,并迅速在赌场赌徒中流行起来。

示例

要理解 Martingale 策略的机制,请考虑一个场景,其中在正面或反面的游戏中掷硬币,从 1 美元的赌注开始。

硬币有 50/50 的机会落在正面或反面。 每次掷硬币都是独立的——一次掷硬币的结果不会影响下一次。

如果每次亏损后将赌注加倍,最终的胜利将收回所有亏损,并带来 1 美元的利润。

cBot 创建

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

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

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

        [Parameter("Stop Loss", Group = "Protection", DefaultValue = 40)]
        public int StopLoss { get; set; }

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


        private Random random = new Random();

        protected override void OnStart()
        {
            Positions.Closed += OnPositionsClosed;

            ExecuteOrder(InitialQuantity, GetRandomTradeType());
        }

        private void ExecuteOrder(double quantity, TradeType tradeType)
        {
            var volumeInUnits = Symbol.QuantityToVolumeInUnits(quantity);
            var result = ExecuteMarketOrder(tradeType, SymbolName, volumeInUnits, "Martingale", StopLoss, TakeProfit);

            if (result.Error == ErrorCode.NoMoney)
                Stop();
        }

        private void OnPositionsClosed(PositionClosedEventArgs args)
        {
            Print("Closed");
            var position = args.Position;

            if (position.Label != "Martingale" || position.SymbolName != SymbolName)
                return;

            if (position.GrossProfit > 0)
            {
                ExecuteOrder(InitialQuantity, GetRandomTradeType());
            }
            else
            {
                ExecuteOrder(position.Quantity * 2, position.TradeType);
            }
        }

        private TradeType GetRandomTradeType()
        {
            return random.Next(2) == 0 ? TradeType.Buy : TradeType.Sell;
        }
    }
}
 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
import clr

clr.AddReference("cAlgo.API")

from cAlgo.API import *

from robot_wrapper import *

import random

class SampleMartingalecBot():
    def on_start(self):
        api.Positions.Closed += self.on_position_closed
        self.execute_order(api.InitialQuantity, self.get_random_trade_type())

    def execute_order(self, quantity, tradeType):
        volumeInUnits = api.Symbol.QuantityToVolumeInUnits(quantity)
        result = api.ExecuteMarketOrder(tradeType, api.SymbolName, volumeInUnits, "Martingale",  api.StopLoss,  api.TakeProfit)
        if result.Error == ErrorCode.NoMoney:
            api.Stop()

    def on_position_closed(self, args):
        api.Print("Closed")

        position = args.Position
        if position.Label != "Martingale" or position.SymbolName != api.SymbolName:
            return
        if position.GrossProfit > 0:
            self.execute_order(api.InitialQuantity, self.get_random_trade_type())
        else:
            self.execute_order(position.Quantity * 2, position.TradeType)

    def get_random_trade_type(self):
        return TradeType.Buy if random.randint(0, 1) == 0 else TradeType.Sell

指标集成

Martingale cBot 不使用任何预测模型或技术指标来预测市场方向。 相反,它依赖于随机机会做出买卖决策,导致每笔交易的结果(盈利或亏损)不可预测。

逻辑

随机交易方向

  • 该 cBot 通过 GetRandomTradeType() 方法随机选择下达买入或卖出订单。

  • ExecuteOrder() 方法下达一个市价单,其数量、止损和止盈由参数定义。

Martingale 机制

  • 该 cBot 通过 OnPositionsClosed() 事件处理程序检测仓位何时关闭。
  • 如果关闭的仓位产生盈利,cBot 将重置自身并以初始手数和随机交易方向开启新交易。
  • 如果关闭的仓位产生亏损,cBot 将下一笔交易的数量加倍,但保持与前一笔交易相同的交易方向(买入或卖出)。

风险管理

  • 该 cBot 依赖于 Martingale 策略,即在每次亏损交易后将仓位大小加倍,以在成功交易发生时弥补亏损并获利。
  • 默认的止损和止盈值旨在平衡每笔交易的风险和回报。

执行与终止

如果 cBot 因资金不足 (NoMoney) 而遇到错误,cBot 将停止尝试进行交易。

参数

参数 单位 定义 提示
数量 每个 Martingale 周期中(第一笔)交易的交易量。 设置较高的值会增加第一笔交易的仓位大小。 因此,在成功交易周期结束时,盈利会较大。 然而,在亏损交易的情况下,下一笔交易的大小将加倍,这会以指数方式增加风险。

设置较低的值会减少第一笔交易的仓位大小。 因此,在成功交易周期结束时,盈利会较小,但在长期亏损的情况下,风险敞口被最小化。
止损 距离入场价格的距离,在此价格下亏损交易将自动关闭。 较大的止损允许市场在关闭交易前进一步向不利于交易的方向移动。 这可能会防止交易在临时波动期间过早关闭,但如果市场继续朝错误方向发展,您的账户将面临更大的损失。

较小的止损会更快关闭亏损交易,减少每笔交易的潜在损失。 然而,它也增加了由于短期波动而过早被止损的风险,从而更频繁地触发 Martingale 加倍周期。
止盈 达到特定盈利水平时,交易平仓价与建仓价之间的距离。 设置较高的止盈值可以让您在市场大幅向有利方向波动时捕捉更大的利润。 然而,这也意味着交易可能需要更长时间才能平仓,或者它们可能在达到盈利目标之前反转,从而可能导致错失机会。

较小的止盈水平会导致交易更快平仓,确保较小但更频繁的利润。 这种方法可能会减少错失盈利机会的可能性,但限制了每笔交易的上行潜力。

应用

区间震荡或横盘市场

Martingale cBot 在横盘市场中表现出色,此时市场没有明显的上升或下降趋势。 在区间震荡市场中,价格在支撑位和阻力位之间波动,使得 cBot 在亏损交易后能够迅速恢复损失。

用例

考虑一种情况,EURUSD 在几天内在一个狭窄的 1.1000 至 1.1050 区间内交易。 Martingale cBot 可以利用价格在这些水平之间的反弹,最终在市场小幅回调后反转时捕获利润。

最佳实践

在价格走势清晰、市场可预测地波动的交易品种上使用 cBot。 在交易清淡时段的主要外汇货币对是一个不错的例子。

低波动市场

cBot 可以在低波动条件下使用,此时价格波动不太可能触发连续的止损,从而防止头寸快速增长。 这种条件允许 Martingale 策略通过逐渐的价格反转表现良好。

用例

如果您在低新闻期间交易黄金 (XAUUSD) 等商品,价格可能会保持在一个狭窄的区间内。 cBot 可以受益于这种环境,因为价格更有可能在短期价格波动内反转,从而以较低的大幅回撤风险进行盈利交易。

最佳实践

避免在预期有重大经济事件或新闻发布期间运行 cBot,因为这些事件会导致高波动性。

均值回归资产

经常回归到平均价格水平的交易品种非常适合 Martingale cBot,因为它们通常在形成长期趋势之前经历反转。 在这种情况下,cBot 可以通过在亏损后增加头寸规模来更快恢复并获利。

用例

考虑交易均值回归货币,例如 EURGBP。 这些类型的交易品种通常在暂时上涨或下跌后回归到其平均价格,为 cBot 提供了理想的条件和机会,使其在价格回归后以盈利平仓亏损头寸。

最佳实践

避免在强劲、长期的趋势市场中使用 cBot,此时价格可能会长时间朝一个方向移动。 在这种市场中,恢复之前出现大额亏损的风险更高。

摘要

Martingale cBot 是一种实现流行的 Martingale 策略的自动交易算法。 该 cBot 完全基于随机机会做出买卖决策,放弃了预测模型或技术指标,这导致每笔交易的结果不确定。

在假设市场最终会偏向交易者的前提下,Martingale cBot 在亏损后加倍交易规模,以期通过一次盈利交易挽回损失。 该 cBot 在 某些市场 中可能有效,尤其是当用户充分了解风险并有足够资源承受长期回撤时。