Langkau tajuk talian

Cara mengendalikan peristiwa bar

Peristiwa bar adalah penting untuk kitaran hayat mana-mana cBot. Mengendalikan peristiwa ini dengan betul adalah penting untuk mengurus bagaimana cBot anda bertindak balas terhadap keadaan pasaran baharu. Dalam artikel ini dan video yang berkaitan, kami akan menunjukkan jenis utama peristiwa bar dan membincangkan pengendali untuk peristiwa ini yang didedahkan oleh API cTrader.

  • Bar - merujuk kepada pelbagai jenis objek yang dilukis secara berurutan pada carta dagangan oleh cTrader. Ia boleh jadi candlestick, bata Renko, bar Julat atau bahkan lilin Heiken Ashi.

Kendalikan peristiwa BarOpened

Peristiwa bar berlaku apabila bar baharu mula diplot pada carta dagangan yang dikaitkan dengan cBot. Peristiwa BarOpened berlaku untuk bar baharu yang baru sahaja mula dilukis pada carta.

Pengendalian peristiwa ini dilakukan melalui kaedah OnBar(), yang merupakan kaedah yang diwarisi daripada kelas asas Robot. Kami akan mencipta cBot yang mengendalikan peristiwa BarOpened sebagai sebahagian daripada strategi kami untuk menganalisis sentimen pasaran. Kami akan memadamkan kaedah OnStart() dan OnStop() daripada templat dan menggantikan pengendali OnTick() dengan pengendali OnBar().

 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 ini sepatutnya dilancarkan pada carta dengan kerangka masa D1 (harian). Pada setiap bar, ia membandingkan perbezaan harga pembukaan dengan harga pembukaan bar sebelumnya dan meletakkan pesanan baharu dalam arah yang sesuai. Jika perbezaan harga tidak ketara, bot sebaliknya menutup semua posisi yang sedang dibuka.

Jika kita menjalankan ujian belakang bot ringkas ini, hasilnya nampaknya menggalakkan.

Kendalikan peristiwa BarClosed

Apabila bar baharu dibuka, ia sebenarnya kekurangan sebarang data harga selain daripada harga pembukaannya. Dalam banyak kes, anda mungkin mahu cBot anda mengakses data daripada bar sebelumnya untuk memastikan pelaksanaan strategi yang lancar. Inilah sebabnya peristiwa BarClosed berlaku untuk bar yang baru sahaja ditutup (yang serta-merta sebelum bar baharu) dan membolehkan anda menggunakan data harga dan volum dengan mudah. Apabila peristiwa BarClosed dicetuskan, bar yang baru dibuka diabaikan sepenuhnya daripada koleksi Bars

Untuk mengendalikan peristiwa BarClosed, API mendedahkan kaedah OnBarClosed.

Nota

Dalam contoh sebelumnya, kami menggunakan sifat Bars.LastBar.Open untuk mendapatkan harga pembukaan bar yang baru dibuka. Jika kita menggunakan sifat yang sama dalam kaedah OnBarClosed(), kita akan mendapat harga pembukaan bar yang baru sahaja ditutup.

Kami akan mencipta cBot ringkas yang menggunakan pengendali OnBarClosed() seperti berikut.

 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 mengesan corak menaik (hammer) dengan menilai panjang sumbu bawah lilin. Jika corak hammer dikesan, semua posisi yang dibuka sebelumnya ditutup dan pesanan beli baharu diletakkan dengan henti rugi 50 pip.

Jika kita menguji belakang bot ini, kita akan mendapat hasil yang baik.

Tambah pengendali peristiwa tersuai

Apabila mengendalikan peristiwa BarOpened dan BarClosed, anda juga boleh menggunakan sintaks yang sedikit berbeza dengan menetapkan peristiwa ini dengan pengendali tersuai. Walaupun OnBar() dan OnBarClosed() hanya dicetuskan sekali, anda boleh menetapkan seberapa banyak pengendali tersuai yang anda mahu, yang membolehkan penambahan logik yang kompleks.

Nota

Pengendali peristiwa tersuai mesti ditambah dalam kaedah OnStart(). Pengendali tersuai juga mesti menerima hujah jenis BarOpenedEventArgs (untuk peristiwa BarOpened) atau BarClosedEventArgs (untuk peristiwa BarClosed).

 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) {}

Kami akan mencipta cBot lain yang menggunakan dua pengendali tersuai untuk peristiwa BarOpened untuk bertindak balas terhadap pembalikan menaik dan menurun yang mungkin.

 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 memeriksa sama ada harga pembukaan bar yang baru dibuka lebih tinggi daripada harga penutupan dua bar sebelumnya. Jika ini berlaku, pesanan beli diletakkan. Jika harga pembukaan lebih rendah daripada harga penutupan dua bar sebelumnya, pesanan jual diletakkan. Penggunaan dua pengendali peristiwa berasingan membolehkan kita membahagikan logik dagangan kita kepada komponen yang lebih kecil yang boleh kita ubah suai dengan mudah kemudian jika diperlukan.

Hasil ujian belakang pada kerangka masa D1 juga positif.

Ringkasan

Dengan mempelajari cara mengendalikan peristiwa bar dengan betul, anda boleh membuat cBot anda melakukan tepat seperti yang anda mahu dan anda mahu ia melakukannya.