Перейти к содержанию

Martingale cBot

Обзор стратегии

Martingale cBot — это торговый робот, реализующий стратегию Мартингейла, классическую систему ставок, адаптированную для финансовых рынков. Открытая французскими математиками в XVIII веке, стратегия Мартингейла быстро стала популярной среди игроков в казино.

Пример

Чтобы понять механику стратегии Мартингейла, рассмотрим сценарий, при котором подбрасывается монета в игре «орел или решка», начиная со ставки в 1 доллар США.

У монеты есть шанс 50/50 выпасть орлом или решкой. Каждое подбрасывание монеты независимо — результат одного подбрасывания не влияет на следующее.

Если ставка удваивается после каждого проигрыша, то в конечном итоге выигрыш покроет все убытки, а также принесет прибыль в 1 доллар США.

Создание сиБота

Узнайте, как создавать сиБотов, используя C# или Python, в наших пошаговых руководствах.

Код 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 не использует какую-либо прогностическую модель или технический индикатор для прогнозирования направления рынка. Вместо этого он полагается на случайный выбор для решений о покупке и продаже, что приводит к непредсказуемым результатам (прибыль или убыток) для каждой сделки.

Логика

Случайное направление сделки

  • сиБот случайным образом выбирает, размещать ли ордер на покупку или продажу, через метод GetRandomTradeType().

  • Метод ExecuteOrder() размещает рыночный ордер с объемом, стоп-лоссом и тейк-профитом, определенными в параметрах.

Механизм Мартингейла

  • сиБот обнаруживает закрытие позиции через обработчик события OnPositionsClosed().
  • Если закрытая позиция приносит прибыль, сиБот сбрасывается и открывает новую сделку с начальным размером лота и случайным направлением сделки.
  • Если закрытая позиция приносит убыток, сиБот удваивает объем следующей сделки, но сохраняет то же направление сделки (покупка или продажа), что и в предыдущей сделке.

Управление рисками

  • сиБот полагается на стратегию Мартингейла удвоения размера позиции после каждой убыточной сделки для восстановления убытков и получения прибыли после успешной сделки.
  • Значения стоп-лосса и тейк-профита по умолчанию направлены на балансировку риска и дохода по каждой сделке.

Исполнение и завершение

Если сиБот сталкивается с ошибкой из-за недостатка средств (NoMoney), сиБот прекращает попытки совершать сделки.

Параметры

Параметр Единица Определение Советы
Количество Лот Объем (первой) сделки в каждом цикле Мартингейла. Установка высокого значения увеличивает размер позиции для первой сделки. Следовательно, в конце успешного торгового цикла прибыль будет большой. Однако в случае убыточной сделки размер следующей сделки удвоится, что экспоненциально увеличивает риск.

Установка низкого значения уменьшает размер позиции для первой сделки. Следовательно, в конце успешного торгового цикла прибыль будет небольшой, но риск минимизируется при продолжительной серии убытков.
Стоп-лосс Пип Расстояние от цены входа, на котором убыточная сделка будет автоматически закрыта. Большой стоп-лосс позволяет рынку двигаться дальше против сделки перед ее закрытием. Это может предотвратить преждевременное закрытие сделок во время временных колебаний, но подвергает ваш счет большим потерям, если рынок продолжит движение в неблагоприятном направлении.

Небольшой стоп-лосс закроет убыточные сделки раньше, уменьшая потенциальные потери на сделку. Однако это также увеличивает риск слишком раннего срабатывания стоп-лосса из-за краткосрочной волатильности, что чаще запускает цикл удвоения по Мартингейлу.
Тейк-профит Пип Расстояние от цены входа, на котором сделка будет закрыта при достижении определенного уровня прибыли. Установка высокого значения тейк-профита позволяет получить большую прибыль, когда рынок значительно движется в вашу пользу. Однако это также означает, что закрытие сделок может занять больше времени, или они могут развернуться до достижения целевой прибыли, что потенциально приведет к упущенным возможностям.

Меньший уровень тейк-профита приводит к более быстрому закрытию сделок, обеспечивая меньшую, но более частую прибыль. Такой подход может снизить вероятность упущенных прибыльных возможностей, но ограничивает потенциал роста каждой сделки.

Приложение

Рынки в диапазоне или боковые рынки

Martingale cBot превосходно работает на рынках, движущихся в боковом направлении, где нет доминирующего восходящего или нисходящего тренда. На рынках в диапазоне цены колеблются между уровнями поддержки и сопротивления, что делает вероятным быстрое восстановление потерь сиБотом после убыточных сделок.

Пример использования

Рассмотрим сценарий, когда EURUSD торгуется в узком диапазоне от 1,1000 до 1,1050 в течение нескольких дней. Martingale cBot может воспользоваться отскоком цены между этими уровнями, в конечном итоге получая прибыль по мере разворота рынка после незначительных откатов.

Лучшая практика

Используйте сиБота на инструментах с четкими, хорошо определенными ценовыми движениями, где рынок колеблется предсказуемо. Хорошим примером являются основные валютные пары в часы спокойной торговли.

Рынки с низкой волатильностью

сиБот может использоваться в условиях низкой волатильности, где ценовые движения с меньшей вероятностью вызовут последовательные срабатывания стоп-лоссов, предотвращая быстрый рост позиций. Такие условия позволяют стратегии Мартингейла хорошо работать благодаря постепенным разворотам цены.

Пример использования

Если вы торгуете таким товаром, как золото (XAUUSD), в период отсутствия новостей, цена может оставаться в узком диапазоне. сиБот может извлечь выгоду из такой среды, поскольку цены с большей вероятностью вернутся в пределах коротких ценовых движений, что позволяет совершать прибыльные сделки с меньшим риском больших просадок.

Лучшая практика

Избегайте запуска сиБота в периоды, когда ожидаются значительные экономические события или выход новостей, поскольку они вызывают высокую волатильность.

Активы с возвратом к среднему

Инструменты, которые часто возвращаются к среднему уровню цены, хорошо подходят для Martingale cBot, поскольку они часто испытывают развороты до формирования долгосрочного тренда. В таких условиях сиБот может быстрее восстановиться и получить прибыль, увеличивая размеры позиций после убытков.

Пример использования

Рассмотрите торговлю валютами с возвратом к среднему, такими как EURGBP. Такие типы инструментов часто возвращаются к своей средней цене после временных скачков или падений, обеспечивая идеальные условия и возможности для сиБота закрыть убыточные позиции с прибылью после возврата цены.

Лучшая практика

Избегайте использования сиБота на сильных, продолжительных трендовых рынках, где цены могут продолжать двигаться в одном направлении в течение длительного периода. Риск больших потерь до восстановления выше на таких рынках.

Обзор

Martingale cBot — это автоматизированный торговый алгоритм, реализующий популярную стратегию Мартингейла. Этот сиБот основывает свои решения о покупке и продаже исключительно на случайности, отказываясь от прогностических моделей или технических индикаторов, что приводит к неопределенным результатам для каждой сделки.

Исходя из предположения, что рынки в конечном итоге будут благоприятствовать трейдеру, Martingale cBot удваивает размер сделки после убытков, чтобы возместить их одной прибыльной сделкой. Этот сиБот может быть эффективным на определенных рынках, особенно когда пользователи хорошо осведомлены о рисках и имеют достаточные ресурсы для переноса продолжительных просадок.