ข้ามไปที่เนื้อหา

รับข้อมูลสัญลักษณ์

การรับและตีความข้อมูลสัญลักษณ์ (เช่น ราคาเปิดและปิดของแท่งทั้งหมดในช่วงเวลาที่กำหนด) เป็นสิ่งสำคัญในแอปพลิเคชันใดๆ ที่มีฟังก์ชันการทำงานดังต่อไปนี้:

  • แผนภูมิ – เพื่อสร้างแผนภูมิแท่งหรือเส้น คุณจำเป็นต้องรู้ทั้งข้อมูลแท่งและคำพูดในอดีตและแบบเรียลไทม์
  • สถิติตลาด – หากคุณต้องการแสดงสถิติตลาด (เช่น การเปลี่ยนแปลงราคารายวันสำหรับสัญลักษณ์แต่ละตัว) คุณต้องรับทั้งราคาในอดีตและแบบเรียลไทม์
  • รีเพลย์ – ในแอปพลิเคชันของคุณ คุณอาจอนุญาตให้นักเทรดย้อนกลับไปยังช่วงเวลาก่อนหน้าและเทรดบนข้อมูลในอดีต เพื่อทำเช่นนั้น คุณจะต้องรับและประมวลผลข้อมูลแท่งและ tick ในอดีต

ในบทช่วยสอนนี้ เราจะแสดงให้เห็นว่าคุณสามารถรับและประมวลผลข้อมูลแท่งและ tick ในอดีตและแบบเรียลไทม์ และคำพูด depth แบบเรียลไทม์ได้อย่างไร

โปรดทราบว่าบทช่วยสอนนี้ให้ตัวอย่างโค้ดสำหรับการรับข้อมูลแท่งในอดีตเท่านั้น เนื่องจากตรรกะหลักยังคงเหมือนเดิมไม่ว่าคุณจะดำเนินการใด คุณสามารถปรับตัวอย่างโค้ดนี้เพื่อรับข้อมูลประเภทอื่นได้

ทำงานกับ JSON

เมื่อทำงานกับ JSON คุณยังสามารถนำโค้ดจากบทช่วยสอนนี้มาใช้ใหม่ได้ อย่างไรก็ตาม คุณจำเป็นต้องปรับเปลี่ยนเล็กน้อยขึ้นอยู่กับวิธีการ serialisation และ deserialisation ของคุณ

รับข้อมูลแท่งในอดีต

เพื่อรับข้อมูลแท่งในอดีต ให้ทำตามขั้นตอนต่อไปนี้:

  • เริ่มต้นออบเจ็กต์ที่แสดงถึง ข้อความ ProtoOAGetTrendbarsReq
  • เติมคุณสมบัติของออบเจ็กต์ด้วย ctidTraderAccountId, symbolId, ProtoOATrendbarPeriod, count ของแท่งที่จะส่งคืน และ toTimestamp และ fromTimestamp Unix timestamps ที่ต้องการ

ข้อจำกัดของ Timestamp

โปรดทราบว่ามีข้อจำกัดบางประการเกี่ยวกับระยะทางสูงสุดที่เป็นไปได้ระหว่าง toTimestamp และ fromTimestamp ข้อจำกัดเหล่านี้ขึ้นอยู่กับ ProtoOATrendPeriod ที่ระบุ หากต้องการเรียนรู้เพิ่มเติม คลิกที่นี่

  • ส่งข้อความที่สร้างใหม่และรับการตอบสนองของประเภท ProtoOAGetTrendbarsRes เข้าถึงฟิลด์ trendbar เพื่อรับรายการแท่งเทรนด์
  • แปลงข้อมูลจากรูปแบบสัมพัทธ์เป็นราคาสัญลักษณ์จริง เพื่อทำเช่นนั้น ก่อนอื่นให้รับราคาต่ำสุดของแท่งเทรนด์และหารด้วย 100000 จากนั้นปัดเศษผลลัพธ์เป็นตัวเลขสัญลักษณ์ (เช่น สองตัวหลังจุดทศนิยม) เพื่อรับราคาสูงสุด เปิด และปิดของแท่งเทรนด์ ให้เพิ่มเดลต้าของแต่ละราคาเหล่านี้เข้ากับราคาต่ำสุดของแท่งเทรนด์ หลังจากนั้นหารแต่ละตัวเลขด้วย 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

รับข้อมูล tick ในอดีต

เพื่อรับข้อมูล tick ในอดีต ให้ทำตามขั้นตอนต่อไปนี้:

  • เริ่มต้นออบเจ็กต์ที่แสดงถึง ข้อความ ProtoOAGetTickDataReq
  • เติมคุณสมบัติของออบเจ็กต์ด้วย ctidTraderAccountId, symbolId, ประเภทคำพูด type รวมถึง fromTimestamp และ toTimestamp ที่ต้องการ

ข้อจำกัดของ Timestamp

