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

วิธีใช้การเข้าถึงเครือข่าย

การเข้าถึงอินเทอร์เน็ตเป็นกรณีการใช้งานทั่วไปสำหรับปลั๊กอิน cBot และอินดิเคเตอร์ ก่อนหน้านี้ อัลกอริทึมต้องขอสิทธิ์พิเศษเพื่อดำเนินการเกี่ยวกับเครือข่ายใดๆ ซึ่งอาจทำให้เกิดความกังวลบางอย่างจากผู้ใช้ โดยเฉพาะอย่างยิ่งหากอัลกอริทึมเหล่านี้ถูกเผยแพร่โดยไม่มีซอร์สโค้ด โชคดีที่ตอนนี้ cTrader อนุญาตให้อัลกอริทึมทั้งหมดเข้าถึงทรัพยากรเว็บได้โดยไม่ต้องมีสิทธิ์การเข้าถึงที่สูงขึ้น

ในบทความนี้และวิดีโอที่เกี่ยวข้อง เราจะแสดงวิธีการดึงข่าวจาก API ฟรีที่ใช้ JSON สำหรับการแปลงข้อมูลเป็นอ็อบเจ็กต์และกลับกัน

บริโภค API endpoint

ในตัวอย่างของเรา เราจะใช้ cBot ของเราเพื่ออ่านข้อมูลข่าวจากแหล่งภายนอกและพิมพ์ลงในบันทึก เพื่อจุดประสงค์นี้ เราจะใช้ API ฟรีที่เสนอโดย NewsData

เพื่อดูว่า API มีหน้าตาอย่างไรในเบราว์เซอร์ เราสามารถเข้าถึงลิงก์นี้ได้อย่างง่ายดาย

https://newsdata.io/api/1/news?apikey=pub_32606381862bbdf07962c72ae7bc6135d6332&&language=en

ดังที่เราเห็น endpoint ให้ลำดับของคู่คีย์-ค่าที่เราสามารถบริโภคได้อย่างง่ายดายโดยใช้ cBot เราจะเริ่มต้นด้วยการเพิ่ม namespace ที่มีคลาสและเมธอดหลายอย่างสำหรับการแปลงข้อมูล JSON เป็นอ็อบเจ็กต์และการอ่านข้อมูล

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Net.Http.Json;
using System.Net.Http;

จากนั้นเราสามารถประกาศ HttpClient() อย่างง่ายที่จะเข้าถึงอินเทอร์เน็ต

1
private static readonly HttpClient client = new HttpClient();

หลังจากนั้นเราจะสามารถอ่านข้อมูลในเมธอด OnStart() ได้

1
2
3
4
protected override void OnStart()
{
    HttpResponseMessage responseToGet = client.GetAsync("https://newsdata.io/api/1/news?apikey=pub_32606381862bbdf07962c72ae7bc6135d6332&q=inflation&language=en").Result;
}

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

1
2
3
var stream = responseToGet.Content.ReadAsStream();
var reader = new StreamReader(stream);
MessageBox.Show(reader.ReadToEnd());

แปลงข้อมูล JSON เป็นอ็อบเจ็กต์

เพื่อแปลงข้อมูล JSON ของเราเป็นอ็อบเจ็กต์ เราจะใช้คลาส JsonSerialiser อย่างไรก็ตาม ก่อนที่เราจะสามารถทำเช่นนี้ได้ เราจะต้องกำหนดคลาสที่จำเป็นสำหรับการแปลงข้อมูลเป็นอ็อบเจ็กต์

  • NewsItem - คลาสนี้แทนบทความข่าวเดียว
  • News - คลาสนี้มีคอลเลกชันของอ็อบเจ็กต์ NewsItem
1
2
3
4
5
6
7
8
9
public class NewsItem
{
    public string title { get; set; }   
}

public class News
{
    public List<NewsItem> results { get; set; }
}

หากคุณต้องการหลีกเลี่ยงการเขียนโค้ดพื้นฐานนี้ คุณยังสามารถใช้ ตัวแปลงออนไลน์จาก JSON เป็น C#

โดยใช้ตัวแปลง เราได้กำหนดคลาสของเราดังนี้:

 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
public class NewsItem
{
    public string article_id { get; set; }
    public string title { get; set; }
    public string link { get; set; }
    public List<string> keywords { get; set; }
    public List<string> creator { get; set; }
    public object video_url { get; set; }
    public string description { get; set; }
    public string content { get; set; }
    public string pubDate { get; set; }
    public string image_url { get; set; }
    public string source_id { get; set; }
    public int source_priority { get; set; }
    public List<string> country { get; set; }
    public List<string> category { get; set; }
    public string language { get; set; }
}

public class News
{
    public string status { get; set; }
    public int totalResults { get; set; }
    public List<NewsItem> results { get; set; }
    public string nextPage { get; set; }
}

ตอนนี้เราสามารถเขียนโค้ดการแปลงข้อมูลเป็นอ็อบเจ็กต์ของเราได้

1
News news = JsonSerializer.Deserialize<News>(responseToGet.Content.ReadAsStream());

นอกจากนี้ เราสามารถเพิ่มโค้ดต่อไปนี้เพื่อพิมพ์หัวข้อข่าวในบันทึก

1
2
3
4
5
6
7
if (responseToGet.IsSuccessful)
{
    News news = JsonSerializer.Deserialize<News>(responseToGet.Body);

    foreach (var item in news.results)
            Print(item.title);
}

หากเราสร้างและรัน cBot ของเรา เราจะเห็นข้อยกเว้นปรากฏในบันทึก อย่างไรก็ตาม หากเราเปลี่ยนสิทธิ์การเข้าถึงของ cBot เป็น AccessRights.FullAccess เราจะเห็นว่า cBot ของเราทำงานตามที่ตั้งใจ

เข้าถึงอินเทอร์เน็ตโดยไม่ต้องมีสิทธิ์การเข้าถึงที่สูงขึ้น

เพื่อหลีกเลี่ยงสถานการณ์ที่ cBot ของเราต้องขอสิทธิ์การเข้าถึงที่สูงขึ้น เราสามารถแก้ไขเมธอด OnStart() ของเราเป็นดังนี้

1
2
3
4
protected override void OnStart()
{
    var responseToGet = Http.Get("https://newsdata.io/api/1/news?apikey=pub_32606381862bbdf07962c72ae7bc6135d6332&q=inflation&language=en");
}

หากเราตั้งค่าสิทธิ์การเข้าถึงเป็น AccessRights.None และสร้าง cBot ของเราใหม่ เราควรจะเห็นหัวข้อข่าวถูกพิมพ์ในบันทึกโดยไม่มีปัญหาใดๆ ด้วยความพยายามเพิ่มเติม cBot ของเราสามารถเปลี่ยนเป็นตัวอ่านข่าวที่สวยงามซึ่งพร้อมใช้งานภายในกราฟ cTrader ใดๆ!