Lewati ke isi

Siklus hidup cBot

Dalam artikel ini dan video yang menyertainya, kami membahas struktur kode dan menjelaskan logika di balik peristiwa dan siklus hidup cTrader cBot.

Sebagai pengingat, Anda dapat mengakses cBot Anda di aplikasi Algo di cTrader. Untuk membuat cBot baru, cukup klik tombol cBot Baru atau pilih opsi ini di dropdown yang ditunjukkan di bawah ini.

Interpretasikan template dasar

Setelah membuat cBot baru, Anda akan melihat struktur dasar berikut di jendela editor kode.

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

Perhatikan bahwa hanya ada tiga peristiwa yang ditampilkan dalam template dasar; peristiwa ini ditangani oleh metode OnStart(), OnTick() dan OnStop(). Kami akan menambahkan dua metode tambahan (OnBar() dan OnException()) dan menjelaskan cara kerjanya nanti; pertama, kita akan membahas metode OnStart().

Gunakan metode OnStart()

Metode OnStart() dipicu ketika cBot pertama kali dimulai. Ini digunakan untuk menginisialisasi variabel apa pun yang Anda rencanakan untuk digunakan dalam cBot Anda, termasuk indikator, penghitung, penangan peristiwa atau pengatur waktu.

Catatan

Template kode awal sudah menyertakan pernyataan kode untuk mencetak pesan ke log ketika cBot dimulai. Seperti yang Anda lihat, cBot kita memiliki parameter Message, dan metode OnStart() meneruskan nilai parameter ini ke metode Print().

Kita dapat mendemonstrasikan cara kerja metode OnStart() dengan hanya memulai instance cBot di aplikasi Trade dan membuka tab Log untuk melihat hasilnya.

Kita juga dapat menghentikan cBot kapan saja, mengubah nilai parameter Message di tab Parameter, dan memulai ulang instance kita. Saat dimulai, pesan baru kita masih akan dicetak ke log.

Gunakan metode OnTick()

Metode OnTick() dipicu setiap kali harga bid atau ask simbol berubah. Di dalam metode ini, Anda biasanya dapat memprogram kondisi masuk dan keluar posisi serta fungsi tambahan lainnya yang perlu dijalankan ketika tick data baru tiba.

Kami akan menambahkan kode berikut ke metode OnTick() sehingga mencetak pesan ke log.

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

Seperti yang Anda lihat di bawah ini, cBot kita sekarang mencetak harga bid dan ask ke log pada setiap perubahan harga.

Gunakan metode OnBar()

Metode OnBar() tidak termasuk dalam template kode cBot default sehingga kami akan menambahkan cuplikan kode berikut untuk menambahkannya.

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

Metode OnBar() dipicu setiap kali bar atau candlestick baru digambar pada grafik tempat cBot dilampirkan. Mirip dengan metode OnTick(), Anda dapat menggunakan metode OnBar() untuk memprogram kondisi masuk dan keluar posisi serta logika lain yang perlu dieksekusi pada pembentukan setiap bar baru.

Bagaimana metode OnBar() dipicu

Jika Anda memiliki grafik H1, bar baru terbentuk setiap jam, yang berarti bahwa metode OnBar() akan dipanggil sekali per jam. Jika Anda memiliki grafik m1, metode yang sama akan dipanggil sekali per menit.

Metode OnBar() kita akan mencetak "OnBar" pada setiap bar/candlestick baru. Untuk mendemonstrasikan cara kerjanya, kita akan melampirkan cBot kita ke grafik m1 dan melihat lognya.

Gunakan metode OnStop()

Metode OnStop() dipanggil ketika cBot berhenti baik oleh pengguna atau melalui kode. Ketika ini terjadi, kode apa pun di dalam metode OnStop() dieksekusi. Ini dapat digunakan untuk melakukan operasi akhir, seperti menutup posisi.

Kami akan menambahkan kode berikut ke metode OnStop() kita - seperti biasa, cBot kita akan mencetak nilai parameter Message ketika dihentikan.

1
Print(Message);

Pada tangkapan layar di bawah ini, kami meluncurkan dan menghentikan instance cBot kita untuk mendemonstrasikan cara kerjanya.

Gunakan metode OnException()

Metode OnException() memberikan toleransi kesalahan dengan menangkap pengecualian yang tidak tertangani, memungkinkan Anda untuk memutuskan cara menanganinya. Ini tidak termasuk dalam template kode default sehingga kita akan menambahkannya sendiri menggunakan cuplikan berikut.

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

Untuk memicu metode OnException(), kita akan menulis beberapa kode untuk menangkap pengecualian yang terjadi ketika kita mencoba mengakses informasi tentang trading yang tidak lagi ada. Kita akan menambahkan kode di bawah ini ke metode OnStart() kita.

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

Kode yang telah kita tulis dalam metode OnStart() akan mengeksekusi order pasar dengan parameter yang dapat dikonfigurasi berikut.

  • Tipe trading akan menjadi order beli.
  • Trading akan dieksekusi untuk simbol saat ini untuk grafik tempat cBot dilampirkan.
  • Volume order akan menjadi 1.000 unit.
  • Label unik yang dilampirkan pada order akan menjadi "my label".

Kami juga akan menambahkan kode berikut ke metode OnTick().

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

Kode yang telah kita tulis dalam metode OnTick() akan menemukan posisi yang dibuka dalam metode OnStart() menggunakan nama label "my label".

Jika posisi ditemukan dengan label yang sama, maka akan mencetak ID posisi dari trading terbuka ke log. Ini juga akan mencetak pesan lain yang disebut "Message below" sebagai baris kode berikutnya yang dieksekusi.

Ketika cBot kita diluncurkan dan metode OnTick() dipanggil dan order ditemukan, cBot akan mencetak ID order ke log dan, setelah ID order, akan mencetak pesan "Message below".

Seperti yang Anda lihat, tidak ada pengecualian yang muncul dan cBot kita melakukan tugasnya dengan sempurna.

Namun, sekarang kita akan menutup posisi yang dibuka oleh cBot secara manual dan membuat perubahan kecil pada kode sehingga pengecualian dijamin akan terjadi. Dalam metode OnStart(), kita akan mengubah label order menjadi "cTrader". Dalam metode OnTick(), kita akan mengomentari kondisi yang memeriksa apakah ada posisi dengan label "my label".

Berikut adalah kode final cBot kita - perhatikan bahwa kode ini akan selalu memicu pengecualian.

 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");            
        }
    }
}

Kita akan menjalankan cBot lagi dan melihat apa yang terjadi.

Yang terjadi adalah order pasar baru dibuat ketika cBot dimulai. Label yang melekat pada order ini adalah "cTrader". Dalam metode OnTick(), kode mencoba mendapatkan posisi dengan label "my label" dan karena kita mengomentari baris kode dengan kondisional. Kemudian mencoba mencetak ID posisi ke log.

Ini menyebabkan kesalahan pengecualian yang biasanya akan menghentikan cBot dalam versi cTrader sebelumnya, tetapi dengan metode OnException() yang baru, kita sekarang dapat menangkap dan menangani kesalahan ini. cBot akan terus berjalan dan kita dapat mencatat kesalahan tersebut sehingga dapat diperbaiki.

Ringkasan

Siklus hidup cBot terdiri dari beberapa peristiwa kunci yang dapat Anda tangani melalui metode OnStart(), OnTick(), OnStop(), OnBar() dan OnException(). Dengan menyesuaikan bagaimana cBot Anda merespons peristiwa utama, Anda dapat memastikan bahwa algoritma Anda berperilaku persis seperti yang diharapkan.