เป็นไปไม่ได้ที่จะขอข้อมูล tick ในอดีตสำหรับช่วงเวลาที่มากกว่าหนึ่งสัปดาห์ ดังนั้นความแตกต่างระหว่าง toTimestamp และ fromTimestamp ที่ระบุต้องไม่เกิน 604800000

  • ส่งข้อความที่สร้างใหม่และรับการตอบสนองของประเภท ProtoOAGetTickDataRes เข้าถึงฟิลด์ tickData เพื่อรับรายการองค์ประกอบประเภท ProtoOATickData
  • แปลงข้อมูลจากรูปแบบสัมพัทธ์เป็นราคาสัญลักษณ์จริง เพื่อทำเช่นนั้นหารแต่ละ tick ด้วย 100000 และปัดเศษผลลัพธ์เป็นตัวเลขสัญลักษณ์

การขอจำนวน tick จำนวนมาก

มีข้อจำกัดเกี่ยวกับจำนวน tick ที่สามารถส่งคืนในข้อความ ProtoOAGetTickDataRes หากเกินขีดจำกัดนี้ (เช่น มีจำนวน tick จำนวนมากในช่วงเวลาที่ระบุ) ข้อความ ProtoOAGetTickDataRes จะรวมเฉพาะ tick X แรก โดยที่ X เป็นตัวเลขที่ต่ำกว่าขีดจำกัด tick ขีดจำกัดที่แน่นอนขึ้นอยู่กับการกำหนดค่า backend ของ cTrader

เพื่อตรวจสอบว่ามี tick มากกว่าที่ส่งคืนในข้อความที่ได้รับหรือไม่ ให้ใช้แฟล็ก hasMore

รับข้อมูลแท่งแบบเรียลไทม์

เพื่อรับแท่งแบบเรียลไทม์ ให้ทำตามขั้นตอนต่อไปนี้:

  • เริ่มต้นตัวแปรที่แสดงถึง ข้อความ ProtoOAGetTrendbarsReq
  • เติมคุณสมบัติของออบเจ็กต์ด้วย ctidTraderAccountId, symbolId, ProtoOATrendbarPeriod, count ของแท่งที่จะส่งคืน, toTimestamp และ fromTimestamp Unix timestamps ที่ต้องการ

ข้อจำกัดของ Timestamp

มีข้อจำกัดบางประการเกี่ยวกับระยะทางสูงสุดที่เป็นไปได้ระหว่าง toTimestamp และ fromTimestamp ข้อจำกัดเหล่านี้ขึ้นอยู่กับ ProtoOATrendPeriod ที่ระบุ หากต้องการเรียนรู้เพิ่มเติม คลิกที่นี่

  • ส่งข้อความที่สร้างใหม่และรับการตอบสนองของประเภท ProtoOAGetTrendbarsRes เข้าถึงฟิลด์ trendbar เพื่อรับรายการแท่งเทรนด์

  • แปลงข้อมูลจากรูปแบบสัมพัทธ์เป็นราคาสัญลักษณ์จริง เพื่อทำเช่นนั้น ก่อนอื่นให้รับราคาต่ำสุดของแท่งเทรนด์และหารด้วย 100000 จากนั้นปัดเศษผลลัพธ์เป็นตัวเลขสัญลักษณ์ (เช่น สองตัวหลังจุดทศนิยม) เพื่อรับราคาสูงสุด เปิด และปิดของแท่งเทรนด์ ให้เพิ่มเดลต้าของแต่ละราคาเหล่านี้เข้ากับราคาต่ำสุดของแท่งเทรนด์ หลังจากนั้นหารแต่ละตัวเลขด้วย 100000 และปัดเศษผลลัพธ์เป็นตัวเลขสัญลักษณ์

  • เริ่มต้นออบเจ็กต์ที่แสดงถึง ข้อความ ProtoOASubscribeLiveTrendbarReq

  • เติมคุณสมบัติของออบเจ็กต์ด้วย ctidTraderAccountId, ProtoOATrendbarPeriod และ symbolId ที่ต้องการ

  • ทำเช่นเดียวกันสำหรับออบเจ็กต์ที่แสดงถึง ข้อความ ProtoOASubscribeSpotsReq

  • ส่งข้อความ ProtoOASubscribeSpotsReq และ ProtoOASubscribeLiveTrendbarReq ในลำดับนั้นและรับการตอบสนองของประเภท ProtoOASubscribeSpotsRes และ ProtoOASubscribeLiveTrenbarsRes ณ จุดนี้ คุณได้สมัครสมาชิกข้อมูลแท่งแบบเรียลไทม์และคุณควรได้รับข้อความประเภท ProtoOASpotEvent

สมัครสมาชิกแท่งเทรนด์แบบเรียลไทม์

