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

الحصول على بيانات الرمز

يعد الحصول على بيانات الرمز وتفسيرها (على سبيل المثال، أسعار الفتح والإغلاق لجميع الشموع لفترة محددة) أمراً أساسياً في أي تطبيق يحتوي على أي من الوظائف التالية:

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

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

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

العمل مع JSON

عند العمل مع JSON، لا يزال بإمكانك إعادة استخدام الكود من هذا البرنامج التعليمي؛ ومع ذلك، ستحتاج إلى تعديله قليلاً اعتماداً على نهجك في التسلسل وفك التسلسل.

الحصول على بيانات الشموع التاريخية

للحصول على بيانات الشموع التاريخية، قم بتنفيذ الإجراءات التالية:

  • قم بتهيئة كائن يمثل رسالة ProtoOAGetTrendbarsReq.
  • املأ خصائص الكائن بـ ctidTraderAccountId المطلوب، وsymbolId، وProtoOATrendbarPeriod، وcount الخاص بعدد trendbars المراد إرجاعها وtoTimestamp وfromTimestamp للطوابع الزمنية Unix.

قيود الطابع الزمني

لاحظ أن هناك بعض القيود على المسافة القصوى الممكنة بين toTimestamp وfromTimestamp. تعتمد هذه القيود على ProtoOATrendPeriod المحدد. لمعرفة المزيد، انقر هنا.

  • أرسل الرسالة التي تم إنشاؤها حديثاً واستلم رداً من نوع ProtoOAGetTrendbarsRes. قم بالوصول إلى حقل trendbar للحصول على قائمة أشرطة الاتجاه.
  • قم بتحويل البيانات من التنسيق النسبي إلى سعر الرمز الفعلي. للقيام بذلك، احصل أولاً على السعر المنخفض لـ trendbar واقسمه على 100000. ثم قم بتقريب النتيجة إلى أرقام الرمز (على سبيل المثال، رقمين بعد الفاصل). للحصول على الأسعار المرتفعة والافتتاح والإغلاق لـ trendbar، أضف دلتا trendbar لكل من هذه الأسعار إلى السعر المنخفض لـ trendbar. بعد ذلك، اقسم كل رقم على 100000 وقرب النتيجة إلى أرقام الرمز.

يمكنك إكمال هذه الإجراءات بإعادة استخدام الكود أدناه.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
private static async void TrendbarRequest(ProtoOATrendbarPeriod period, int accountId, int symbolId, int days)
{
    Console.WriteLine("Sending ProtoOAGetTrendbarsReq...");

    var request = new ProtoOAGetTrendbarsReq
    {
        CtidTraderAccountId = accountId,
        SymbolId = symbolId,
        Period = period,
        FromTimestamp = DateTimeOffset.UtcNow.AddDays(-days).ToUnixTimeMilliseconds(),
        ToTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
    };

    Console.WriteLine($"FromTimestamp: {request.FromTimestamp} | ToTimestamp: {request.ToTimestamp}");

    await _client.SendMessage(request);
}

public static double GetPriceFromRelative(ProtoOASymbol symbol, long relative) => Math.Round(relative / 100000.0, symbol.Digits);

