네트워크 접근 사용 방법 VIDEO
인터넷 접근은 플러그인, cBot 및 지표의 일반적인 사용 사례입니다. 이전에는 알고리즘이 네트워크 관련 작업을 수행하기 위해 특별한 권한을 요청해야 했으며, 특히 소스 코드 없이 배포된 알고리즘의 경우 사용자들에게 일부 우려를 불러일으킬 수 있었습니다. 다행히도, cTrader는 이제 모든 알고리즘이 높은 접근 권한 없이도 웹 리소스에 접근할 수 있도록 허용합니다.
이 글과 해당 비디오에서는 JSON을 사용하여 직렬화 및 역직렬화를 수행하는 무료 API에서 뉴스를 검색하는 방법을 시연합니다.
API 엔드포인트 사용 예제에서는 외부 소스에서 뉴스 정보를 읽어 로그에 출력하는 cBot을 사용할 것입니다. 이를 위해 NewsData에서 제공하는 무료 API를 사용할 것입니다.
브라우저에서 API가 어떻게 보이는지 확인하려면 이 링크에 접근하면 됩니다.
https://newsdata.io/api/1/news?apikey=pub_32606381862bbdf07962c72ae7bc6135d6332&&language=en
보시다시피, 엔드포인트는 cBot을 사용하여 쉽게 소비할 수 있는 키-값 쌍의 시퀀스를 제공합니다. 먼저 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 () 를 선언할 수 있습니다.
private static readonly HttpClient client = new HttpClient ();
이후 OnStart () 메서드에서 데이터를 읽을 수 있습니다.
protected override void OnStart ()
{
HttpResponseMessage responseToGet = client . GetAsync ( "https://newsdata.io/api/1/news?apikey=pub_32606381862bbdf07962c72ae7bc6135d6332&q=inflation&language=en" ). Result ;
}
요청은 JSON 형식의 원시 응답을 반환합니다. MessageBox 를 사용하여 어떻게 보이는지 확인할 수 있습니다.
var stream = responseToGet . Content . ReadAsStream ();
var reader = new StreamReader ( stream );
MessageBox . Show ( reader . ReadToEnd ());
JSON 데이터 역직렬화 JSON 데이터를 역직렬화하기 위해 JsonSerialiser 클래스를 사용할 것입니다. 그러나 이를 수행하기 전에 역직렬화에 필요한 클래스를 정의해야 합니다.
NewsItem - 이 클래스는 단일 뉴스 기사를 나타냅니다. News - 이 클래스는 NewsItem 객체의 컬렉션을 포함합니다. 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 ; }
}
이제 역직렬화 코드를 작성할 수 있습니다.
News news = JsonSerializer . Deserialize < News > ( responseToGet . Content . ReadAsStream ());
또한 로그에 뉴스 제목을 출력하기 위해 다음 코드를 추가할 수 있습니다.
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 () 메서드를 다음과 같이 수정할 수 있습니다.
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 차트 내에서 바로 사용할 수 있는 멋진 뉴스 리더로 변환할 수 있습니다!