Przejdź do treści

Martingale cBot

Przegląd strategii

Martingale cBot to robot handlowy, który implementuje strategię Martingale, klasyczny system obstawiania zaadaptowany na rynki finansowe. Odkryta przez francuskich matematyków w XVIII wieku strategia Martingale szybko stała się popularna wśród graczy w kasynach.

Przykład

Aby zrozumieć mechanikę strategii Martingale, rozważmy scenariusz, w którym rzuca się monetą w grze orzeł czy reszka, zaczynając od zakładu o wartości 1 USD.

Moneta ma 50/50 szans na wypadnięcie orła lub reszki. Każde rzucenie monetą jest niezależne - wynik jednego rzutu nie wpływa na następny.

Jeśli zakład zostanie podwojony po każdej przegranej, ewentualna wygrana odzyska wszystkie straty, a także przyniesie zysk w wysokości 1 USD.

Tworzenie cBota

Dowiedz się, jak tworzyć cBoty, używając C# lub Pythona, w naszych szczegółowych przewodnikach.

Kod Martingale cBot jest dostępny w naszych publicznych repozytoriach C# i Python. Ten sam kod jest dostępny jako szablon w kreatorze tworzenia algorytmów w aplikacji cTrader Windows lub Mac, lub możesz po prostu skopiować i użyć poniższego fragmentu kodu:

 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

Integracja wskaźnika

Martingale cBot nie używa żadnego modelu predykcyjnego ani wskaźnika technicznego do prognozowania kierunku rynku. Zamiast tego opiera się na losowej szansie przy podejmowaniu decyzji o kupnie i sprzedaży, co skutkuje nieprzewidywalnymi wynikami (zysk lub strata) dla każdej transakcji.

Logika

Losowy kierunek transakcji

  • cBot losowo wybiera, czy złożyć zlecenie kupna, czy sprzedaży za pomocą metody GetRandomTradeType().

  • Metoda ExecuteOrder() składa zlecenie rynkowe z wolumenem, stop loss i take profit zdefiniowanymi w parametrach.

Mechanizm Martingale

  • cBot wykrywa zamknięcie pozycji za pomocą procedury obsługi zdarzeń OnPositionsClosed().
  • Jeśli zamknięta pozycja przynosi zysk, cBot resetuje się i otwiera nową transakcję z początkowym rozmiarem lota i losowym kierunkiem transakcji.
  • Jeśli zamknięta pozycja przynosi stratę, cBot podwaja wolumen następnej transakcji, ale zachowuje ten sam kierunek transakcji (kupno lub sprzedaż) co poprzednia transakcja.

Zarządzanie ryzykiem

  • cBot opiera się na strategii Martingale polegającej na podwajaniu wielkości pozycji po każdej przegranej transakcji, aby odzyskać straty i osiągnąć zysk po udanej transakcji.
  • Domyślne wartości stop-loss i take-profit mają na celu zrównoważenie ryzyka i zysku w każdej transakcji.

Wykonanie i zakończenie

Jeśli cBot napotka błąd z powodu niewystarczających środków (NoMoney), cBot przestaje próbować zawierać transakcje.

Parametry

Parametr Jednostka Definicja Wskazówki
Ilość Lot Wolumen (pierwszej) transakcji w każdym cyklu Martingale. Ustawienie wysokiej wartości zwiększa wielkość pozycji dla pierwszej transakcji. W konsekwencji, po zakończeniu udanego cyklu transakcji, zysk będzie duży. Jednak w przypadku przegranej transakcji wielkość następnej transakcji podwoi się, co wykładniczo zwiększa ryzyko.

Ustawienie niskiej wartości zmniejsza wielkość pozycji dla pierwszej transakcji. W konsekwencji, po zakończeniu udanego cyklu transakcji, zysk będzie niewielki, ale ekspozycja jest zminimalizowana podczas przedłużającej się serii strat.
Stop loss Pip Odległość od ceny otwarcia, przy której przegrana transakcja zostanie automatycznie zamknięta. Duży stop loss pozwala rynkowi poruszać się dalej przeciwko transakcji przed jej zamknięciem. Może to zapobiec przedwczesnemu zamykaniu transakcji podczas tymczasowych wahań, ale naraża Twoje konto na większe straty, jeśli rynek będzie nadal poruszał się w niewłaściwym kierunku.

