Vai al contenuto

Simboli personalizzati

L'API per simboli personalizzati ti permette di creare e gestire i tuoi simboli in cTrader. Questi simboli possono rappresentare asset sintetici, dataset esterni, metriche derivate o strumenti completamente offline. Ogni simbolo personalizzato può essere definito usando uno o due asset e supporta l'integrazione completa con periodi di tempo, grafici, indicatori, backtesting e aggiornamenti in tempo reale.

I tipi e i metodi chiave per i simboli personalizzati includono:

  • CustomSymbols.Add(name, baseSymbol) o CustomSymbols.Add(name, baseAsset, quoteAsset) per creare un nuovo simbolo personalizzato.
  • CustomSymbol.BarsNeeded per fornire dati OHLC per il simbolo su richiesta.
  • CustomSymbol.UpdateQuote(bid, ask) per alimentare prezzi live al simbolo.
  • CustomBars.AppendBars(), UpdateLastBar() e PrependBars() per gestire dinamicamente i dati delle barre. Ogni CustomBar memorizza Time, Open, High, Low, Close e Volume.

Inoltre, gli sviluppatori possono definire tassi di swap, commissioni, livelli di leva, sentiment, impostazioni futures e persino orari di mercato o festività per i simboli personalizzati. Una volta creati, i simboli personalizzati sono completamente interattivi e possono essere visualizzati nei grafici o utilizzati programmaticamente in cBot, indicatori e plugin.

Suggerimento

Usa i simboli personalizzati per visualizzare dati esterni, simulare spread o correlazioni, testare strategie su dataset proprietari o combinare più asset in strumenti sintetici.

Gli oggetti API per simboli personalizzati possono essere utilizzati per fare quanto segue:

Funzionalità o operazione Esempi
Simulazione di asset sintetici Costruire un simbolo spread (ad es. UKOIL - USOIL)
Creare panieri di azioni o valute
Visualizzazione di dataset offline Caricare dati CSV per i mercati
Tracciare tassi di interesse storici o indici economici
Grafici live da API Alimentare prezzi esterni in tempo reale
Trasmettere fair value calcolato o metriche di rischio
Test di strategia su dati personalizzati Effettuare backtesting su dataset fondamentali o alternativi
Simulare ambienti di mercato legacy
Generazione di quotazioni sintetiche Derivare prezzi personalizzati da simboli esistenti
Iniettare quotazioni in strumenti personalizzati
Modellazione di vincoli di trading Applicare sessioni personalizzate, festività, scadenza futures, struttura swap o livelli di leva
Visualizzazione di metriche di strategia Tracciare curva di capitale netto, drawdown o segnali come serie di prezzi per l'analisi interna alla strategia

Operazioni di base

Crea un nuovo simbolo personalizzato con simbolo base

1
2
3
4
5
var baseSymbol = Symbols.GetSymbol("EURUSD");

var customSymbol = CustomSymbols.Add("MyCustomSymbol1", baseSymbol);
customSymbol.Description = "Synthetic EURUSD Tracker";
customSymbol.UpdateQuote(baseSymbol.Bid, baseSymbol.Ask);

Crea un simbolo personalizzato con asset (senza simbolo base)

1
2
3
4
5
var baseAsset = Assets.GetAsset("XAU");
var quoteAsset = Assets.GetAsset("USD");

var customSymbol = CustomSymbols.Add("GoldIndex", baseAsset, quoteAsset);
customSymbol.UpdateQuote(1923.5, 1923.8);

Definisci le proprietà statiche dello strumento

1
2
3
4
5
6
customSymbol.LotSize = 100000;
customSymbol.PipDigits = 2;
customSymbol.TickDigits = 3;
customSymbol.Commission = 3.5;
customSymbol.SwapLong = -0.2;
customSymbol.SwapShort = 0.1;

Assegna un feed di quotazioni (live o simulato)

1
2
var tracking = Symbols.GetSymbol("GBPUSD");
tracking.Tick += e => customSymbol.UpdateQuote(e.Symbol.Bid, e.Symbol.Ask);

Gestisci la richiesta di barre per dati sintetici

1
2
3
4
5
6
customSymbol.BarsNeeded = args =>
{
    var baseBars = MarketData.GetBars(args.CustomBars.TimeFrame, "EURUSD");
    var newBars = baseBars.Select(b => new CustomBar(b.OpenTime, b.Open, b.High, b.Low, b.Close, b.TickVolume));
    args.CustomBars.AppendBars(newBars);
};

Aggiungi barra in tempo reale al tick

1
2
3
4
5
tracking.Tick += _ =>
{
    var last = MarketData.GetBars(TimeFrame.Minute, tracking.Name).LastBar;
    customSymbol.CustomBars.UpdateLastBar(last.Open, last.High, last.Low, last.Close, last.TickVolume);
};

Aggiungi sessione di trading personalizzata

1
2
3
4
customSymbol.MarketHours.Sessions.Add(new CustomSymbolTradingSession(
    DayOfWeek.Monday, DayOfWeek.Friday,
    new TimeSpan(8, 0, 0), new TimeSpan(16, 30, 0)
));

Definisci impostazioni futures

1
2
3
4
5
customSymbol.FuturesSettings = new CustomSymbolFuturesSettings(
    DateTime.UtcNow.AddDays(20),
    DateTime.UtcNow.AddDays(30),
    0.15 // maintenance margin
);

Aggiungi livelli di leva dinamici

1
2
customSymbol.DynamicLeverage.Add(new CustomSymbolLeverageTier(100000, 100));
customSymbol.DynamicLeverage.Add(new CustomSymbolLeverageTier(500000, 50));

Crea e aggiungi periodo personalizzato

1
2
3
4
5
6
7
var customTF = TimeFrameManager.Custom.Add("MyCustomH1");

