Ana içeriğe geç

Ağ erişimi

Bu kılavuz, İnternet'e erişebilen algoritmaları nasıl oluşturabileceğinizi tanımlar. Aşağıda, bu API özelliğinin bir dakikalık özeti bulunmaktadır.

Bir dakikada ağ erişimi!

  • Algoritma çözümleriniz, işlem haberleri web sitelerinden veya Forex odaklı web API'lerinden bilgi alabilir. Bu özelliği, cBot'larınızın, eklentilerinizin ve göstergelerinizin güncel gerçek hayat olaylarına ve bilgilerine tepki vermesini sağlamak için kullanın.
  • System.Text.Json ve System.Text.Json.Serialization ad alanlarındaki yöntemleri kullanarak nesneleri JSON dosyalarına ve JSON dosyalarından hızlı bir şekilde serileştirebilir veya seri durumdan çıkarabilirsiniz, bu da cBot'ların uç noktaları kolayca tüketmesine ve değerli bilgileri işlemesine olanak tanır.
  • WebSocket protokolü, her seferinde bir HTTP isteği yapmak zorunda kalmak yerine bir hizmetten gerçek zamanlı olarak veri almayı sağlar. Algoritmalarınızı web kaynaklarıyla sorunsuz bir şekilde entegre etmek için WebSocket kullanın. WebSocketClient sınıfı, WebSocket bağlantılarını kullanmak için gerekli tüm yöntemleri ve parametreleri içerir.
  • WebSocket kullanırken dizeleri ve ham bayt verilerini gönderebilir ve alabilirsiniz. Farklı veri yapılarıyla çalışın ve değerli üçüncü taraf hizmetlerini kullanmak için bunları baytlara serileştirin.
  • AccessRights.None ağ işlevleri için yeterlidir.

HTTP

Yeni Http arayüzü, uygulandığında cBot'ların ve diğer algoritma türlerinin İnternet'e erişmesini sağlaması gereken çeşitli yöntemler içerir. Bir örnek için aşağıdakilere bakın:

  • HttpResponse Http.Get(string uri). Geçirilen uri dizesinde belirtilen URI'ye bir GET isteği gerçekleştirir ve bu isteğin sonuçlarını içeren bir HttpsResponse nesnesi döndürür.

HttpsRequest sınıfı, POST istekleri de dahil olmak üzere daha karmaşık istekler gerçekleştirmeye olanak tanır. Bu istekleri gerçekleştirmek için HttpsRequest.Method özelliğini HttpMethod.Put veya HttpMethod.Patch gibi HttpMethod enum değerlerinden birine ayarlayın.

Buna karşılık, HttpsRequest.Uri özelliği isteğin gönderildiği URI'yi içerirken, HttpsRequest.Body özelliği istek gövdesini ayarlamak için kullanılabilir. HttpsRequest nesnesini nasıl kullanabileceğinize dair bir örnek için aşağıya bakın.

  • HttpResponse Http.Send(HttpRequest request). Bu yönteme geçirilen HttpsRequest nesnesinin request.Uri özelliğinin değeri olarak belirtilen URI'ye bir istek gerçekleştirir. Daha sonra, bu isteğin sonuçlarını içeren bir HttpsResponse nesnesi döndürür. İstek türü, equest.Method özelliğinin değeri olarak ayarlanır.

Geriye dönük test ve optimizasyonda ağ erişimi

Http arayüzündeki tüm yöntemler, geriye dönük test ve optimizasyonda amaçlandığı gibi çalışır. Geriye dönük test veya optimizasyonda bir web kaynağına erişirken, bu kaynağın geçmiş bir sürümü yerine güncel sürümünün isteneceği unutulmamalıdır.

Örnek cBot'lar oluşturun

Bir GET isteği gerçekleştirin

Aşağıdaki eylemleri gerçekleştiren basit bir cBot oluşturacağız:

  • GET isteği gönderir ve https://forexApiExample.com/v1/exchangerate adresindeki API aracılığıyla bir JSON dosyasına erişir (bu API'nin tamamen sahte olduğunu unutmayın).
  • Eğer GET yanıtı başarılı olursa, cBot yanıt gövdesini özel bir SymbolPrice sınıfının nesnesine seri durumdan çıkarır (bu sınıfı tanıtım amaçlı oluşturduk).
  • API'de belirtilen fiyattan biraz daha yüksek bir fiyata bir sembol için satış limit emri verir.

cBot'un tamamen uydurma olduğunu unutmayın. Kod derlenecek olsa da, herhangi bir anlamlı eylem gerçekleştirmeyecektir.

JSON dosyalarından dizeleri nasıl serileştireceğiniz veya seri durumdan çıkaracağınız

cBot'umuzun kodu, System.Text.Json ve System.Text.Json.Serialization olmak üzere iki önemli using ifadesi içerir. Bu ad alanları, JsonSerializer.Deserialize<T>() gibi JSON dosyalarından dizeleri kolayca serileştirmeye ve seri durumdan çıkarmaya olanak tanıyan çeşitli yöntemler içerir.

