Vai al contenuto

Martingale cBot

Panoramica della strategia

Martingale cBot è un robot di trading che implementa la strategia Martingale, un classico sistema di scommesse adattato ai mercati finanziari. Scoperta dai matematici francesi nel XVIII secolo, la strategia Martingale divenne rapidamente popolare tra gli scommettitori nei casinò.

Esempio

Per comprendere i meccanismi della strategia Martingale, considera uno scenario in cui viene lanciata una moneta in un gioco di testa o croce, iniziando con una scommessa di 1 USD.

La moneta ha una probabilità del 50/50 di atterrare su testa o croce. Ogni lancio della moneta è indipendente - il risultato di un lancio non influisce sul successivo.

Se la scommessa viene raddoppiata dopo ogni perdita, una vincita finale recupererà tutte le perdite e fornirà anche un profitto di 1 USD.

Creazione del cBot

Scopri come creare cBot, utilizzando C# o Python, nelle nostre guide dettagliate.

Il codice di Martingale cBot è disponibile nei nostri repository pubblici C# e Python. Lo stesso codice è fornito come modello nella procedura guidata di creazione dell'algoritmo in cTrader Windows o Mac, oppure puoi semplicemente copiare e utilizzare lo snippet qui sotto:

 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

Integrazione dell'indicatore

Martingale cBot non utilizza alcun modello predittivo o indicatore tecnico per prevedere la direzione del mercato. Si basa invece su una possibilità casuale per le decisioni di acquisto e vendita, con conseguenti risultati imprevedibili (profitto o perdita) per ogni operazione.

Logica

Direzione casuale dell'operazione

  • Il cBot seleziona casualmente se effettuare un ordine di acquisto o vendita tramite il metodo GetRandomTradeType().

  • Il metodo ExecuteOrder() piazza un ordine di mercato con la quantità, lo stop loss e il take profit definiti nei parametri.

Meccanismo Martingale

  • Il cBot rileva quando una posizione viene chiusa tramite il gestore di eventi OnPositionsClosed().
  • Se la posizione chiusa genera un profitto, il cBot si ripristina e apre una nuova operazione con la dimensione del lotto iniziale e una direzione di trading casuale.
  • Se la posizione chiusa genera una perdita, il cBot raddoppia la quantità dell'operazione successiva ma mantiene la stessa direzione di trading (acquisto o vendita) dell'operazione precedente.

Gestione del rischio

  • Il cBot si basa sulla strategia Martingale di raddoppiare la dimensione della posizione dopo ogni operazione in perdita per recuperare le perdite e ottenere un profitto una volta che si verifica un'operazione di successo.
  • I valori predefiniti di stop loss e take profit mirano a bilanciare il rischio e il rendimento di ciascuna operazione.

Esecuzione e chiusura

Se il cBot incontra un errore dovuto a fondi insufficienti (NoMoney), il cBot smette di tentare di effettuare operazioni.

Parametri

Parametro Unità Definizione Suggerimenti
Quantità Lotto Volume della (prima) operazione in ciascun ciclo Martingale. Impostare un valore elevato aumenta la dimensione della posizione per la prima operazione. Di conseguenza, al termine di un ciclo di operazioni di successo, il profitto sarà elevato. Tuttavia, in caso di operazione in perdita, la dimensione dell'operazione successiva raddoppierà, il che aumenta il rischio in modo esponenziale.

Impostare un valore basso riduce la dimensione della posizione per la prima operazione. Di conseguenza, al termine di un ciclo di operazioni di successo, il profitto sarà ridotto, ma l'esposizione viene minimizzata in caso di una serie di perdite prolungata.
Stop loss Pip Distanza dal prezzo di entrata alla quale un'operazione in perdita verrà chiusa automaticamente. Uno stop loss ampio consente al mercato di muoversi ulteriormente contro l'operazione prima di chiuderla. Ciò può impedire che le operazioni vengano chiuse prematuramente durante fluttuazioni temporanee, ma espone il tuo conto a perdite maggiori se il mercato continua nella direzione sbagliata.

