Saltar a contenido

Símbolos personalizados

La API de símbolos personalizados le permite crear y gestionar sus propios símbolos en cTrader. Estos símbolos pueden representar activos sintéticos, conjuntos de datos externos, métricas derivadas o instrumentos completamente offline. Cada símbolo personalizado puede definirse utilizando uno o dos activos y admite una integración completa con períodos de tiempo, gráficos, indicadores, backtesting y actualizaciones en tiempo real.

Los tipos y métodos clave para los símbolos personalizados incluyen:

  • CustomSymbols.Add(name, baseSymbol) o CustomSymbols.Add(name, baseAsset, quoteAsset) para crear un nuevo símbolo personalizado.
  • CustomSymbol.BarsNeeded para proporcionar datos OHLC para el símbolo bajo demanda.
  • CustomSymbol.UpdateQuote(bid, ask) para alimentar precios en vivo al símbolo.
  • CustomBars.AppendBars(), UpdateLastBar() y PrependBars() para gestionar datos de barras de forma dinámica. Cada CustomBar almacena Time, Open, High, Low, Close y Volume.

Además, los desarrolladores pueden definir tasas de swap, comisiones, niveles de apalancamiento, sentimiento, configuraciones de futuros e incluso horarios de mercado o festivos para símbolos personalizados. Una vez creados, los símbolos personalizados son totalmente interactivos y se pueden ver en gráficos o utilizar de forma programática en cBots, indicadores y plugins.

Consejo

Utilice símbolos personalizados para visualizar datos externos, simular spreads o correlaciones, probar estrategias en conjuntos de datos propios o combinar múltiples activos en instrumentos sintéticos.

Los objetos de API de símbolos personalizados se pueden utilizar para hacer lo siguiente:

Característica u operación Ejemplos
Simulación de activos sintéticos Crear un símbolo de spread (p. ej., UKOIL - USOIL)
Crear cestas de acciones o divisas
Visualización de conjuntos de datos sin conexión Cargar datos CSV para mercados
Trazar tipos de interés históricos o índices económicos
Gráficos en tiempo real desde APIs Alimentar precios externos en tiempo real
Transmitir valor razonable calculado o métricas de riesgo
Prueba de estrategias con datos personalizados Backtesting en conjuntos de datos fundamentales o alternativos
Simular entornos de mercado heredados
Generación de cotizaciones sintéticas Derivar precios personalizados de símbolos existentes
Inyectar cotizaciones en instrumentos personalizados
Modelado de restricciones de operaciones Aplicar sesiones personalizadas, festivos, vencimiento de futuros, estructura de swaps o niveles de apalancamiento
Visualización de métricas de estrategia Trazar curva de capital, drawdown o señales como series de precios para análisis dentro de la estrategia

Operaciones básicas

Crear un nuevo símbolo personalizado con símbolo 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);

Crear un símbolo personalizado con activos (sin símbolo 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);

Definir las propiedades estáticas del instrumento

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;

Asignar un flujo de cotizaciones (en vivo o simulado)

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

Manejar solicitudes de barras para datos sintéticos

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);
};

Añadir barra en tiempo real 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);
};

Añadir sesión de operación personalizada

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

Definir ajustes de futuros

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

Añadir niveles de apalancamiento dinámicos

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

Crear y añadir período personalizado

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)));
};

Importar datos desde 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);

Eliminar un símbolo personalizado

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

Ejemplos prácticos de integración

Seguimiento de datos fundamentales a lo largo del tiempo

Mostrar indicadores macroeconómicos como el IPC, la tasa de desempleo o el PIB como barras OHLC sintéticas. Este enfoque permite la superposición de estrategias, el análisis de divergencias y el seguimiento de patrones históricos utilizando datos económicos estructurados.

 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])
    )));
};

Crear una cesta de activos ponderada

Combinar múltiples acciones en un símbolo personalizado que refleje una cartera ponderada. Esta configuración le permite realizar un seguimiento del rendimiento, aplicar indicadores y hacer backtesting de estrategias en un índice de acciones sintético construido a partir de componentes seleccionados.

 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);
};

Seguimiento de diferenciales de precios de materias primas

Considere crear un símbolo personalizado que represente el diferencial de precio entre el oro y la plata (XAUUSD - XAGUSD). Este símbolo personalizado puede ayudar con estrategias de operaciones de spread, detección de divergencias y análisis entre mercados de metales preciosos.

Al analizar la diferencia en los movimientos de precios entre el oro y la plata, los operadores pueden identificar la fuerza relativa, las posibles oportunidades de arbitraje o cubrir una posición frente a la otra.

 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);
};

Transmitir un símbolo de spread de FX en vivo

Crear un instrumento sintético en tiempo real restando los precios de dos pares de divisas.
Este símbolo personalizado permite graficar y operar el spread directamente, admitiendo estrategias de reversión a la media, seguimiento visual y cobertura basada en spreads.

 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
}