انتقل إلى المحتوى

الرموز المخصصة

تتيح لك واجهة برمجة التطبيقات للرموز المخصصة إنشاء وإدارة رموزك الخاصة في cTrader. يمكن أن تمثل هذه الرموز أصولًا اصطناعية، أو مجموعات بيانات خارجية، أو مقاييس مشتقة، أو أدوات غير متصلة بالإنترنت تمامًا. يمكن تعريف كل رمز مخصص باستخدام أصل واحد أو اثنين ويدعم التكامل الكامل مع الأطر الزمنية والرسوم البيانية والمؤشرات والاختبار العكسي والتحديثات في الوقت الفعلي.

تشمل الأنواع والطرق الرئيسية للرموز المخصصة ما يلي:

  • CustomSymbols.Add(name, baseSymbol) أو CustomSymbols.Add(name, baseAsset, quoteAsset) لإنشاء رمز مخصص جديد.
  • CustomSymbol.BarsNeeded لتوفير بيانات OHLC للرمز عند الطلب.
  • CustomSymbol.UpdateQuote(bid, ask) لتغذية الأسعار الحية للرمز.
  • CustomBars.AppendBars() و UpdateLastBar() و PrependBars() لإدارة بيانات الشموع بشكل ديناميكي. يخزن كل CustomBar البيانات التالية: Time و Open و High و Low و Close و Volume.

بالإضافة إلى ذلك، يمكن للمطورين تحديد معدلات المبادلة والعمولات ومستويات الرافعة المالية والمشاعر وإعدادات العقود الآجلة وحتى ساعات السوق أو العطلات للرموز المخصصة. بمجرد إنشائها، تصبح الرموز المخصصة تفاعلية بالكامل ويمكن عرضها في الرسوم البيانية أو استخدامها برمجيًا في روبوتات التداول والمؤشرات والإضافات.

نصيحة

استخدم الرموز المخصصة لتصور البيانات الخارجية، أو محاكاة فروق الأسعار أو الارتباطات، أو اختبار الاستراتيجيات على مجموعات البيانات الخاصة أو دمج أصول متعددة في أدوات اصطناعية.

يمكن استخدام كائنات واجهة برمجة التطبيقات للرموز المخصصة للقيام بما يلي:

الميزة أو العملية أمثلة
محاكاة الأصول الاصطناعية بناء رمز فرق السعر (مثل UKOIL - USOIL)
إنشاء سلال الأسهم أو العملات
تصور مجموعات البيانات غير المتصلة بالإنترنت تحميل بيانات CSV للأسواق
رسم أسعار الفائدة التاريخية أو المؤشرات الاقتصادية
الرسم البياني المباشر من واجهات برمجة التطبيقات تغذية الأسعار الخارجية في الوقت الفعلي
بث القيمة العادلة المحسوبة أو مقاييس المخاطر
اختبار الإستراتيجية على البيانات المخصصة الاختبار العكسي على مجموعات البيانات الأساسية أو البديلة
محاكاة بيئات السوق القديمة
إنشاء أسعار اصطناعية اشتقاق أسعار مخصصة من الرموز الموجودة
إدخال الأسعار في الأدوات المخصصة
نمذجة قيود التداول تطبيق جلسات مخصصة، عطلات، انتهاء صلاحية العقود الآجلة، هيكل المبادلة أو مستويات الرافعة المالية
تصور مقاييس الإستراتيجية رسم منحنى رأس المال، السحب أو الإشارات كسلسلة أسعار للتحليل داخل الإستراتيجية

العمليات الأساسية

إنشاء رمز مخصص جديد مع رمز أساسي

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

إنشاء رمز مخصص بالأصول (بدون رمز أساسي)

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

تحديد خصائص الأداة الثابتة

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;

تعيين تغذية الأسعار (مباشرة أو محاكاة)

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

معالجة طلب الشموع للبيانات الاصطناعية

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

إضافة شمعة في الوقت الفعلي عند كل تيك

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

إضافة جلسة تداول مخصصة

1
2
3
4
customSymbol.MarketHours.Sessions.Add(new CustomSymbolTradingSession(
    DayOfWeek.Monday, DayOfWeek.Friday,
    new TimeSpan(8, 0, 0), new TimeSpan(16, 30, 0)
));

تحديد إعدادات العقود الآجلة

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

إضافة مستويات الرافعة المالية الديناميكية

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

إنشاء وإضافة فترة مخصصة

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

استيراد البيانات من ملف 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);

إزالة رمز مخصص

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

أمثلة عملية للتكامل

تتبع البيانات الأساسية مع مرور الوقت

عرض المؤشرات الاقتصادية الكلية مثل مؤشر أسعار المستهلك، ومعدل البطالة أو الناتج المحلي الإجمالي كشموع OHLC اصطناعية. يتيح هذا النهج تراكب الاستراتيجية، وتحليل التباعد، وتتبع الأنماط التاريخية باستخدام البيانات الاقتصادية المنظمة.

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

إنشاء سلة أصول مرجحة

دمج أسهم متعددة في رمز مخصص يعكس محفظة مرجحة. يتيح لك هذا الإعداد تتبع الأداء، وتطبيق المؤشرات واختبار الاستراتيجيات على مؤشر أسهم اصطناعي مبني من مكونات مختارة.

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

تتبع فروق أسعار السلع

فكر في إنشاء رمز مخصص يمثل فرق السعر بين الذهب والفضة (XAUUSD - XAGUSD). قد يساعد هذا الرمز المخصص في استراتيجيات تداول الفروق، واكتشاف التباعد وتحليل العلاقات بين الأسواق للمعادن الثمينة.

من خلال تحليل الفرق في حركات الأسعار بين الذهب والفضة، يمكن للمتداولين تحديد القوة النسبية، وفرص المراجحة المحتملة أو التحوط لمركز واحد مقابل الآخر.

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

بث رمز فرق الفوركس المباشر

إنشاء أداة اصطناعية في الوقت الفعلي عن طريق طرح أسعار زوجين من العملات الأجنبية.
يتيح هذا الرمز المخصص رسم الفرق وتداوله مباشرة، مما يدعم استراتيجيات العودة إلى المتوسط، والتتبع البصري والتحوط القائم على الفروق.

 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
}