API khung thời gian tùy chỉnh cung cấp các loại cho phép bạn hiển thị dữ liệu OHLC tùy chỉnh từ bất kỳ nguồn nào, bao gồm API của bên thứ ba, tính toán tổng hợp hoặc tệp cục bộ, trực tiếp trong biểu đồ cTrader. Các thực thể API, chẳng hạn như CustomTimeFrame và TimeFrameManager, cho phép bạn truyền các thanh từ một nguồn dữ liệu cụ thể và hiển thị chúng trong cTrader dưới dạng một chu kỳ đầy đủ chức năng.
Các loại quan trọng bao gồm:
TimeFrameManager.Custom.Add(name) để đăng ký một chu kỳ tùy chỉnh mới với tên do người dùng xác định.
CustomTimeFrame.BarsNeeded để xác định cách thức và thời điểm dữ liệu được tải cho biểu đồ.
CustomBars.AppendBars(), CustomBars.UpdateLastBar(), CustomBars.PrependBars() để quản lý chuỗi một cách linh hoạt, trong đó mỗi CustomBar chứa sáu trường sau: time, open, high, low, close và volume.
Sau khi được thêm vào, các chu kỳ tùy chỉnh tích hợp liền mạch vào giao diện người dùng Chu kỳ của cTrader và xuất hiện trong menu thả xuống cùng với các chu kỳ tích hợp sẵn. Sau đó, người dùng có thể dễ dàng chuyển đổi giữa các chu kỳ tiêu chuẩn và tùy chỉnh.
Mẹo
Sử dụng các chu kỳ tùy chỉnh để trực quan hóa thị trường bên ngoài, mô phỏng các loại thanh thử nghiệm, tạo biểu đồ tương quan/kinh doanh chênh lệch nâng cao hoặc backtest chiến lược trên dữ liệu tùy chỉnh.
Các đối tượng API khung thời gian tùy chỉnh có thể được sử dụng để thực hiện những việc sau:
Tính năng hoặc hoạt động
Ví dụ
Hiển thị dữ liệu thị trường thay thế
Tải các thanh từ REST API (ví dụ: AlphaVantage) Trực quan hóa giá ngoài nền tảng
Mô phỏng các loại thanh tổng hợp
Tạo thanh Heikin-Ashi, Renko hoặc thanh khối lượng Tạo thanh từ chỉ số tâm lý hoặc kinh tế
Kiểm tra dữ liệu ngoại tuyến
Tải các thanh tùy chỉnh từ tệp CSV hoặc JSON Backtest trên bộ dữ liệu độc quyền
Xếp chồng chiến lược đa tài sản
Vẽ biểu đồ GBP/USD trên biểu đồ EUR/USD Phát triển mô hình kinh doanh chênh lệch
Kiểm soát giao diện người dùng nâng cao
Chuyển đổi, đánh dấu yêu thích hoặc sửa đổi các chu kỳ tùy chỉnh
Tạo chu kỳ tùy chỉnh dựa trên dữ liệu hiện có
Plugin ở đây minh họa cách tạo và hiển thị một chu kỳ nội ngày tổng hợp trong cTrader.
Plugin xây dựng khung thời gian 25 phút bằng cách lấy các thanh một phút gốc cho biểu tượng đang hoạt động, tổng hợp chúng thành các nến OHLC 25 phút và sau đó truyền kết quả vào chuỗi CustomBar.
Khung thời gian mới xuất hiện trong menu thả xuống để chọn khung thời gian dưới dạng 25Min.
Khi người dùng cuộn lại trên biểu đồ, plugin sẽ tự động tải thêm dữ liệu phút, thêm các thanh 25 phút cũ hơn vào đầu và cập nhật chế độ xem.
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(){}}}
Tạo chu kỳ tùy chỉnh sử dụng dữ liệu bên ngoài
Plugin ở đây minh họa cách tìm nạp và hiển thị dữ liệu tài chính bên ngoài trong biểu đồ cTrader bằng cách sử dụng các đối tượng API khung thời gian tùy chỉnh.
Plugin tạo một chu kỳ tùy chỉnh trong cTrader bằng cách truy xuất dữ liệu OHLC hàng ngày lịch sử cho IBM từ API AlphaVantage.
Nó phân tích cú pháp phản hồi CSV và tải dữ liệu vào chuỗi CustomBar, sau đó được hiển thị dưới dạng chu kỳ tùy chỉnh có thể chọn được gọi là AlphaVantage trong giao diện người dùng biểu đồ.
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}}}