customTF.BarsNeeded = args =>
{
    var hourly = MarketData.GetBars(TimeFrame.Hour, args.CustomBars.Symbol.Name);
    args.CustomBars.AppendBars(hourly.Select(b => new CustomBar(b.OpenTime, b.Open, b.High, b.Low, b.Close, b.TickVolume)));
};

Importa dati da CSV

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
var lines = File.ReadAllLines("data.csv");

var bars = lines.Skip(1).Select(line =>
{
    var parts = line.Split(',');
    return new CustomBar(DateTime.Parse(parts[0]), 
                         double.Parse(parts[1]), double.Parse(parts[2]), 
                         double.Parse(parts[3]), double.Parse(parts[4]), 
                         int.Parse(parts[5]));
});

customSymbol.BarsNeeded = args => args.CustomBars.AppendBars(bars);

Rimuovi un simbolo personalizzato

1
2
var cs = CustomSymbols.Get("MyCustomSymbol1");
CustomSymbols.Remove(cs);

Esempi pratici di integrazione

Traccia i dati fondamentali nel tempo

Visualizza indicatori macroeconomici come CPI, tasso di disoccupazione o PIL sotto forma di barre OHLC sintetiche. Questo approccio consente la sovrapposizione di strategie, l'analisi delle divergenze e il tracciamento dei pattern storici utilizzando dati economici strutturati.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
var macroSymbol = CustomSymbols.Add("US_MacroIndex", Assets.GetAsset("USD"), Assets.GetAsset("USD"));
macroSymbol.BarsNeeded = args =>
{
    var csvData = LoadCustomCsv("us_macro.csv"); // contains OpenTime, Open, High, Low, Close, Volume
    args.CustomBars.AppendBars(csvData.Select(row => new CustomBar(
        DateTime.Parse(row[0]),
        double.Parse(row[1]),
        double.Parse(row[2]),
        double.Parse(row[3]),
        double.Parse(row[4]),
        int.Parse(row[5])
    )));
};

Crea un paniere di asset ponderato

Combina più azioni in un simbolo personalizzato che riflette un portafoglio ponderato. Questa configurazione ti permette di tracciare le prestazioni, applicare indicatori e testare strategie su un indice azionario sintetico costruito a partire da componenti selezionati.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
var customIndex = CustomSymbols.Add("MyAssetBasket", Assets.GetAsset("USD"), Assets.GetAsset("USD"));
customIndex.BarsNeeded = args =>
{
    var eurusdBars = MarketData.GetBars(TimeFrame.Daily, "EURUSD");
    var gbpusdBars = MarketData.GetBars(TimeFrame.Daily, "GBPUSD");
    var usdjpyBars = MarketData.GetBars(TimeFrame.Daily, "USDJPY");

    var indexBars = Enumerable.Range(0, Math.Min(eurusdBars.Count, Math.Min(gbpusdBars.Count, usdjpyBars.Count)))
        .Select(i =>
        {
            var time = eurusdBars[i].OpenTime;
            var weightedClose = eurusdBars[i].Close * 0.4 + gbpusdBars[i].Close * 0.35 + usdjpyBars[i].Close * 0.25;

            return new CustomBar(time, weightedClose, weightedClose, weightedClose, weightedClose, 0);
        });

    args.CustomBars.AppendBars(indexBars);
};

Traccia i differenziali di prezzo delle materie prime

Considera la creazione di un simbolo personalizzato che rappresenta lo spread di prezzo tra oro e argento (XAUUSD - XAGUSD). Questo simbolo personalizzato può aiutare con le strategie di spread trading, il rilevamento delle divergenze e l'analisi intermercato sui metalli preziosi.

Analizzando la differenza nei movimenti di prezzo tra oro e argento, i trader possono identificare la forza relativa, potenziali opportunità di arbitraggio o coprire una posizione contro l'altra.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
var spreadSymbol = CustomSymbols.Add("Gold_Silver_Spread", Assets.GetAsset("USD"), Assets.GetAsset("USD"));
spreadSymbol.BarsNeeded = args =>
{
    var gold = MarketData.GetBars(TimeFrame.Hour, "XAUUSD");
    var silver = MarketData.GetBars(TimeFrame.Hour, "XAGUSD");

    var spread = gold.Zip(silver, (g, s) => new CustomBar(
        g.OpenTime,
        g.Close - s.Close,
        g.Close - s.Close,
        g.Close - s.Close,
        g.Close - s.Close,
        g.TickVolume + s.TickVolume
    ));

    args.CustomBars.AppendBars(spread);
};

Trasmetti un simbolo di spread FX in tempo reale

Crea uno strumento sintetico in tempo reale sottraendo i prezzi di due coppie forex.
Questo simbolo personalizzato consente di tracciare e negoziare lo spread direttamente, supportando strategie di mean-reversion, tracciamento visivo e hedging basato sullo spread.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
private CustomSymbol _eurGbpSpread;
private Symbol _eurusd, _gbpusd;

protected override void OnStart()
{
    _eurusd = Symbols.GetSymbol("EURUSD");
    _gbpusd = Symbols.GetSymbol("GBPUSD");

    _eurGbpSpread = CustomSymbols.Add("EUR‑GBP Spread",
                                      _eurusd.QuoteAsset,  // both legs already trade in USD
                                      _eurusd.QuoteAsset);

    // propagate tick updates
    _eurusd.Tick  += OnLegTick;
    _gbpusd.Tick  += OnLegTick;
}

private void OnLegTick(SymbolTickEventArgs _)
{
    var mid = _eurusd.Bid - _gbpusd.Bid;        // naïve spread
    _eurGbpSpread.UpdateQuote(mid, mid + 0.00001); // 0.1 pip synthetic spread
}