API kerangka waktu kustom menyediakan tipe yang memungkinkan Anda untuk menampilkan data OHLC kustom dari sumber mana pun, termasuk API pihak ketiga, perhitungan sintetis atau file lokal, langsung di grafik cTrader. Entitas API, seperti CustomTimeFrame dan TimeFrameManager, memungkinkan Anda untuk mengalirkan bar dari sumber data tertentu dan menampilkannya di cTrader sebagai periode yang sepenuhnya berfungsi.
Tipe penting meliputi:
TimeFrameManager.Custom.Add(name) untuk mendaftarkan periode kustom baru dengan nama yang ditentukan pengguna.
CustomTimeFrame.BarsNeeded untuk menentukan bagaimana dan kapan data dimuat untuk grafik.
CustomBars.AppendBars(), CustomBars.UpdateLastBar(), CustomBars.PrependBars() untuk mengelola rangkaian secara dinamis, di mana setiap CustomBar memiliki enam bidang ini: time, open, high, low, close dan volume.
Setelah ditambahkan, periode kustom terintegrasi dengan mulus ke dalam UI Period cTrader dan muncul dalam dropdown bersama periode bawaan. Pengguna kemudian dapat dengan mudah beralih antara periode standar dan kustom.
Tips
Gunakan periode kustom untuk memvisualisasikan pasar eksternal, mensimulasikan tipe bar eksperimental, membuat grafik korelasi/arbitrase lanjutan atau melakukan backtesting strategi pada data yang disesuaikan.
Objek API kerangka waktu kustom dapat digunakan untuk melakukan hal-hal berikut:
Fitur atau operasi
Contoh
Menampilkan data pasar alternatif
Memuat bar dari REST API (mis. AlphaVantage) Memvisualisasikan harga di luar platform
Mensimulasikan tipe bar sintetis
Membuat bar Heikin-Ashi, Renko atau volume Menghasilkan bar dari sentimen atau indeks ekonomi
Pengujian data offline
Memuat bar kustom dari file CSV atau JSON Melakukan backtesting pada dataset eksklusif
Overlay strategi lintas aset
Memplot GBP/USD pada grafik EUR/USD Mengembangkan model arbitrase
Kontrol UI yang ditingkatkan
Mengaktifkan/menonaktifkan, memfavoritkan atau memodifikasi periode kustom
Membuat periode kustom berdasarkan data yang ada
Plugin di sini mengilustrasikan cara membuat dan menampilkan periode intraday sintetis di cTrader.
Plugin ini membangun kerangka waktu 25 menit dengan mengambil bar satu menit asli untuk simbol aktif, menggabungkannya menjadi lilin OHLC 25 menit dan kemudian mengalirkan hasilnya ke dalam rangkaian CustomBar.
Kerangka waktu baru muncul dalam menu drop-down untuk memilih kerangka waktu sebagai 25Min.
Ketika pengguna menggulir ke belakang pada grafik, plugin secara otomatis memuat lebih banyak data menit, menambahkan bar 25 menit yang lebih lama di awal dan menjaga tampilan tetap up to date.
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(){}}}
Membuat periode kustom menggunakan data eksternal
Plugin di sini mendemonstrasikan cara mengambil dan menampilkan data keuangan eksternal di grafik cTrader menggunakan objek API kerangka waktu kustom.
Plugin ini membuat periode kustom di cTrader dengan mengambil data OHLC harian historis untuk IBM dari API AlphaVantage.
Ini mengurai respons CSV dan memuat data ke dalam rangkaian CustomBar, yang kemudian ditampilkan sebagai periode kustom yang dapat dipilih bernama AlphaVantage di UI grafik.
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}}}