การสมัครสมาชิกแท่งเทรนด์แบบเรียลไทม์สำเร็จต้องมีการสมัครสมาชิกเหตุการณ์ spot ก่อน

  • เมื่อคุณได้รับข้อความ ProtoOASpotEvent ใหม่ ให้ใช้ฟิลด์ trendbar เพื่อรับข้อมูลของแท่งราคาปิดล่าสุด
  • แปลงข้อมูลจากรูปแบบสัมพัทธ์เป็นราคาสัญลักษณ์จริง เพื่อทำเช่นนั้น ก่อนอื่นให้รับราคาต่ำสุดของแท่งเทรนด์และหารด้วย 100000 จากนั้นปัดเศษผลลัพธ์เป็นตัวเลขสัญลักษณ์ (เช่น สองตัวหลังจุดทศนิยม) เพื่อรับราคาสูงสุด เปิด และปิดของแท่งเทรนด์ ให้เพิ่มเดลต้าของแต่ละราคาเหล่านี้เข้ากับราคาต่ำสุดของแท่งเทรนด์ หลังจากนั้นหารแต่ละตัวเลขด้วย 100000 และปัดเศษผลลัพธ์เป็นตัวเลขสัญลักษณ์

เพื่อยกเลิกการสมัครรับข้อมูลแท่งเทรนด์สด คุณสามารถส่ง ข้อความ ProtoOAUnsubscribeLiveTrendbarsReq ที่มี symbolId, period และ ctidTraderAccountId ของคุณได้ตลอดเวลา หากคำขอของคุณสำเร็จ คุณควรได้รับคำตอบประเภท ProtoOAUnsubscribeLiveTrenbarRes การสมัครรับเหตุการณ์สปอตของคุณจะยังคงอยู่

รับราคาสด

เพื่อรับราคา Bid และ Ask สดสำหรับสัญลักษณ์ ให้ทำตามขั้นตอนต่อไปนี้:

  • เริ่มต้นวัตถุที่แสดง ข้อความ ProtoOASubscribeSpotsReq
  • กรอกคุณสมบัติของวัตถุด้วย ctidTraderAccountId, symbolId และหากต้องการ subscribeToSpotTimestamp บูล
  • ส่งข้อความที่สร้างใหม่และรับคำตอบประเภท ProtoOASubscribeSpotsRes ณ จุดนี้ คุณได้สมัครรับข้อมูลราคาสดแล้ว และคุณควรได้รับข้อความประเภท ProtoOASpotEvent
  • เมื่อคุณได้รับข้อความ ProtoOASpotEvent ใหม่ ให้เข้าถึงฟิลด์ bid และ ask เพื่อรับราคาล่าสุด โปรดทราบว่าคุณยังต้องแปลงข้อมูลเป็นค่าสัมบูรณ์โดยหารด้วย 100000 และปัดเศษให้เป็นจำนวนหลักของสัญลักษณ์

ฟิลด์ Bid และ Ask

เนื่องจากฟิลด์ bid และ ask เป็นทางเลือก คุณอาจไม่เห็นข้อความ ProtoOASpotEvent ที่ระบุทั้งสองฟิลด์เสมอไป

เพื่อยกเลิกการสมัครรับข้อมูลราคา คุณสามารถส่ง ข้อความ ProtoOAUnsubscribeSpotsReq ที่มี symbolId และ ctidTraderAccountId ของคุณได้ตลอดเวลา หากคำขอของคุณสำเร็จ คุณควรได้รับคำตอบประเภท ProtoOAUnsubscribeSpotsRes ณ จุดนี้ คุณควรหยุดรับเหตุการณ์สปอต

ราคา Depth

สุดท้ายแต่ไม่ท้ายสุด คุณยังสามารถรับราคา Depth หรือ Level II สดสำหรับสัญลักษณ์ได้ ในการทำเช่นนั้น ให้ทำตามขั้นตอนต่อไปนี้

คุณสามารถสมัครและรับราคา Depth หรือ Level II สดสำหรับสัญลักษณ์จาก API ได้

  • เริ่มต้นวัตถุที่แสดง ข้อความ ProtoOASubscribeDepthQuotesReq
  • กรอกคุณสมบัติของวัตถุด้วย ctidTraderAccountId และ symbolId
  • ส่งข้อความที่สร้างใหม่และรับคำตอบประเภท ProtoOASubscribeDepthQuotesRes ณ จุดนี้ คุณได้สมัครรับราคา Depth แล้ว ซึ่งหมายความว่าคุณควรเริ่มรับข้อความประเภท ProtoOADepthEvent
  • เมื่อคุณได้รับข้อความ ProtoOADepthEvent ใหม่ คุณจะต้องใช้ฟิลด์ newQuotes และ deletedQuotes เพื่อรับข้อมูล Depth ล่าสุด คุณยังต้องแปลงข้อมูลเป็นค่าสัมบูรณ์โดยหารด้วย 100000 และปัดเศษผลลัพธ์ให้เป็นจำนวนหลักของสัญลักษณ์ คุณยังต้องแปลงขนาดราคา Depth เป็นหน่วยโดยหารด้วย 100

เพื่อยกเลิกการสมัครรับเหตุการณ์ Depth คุณสามารถใช้ ข้อความ ProtoOAUnsubscribeDepthQuotesReq โดยระบุ symbolId และ ctidTraderAccountId ได้ตลอดเวลา คุณควรได้รับข้อความประเภท ProtoOAUnsubscribeDepthQuotesRes; หลังจากนั้น คุณควรหยุดรับเหตุการณ์ Depth