Saltar a contenido

Martingale cBot

Descripción general de la estrategia

Martingale cBot es un robot de operaciones que implementa la estrategia Martingale, un sistema de apuestas clásico adaptado para los mercados financieros. Descubierta por matemáticos franceses en el siglo XVIII, la estrategia Martingale rápidamente se hizo popular entre los apostadores en casinos.

Ejemplo

Para entender la mecánica de la estrategia Martingale, considere un escenario donde se lanza una moneda en un juego de cara o cruz, comenzando con una apuesta de 1 USD.

La moneda tiene una probabilidad de 50/50 de caer en cara o cruz. Cada lanzamiento de moneda es independiente - el resultado de un lanzamiento no afecta al siguiente.

Si la apuesta se duplica después de cada pérdida, una eventual ganancia recuperará todas las pérdidas y también generará un beneficio de 1 USD.

Creación de cBot

Aprenda cómo crear cBots, usando C# o Python, en nuestras guías paso a paso.

El código de Martingale cBot está disponible en nuestros repositorios públicos de C# y Python. El mismo código se proporciona como plantilla en el asistente de creación de algoritmos en cTrader Windows o Mac, o simplemente puede copiar y usar el fragmento a continuación:

 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

Integración de indicadores

Martingale cBot no utiliza ningún modelo predictivo ni indicador técnico para pronosticar la dirección del mercado. En su lugar, se basa en el azar para las decisiones de compra y venta, lo que resulta en resultados impredecibles (beneficio o pérdida) para cada operación.

Lógica

Dirección aleatoria de la operación

  • El cBot selecciona aleatoriamente si colocar una orden de compra o venta a través del método GetRandomTradeType().

  • El método ExecuteOrder() coloca una orden de mercado con la cantidad, stop loss y take profit definidos en los parámetros.

Mecanismo Martingale

  • El cBot detecta cuando se cierra una posición a través del controlador de eventos OnPositionsClosed().
  • Si la posición cerrada resulta en un beneficio, el cBot se reinicia y abre una nueva operación con el tamaño de lote inicial y una dirección de operación aleatoria.
  • Si la posición cerrada resulta en una pérdida, el cBot duplica la cantidad de la siguiente operación pero mantiene la misma dirección de operación (compra o venta) que la operación anterior.

Gestión de riesgos

  • El cBot se basa en la estrategia Martingale de duplicar el tamaño de la posición después de cada operación perdedora para recuperar pérdidas y obtener un beneficio cuando se produce una operación exitosa.
  • Los valores predeterminados de stop loss y take profit tienen como objetivo equilibrar el riesgo y la recompensa en cada operación.

Ejecución y terminación

Si el cBot encuentra un error debido a fondos insuficientes (NoMoney), el cBot deja de intentar realizar operaciones.

Parámetros

Parámetro Unidad Definición Consejos
Cantidad Lote Volumen de la (primera) operación en cada ciclo Martingale. Establecer un valor alto aumenta el tamaño de la posición para la primera operación. En consecuencia, al final de un ciclo de operación exitoso, el beneficio será grande. Sin embargo, en caso de una operación perdedora, el tamaño de la siguiente operación se duplicará, lo que aumenta el riesgo exponencialmente.

Establecer un valor bajo disminuye el tamaño de la posición para la primera operación. En consecuencia, al final de un ciclo de operación exitoso, el beneficio será pequeño, pero la exposición se minimiza en una racha perdedora prolongada.
Stop loss Pip Distancia desde el precio de entrada en la que se cerrará automáticamente una operación perdedora. Un stop loss grande permite que el mercado se mueva más en contra de la operación antes de cerrarla. Esto puede evitar que las operaciones se cierren prematuramente durante las fluctuaciones temporales, pero expone su cuenta a pérdidas mayores si el mercado continúa en la dirección incorrecta.

