Lewati ke isi

Cara menambahkan metode ke API cTrader

Metode ekstensi adalah alat penting jika Anda ingin menambahkan fungsionalitas baru ke API cTrader. Menggunakan sintaks yang relatif sederhana, Anda dapat menambahkan perilaku baru ke kelas API yang telah ditentukan sebelumnya, seperti Symbol atau Position. Setelah Anda mendefinisikan metode ekstensi, Anda dapat memanggilnya dari objek apa pun dari kelas yang Anda perluas.

Kasus penggunaan untuk metode ekstensi

Pertama, kita akan melakukan demonstrasi singkat mengapa Anda mungkin ingin menggunakan metode ekstensi.

Menggunakan cBot, kita ingin dapat mengakses ukuran posisi tertentu dalam lot karena informasi ini secara langsung mempengaruhi strategi trading yang kita sukai. Untuk melakukannya, kita dapat mencoba menginisialisasi variabel dari kelas Position dan kemudian mencoba mengakses metode Lots() nya.

1
2
Position position = Positions.Last();
Print(position.Lots());

Jika kita hanya mengetik kode apa adanya, kita akan menerima pesan kesalahan yang menyarankan bahwa aksesor Lots() tidak ada dalam API. Tapi bagaimana jika ada cara untuk menambahkan metode baru ke anggota API yang ada tanpa mempengaruhi fungsionalitas lainnya?

Dengan asumsi metode ini ada, kita bisa membuat cBot sederhana yang, pada setiap bar, akan mengiterasi daftar semua posisi saat ini dan mencetak ukurannya dalam lot di log. Kita akan mendefinisikan metode OnBar() sebagai berikut.

1
2
3
4
5
6
protected override void OnBar()
{
    foreach (var position in Positions) {
        Print(position.Lots());
    }
}

Metode ekstensi memungkinkan kita untuk menambahkan fungsionalitas Lots() hanya dalam beberapa baris kode dan kemudian menggunakannya kembali kapan pun kita mau pada objek apa pun dari kelas Position. Di bawah ini, kami menjelaskan bagaimana Anda dapat membuat satu dan memberikan beberapa contoh algo yang menggunakannya.

Bagaimana metode ekstensi bekerja

Saat bekerja dengan metode ekstensi, perhatikan aturan-aturan berikut.

  • Metode ekstensi selalu statis.

Untuk mendeklarasikan metode statis, yang perlu Anda lakukan hanyalah menggunakan kata kunci static. Di bawah ini, deklarasikan metode Lots() dengan badan kosong.

1
2
3
4
public static class MyExtensions {
    public static double Lots() {}

}
  • Metode ekstensi dapat memiliki sejumlah argumen tetapi argumen pertama selalu harus menunjukkan tipe data/kelas yang akan dipanggil metode tersebut didahului oleh kata kunci this.

Kita akan menambahkan objek dari kelas Position sebagai argumen pertama dan satu-satunya dari metode Lots(). Karena objek Position juga berisi informasi tentang simbol yang posisinya dibuka, kita tidak memerlukan argumen lain.

1
2
3
public static class MyExtensions {
    public static double Lots(this Position position) {}
}
  • Metode ekstensi dapat berisi logika apa pun yang sesuai untuk argumen yang diberikan.

Tidak perlu menggunakan sintaks khusus saat mendefinisikan badan metode ekstensi. Kita dapat memperlakukannya seperti metode lainnya dan, oleh karena itu, dapat mendefinisikan badannya sebagai berikut.

1
2
3
4
5
public static class MyExtensions {
    public static double Lots(this Position position) {
        return position.VolumeInUnits / position.Symbol.LotSize;
    }
}
  • Metode ekstensi dapat dipanggil sebagai metode instance atau metode statis.

Ada dua cara yang mungkin untuk memanggil metode ekstensi kita dalam kode cBot.

Saat menggunakan sintaks metode instance, kita memanggil metode dari objek yang sesuai dari tipe Position.

1
2
var position = Positions.Last();
Print(position.Lots());

Saat menggunakan sintaks metode statis, kita dapat memanggil metode ekstensi kita setelah sepenuhnya menentukan kelas statisnya yang sesuai.

1
2
var position = Positions.Last();
Print(MyExtensions.Lots(position));

Terserah Anda untuk menentukan metode mana yang paling nyaman untuk memanggil metode ekstensi.

Tanda tangan metode

Saat menggunakan sintaks instance, hindari kasus di mana metode ekstensi Anda memiliki tanda tangan yang sama dengan metode API bawaan (seperti Position.Close()). Dalam situasi ini, metode bawaan akan dipanggil setiap kali Anda mencoba memanggil metode ekstensi dengan tanda tangan yang cocok.

IntelliSense

Ketika kita mencoba memanggil metode ekstensi, IntelliSense menggunakan ikon khusus untuk membedakannya dari anggota API bawaan.

