Ana içeriğe geç

Hata yönetimi

Hata yönetimi, herhangi bir güvenilir ve kullanıcı dostu Open API uygulaması için çok önemli bir parçadır. Çeşitli hataları yakalayıp işlemezseniz, kullanıcılarınız hatalı bir kullanıcı arayüzüyle karşılaşabilir veya belirli temel eylemleri tamamen gerçekleştiremeyebilir.

Genel olarak, bir hatanın meydana geldiği katmana bağlı olarak farklı hata yönetimi süreçleri uygulanabilir.

  • Veri ve etki alanı katmanında. Bazı durumlarda, cTrader arka ucu isteklerinizden birine yanıt olarak ProtoErrorRes mesajını gönderebilir. Emirler, işlemler veya pozisyonlarla ilgili operasyonlar için ayrıca ProtoOAOrderErrorEvent mesajını alabilirsiniz.
  • Etki alanı ve uygulama katmanında. Kullanıcılar, kodunuzda hesaba katmadığınız eylemler gerçekleştirebilir ve bu da uygulamanızın beklenmedik şekilde davranmasına neden olabilir.

Bu seviyelerdeki hata yönetimi mekanizmaları farklılık gösterir ve aşağıda açıklanmıştır.

Veri ve etki alanı katmanında hata yönetimi

Aşağıdaki durumlarda ProtoErrorRes veya ProtoOAOrderErrorEvent alabilirsiniz (listenin kapsamlı olmadığını unutmayın):

  • Piyasası kapalı olan bir sembol için emir vermeye çalışmak.
  • Yanlış veya desteklenmeyen bir mesaj göndermek.
  • Yürütülmekte olan bir emri değiştirmeye çalışmak.
  • cTrader arka ucuna bağlantınızı kaybettikten sonra mesaj göndermek.

Hataları analiz etme

Hem ProtoErrorRes hem de ProtoOAOrderErrorEvent, meydana gelen hata türü ve açıklaması hakkında kesin bilgiler içeren errorCode ve description alanlarına sahiptir. Desteklenen tüm hata kodlarının tam listesini ProtoErrorCode enum'unda görebilirsiniz.

Uygulamanızın bu tür durumlarda bozulmamasını sağlamak için, bir hata yanıtı aldığınızda tetiklenen geri aramalara genellikle abone olabilirsiniz. Bu geri aramaların kesin mantığı ve bunlara nasıl abone olabileceğiniz, bağlantı kurmak ve mesaj akışını dinlemek için kullandığınız istemciye bağlıdır.

JSON ile çalışma

JSON ile çalışırken, bu eğitimdeki kodu yine de yeniden kullanabilirsiniz; ancak, serileştirme ve seri durumdan çıkarma yaklaşımınıza ve tercih ettiğiniz TCP ve WebSocket istemcisine bağlı olarak kodu biraz değiştirmeniz gerekir.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
private void SubscribeToErrors(IObservable<IMessage> observable)
{
    if (observable is null) throw new ArgumentNullException(nameof(observable));

    observable.ObserveOn(SynchronizationContext.Current).Subscribe(_ => { }, OnError);
    observable.OfType<ProtoErrorRes>().ObserveOn(SynchronizationContext.Current).Subscribe(OnErrorRes);

    observable.OfType<ProtoOAOrderErrorEvent>().ObserveOn(SynchronizationContext.Current).Subscribe(OnOrderErrorRes);
}

private void OnOrderErrorRes(ProtoOAErrorRes error)
{
    Console.WriteLine($"Error: Error {error.ErrorCode}; {error.Description}");
}

private void OnErrorRes(ProtoErrorRes error)
{
    Console.WriteLine($"Error: Error {error.ErrorCode}; {error.Description}");
}

Asenkron işlemleri yönetmek için twisted kütüphanesini kullanırken, ProtoOAVersionReq için aşağıdaki örnekte gösterildiği gibi her yeni mesaj gönderdiğinizde bir hata geri çağırmasına abone olmanız gerekir.

1
2
3
4
5
6
7
8
def sendProtoOAVersionReq(clientMsgId = None):
    request = ProtoOAVersionReq()
    deferred = client.send(request, clientMsgId = clientMsgId)
    deferred.addErrback(onError)

def onError(failure):
    print("Message Error: ", failure)
    reactor.callLater(3, callable=executeUserCommand)

Etki alanı ve uygulama katmanında hata yönetimi

Etki alanı ve uygulama katmanlarında hataları ele alma şekliniz, seçtiğiniz programlama diline, kullanıcı arayüzü çerçevesine ve uyguladığınız kullanım durumlarına bağlıdır, bu da belirli kod parçacıkları ve çözümler sağlamayı zorlaştırır.

Ancak, cTrader Open API ile nasıl entegre olmayı seçerseniz seçin, aşağıdaki öneriler faydalı olabilir.

  • Ana kullanıcı arayüzü öğeleri için her zaman özel bir hata durumu uygulayın. Bu, uygulamanızın tamamen bozulmasını önleyecek ve yarı bozuk durumda çalışmasına olanak tanıyacaktır.
  • Hataları uygun bir konuma (örneğin, yerel depolama) kaydedecek güvenli ve güvenilir bir günlük kaydı mekanizması uygulayın. Tekrarlanan hatalar meydana gelirse, günlük kaydı bunların nedenini belirlemeyi ve gidermeyi basitleştirmelidir.
  • Kullanıcıların sizi hatalardan haberdar etmesi için bir mekanizma oluşturun. Bu, uygulama içinde iletişim bilgilerinizi sağlamak kadar basit veya yeni hatalarda tetiklenen otomatik bir geri bildirim gönderme hizmeti eklemek kadar karmaşık olabilir.
  • Hatalar meydana geldiğinde kullanılan tüm kaynakların düzgün bir şekilde temizlendiğinden emin olun. Çoğu dil çöp toplayıcı hizmetleri sunsa da, özel kaynak imha mantığı belirtmek isteyebilirsiniz.