Mały stop loss zamknie stratne transakcje szybciej, zmniejszając potencjalną stratę na transakcję. Zwiększa to jednak również ryzyko zbyt wczesnego zamknięcia pozycji z powodu krótkoterminowej zmienności, co częściej wyzwala cykl podwajania Martingale.
Take profit Pip Odległość od ceny otwarcia, przy której transakcja zostanie zamknięta po osiągnięciu określonego poziomu zysku. Ustawienie wysokiej wartości Take profit pozwala uzyskać duże zyski, gdy rynek porusza się znacząco na Twoją korzyść. Oznacza to jednak również, że zamknięcie transakcji może potrwać dłużej lub mogą one odwrócić się przed osiągnięciem docelowego zysku, co może skutkować utraconymi możliwościami.

Mniejszy poziom Take profit prowadzi do szybszego zamykania transakcji, zabezpieczając mniejsze, ale częstsze zyski. Takie podejście może zmniejszyć prawdopodobieństwo utraty zyskownych możliwości, ale ogranicza potencjał wzrostu każdej transakcji.

Aplikacja

Rynki ograniczone zakresem lub boczne

Martingale cBot sprawdza się doskonale na rynkach poruszających się bocznie, gdzie nie ma dominującego trendu wzrostowego ani spadkowego. Na rynkach w konsolidacji ceny wahają się między poziomami wsparcia i oporu, co sprawia, że cBot prawdopodobnie szybko odzyska straty po stratnych transakcjach.

Przypadek użycia

Rozważ scenariusz, w którym EURUSD handluje w wąskim zakresie od 1,1000 do 1,1050 przez kilka dni. Martingale cBot może wykorzystać odbijanie się ceny między tymi poziomami, ostatecznie osiągając zyski, gdy rynek odwróci się po niewielkich cofnięciach.

Najlepsza praktyka

Używaj cBota na symbolach z wyraźnymi, dobrze zdefiniowanymi ruchami cen, gdzie rynek oscyluje w przewidywalny sposób. Główne pary walutowe podczas spokojnych godzin handlowych są dobrym przykładem.

Rynki o niskiej zmienności

cBot może być używany w warunkach niskiej zmienności, gdzie ruchy cen są mniej skłonne do wyzwalania kolejnych stop lossów, zapobiegając szybkiemu wzrostowi pozycji. Takie warunki pozwalają strategii Martingale działać dobrze dzięki stopniowym odwróceniom cen.

Przypadek użycia

Jeśli handlujesz towarem takim jak złoto (XAUUSD) w okresie niskiej aktywności informacyjnej, cena może pozostać w wąskim zakresie. cBot może skorzystać z tego środowiska, ponieważ ceny są bardziej skłonne do powrotu w ramach krótkich ruchów cenowych, umożliwiając zyskowne transakcje przy niższym ryzyku dużych spadków.

Najlepsza praktyka

Unikaj uruchamiania cBota w okresach, gdy spodziewane są istotne wydarzenia gospodarcze lub publikacje wiadomości, ponieważ powodują one wysoką zmienność.

Aktywa powracające do średniej

Symbole, które często powracają do średniego poziomu ceny, są dobrze dopasowane do Martingale cBot, ponieważ często doświadczają odwróceń przed utworzeniem długoterminowego trendu. W takich warunkach cBot może szybciej odzyskać straty i osiągnąć zyski, zwiększając wielkość pozycji po stratach.

Przypadek użycia

Rozważ handel walutami powracającymi do średniej, takimi jak EURGBP. Te typy symboli często powracają do swojej średniej ceny po tymczasowych wzrostach lub spadkach, zapewniając idealne warunki i możliwości dla cBota do zamykania stratnych pozycji z zyskiem po powrocie ceny.

Najlepsza praktyka

Unikaj używania cBota na silnych, przedłużających się rynkach trendowych, gdzie ceny mogą poruszać się w jednym kierunku przez długi okres. Ryzyko dużych strat przed odzyskaniem jest wyższe na takich rynkach.

Podsumowanie

Martingale cBot to zautomatyzowany algorytm handlowy, który implementuje popularną strategię Martingale. Ten cBot opiera swoje decyzje kupna i sprzedaży wyłącznie na przypadku, rezygnując z modeli predykcyjnych lub wskaźników technicznych, co prowadzi do niepewnych wyników każdej transakcji.

Działając przy założeniu, że rynki ostatecznie będą sprzyjać traderowi, Martingale cBot podwaja wielkość transakcji po stratach, aby odzyskać je jedną zyskowną transakcją. Ten cBot może być skuteczny na określonych rynkach, szczególnie gdy użytkownicy są dobrze poinformowani o ryzykach i mają wystarczające zasoby, aby wytrzymać przedłużające się spadki.