İşte örnek cBot'umuzun kodu:

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

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class NetworkAccessTest : Robot
    {

        protected override void OnStart()
        {

            var responseToGet = Http.Get("https://forexApiExample.com/v1/exchangerate");

            if (responseToGet.IsSuccessful)
            {
                var tradedSymbol = JsonSerializer.Deserialize<SymbolPrice>(responseToGet.Body);
                var result = PlaceLimitOrder(TradeType.Sell, tradedSymbol.SymbolName, 10000, tradedSymbol.ConversionRate + 0.15);

            }
        }
    }

    public class SymbolPrice
    {
        public string SymbolName { get; set; }
        public double ConversionRate { get; set; }
    }
}

Bu cBot gerçek bir API'ye erişseydi, bunu başarıyla yapmış olurdu.

Bir POST isteği gerçekleştirin

Aşağıdaki hedeflere ulaşan daha gelişmiş bir cBot da oluşturabiliriz:

  • Aynı sahte API'ye https://anotherForexApiExample.com/commodities/v1/getaccesstoken adresinden bir POST isteği gönderir. Bu, bu API için bir erişim belirteci almak amacıyla yapılır.
  • Yanıt gövdesindeki belirteci token değişkeninde saklar.
  • Aynı API'ye, token değişkeninin değeri URI'de bir sorgu parametresi olarak geçirilerek (https://anotherForexApiExample.com/commodities/v1/getprices) bir GET isteği gerçekleştirir.
  • JSON serileştirmeyi (yukarıda tartışıldı) kullanarak, API'den alınan fiyattan biraz daha düşük bir fiyata bir alış stop emri verir.

Bir kez daha, bu cBot derlendiğinde herhangi bir anlamlı eylem gerçekleştirmeyecektir. Yalnızca örnek amaçlıdır.

 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
41
42
43
44
45
46
47
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;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class NetworkAccessTestTwo : Robot
    {

        protected override void OnStart()
        {
            var uriForAccessToken = new Uri("https://anotherForexApiExample.com/commodities/v1/getaccesstoken");

            var postRequest = new HttpRequest(uriForAccessToken);

            postRequest.Method = HttpMethod.Post;

            var responseToPost = Http.Send(postRequest);

            var token = responseToPost.Body;

            var response = Http.Get($"https://anotherForexApiExample.com/commodities/v1/getprices?token={token}");

            if (response.IsSuccessful)
            {
                var tradedSymbol = JsonSerializer.Deserialize<SymbolPrice>(response.Body);

                var result = PlaceStopOrder(TradeType.Buy, tradedSymbol.SymbolName, 10000, tradedSymbol.ConversionRate - 0.15);

            }
        }
    }

    public class SymbolPrice
    {
        public string SymbolName { get; set; }
        public double ConversionRate { get; set; }
    }
}

WebSocket istemcisi

Algo API, herkesin bir WebSocket bağlantısı kullanarak çeşitli web hizmetlerini ve kaynaklarını kullanmasına olanak tanır. Ağ erişimi özelliğinde kullanılan HTTP protokolüne kıyasla, WebSocket protokolü daha hızlıdır ve gerçek zamanlı olarak veri almayı sağlar.

WebSocket istemcisini kullanın

WebSocket istemcisini kullanmak basittir:

  1. Bir WebSocket bağlantısı için bir uç nokta sunan bir hizmet seçin
  2. WebSocketClientOptions sınıfının bir nesnesini başlatın ve istemcinizi yapılandırmak için parametrelerini belirtin.
  3. WebSocketClient sınıfının bir nesnesini başlatın ve daha önce oluşturulan seçenekleri kurucuya geçirin.
  4. Seçtiğiniz kaynağa bağlanmak için Connect() yöntemini ve Send() yöntemi aracılığıyla veri göndermek için kullanın.
  5. WebSocket istemcisi yeni veri aldığında algoritmanızın ne yapması gerektiğini ayarlamak için TextReceived() ve BinaryReceived() olay işleyicilerini kullanın.

Aşağıda, WebSocket aracılığıyla hayali bir ekonomik haber hizmetine bağlanan basit bir cBot oluşturacağız. cBot'un şu anda bağlı olduğu sembol hakkında yeni bir haber yayınlandığında, algoritma haber metnini içeren bir mesaj kutusu gösterecektir.

Not

Bu cBot yalnızca örnek amaçlıdır. Başarıyla derlense de, bir grafiğe eklendiğinde herhangi bir eylem gerçekleştirmez.

 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
41
42
43
44
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;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class ExampleWebSocketBot : Robot
    {

        private static WebSocketClientOptions _webSocketClientOptions = new WebSocketClientOptions 
        {
            KeepAliveInterval = new TimeSpan(0, 1, 30),
            UseDefaultCredentials = true,
        };
        private WebSocketClient _webSocketClient = new WebSocketClient(_webSocketClientOptions);
        private readonly Uri _targetUri = new Uri("ws://amazingnews.com:8000");

        protected override void OnStart()
        {
            _webSocketClient.Connect(_targetUri);
            _webSocketClient.Send("Hello");
            _webSocketClient.TextReceived += NewsReceived;
        }

        protected override void OnStop()
        {
            _webSocketClient.Close(WebSocketClientCloseStatus.NormalClosure);
        }

        private void NewsReceived(WebSocketClientTextReceivedEventArgs args) 
        {
            if (args.Text.Contains(SymbolName)) 
            {
                MessageBox.Show(args.Text, "News!", MessageBoxButton.OK, MessageBoxImage.Information, MessageBoxResult.OK);
            }
        }
    }
}

