Ir para o conteúdo

Símbolos personalizados

A API de símbolos personalizados permite-lhe criar e gerir os seus próprios símbolos no cTrader. Estes símbolos podem representar ativos sintéticos, conjuntos de dados externos, métricas derivadas ou instrumentos completamente offline. Cada símbolo personalizado pode ser definido usando um ou dois ativos e suporta integração total com timeframes, gráficos, indicadores, testes de verificação e atualizações em tempo real.

Os principais tipos e métodos para símbolos personalizados incluem:

  • CustomSymbols.Add(name, baseSymbol) ou CustomSymbols.Add(name, baseAsset, quoteAsset) para criar um novo símbolo personalizado.
  • CustomSymbol.BarsNeeded para fornecer dados OHLC para o símbolo sob demanda.
  • CustomSymbol.UpdateQuote(bid, ask) para alimentar preços em tempo real para o símbolo.
  • CustomBars.AppendBars(), UpdateLastBar() e PrependBars() para gerir dados de barras dinamicamente. Cada CustomBar armazena Time, Open, High, Low, Close e Volume.

Adicionalmente, os desenvolvedores podem definir taxas de swap, comissões, níveis de alavancagem, sentimento, configurações de futuros e até mesmo horários de mercado ou feriados para símbolos personalizados. Uma vez criados, os símbolos personalizados são totalmente interativos e podem ser visualizados em gráficos ou usados programaticamente em cBots, indicadores e plugins.

Dica

Use símbolos personalizados para visualizar dados externos, simular spreads ou correlações, testar estratégias em conjuntos de dados proprietários ou combinar múltiplos ativos em instrumentos sintéticos.

Objetos de API de símbolos personalizados podem ser utilizados para fazer o seguinte:

Funcionalidade ou operação Exemplos
Simular ativos sintéticos Criar um símbolo de spread (por exemplo, UKOIL - USOIL)
Criar cabazes de ações ou moedas
Visualizar conjuntos de dados offline Carregar dados CSV para mercados
Traçar taxas de juro históricas ou índices económicos
Gráficos em tempo real a partir de APIs Fornecer preços externos em tempo real
Transmitir valor justo calculado ou métricas de risco
Testar estratégias em dados personalizados Realizar testes de verificação em conjuntos de dados fundamentais ou alternativos
Simular ambientes de mercado antigos
Gerar cotações sintéticas Derivar preços personalizados a partir de símbolos existentes
Injetar cotações em instrumentos personalizados
Modelar restrições de trading Aplicar sessões personalizadas, feriados, expiração de futuros, estrutura de swap ou níveis de alavancagem
Visualização de métricas de estratégia Traçar curva de capital, drawdown ou sinais como séries de preços para análise interna da estratégia

Operações básicas

Criar um novo símbolo personalizado com 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);

Criar um símbolo personalizado com ativos (sem 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 as propriedades estáticas do 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;

Atribuir um feed de cotações (em tempo real ou simulado)

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

Gerir pedidos de barras para dados 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);
};

Adicionar barra em tempo real ao 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);
};

Adicionar sessão de trading 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 configurações de futuros

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

Adicionar níveis de alavancagem dinâmicos

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

Criar e adicionar 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 dados de 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);

Remover um símbolo personalizado

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

Exemplos práticos de integração

Acompanhar dados fundamentais ao longo do tempo

Exibir indicadores macroeconómicos como IPC, taxa de desemprego ou PIB como barras OHLC sintéticas. Esta abordagem permite a sobreposição de estratégias, análise de divergências e acompanhamento de padrões históricos utilizando dados económicos estruturados.

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

Criar um cabaz de ativos ponderado

Combinar múltiplas ações num símbolo personalizado que reflete uma carteira ponderada. Esta configuração permite-lhe acompanhar o desempenho, aplicar indicadores e realizar testes de verificação de estratégias num índice de ações sintético construído a partir de componentes selecionados.

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

Acompanhar diferenciais de preços de commodities

Considere criar um símbolo personalizado que represente o spread de preços entre ouro e prata (XAUUSD - XAGUSD). Este símbolo personalizado pode ajudar com estratégias de trading de spread, deteção de divergências e análise entre mercados de metais preciosos.

Ao analisar a diferença nos movimentos de preços entre ouro e prata, os traders podem identificar força relativa, potenciais oportunidades de arbitragem ou cobrir uma posição contra a outra.

 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 um símbolo de spread FX em tempo real

Criar um instrumento sintético em tempo real subtraindo os preços de dois pares de forex.
Este símbolo personalizado permite a criação de gráficos e trading do spread diretamente, suportando estratégias de reversão à média, acompanhamento visual e cobertura baseada em 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
}