Uno stop loss ridotto chiuderà le operazioni in perdita prima, riducendo la perdita potenziale per operazione. Tuttavia, aumenta anche il rischio di essere fermati troppo presto a causa della volatilità a breve termine, attivando il ciclo di raddoppio Martingale più frequentemente.
Take profit Pip Distanza dal prezzo di entrata alla quale un'operazione verrà chiusa quando viene raggiunto un determinato livello di profitto. Impostare un valore di take profit elevato ti consente di ottenere profitti elevati quando il mercato si muove in modo significativo a tuo favore. Tuttavia, ciò significa anche che le operazioni potrebbero richiedere più tempo per chiudersi, oppure potrebbero invertirsi prima di raggiungere l'obiettivo di profitto, con il risultato potenziale di opportunità mancate.

Un livello di take profit più piccolo porta a chiusure di operazioni più rapide, assicurando profitti più piccoli ma più frequenti. Questo approccio può ridurre la probabilità di perdere opportunità redditizie ma limita il potenziale di rialzo di ciascuna operazione.

Applicazione

Mercati range-bound o laterali

Martingale cBot eccelle nei mercati che si muovono lateralmente, dove non c'è un trend rialzista o ribassista dominante. Nei mercati in range, i prezzi oscillano tra livelli di supporto e resistenza, rendendo probabile che il cBot recuperi rapidamente le perdite dopo operazioni in perdita.

Caso d'uso

Considera uno scenario in cui EURUSD viene scambiato all'interno di un range ristretto da 1,1000 a 1,1050 per diversi giorni. Martingale cBot potrebbe trarre vantaggio dal prezzo che rimbalza tra quei livelli, ottenendo infine profitti quando il mercato si inverte dopo lievi ritracciamenti.

Buona pratica

Utilizza il cBot su simboli con movimenti di prezzo chiari e ben definiti in cui il mercato oscilla in modo prevedibile. Le principali coppie forex durante le ore di trading tranquille sono un buon esempio.

Mercati a bassa volatilità

Il cBot può essere utilizzato in condizioni di bassa volatilità in cui i movimenti di prezzo hanno meno probabilità di attivare stop loss consecutivi, prevenendo una rapida crescita della posizione. Tali condizioni consentono alla strategia Martingale di funzionare bene attraverso inversioni di prezzo graduali.

Caso d'uso

Se stai negoziando una materia prima come l'oro (XAUUSD) durante un periodo di scarse notizie, il prezzo potrebbe rimanere in un range ristretto. Il cBot può trarre vantaggio da questo ambiente poiché è più probabile che i prezzi tornino indietro entro brevi movimenti di prezzo, consentendo operazioni redditizie con un rischio inferiore di grandi ribassi.

Buona pratica

Evita di eseguire il cBot durante i periodi in cui sono previsti eventi economici significativi o comunicati stampa perché causano un'elevata volatilità.

Asset a ritorno alla media

I simboli che tornano frequentemente a un livello di prezzo medio sono adatti per Martingale cBot, poiché spesso subiscono inversioni prima di formare un trend a lungo termine. In tali condizioni, il cBot può recuperare più velocemente e ottenere guadagni aumentando le dimensioni delle posizioni dopo le perdite.

Caso d'uso

Considera il trading di valute a ritorno alla media, come EURGBP. Questi tipi di simboli spesso tornano al loro prezzo medio dopo picchi o cali temporanei, fornendo condizioni e opportunità ideali per il cBot di chiudere posizioni in perdita con profitti dopo l'inversione del prezzo.

Buona pratica

Evita di utilizzare il cBot in mercati con trend forti e prolungati in cui i prezzi possono continuare a muoversi in una direzione per un lungo periodo. Il rischio di grandi perdite prima dei recuperi è più elevato in tali mercati.

Martingale cBot è un algoritmo di trading automatizzato che implementa la popolare strategia Martingale. Questo cBot basa le sue decisioni di acquisto e vendita interamente sul caso, rinunciando a modelli predittivi o indicatori tecnici, il che porta a risultati incerti per ciascuna operazione.

Operando partendo dal presupposto che i mercati alla fine favoriranno il trader, Martingale cBot raddoppia la dimensione dell'operazione dopo le perdite per recuperarle con una singola operazione redditizia. Questo cBot può essere efficace in determinati mercati, soprattutto quando gli utenti sono ben informati sui rischi e dispongono di risorse sufficienti per sopportare ribassi prolungati.