Un stop loss pequeño cerrará las operaciones perdedoras antes, reduciendo la pérdida potencial por operación. Sin embargo, también aumenta el riesgo de sufrir un stop out demasiado pronto debido a la volatilidad a corto plazo, activando el ciclo de duplicación Martingale con más frecuencia.
Take profit Pip Distancia desde el precio de entrada en la que se cerrará una operación cuando se alcance cierto nivel de beneficio. Establecer un valor alto de take profit le permite capturar grandes beneficios cuando el mercado se mueve significativamente a su favor. Sin embargo, esto también significa que las operaciones pueden tardar más en cerrarse, o pueden revertirse antes de alcanzar el objetivo de beneficio, lo que potencialmente resulta en oportunidades perdidas.

Un nivel de take profit más pequeño conduce a cierres de operaciones más rápidos, asegurando beneficios más pequeños pero más frecuentes. Este enfoque puede reducir la probabilidad de perder oportunidades rentables pero limita el potencial alcista de cada operación.

Aplicación

Mercados laterales o de rango

El Martingale cBot se destaca en mercados que se mueven lateralmente, donde no hay una tendencia alcista o bajista dominante. En mercados de rango, los precios fluctúan entre niveles de soporte y resistencia, lo que hace probable que el cBot recupere pérdidas rápidamente después de operaciones perdedoras.

Caso de uso

Considere un escenario donde EURUSD opera dentro de un rango estrecho de 1.1000 a 1.1050 durante varios días. Martingale cBot podría aprovechar el rebote del precio entre esos niveles, capturando eventualmente beneficios a medida que el mercado se revierte después de retrocesos menores.

Mejor práctica

Use el cBot en símbolos con movimientos de precio claros y bien definidos donde el mercado oscila de manera predecible. Los principales pares de forex durante las horas de operación tranquilas son un buen ejemplo.

Mercados de baja volatilidad

El cBot puede ser utilizado en condiciones de baja volatilidad donde los movimientos de precio tienen menos probabilidades de activar stop loss consecutivos, evitando el crecimiento rápido de posiciones. Tales condiciones permiten que la estrategia Martingale funcione bien a través de reversiones graduales de precio.

Caso de uso

Si está operando una materia prima como el oro (XAUUSD) durante un período de pocas noticias, el precio puede permanecer en un rango estrecho. El cBot puede beneficiarse de este entorno ya que los precios tienen más probabilidades de revertir dentro de movimientos cortos de precio, permitiendo operaciones rentables con menor riesgo de grandes caídas.

Mejor práctica

Evite ejecutar el cBot durante períodos en los que se esperan eventos económicos significativos o publicaciones de noticias porque causan alta volatilidad.

Activos de reversión a la media

Los símbolos que frecuentemente revierten a un nivel de precio medio son adecuados para Martingale cBot, ya que a menudo experimentan reversiones antes de formar una tendencia a largo plazo. En tales condiciones, el cBot puede recuperarse más rápido y obtener ganancias aumentando el tamaño de sus posiciones después de las pérdidas.

Caso de uso

Considere operar con divisas de reversión a la media, como EURGBP. Este tipo de símbolos suelen volver a su precio promedio después de picos o caídas temporales, proporcionando condiciones ideales y oportunidades para que el cBot cierre posiciones perdedoras con ganancias después de la reversión del precio.

Mejor práctica

Evite usar el cBot en mercados con tendencias fuertes y prolongadas donde los precios pueden seguir moviéndose en una dirección durante un largo período. El riesgo de grandes pérdidas antes de las recuperaciones es mayor en tales mercados.

Resumen

Martingale cBot es un algoritmo de operaciones automatizado que implementa la popular estrategia Martingale. Este cBot basa sus decisiones de compra y venta enteramente en el azar, prescindiendo de modelos predictivos o indicadores técnicos, lo que lleva a resultados inciertos para cada operación.

Operando bajo la suposición de que los mercados eventualmente favorecerán al operador, Martingale cBot duplica el tamaño de la operación después de las pérdidas para recuperarlas con una sola operación rentable. Este cBot puede ser efectivo en ciertos mercados, especialmente cuando los usuarios están bien informados sobre los riesgos y tienen recursos suficientes para soportar caídas prolongadas.