Untuk mendemonstrasikan metode baru kita dalam tindakan, kita dapat membuat cBot yang menempatkan tiga order pada awal, masing-masing dengan volume yang berbeda. Pada setiap bar, cBot mencetak volume semua posisi yang saat ini terbuka dalam lot.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
protected override void OnStart()
{
    ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000);
    ExecuteMarketOrder(TradeType.Buy, SymbolName, 100000);
    ExecuteMarketOrder(TradeType.Buy, SymbolName, 50000);
}

protected override void OnBar()
{
    foreach (var position in Positions) {
        Print(position.Lots());
    }
}

Setelah membangun dan meluncurkan cBot kita, kita seharusnya melihat nilai-nilai yang benar dicetak dalam log.

Menggunakan metode ekstensi dalam cBot

Sekarang kita akan mencoba membuat cBot yang lebih kompleks. Pada setiap bar, algo kita akan memeriksa daftar posisi yang saat ini terbuka dan menyesuaikan level Stop Loss mereka sehingga berada pada titik impas. Untuk melakukannya, kita perlu membuat metode ekstensi BreakEven() untuk kelas Position.

Kita membuat cBot baru dan mengganti namanya. Setelah itu, kita menghapus semua kode yang tidak kita perlukan dan menambahkan kelas MyExtensions.

1
2
3
public static class MyExtensions {

}

Kode kita untuk metode BreakEven() relatif sederhana. Kita memeriksa apakah sebuah posisi memiliki Stop Loss, apakah laba kotornya lebih besar dari nol dan apakah Stop Loss yang saat ini diatur tidak sama dengan harga entri posisi. Jika semua kondisi ini benar, kita memodifikasi Stop Loss posisi sehingga sama dengan harga entri posisi.

1
2
3
4
5
6
7
public static class MyExtensions {
    public static void BreakEven(this Position position) {
        if (position.StopLoss is not null && position.GrossProfit > 0 && position.StopLoss != position.EntryPrice) {
            position.ModifyStopLossPrice(position.EntryPrice);
        }
    }
}

Dalam cBot itu sendiri, kita tidak perlu menggunakan metode lain selain OnBar(). Pada setiap bar, kita meminta cBot untuk melakukan operasi sederhana, yaitu melakukan iterasi pada koleksi Positions dan memanggil metode BreakEven() yang baru untuk setiap elemen di dalamnya.

1
2
3
4
5
6
protected override void OnBar() 
{
    foreach (var position in Positions) {
        position.BreakEven();
    }
}

Setelah kita membangun dan meluncurkan cBot kita, kita dapat melihatnya beraksi. Ini bisa menjadi asisten trading yang berguna, terutama saat mengelola banyak posisi terbuka.

Menggunakan metode ekstensi dalam indikator

Kita juga akan membuat indikator yang berguna yang mengandalkan metode ekstensi. Indikator ini akan mengukur volatilitas dengan memplot persentase perubahan harga simbol pada setiap bar dibandingkan dengan harga pembukaan bar tersebut.

Untuk melakukannya, kita akan membuat indikator baru dan mengganti namanya. Di jendela editor kode, kita akan membuat kelas MyExtensions untuk memperluas kelas Bar.

1
2
3
public static class MyExtensions {

}

Kita juga akan menambahkan metode PercentageChange(). Dalam variabel priceChange, kita mengurangkan harga penutupan bar dari harga pembukaannya. Metode ini mengembalikan perubahan harga kita dibagi dengan harga pembukaan dan dikalikan dengan 100.

1
2
3
4
5
6
7
8
public static class MyExtensions 
{
    public static double PercentageChange(this Bar bar) 
    {
        var priceChange = bar.Open - bar.Close;
        return priceChange / bar.Open * 100;
    }
}

Dalam kode indikator itu sendiri, kita tidak memerlukan metode Initialize() dan parameter yang tidak perlu. Dalam badan metode Calculate(), kita hanya memanggil metode PercentageChange() baru kita pada setiap bar.

1
2
3
4
5
6
7
8
[Output("Main")]
public IndicatorDataSeries Result { get; set; }


public override void Calculate(int index)
{
    Result[index] = Bars[index].PercentageChange();
}

Setelah itu, kita menyimpan dan membangun indikator kita. Setelah membuat instance-nya, kita seharusnya melihat persentase perubahan yang benar sedang diplot. Ini dapat digunakan untuk menentukan volatilitas jangka pendek dan panjang, menguntungkan semua jenis strategi trading.

Ringkasan

Sebagai kesimpulan, metode ekstensi adalah alat yang berharga jika Anda ingin membuat kode yang dapat digunakan kembali yang menambahkan fungsionalitas baru ke API cTrader. Kami sangat merekomendasikan untuk bereksperimen dengan metode ekstensi karena mereka dapat membuat algo Anda lebih efisien dan lebih mudah dikelola.