توفر واجهة برمجة التطبيقات للإطار الزمني المخصص أنواعًا تمكنك من عرض بيانات OHLC المخصصة من أي مصدر، بما في ذلك واجهات برمجة التطبيقات الخارجية، والحسابات الاصطناعية أو الملفات المحلية، مباشرة في مخططات cTrader. تسمح لك كيانات واجهة برمجة التطبيقات، مثل CustomTimeFrame وTimeFrameManager، ببث الشموع من مصدر بيانات محدد وعرضها في cTrader كفترة كاملة.
تشمل الأنواع المهمة:
TimeFrameManager.Custom.Add(name) لتسجيل فترة مخصصة جديدة باسم يحدده المستخدم.
CustomTimeFrame.BarsNeeded لتحديد كيفية ووقت تحميل البيانات للمخطط.
CustomBars.AppendBars()، CustomBars.UpdateLastBar()، CustomBars.PrependBars() لإدارة السلسلة بشكل ديناميكي، حيث تحتوي كل CustomBar على هذه الحقول الستة: time، open، high، low، close وvolume.
بمجرد إضافتها، تتكامل الفترات المخصصة بسلاسة في واجهة مستخدم الفترة في cTrader وتظهر في القائمة المنسدلة إلى جانب الفترات المدمجة. يمكن للمستخدمين بعد ذلك التبديل بسهولة بين الفترات القياسية والمخصصة.
نصيحة
استخدم الفترات المخصصة لتصور الأسواق الخارجية، ومحاكاة أنواع الشموع التجريبية، وإنشاء مخططات ارتباط/مراجحة متقدمة أو اختبار الاستراتيجيات على بيانات مخصصة.
يمكن استخدام كائنات واجهة برمجة التطبيقات للإطار الزمني المخصص للقيام بما يلي:
الميزة أو العملية
أمثلة
عرض بيانات السوق البديلة
تحميل الشموع من واجهات برمجة التطبيقات REST (مثل AlphaVantage) تصور الأسعار خارج المنصة
محاكاة أنواع الشموع الاصطناعية
إنشاء شموع Heikin-Ashi أو Renko أو شموع الحجم إنشاء شموع من مؤشرات المشاعر أو المؤشرات الاقتصادية
اختبار البيانات غير المتصلة
تحميل الشموع المخصصة من ملف CSV أو JSON الاختبار العكسي على مجموعات البيانات الخاصة
تراكبات استراتيجية الأصول المتعددة
رسم GBP/USD على مخططات EUR/USD تطوير نماذج المراجحة
تحكم محسن في واجهة المستخدم
تبديل أو تفضيل أو تعديل الفترات المخصصة
إنشاء فترة مخصصة بناءً على البيانات الموجودة
توضح الإضافة هنا كيفية إنشاء وعرض فترة زمنية اصطناعية داخل اليوم في cTrader.
تقوم الإضافة ببناء إطار زمني مدته 25 دقيقة عن طريق جلب شموع الدقيقة الواحدة الأصلية للرمز النشط، وتجميعها في شموع OHLC مدتها 25 دقيقة ثم بث النتيجة في سلسلة CustomBar.
يظهر الإطار الزمني الجديد في القائمة المنسدلة لاختيار الأطر الزمنية باسم 25Min.
عندما يقوم المستخدمون بالتمرير للخلف على المخطط، تقوم الإضافة تلقائيًا بتحميل المزيد من بيانات الدقائق، وإضافة شموع 25 دقيقة أقدم في البداية والحفاظ على تحديث العرض.
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(){}}}
إنشاء فترة مخصصة باستخدام بيانات خارجية
توضح الإضافة هنا كيفية جلب وعرض البيانات المالية الخارجية في مخططات cTrader باستخدام كائنات واجهة برمجة التطبيقات للإطار الزمني المخصص.
تقوم الإضافة بإنشاء فترة مخصصة في cTrader عن طريق استرجاع بيانات OHLC اليومية التاريخية لشركة IBM من واجهة برمجة تطبيقات AlphaVantage.
تقوم بتحليل استجابة CSV وتحميل البيانات في سلسلة CustomBar، والتي يتم عرضها بعد ذلك كفترة مخصصة قابلة للاختيار تسمى AlphaVantage في واجهة مستخدم المخطط.
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}}}