Ana içeriğe geç

cBot yaşam döngüsü

Bu makalede ve eşlik eden videosunda, kod yapısını adım adım inceleyerek bir cTrader cBot'unun olaylarının ve yaşam döngüsünün ardındaki mantığı açıklıyoruz.

Bir hatırlatma olarak, cBot'larınıza cTrader'daki Algo uygulamasından erişebilirsiniz. Yeni bir cBot oluşturmak için Yeni cBot düğmesine tıklamanız veya aşağıda gösterilen açılır menüden bu seçeneği belirlemeniz yeterlidir.

Temel şablonu yorumlayın

Yeni bir cBot oluşturduktan sonra, kod düzenleyici penceresinde aşağıdaki temel yapıyı görmelisiniz.

 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
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 NewcBot : Robot
    {
        [Parameter(DefaultValue = "Hello world!")]
        public string Message { get; set; }

        protected override void OnStart()
        {
            // To learn more about cTrader Algo visit our Help Center:
            // https://help.ctrader.com/ctrader-algo

            Print(Message);
        }

        protected override void OnTick()
        {
            // Handle price updates here
        }

        protected override void OnStop()
        {
            // Handle cBot stop here
        }
    }
}

Temel şablonda yalnızca üç olay görüntülendiğini unutmayın; bu olaylar OnStart(), OnTick() ve OnStop() yöntemleri tarafından işlenir. İki ek yöntem (OnBar() ve OnException()) ekleyeceğiz ve nasıl çalıştıklarını daha sonra açıklayacağız; önce OnStart() yöntemini ele alacağız.

OnStart() yöntemini kullanın

OnStart() yöntemi, bir cBot ilk başladığında tetiklenir. Göstergeler, sayaçlar, olay işleyiciler veya zamanlayıcılar dahil olmak üzere cBot'unuzda kullanmayı planladığınız tüm değişkenleri başlatmak için kullanılır.

Not

Başlangıçtaki kod şablonu, bir cBot başladığında günlüğe bir mesaj yazdırmak için zaten bir kod ifadesi içerir. Gördüğünüz gibi, cBot'umuz Message parametresine sahiptir ve OnStart() yöntemi bu parametrenin değerini Print() yöntemine iletir.

OnStart() yönteminin nasıl çalıştığını, cBot örneğini İşlem uygulamasında başlatıp sonucu görmek için Günlük sekmesini açarak gösterebiliriz.

Ayrıca cBot'u istediğimiz zaman durdurabilir, Parametreler sekmesindeki Message parametresinin değerini değiştirebilir ve örneğimizi yeniden başlatabiliriz. Başlangıçta, yeni mesajımız yine de günlüğe yazdırılacaktır.

OnTick() yöntemini kullanın

OnTick() yöntemi, sembolün satış veya alış fiyatı her değiştiğinde tetiklenir. Bu yöntemin içinde, genellikle pozisyon giriş ve çıkış koşullarını ve yeni bir veri tiki geldiğinde çalıştırmanız gereken diğer yardımcı fonksiyonları programlayabilirsiniz.

OnTick() yöntemine aşağıdaki kodu ekleyeceğiz, böylece günlüğe bir mesaj yazdırır.

1
Print("OnTick. Bid: ", Symbol.Bid, ", Ask: ", Symbol.Ask);

Aşağıda gördüğünüz gibi, cBot'umuz artık her fiyat değişiminde satış ve alış fiyatlarını günlüğe yazdırıyor.

OnBar() yöntemini kullanın

OnBar() yöntemi varsayılan cBot kod şablonuna dahil değildir, bu yüzden onu eklemek için aşağıdaki kod parçasını ekleyeceğiz.

1
2
3
4
protected override void OnBar() 
{
    Print("OnBar");
}

OnBar() yöntemi, bir cBot'un bağlı olduğu grafikte yeni bir çubuk veya mum çizildiğinde tetiklenir. OnTick() yöntemine benzer şekilde, OnBar() yöntemini pozisyon giriş ve çıkış koşullarını ve her yeni çubuğun oluşumunda yürütülmesi gereken diğer tüm mantıkları programlamak için kullanabilirsiniz.

OnBar() yöntemi nasıl tetiklenir

Bir H1 grafiğiniz varsa, her saat yeni bir çubuk oluşur, bu da OnBar() yönteminin saatte bir kez çağrılacağı anlamına gelir. Bir m1 grafiğiniz varsa, aynı yöntem dakikada bir kez çağrılacaktır.

OnBar() yöntemimiz her yeni çubuk/mum üzerinde "OnBar" yazdıracaktır. Nasıl çalıştığını göstermek için cBot'umuzu bir m1 grafiğine bağlayacağız ve günlüğe bakacağız.

OnStop() yöntemini kullanın

OnStop() yöntemi, cBot kullanıcı tarafından veya kod aracılığıyla durdurulduğunda çağrılır. Bu olduğunda, OnStop() yönteminin içindeki herhangi bir kod yürütülür. Bu, pozisyonları kapatmak gibi nihai işlemleri gerçekleştirmek için kullanılabilir.