Gördüğünüz gibi, WebSocketClient.TextReceived olayını mesaj kutusunu göstermek için işleyebildiğimizden kodumuz oldukça kompakttır. cBot'umuzun hizmetlerden aktif olarak bilgi istemediğini unutmayın. Bunun yerine, kendisine sağlanan yeni bilgilere dinamik olarak tepki verir.

Uyarı

WebSocket istemciniz herhangi bir nedenle bağlantısı kesildiğinde (örneğin, sunucu tarafı bir hata nedeniyle keep-alive aralığının aşılması), WebSocketClient.Connect() yöntemini tekrar çağırmanız gerekir. Bu tür durumları programlı olarak ele almak için WebSocketClient.Disconnected olayını kullanın.

WebSocket'in Faydaları

WebSocket, web'den gelen yeni verilere gerçek zamanlı olarak tepki vermeyi sağladığı için, algoritmalarınızı bir şeyler hakkında otonom olarak bilgilendirebilen üçüncü taraf hizmetleriyle entegrasyon için mükemmeldir. İşte WebSocket istemcisini kullanabileceğiniz web kaynaklarına birkaç örnek.

  • Bir ekonomik haber takvimi. Yeni bir haber yayınlandığında, algoritmanız önemli bilgileri içeren bir mesaj kutusu gösterebilir.
  • Üretken bir yapay zeka hizmeti. Bir yapay zeka hizmeti bir isteme yanıt vermeye başladığında, tam yanıtı beklemek zorunda kalmak yerine sonucu kelime kelime gösterebilirsiniz.
  • Bir algoritmanın bağlı olduğu sembolle ilişkili tüm semboller için bir fiyat akışı. Fiyatlar güncellendiğinde, algoritma kullanıcılarına anında ve doğru bir şekilde gösterilir.
  • İşlem yapmaya odaklanmış bir sosyal medya ağı. Belirli bir sembol hakkında yeni mesajlar yayınlandığında, bir algoritma içeriklerini kullanıcılara gösterebilir.

Genel olarak, WebSocket bağlantıları normal HTTPS'ye kıyasla aşağıdaki faydaları sunar:

  • WebSocket bağlantıları daha verimlidir. Her HTTP isteği, başlıklar gibi ek veriler içermek zorundadır. WebSocket ile bağlantınız yalnızca bir kez kurulur, bundan sonra gereksiz veri göndermeye gerek kalmaz.
  • WebSocket bağlantıları gelişmiş eşzamanlılık sunar. HTTP isteği gönderdikten sonra bir yanıt bekleyene kadar algo işlemlerini durdurmaya gerek yoktur. WebSocket ile istediğiniz zaman veri gönderip alabilir ve bunları eşzamansız olarak işleyebilirsiniz.

WebSocket istemcisi, her tür algonun web kaynaklarıyla dinamik olarak etkileşim kurmasına olanak tanır; bu etkileşim HTTP kullanmaya kıyasla daha hızlı ve daha verimlidir. Üçüncü taraf hizmetlerle entegre güçlü algolar oluşturmak için WebSocket istemcisini kullanın.

Ağ erişimi ve AccessRights özelliği

Kısacası, AccessRights enum'ı algoritmaların cTrader dışındaki verilere (yerel makinenizin dosya sistemi gibi) erişimi olup olmadığını tanımlar. Daha fazlasını bu eğitimde öğrenebilirsiniz.

AccessRights'ı AccessRights.FullAccess olarak ayarlamak, algoların gelişmiş işlemler (Windows kayıt defterinden bilgi alma gibi) gerçekleştirmesine olanak tanır. Ancak son kullanıcılar, cBot'lara veya göstergelere tam erişim vermeyi riskli bulabilirler, çünkü bu durum bir veri ihlaline yol açabilir.

Sonuç olarak, algo ürünlerinizi başkalarıyla paylaşmak istiyorsanız AccessRights.None genellikle en mantıklı seçenektir. Ancak bu seçeneği tercih etseniz bile cTrader ürünleriniz web'e ücretsiz olarak erişebilir. cTrader Algo API'ye ağ erişimi işlevselliğinin eklenmesi, cBot'ların İnternet'teki kaynaklarla çalışmak için artık AccessRights özelliğinin AccessRights.FullAccess olarak ayarlanmasını gerektirmediği anlamına gelir.

Bu, algo geliştiricilerinin diğer trader'lara dağıtmayı amaçladıkları cTrader ürünlerini kodlarken sahip oldukları fırsatları büyük ölçüde genişletir.

Özet

Sonuç olarak, ağ erişimi, algoritmalarınızın gerçekleştirebileceği işlem sayısını büyük ölçüde artırırken ek riskler getirmeyen güçlü bir özelliktir.