Ana içeriğe geç

Ağ erişimi nasıl kullanılır

İnternete erişim, eklentiler, cBot'lar ve göstergeler için yaygın bir kullanım durumudur. Daha önce, algoritmaların herhangi bir ağla ilgili işlem gerçekleştirmek için özel izinler istemesi gerekiyordu; bu da özellikle bu algoritmalar herhangi bir kaynak kodu olmadan dağıtıldıysa kullanıcılardan bazı endişeler doğurabilirdi. Neyse ki cTrader, artık tüm algoritmaların yükseltilmiş erişim haklarına sahip olmadan web kaynaklarına erişmesine izin veriyor.

Bu makalede ve ilgili videosunda, serileştirme ve seri durumdan çıkarma için JSON kullanan ücretsiz bir API'den haberleri nasıl alacağımızı göstereceğiz.

Bir API uç noktasını kullanma

Örneğimizde, cBot'umuzu harici bir kaynaktan haber bilgilerini okumak ve günlüğe yazdırmak için kullanacağız. Bu amaçla NewsData tarafından sunulan ücretsiz bir API kullanacağız.

API'nin bir tarayıcıda nasıl göründüğünü görmek için bu bağlantıya erişebiliriz.

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

Gördüğümüz gibi uç nokta, cBot kullanarak kolayca tüketebileceğimiz bir dizi anahtar-değer çifti sağlar. JSON biçimli verileri seri durumdan çıkarmak ve okumak için çeşitli sınıflar ve yöntemler içeren ad alanlarını ekleyerek başlayacağız.

 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;

Daha sonra İnternet'e erişecek basit bir HttpClient() tanımlayabiliriz.

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

Daha sonra OnStart() yönteminde veri okuyabileceğiz.

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

İstek, JSON biçiminde ham bir yanıt döndürecektir. Bir MessageBox kullanarak nasıl göründüğünü görebiliriz.

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

JSON verilerini seri durumdan çıkarma

JSON verilerimizi seri durumdan çıkarmak için JsonSerialiser sınıfını kullanacağız. Ancak, bunu yapmadan önce seri durumdan çıkarma için gerekli sınıfları tanımlamamız gerekecek.

  • NewsItem - bu sınıf tek bir haber makalesini temsil eder.
  • News - bu sınıf bir NewsItem nesneleri koleksiyonu içerir.
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; }
}

Bu şablon kodu yazmaktan kaçınmak isterseniz JSON'dan C#'a çevrimiçi bir dönüştürücü de kullanabilirsiniz.

Dönüştürücüyü kullanarak sınıflarımızı aşağıdaki gibi tanımladık:

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

Şimdi seri durumdan çıkarma kodumuzu yazabiliriz.

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

Ek olarak, haber başlıklarını günlüğe yazdırmak için aşağıdaki kodu ekleyebiliriz.

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'umuzu derleyip çalıştırırsak günlükte bir istisna göründüğünü göreceğiz. Ancak, cBot'un erişim haklarını AccessRights.FullAccess olarak değiştirirsek cBot'umuzun amaçlandığı gibi çalıştığını göreceğiz.

Yükseltilmiş erişim hakları olmadan İnternet'e erişim

cBot'umuzun yükseltilmiş erişim hakları istemesi gereken bir durumdan kaçınmak için OnStart() yöntemimizi aşağıdaki gibi değiştirebiliriz.

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

Erişim haklarını AccessRights.None olarak ayarlarsak ve cBot'umuzu yeniden oluşturursak haber başlıklarının günlükte sorunsuz bir şekilde yazdırıldığını görmeliyiz. Biraz daha çabayla cBot'umuz, herhangi bir cTrader grafiğinin hemen içinde kullanılabilen şık bir haber okuyucuya dönüştürülebilir!