OnStop() yöntemimize aşağıdaki kodu ekleyeceğiz - her zamanki gibi, cBot'umuz durdurulduğunda Message parametresinin değerini yazdıracaktır.

1
Print(Message);

Aşağıdaki ekran görüntüsünde, hepsinin nasıl çalıştığını göstermek için cBot'umuzun bir örneğini başlatıp durduruyoruz.

OnException() yöntemini kullanın

OnException() yöntemi, işlenmeyen istisnaları yakalayarak hata toleransı sağlar ve bunları nasıl ele alacağınıza karar vermenizi sağlar. Varsayılan kod şablonuna dahil değildir, bu yüzden aşağıdaki kod parçasını kullanarak kendimiz ekleyeceğiz.

1
2
3
4
protected override void OnException(Exception exception) 
{
    Print("Ooops, unhandled exception! No worries, cBot still alive");            
}

OnException() yöntemini tetiklemek için, artık mevcut olmayan bir işlemle ilgili bilgilere erişmeye çalıştığımızda ortaya çıkan bir istisnayı yakalamak için bazı kodlar yazacağız. Aşağıdaki kodu OnStart() yöntemimize ekleyeceğiz.

1
ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000, "my label");

OnStart() yönteminde yazdığımız kod, aşağıdaki yapılandırılabilir parametrelerle bir piyasa emri yürütecektir.

  • İşlem türü bir alış emri olacaktır.
  • İşlem, cBot'un bağlı olduğu grafik için mevcut sembolde yürütülecektir.
  • Emir hacmi 1.000 birim olacaktır.
  • Emre eklenen benzersiz etiket "my label" olacaktır.

Ayrıca aşağıdaki kodu OnTick() yöntemine ekleyeceğiz.

1
2
3
var position = Positions.Find("my label");
if (Positions.Find("my label") != null) Print("PositionId: ", position.Id);
Print("Message below");

OnTick() yönteminde yazdığımız kod, "my label" etiket adını kullanarak OnStart() yönteminde açılan pozisyonu bulacaktır.

Aynı etiketle pozisyon bulunursa, açık işlemin pozisyon kimliğini günlüğe yazdıracaktır. Ayrıca, bir sonraki kod satırı yürütüldüğünde “Message below” adlı başka bir mesaj yazdıracaktır.

cBot'umuz başlatıldığında ve OnTick() yöntemi çağrıldığında ve emir bulunduğunda, cBot emir kimliğini günlüğe yazdıracak ve emir kimliğinden sonra "Message below" mesajını yazdıracaktır.

Gördüğünüz gibi, hiçbir istisna ortaya çıkmıyor ve cBot'umuz işini mükemmel yapıyor.

Ancak şimdi, cBot tarafından açılan pozisyonu manuel olarak kapatacağız ve bir istisnanın kesinlikle meydana gelmesini sağlamak için kodda küçük değişiklikler yapacağız. OnStart() yönteminde, emir etiketini "cTrader" olarak değiştireceğiz. OnTick() yönteminde, "my label" etiketine sahip bir pozisyonun var olup olmadığını kontrol eden koşulu yorum satırı yapacağız.

İşte cBot'umuzun son kodu - bu kodun her zaman bir istisnayı tetikleyeceğini unutmayın.

 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
namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class LifecycleTest : Robot
    {
        [Parameter(DefaultValue = "cTrader rocks!")]
        public string Message { get; set; }

        protected override void OnStart()
        {
            ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000, "cTrader");
        }

        protected override void OnTick()
        {
            var position = Positions.Find("my label");
            //if (Positions.Find("my label") != null) 
            Print("PositionId: ", position.Id);
            Print("Message below");
        }

        protected override void OnStop()
        {
            Print(Message);
        }

        protected override void OnException(Exception exception) 
        {
            Print("Ooops, unhandled exception! No worries, cBot still alive");            
        }
    }
}

cBot'u tekrar çalıştıracağız ve ne olacağını göreceğiz.

Olan şey, cBot başladığında yeni bir piyasa emri oluşturulmasıydı. Bu emre eklenen etiket "cTrader" idi. OnTick() yönteminde, kod “my label” etiketine sahip bir pozisyon almaya çalıştı ve koşullu kod satırını yorum satırı yaptığımız için. Ardından pozisyon kimliğini günlüğe yazdırmaya çalıştı.

Bu, normalde cTrader'ın önceki sürümlerinde cBot'u durduracak bir istisna hatasına neden oldu, ancak yeni OnException() yöntemiyle bunu artık yakalayabilir ve hatayı işleyebiliriz. cBot çalışmaya devam edecek ve hatayı günlüğe kaydedebiliriz, böylece düzeltilebilir.

Özet

cBot yaşam döngüsü, OnStart(), OnTick(), OnStop(), OnBar() ve OnException() yöntemleri aracılığıyla işleyebileceğiniz birkaç temel olaydan oluşur. cBot'unuzun önemli olaylara nasıl tepki verdiğini özelleştirerek, algoritmalarınızın tam olarak beklendiği gibi davrandığından emin olabilirsiniz.