A API de intervalo de tempo personalizado fornece tipos que permitem exibir dados OHLC personalizados de qualquer fonte, incluindo APIs de terceiros, cálculos sintéticos ou ficheiros locais, diretamente nos gráficos do cTrader. Entidades da API, como CustomTimeFrame e TimeFrameManager, permitem-lhe transmitir barras de uma fonte de dados específica e exibi-las no cTrader como um período totalmente funcional.
Os tipos importantes incluem:
TimeFrameManager.Custom.Add(name) para registar um novo período personalizado com um nome definido pelo utilizador.
CustomTimeFrame.BarsNeeded para definir como e quando os dados são carregados para o gráfico.
CustomBars.AppendBars(), CustomBars.UpdateLastBar(), CustomBars.PrependBars() para gerir dinamicamente a série, onde cada CustomBar contém estes seis campos: time, open, high, low, close e volume.
Uma vez adicionados, os períodos personalizados integram-se perfeitamente na interface do utilizador Período do cTrader e aparecem no menu suspenso juntamente com os períodos incorporados. Os utilizadores podem então alternar facilmente entre períodos padrão e personalizados.
Dica
Utilize períodos personalizados para visualizar mercados externos, simular tipos de barras experimentais, criar gráficos avançados de correlação/arbitragem ou realizar testes de verificação de estratégias em dados personalizados.
Os objetos da API de intervalo de tempo personalizado podem ser utilizados para fazer o seguinte:
Funcionalidade ou operação
Exemplos
Exibir dados de mercado alternativos
Carregar barras de APIs REST (por exemplo, AlphaVantage) Visualizar preços de outras plataformas
Simular tipos de barras sintéticas
Criar barras Heikin-Ashi, Renko ou de volume Gerar barras a partir de índices de sentimento ou económicos
Testar dados offline
Carregar barras personalizadas de um ficheiro CSV ou JSON Realizar testes de verificação em conjuntos de dados proprietários
Sobreposições de estratégias entre ativos
Traçar GBP/USD em gráficos de EUR/USD Desenvolver modelos de arbitragem
Controlo avançado da interface do utilizador
Alternar, marcar como favorito ou modificar períodos personalizados
Criar período personalizado com base em dados existentes
O plugin aqui ilustra como criar e exibir um período intradiário sintético no cTrader.
O plugin constrói um período de 25 minutos obtendo barras nativas de um minuto para o símbolo ativo, agregando-as em velas OHLC de 25 minutos e, em seguida, transmitindo o resultado para uma série CustomBar.
O novo período aparece no menu suspenso para selecionar períodos como 25Min.
Quando os utilizadores recuam no gráfico, o plugin carrega automaticamente mais dados de minutos, acrescenta barras mais antigas de 25 minutos e mantém a vista atualizada.
usingSystem;usingSystem.Linq;usingcAlgo.API;usingcAlgo.API.Internals;namespacecAlgo.Plugins{[Plugin(AccessRights = AccessRights.None)]publicclassTF25:Plugin{privateCustomTimeFrame_tf25Min;privatebool_isLoadMoreEnabled=true;protectedoverridevoidOnStart(){// Create the 25-minute TF_tf25Min=TimeFrameManager.Custom.Add("25Min");_tf25Min.Description="25‑minute aggregated from 1‑minute bars";// Hook initial load and on‑scroll‑back_tf25Min.NewChart+=OnNewChart;_tf25Min.BarsNeeded=OnBarsNeeded;}privatevoidOnNewChart(CustomTimeFrameNewChartEventArgsargs){varcb=args.CustomBars;varchart=args.Chart;// Show a loading indicatorvarloading=newTextBlock{Text="Loading 25‑min bars…",FontSize=12};chart.AddControl(loading);// Fetch the 1‑min bars and aggregateMarketData.GetBarsAsync(TimeFrame.Minute,cb.Symbol.Name,minuteBars=>{varaggregated=minuteBars.Select((bar,idx)=>new{bar,idx}).GroupBy(x=>x.idx/25).Select(g=>{varfirst=g.First().bar;varlast=g.Last().bar;returnnewCustomBar(time:first.OpenTime,open:first.Open,high:g.Max(x=>x.bar.High),low:g.Min(x=>x.bar.Low),close:last.Close,volume:g.Sum(x=>(int)x.bar.TickVolume));});chart.RemoveControl(loading);});}privatevoidOnBarsNeeded(CustomTimeFrameBarsNeededArgsargs){varcb=args.CustomBars;// Same logic for explicit BarsNeeded triggersMarketData.GetBarsAsync(TimeFrame.Minute,cb.Symbol.Name,minuteBars=>{varaggregated=minuteBars.Select((bar,idx)=>new{bar,idx}).GroupBy(x=>x.idx/25).Select(g=>newCustomBar(time:g.First().bar.OpenTime,open:g.First().bar.Open,high:g.Max(x=>x.bar.High),low:g.Min(x=>x.bar.Low),close:g.Last().bar.Close,volume:g.Sum(x=>(int)x.bar.TickVolume)));cb.AppendBars(aggregated);args.CustomBars.NeedsMore+=_=>{if(!_isLoadMoreEnabled){Print("Load‑more disabled; skipping additional bars.");return;}Print("NeedsMore fired; loading more history…");minuteBars.LoadMoreHistoryAsync(loadArgs=>{Print($"Loaded {loadArgs.Count} more 1‑min bars");if(loadArgs.Count==0)return;Sleep(TimeSpan.FromSeconds(1));args.CustomBars.PrependBars(minuteBars.Take(loadArgs.Count).Select(bar=>newCustomBar(bar.OpenTime,bar.Open,bar.High,bar.Low,bar.Close,(int)bar.TickVolume)));});};});}protectedoverridevoidOnStop(){}}}
Criar período personalizado usando dados externos
O plugin aqui demonstra como obter e exibir dados financeiros externos nos gráficos do cTrader usando objetos API de período personalizado.
O plugin cria um período personalizado no cTrader obtendo dados OHLC diários históricos para a IBM da API AlphaVantage.
Analisa a resposta CSV e carrega os dados numa série CustomBar, que é então exibida como um período personalizado selecionável chamado AlphaVantage na interface do gráfico.
usingSystem;usingSystem.Collections.Generic;usingcAlgo.API;usingcAlgo.API.Collections;usingcAlgo.API.Indicators;usingcAlgo.API.Internals;namespacecAlgo.Plugins{[Plugin(AccessRights = AccessRights.None)]publicclassCustomTimeFrameAlphaVantage:Plugin{privateconststringApiKey="YOUR_ALPHA_VANTAGE_KEY";privateconststringSymbol="IBM";privateconststringEndpoint=$"https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol={Symbol}&apikey={ApiKey}&datatype=csv&outputsize=full";privateCustomTimeFrame_customTimeFrame;protectedoverridevoidOnStart(){_customTimeFrame=TimeFrameManager.Custom.Add("AlphaVantage");_customTimeFrame.Description="Loads data from AlphaVantage";_customTimeFrame.BarsNeeded=args=>{varresponse=Http.Get(newUri(Endpoint));if(!response.IsSuccessful){Print($"Error loading data from AlphaVantage, status code: {response.StatusCode}, body: {response.Body}");return;}Print($"Response Received: {response.StatusCode}");varohlcData=response.Body.Split(Environment.NewLine)[1..];Array.Reverse(ohlcData);Print($"ohlcData Count: {ohlcData.Length}");varbars=newList<CustomBar>();foreach(varohlcinohlcData){varohlcSplit=ohlc.Split(',');if(ohlcSplit.Length<6)continue;vartime=DateTime.Parse(ohlcSplit[0]);varopen=double.Parse(ohlcSplit[1]);varhigh=double.Parse(ohlcSplit[2]);varlow=double.Parse(ohlcSplit[3]);varclose=double.Parse(ohlcSplit[4]);varvolume=long.Parse(ohlcSplit[5]);bars.Add(newCustomBar(time,open,high,low,close,volume));}Print($"AppendBars Count: {bars.Count}");args.CustomBars.AppendBars(bars);};}protectedoverridevoidOnStop(){// Handle Plugin stop here}}}