Ana içeriğe geç

Bar olayları nasıl işlenir

Bar olayları, herhangi bir cBot'un yaşam döngüsü için çok önemlidir. Bu olayları doğru şekilde işlemek, cBot'larınızın yeni piyasa koşullarına nasıl tepki verdiğini yönetmek için çok önemlidir. Bu makalede ve ilgili videosunda, temel bar olay türlerini gösterecek ve cTrader API'si tarafından sunulan bu olayların işleyicilerini tartışacağız.

  • Bar - cTrader tarafından işlem grafiğinde sırayla çizilen farklı türdeki nesneleri ifade eder. Mumlar, Renko tuğlaları, Aralık barları ve hatta Heiken Ashi mumları olabilir.

BarOpened olayını işleyin

Bar olayları, bir cBot'a bağlı işlem grafiğinde yeni bir bar çizilmeye başladığında gerçekleşir. BarOpened olayı, grafikte henüz çizilmeye başlanan yeni bar için gerçekleşir.

Bu olayın işlenmesi, temel Robot sınıfından miras alınan bir yöntem olan OnBar() yöntemi aracılığıyla yapılır. Şimdi, piyasa duyarlılığını analiz etme stratejimizin bir parçası olarak BarOpened olayını işleyen bir cBot oluşturacağız. Şablondan OnStart() ve OnStop() yöntemlerini silecek ve OnTick() işleyicisini OnBar() işleyicisiyle değiştireceğiz.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
protected override void OnBar()
{
    var previousBar = Bars[Bars.Count - 2];
    var priceDifference = ((Bars.LastBar.Open - previousBar.Open) / previousBar.Open) * 100;
    if (priceDifference > 1)
    {
        ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000);
    }
    else if (priceDifference < -1)
    {
        ExecuteMarketOrder(TradeType.Sell, SymbolName, 10000);
    }
    else 
    {
        foreach (var position in Positions) 
        {
            position.Close();
        }
    }
}

cBot'un D1 (günlük) zaman dilimine sahip grafiklerde başlatılması bekleniyor. Her barda, açılış fiyatı farkını önceki barın açılış fiyatıyla karşılaştırır ve uygun yönde yeni bir emir verir. Fiyat farkı önemsizse, bot bunun yerine şu anda açık olan tüm pozisyonları kapatır.

Bu basit botun geriye dönük testini yaparsak, sonuçlar cesaret verici görünüyor.

BarClosed olayını işleyin

Yeni bir bar açıldığında, açılış fiyatı dışında herhangi bir fiyat verisi etkili bir şekilde eksiktir. Birçok durumda, stratejinin sorunsuz yürütülmesini sağlamak için cBot'unuzun önceki bardan verilere erişmesini isteyebilirsiniz. Bu nedenle BarClosed olayı, henüz kapanan bar için (yeni bardan hemen önceki) gerçekleşir ve fiyat ile hacim verilerini kolayca kullanmanıza olanak tanır. BarClosed olayı tetiklendiğinde, yeni açılan bar Bars koleksiyonundan tamamen atlanır.

BarClosed olayını işlemek için API, OnBarClosed yöntemini sunar.

Not

Önceki örnekte, yeni açılan barın açılış fiyatını almak için Bars.LastBar.Open özelliğini kullandık. Aynı özelliği OnBarClosed() yönteminde kullanırsak, henüz kapanan barın açılış fiyatını alırız.

OnBarClosed() işleyicisini aşağıdaki gibi kullanan basit bir cBot oluşturacağız.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
protected override void OnBarClosed()
{
    var lowCloseDifference = ((Bars.LastBar.Close - Bars.LastBar.Low) / Bars.LastBar.Close) * 100;
    if (lowCloseDifference > 0.5)
    {
        foreach (var position in Positions)
        {
            position.Close();
        }
        ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000, null, null, 50);

    }
}

cBot, bir mumun alt fitilinin uzunluğunu değerlendirerek boğa (çekiç) formasyonunu tespit eder. Çekiç formasyonu tespit edilirse, önceden açık olan tüm pozisyonlar kapatılır ve 50 piplik zarar durdur ile yeni bir alış emri verilir.

Botu geriye dönük test edersek, iyi sonuçlar alırız.

Özel olay işleyicileri ekleyin

BarOpened ve BarClosed olaylarını işlerken, bu olayları özel işleyicilerle atayarak biraz farklı bir sözdizimi de kullanabilirsiniz. OnBar() ve OnBarClosed() yalnızca bir kez tetiklenirken, istediğiniz kadar özel işleyici atayabilirsiniz, bu da karmaşık mantık eklemenize olanak tanır.

Not

Özel olay işleyicileri OnStart() yönteminde eklenmelidir. Özel işleyiciler ayrıca BarOpenedEventArgs (BarOpened olayı için) veya BarClosedEventArgs (BarClosed olayı için) türünde bir argüman kabul etmelidir.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
protected override void OnStart() 
{
    Bars.BarClosed += BarClosedHandler;
    Bars.BarClosed += AnotherClosedHandler;
    Bars.BarOpened += BarOpenedHandler;
}

void BarClosedHandler(BarClosedEventArgs args) {}
void AnotherClosedHandler(BarClosedEventArgs args) {}
void BarOpenedHandler(BarOpenedEventArgs args) {}

Olası boğa ve ayı dönüşlerine tepki vermek için BarOpened olayı için iki özel işleyici kullanan başka bir cBot oluşturacağız.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
protected override void OnStart() 
{
    Bars.BarOpened += BullishReversal;
    Bars.BarOpened += BearishReversal;

}

private void BullishReversal(BarOpenedEventArgs args) 
{
    if (Bars.LastBar.Open > Bars.Last(1).Close && Bars.LastBar.Open > Bars.Last(2).Close) 
    {
        ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000, null, 10, 50);
    }
}

private void BearishReversal(BarOpenedEventArgs args) 
{
    if (Bars.LastBar.Open < Bars.Last(1).Close && Bars.LastBar.Open < Bars.Last(2).Close) 
    {
        ExecuteMarketOrder(TradeType.Sell, SymbolName, 10000, null, 10, 50);
    }
}

cBot, yeni açılan barın açılış fiyatının önceki iki barın kapanış fiyatlarından daha yüksek olup olmadığını kontrol eder. Durum buysa, bir alış emri verilir. Açılış fiyatı önceki iki barın kapanış fiyatlarından daha düşükse, bir satış emri verilir. İki ayrı olay işleyicisi kullanmak, işlem mantığımızı ihtiyaç duyulduğunda daha sonra kolayca değiştirebileceğimiz daha küçük bileşenlere bölmemize olanak tanır.

D1 zaman diliminde yapılan geriye dönük test sonuçları da olumludur.

Özet

Bar olaylarını doğru şekilde işlemeyi öğrenerek, cBot'larınızın tam olarak istediğiniz şeyi ve istediğiniz şekilde yapmasını sağlayabilirsiniz.