private List<Trendbar> OnHistoricalTrendbarsReceived(ProtoOAGetTrendbarsRes message) 
{
    var trendbars = message.Trendbar;

    var data = new List<Trendbar>();

    foreach (var trendbar in trendbars) 
    {
        data.Add(new Trendbar
        {
            Low = GetPriceFromRelative(symbol, trendbar.Low),
            High = GetPriceFromRelative(symbol, trendbar.Low + (int)trendbar.DeltaHigh),
            Open = GetPriceFromRelative(symbol, trendbar.Low + (int)trendbar.DeltaOpen),
            Close = GetPriceFromRelative(symbol, trendbar.Low + (int)trendbar.DeltaClose),
        }
        );
    }

    return data;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
def sendProtoOAGetTrendbarsReq(ctidTraderAccountId, weeks, period, symbolId, clientMsgId = None):
    request = ProtoOAGetTrendbarsReq()
    request.ctidTraderAccountId = ctidTraderAccountId
    request.period = ProtoOATrendbarPeriod.Value(period)
    request.fromTimestamp = int(calendar.timegm((datetime.datetime.utcnow() - datetime.timedelta(weeks=int(weeks))).utctimetuple())) * 1000
    request.toTimestamp = int(calendar.timegm(datetime.datetime.utcnow().utctimetuple())) * 1000
    request.symbolId = int(symbolId)
    deferred = client.send(request, clientMsgId = clientMsgId)

def getPriceFromRelative(symbol, relative): round(relative / 100000.0, symbol.digits)

def onHistoricalTrendbarsReceived(message):

    trendbars = message.trendbars

    data = []

    for trendbar in trenbars:
        data.append(Trendbar(low=getPriceFromRelative(symbol, trendbar.low), high=getPriceFromRelative(symbol, trendbar.low + int(trendbar.deltaHigh)), open=getPriceFromRelative(symbol, trendbar.low + int(trendbar.deltaHigh)), close=getPriceFromRelative(symbol, trendbar.low +int(trendbar.deltaClose))))

    return data

الحصول على بيانات التيك التاريخية

لاستلام بيانات التيك التاريخية، قم بتنفيذ الإجراءات التالية:

  • قم بتهيئة كائن يمثل رسالة ProtoOAGetTickDataReq.
  • املأ خصائص الكائن بـ ctidTraderAccountId المطلوب، وsymbolId، ونوع type السعر بالإضافة إلى fromTimestamp وtoTimestamp.

قيود الطابع الزمني

من المستحيل طلب بيانات التيك التاريخية لفترة أكبر من أسبوع واحد. وبالتالي، يجب ألا يكون الفرق بين toTimestamp وfromTimestamp المحددين أكبر من 604800000.

  • أرسل الرسالة التي تم إنشاؤها حديثاً واستلم رداً من نوع ProtoOAGetTickDataRes. قم بالوصول إلى حقل tickData للحصول على قائمة عناصر من نوع ProtoOATickData.
  • قم بتحويل البيانات من التنسيق النسبي إلى سعر الرمز الفعلي. للقيام بذلك، اقسم كل تيك على 100000 وقرب النتيجة إلى أرقام الرمز.

طلب عدد كبير من التيكات

هناك حد لعدد التيكات التي يمكن إرجاعها في رسالة ProtoOAGetTickDataRes. إذا تم تجاوز هذا الحد (على سبيل المثال، كان هناك عدد كبير من التيكات خلال الفترة المحددة)، فستتضمن رسالة ProtoOAGetTickDataRes فقط أول X تيك، حيث X هو رقم أقل من حد التيك. يعتمد الحد الدقيق على تكوين الواجهة الخلفية لـ cTrader.

للتحقق مما إذا كان هناك المزيد من التيكات أكثر مما تم إرجاعه في الرسالة المستلمة، استخدم علامة hasMore.

الحصول على بيانات الأشرطة المباشرة

لاستلام الأشرطة المباشرة، قم بتنفيذ الإجراءات التالية:

  • قم بتهيئة متغير يمثل رسالة ProtoOAGetTrendbarsReq.
  • املأ خصائص الكائن بـ ctidTraderAccountId المطلوب، وsymbolId، وProtoOATrendbarPeriod، وcount الخاص بعدد trendbars المراد إرجاعها، وtoTimestamp وfromTimestamp للطوابع الزمنية Unix.

قيود الطابع الزمني

هناك بعض القيود على المسافة القصوى الممكنة بين toTimestamp وfromTimestamp. تعتمد هذه القيود على ProtoOATrendPeriod المحدد. لمعرفة المزيد، انقر هنا.

  • أرسل الرسالة التي تم إنشاؤها حديثاً واستلم رداً من نوع ProtoOAGetTrendbarsRes. قم بالوصول إلى حقل trendbar للحصول على قائمة أشرطة الاتجاه.

  • قم بتحويل البيانات من التنسيق النسبي إلى سعر الرمز الفعلي. للقيام بذلك، احصل أولاً على السعر المنخفض لـ trendbar واقسمه على 100000. ثم قم بتقريب النتيجة إلى أرقام الرمز (على سبيل المثال، رقمين بعد الفاصل). للحصول على الأسعار المرتفعة والافتتاح والإغلاق لـ trendbar، أضف دلتا trendbar لكل من هذه الأسعار إلى السعر المنخفض لـ trendbar. بعد ذلك، اقسم كل رقم على 100000 وقرب النتيجة إلى أرقام الرمز.

  • قم بتهيئة كائن يمثل رسالة ProtoOASubscribeLiveTrendbarReq.

  • املأ خصائص الكائن بـ ctidTraderAccountId المطلوب، وProtoOATrendbarPeriod وsymbolId.

  • قم بنفس الشيء لكائن يمثل رسالة ProtoOASubscribeSpotsReq.

  • أرسل رسالة ProtoOASubscribeSpotsReq ورسالة ProtoOASubscribeLiveTrendbarReq بهذا الترتيب واستلم ردوداً من ProtoOASubscribeSpotsRes ونوع ProtoOASubscribeLiveTrenbarsRes. في هذه المرحلة، أنت مشترك في بيانات الأشرطة المباشرة ويجب أن تتلقى رسائل من نوع ProtoOASpotEvent.

الاشتراك في trendbars المباشرة

يتطلب الاشتراك بنجاح في trendbars المباشرة أولاً الاشتراك في أحداث السبوت.

  • عندما تتلقى رسالة ProtoOASpotEvent جديدة، استخدم حقل trendbar للحصول على بيانات آخر شريط مغلق.
  • قم بتحويل البيانات من التنسيق النسبي إلى أسعار الرمز الفعلية. للقيام بذلك، احصل أولاً على السعر المنخفض لـ trendbar واقسمه على 100000. ثم قم بتقريب النتيجة إلى أرقام الرمز (على سبيل المثال، رقمين بعد الفاصل). للحصول على الأسعار المرتفعة والافتتاح والإغلاق لـ trendbar، أضف دلتا trendbar لكل من هذه الأسعار إلى السعر المنخفض لـ trendbar. بعد ذلك، اقسم كل رقم على 100000 وقرب النتيجة إلى أرقام الرمز.

لإلغاء الاشتراك في بيانات trendbar المباشرة، يمكنك دائماً إرسال رسالة ProtoOAUnsubscribeLiveTrendbarsReq تحتوي على symbolId و period و ctidTraderAccountId الخاص بك. إذا كان طلبك ناجحاً، يجب أن تتلقى رداً من نوع ProtoOAUnsubscribeLiveTrenbarRes. سيظل اشتراكك في أحداث التسعير قائماً.

الحصول على الأسعار المباشرة

لتلقي أسعار العرض والطلب المباشرة لرمز ما، قم بتنفيذ الإجراءات التالية:

  • قم بتهيئة كائن يمثل رسالة ProtoOASubscribeSpotsReq.
  • املأ خصائص الكائن بـ ctidTraderAccountId و symbolId، واختيارياً، القيمة المنطقية subscribeToSpotTimestamp.
  • أرسل الرسالة التي تم إنشاؤها حديثاً وتلقى رداً من نوع ProtoOASubscribeSpotsRes. في هذه المرحلة، أنت مشترك في بيانات الأسعار المباشرة ويجب أن تتلقى رسائل من نوع ProtoOASpotEvent.
  • عندما تتلقى رسالة ProtoOASpotEvent جديدة، قم بالوصول إلى حقلي bid و ask للحصول على أحدث الأسعار. لاحظ أنه لا يزال عليك تحويل البيانات إلى قيمة سعر فعلية بقسمتها على 100000 وتقريبها إلى أرقام الرمز.

حقول العرض والطلب

نظراً لأن حقلي bid و ask اختياريان، قد لا ترى بالضرورة رسائل ProtoOASpotEvent حيث يتم تحديد كليهما.

لإلغاء الاشتراك في بيانات الأسعار، يمكنك دائماً إرسال رسالة ProtoOAUnsubscribeSpotsReq تحتوي على symbolId و ctidTraderAccountId الخاص بك. إذا كان طلبك ناجحاً، يجب أن تتلقى رداً من نوع ProtoOAUnsubscribeSpotsRes. في هذه المرحلة، يجب أن تتوقف عن تلقي أحداث التسعير.

أسعار العمق

أخيراً وليس آخراً، يمكنك أيضاً تلقي أسعار العمق أو المستوى الثاني المباشرة لرمز ما. للقيام بذلك، قم بتنفيذ الإجراءات التالية.

يمكنك الاشتراك وتلقي أسعار العمق أو المستوى الثاني المباشرة لرمز ما من API.

  • قم بتهيئة كائن يمثل رسالة ProtoOASubscribeDepthQuotesReq.
  • املأ خصائص الكائن بـ ctidTraderAccountId و symbolId.
  • أرسل الرسالة التي تم إنشاؤها حديثاً وتلقى رداً من نوع ProtoOASubscribeDepthQuotesRes. في هذه المرحلة، أنت مشترك في أسعار العمق، مما يعني أنه يجب أن تبدأ في تلقي رسائل ProtoOADepthEvent.
  • عندما تتلقى رسالة ProtoOADepthEvent جديدة، ستحتاج إلى استخدام حقلي newQuotes و deletedQuotes للحصول على أحدث بيانات العمق. ستحتاج أيضاً إلى تحويل البيانات إلى قيمة سعر فعلية بقسمتها على 100000 وتقريب النتيجة إلى أرقام الرمز. ستحتاج أيضاً إلى تحويل حجم سعر العمق إلى وحدات بقسمته على 100.

لإلغاء الاشتراك في أحداث العمق، يمكنك دائماً استخدام رسالة ProtoOAUnsubscribeDepthQuotesReq مع تحديد symbolId و ctidTraderAccountId. يجب أن تتلقى رسالة من نوع ProtoOAUnsubscribeDepthQuotesRes؛ بعد ذلك، يجب أن تتوقف عن تلقي أحداث العمق.