Langkau tajuk talian

C# untuk dagangan algoritma

Apakah itu C#

C# ialah bahasa pengaturcaraan berorientasikan objek yang digunakan untuk membina pelbagai perkhidmatan dan aplikasi. Sintaksnya yang jelas dan berstruktur menjadikannya mudah untuk dipelajari dan dibaca, walaupun oleh pemula, sambil menyediakan pendekatan berstruktur untuk menulis kod yang padat dan boleh diguna semula.

Algoritma C# dalam satu minit!

  • Walaupun anda tidak pernah bekerja dengan C# sebelum ini, mencipta dan menggunakan bot pertama anda atau indikator hanya mengambil masa beberapa minit sahaja.
  • Oleh kerana C# mudah digunakan, anda boleh menulis semula mana-mana cebisan kod daripada dokumentasi ini dengan cepat untuk memenuhi keperluan anda.
  • Apabila menggunakan C#, anda boleh mengakses sejumlah besar perpustakaan yang mengandungi kelas dan kaedah yang telah ditentukan. Kaedah-kaedah ini boleh mengendalikan tugas-tugas biasa dengan cekap, membebaskan anda untuk menyelesaikan masalah dagangan yang kompleks.
  • Dalam C#, anda boleh menulis kod yang tidak menghalang bebenang pelayan semasa pelaksanaan. Dengan kata lain, anda boleh memulakan tugas-tugas tertentu secara serentak dengan tugas-tugas lain.

Apakah itu .NET?

Untuk program C# berjalan, kod sumbernya mesti dikompil menjadi Bahasa Perantaraan (IL). Kod IL ini mengikuti spesifikasi Infrastruktur Bahasa Umum (CLI) dan kemudiannya dikompil menjadi arahan mesin natif semasa masa jalan. Rangka kerja .NET menyediakan persekitaran pelaksanaan maya yang dibina pada perpustakaan kelas yang luas dan Common Language Runtime (CLR), pelaksanaan CLI oleh Microsoft.

Tanpa mendalami kerumitan teknikal, .NET memenuhi fungsi-fungsi berikut:

  • Memudahkan pembangunan dan pelaksanaan aplikasi: .NET SDK sudah mengandungi beberapa pengompil dan enjin pembinaan terbina dalam, menghapuskan keperluan untuk mencipta sebarang penyelesaian tersuai.
  • Menyediakan perpustakaan masa jalan: Apabila menambah jenis data atau koleksi baharu ke dalam kod anda, anda akan sering mendapati bahawa .NET sudah menawarkan kelas dan kaedah yang sesuai untuk tugas tersebut.

Asas-asas C#

Jenis data dan pengisytiharan pemboleh ubah

Jenis data adalah cara untuk mengkategorikan data supaya C# tahu dengan tepat bagaimana untuk mengendalikan pemboleh ubah dan sifat. Dalam pengisytiharan pemboleh ubah/sifat, jenis data sentiasa mendahului nama pemboleh ubah/sifat.

1
string developer = "I am developing cBots, plugins, and indicators!";

Sebagai alternatif, anda boleh menggunakan kata kunci var untuk mengelakkan penentuan jenis data.

1
var developer = "I am developing cBots, plugins, and indicators!";

Objek dan kelas

Fikirkan objek sebagai abstraksi entiti nyata atau tidak nyata. Entiti-entiti ini boleh mempunyai ciri-ciri tertentu (sifat) dan boleh melakukan pelbagai operasi (kaedah). Seterusnya, kelas berfungsi sebagai templat untuk penciptaan objek.

Oleh kerana C# ialah bahasa berorientasikan objek, kelas juga boleh mewarisi sifat dan kaedah daripada kelas lain. Pertimbangkan contoh berikut di mana kita mengisytiharkan kelas NewBot baharu yang mewarisi daripada kelas Robot. Kita juga menentukan beberapa sifat kelas baharu.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* We use the colon sign to designate inheritance.
Additionally, we used expressions in square brackets to
specify the parameters that apply to the entire class */
[Robot(AccessRights = AccessRights.None)]
public class NewBot : Robot
{
    /* We declare a custom class property and make it
    read-only. */
    public string CustomProperty { get; }

    /* In this declaration, we define the default value of a
    custom parameter. */
    [Parameter("BotName", DefaultValue = "Traders First!")]

    /* We declare the BotName property which is changeable via
    the "BotName" parameter. */
    public string BotName { get; }

    /* We also declare the BotComment parameter.
    It can be both read and set. */
    [Parameter("BotComment", DefaultValue = "Our super-duper bot!")]
    public string BotComment { get; set; }
}

Jenis data

Oleh kerana C# ialah bahasa yang ditaip dengan kuat, adalah perlu untuk menentukan jenis data semasa mengisytiharkan pemboleh ubah dan sifat kelas. Secara ringkas, jenis data merupakan kelas unik dengan set tingkah laku yang berbeza. Pertimbangkan contoh-contoh berikut di mana pelbagai jenis data ditentukan untuk sifat kelas dan parameter berkaitan yang berbeza.

1
2
[Parameter("Price")]
public DataSeries Source { get; }

Dalam kod di atas, jenis data DataSeries mewakili senarai nilai baca sahaja dan oleh itu, biasanya digunakan untuk mewakili harga pasaran.

Apabila terdapat keperluan untuk mencipta parameter pelbagai pilihan, anda boleh menggunakan jenis data enum terbina dalam seperti yang diterangkan di bawah. Anda boleh menganggap enum sebagai kelas khas yang mengandungi pelbagai pemalar.

1
2
3
4
5
6
7
8
9
public enum Option
{
    First,
    Second,
    Third
}

[Parameter("Option", DefaultValue = Option.Third)]
public Option SelectedOption { get; set; }

Untuk mengakses pemalar yang terkandung dalam enum, gunakan sintaks berikut.

1
var newOption = Option.First;

Jika parameter atau sifat perlu menjadi nombor, anda akan paling kerap menggunakan jenis data int (integer) atau double (perpuluhan). Walaupun jenis double mempunyai ketepatan yang kurang daripada jenis decimal, ia juga kurang intensif sumber.

1
2
[Parameter("MA Periods", DefaultValue = 14, MinValue = 1, MaxValue = 20)]
public int Periods { get; set; }

Akhir sekali, jenis bool biasanya mewakili input ya atau tidak. Nilai ya dan tidak sepadan dengan true dan false, masing-masing.

1
2
[Parameter("Message", DefaultValue = true)]
public bool DisplayChartMessage { get; set; }

Ruang nama

Ruang nama bertindak sebagai koleksi kelas yang ditetapkan. Setelah anda menetapkan kelas kepada ruang nama, ia boleh diakses kemudian dengan menggunakan notasi Namespace.ClassName. Kita akan menetapkan NewBot kita kepada ruang nama CoolTradingBots.

1
2
3
4
5
6
7
8
namespace CoolTradingBots
{
    [Robot(AccessRights = AccessRights.None)]
    public class NewBot : Robot
    {
        // ...
    }
}

Kaedah kelas

Kaedah kelas ditakrifkan selepas pengisytiharan kelas. Semua objek kelas NewBot kita akan dapat memanggil kaedah CustomTradeOperation(). Ia mengambil dua hujah, iaitu objek Symbol dan objek double. Kaedah kita sepatutnya mengambil simbol dan melaksanakan sejenis tindakan dagangan untuk volum yang ditentukan

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
namespace CoolTradingBots
{
    [Robot(AccessRights = AccessRights.None)]
    public class NewBot : Robot
    {
        // ... Defining the class parameters.

        // We declare the CustomTradeOperation method. 
        protected override void CustomTradeOperation(string symbolName, double volume)

        {
            // This space is for declaring the method logic. 
        }
    }
}

Perpustakaan kelas

Perpustakaan kelas (dan seterusnya, kaedah kelas) boleh diakses melalui ruang nama mereka seperti yang ditunjukkan dalam contoh di bawah.

1
CoolTradingBots.NewBot.CustomTradeOperation(symbolName, 10000)

Sebagai alternatif, anda boleh menaip kata kunci using pada permulaan kod anda untuk menentukan ruang nama tertentu dan mengelakkan kelewahan. Pertimbangkan cebisan kod berikut.

1
2
3
using CoolTradingBots;

NewBot.CustomTradeOperation(symbolName, 10000)

Penyata bersyarat

Untuk menggunakan penyata bersyarat, gunakan kata kunci diikuti dengan ungkapan dalam kurungan bulat. Contoh di bawah menggunakan kata kunci if untuk menyelesaikan kaedah CustomTradingOperation() kita. Untuk berbuat demikian, kita menggunakan kaedah EvaluateMarket() yang ditakrifkan dalam ruang nama Analytics.Actions.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
namespace CoolTradingBots
{
    [Robot(AccessRights = AccessRights.None)]
    public class NewBot : Robot
    {
        // ... Defining the class parameters.

        protected override void CustomTradeOperation(string symbolName, double volume)
        {
            // We declare and initialize the 'result' variable.
            var result = Analytics.Action.EvaluateMarket();

            // We use a conditional statement based on the IsSuccessful property.
            if (result.IsSuccessful)
            {
                Print("Operation successful!")
            }
        }
    }
}

Koleksi

Koleksi ditakrifkan sebagai bekas yang boleh menyimpan satu atau lebih objek daripada kelas tertentu.

Koleksi boleh diindeks sepenuhnya, bermakna ahli-ahlinya boleh diakses dengan memasukkan nilai integer tertentu dalam kurungan siku. Pertimbangkan contoh berikut di mana kaedah Calculate() mencetak sifat-sifat bar yang diakses melalui indeksnya.

1
2
3
4
5
public override void Calculate(int index)
{
       var bar = Bars[index];
       Print($"{bar.Open} | {bar.High} | {bar.Low} | {bar.Close}");
}

Cipta sambungan cTrader

Dalam cebisan di bawah, kita mencipta bot dagangan asas menggunakan hanya pengetahuan yang diliputi dalam bahagian di atas.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System; 

namespace Spotware.cBots
{
    [Robot(AccessRights = AccessRights.None)]
    public class SuperAwesomeBot : Robot
    {

        /* In the below method, we define the operation(s) that our bot should
        perform when it is launched. */
        protected override void OnStart()
        {
            var result = ExecuteMarketOrder(TradeType.Buy, symbolName, 10000);

            /* We use a conditional statement using the IsSuccessful property of the
            TradeResult object. */
            if (result.IsSuccessful)
            {
                var position = result.Position;
                Print ("Position entry price is {0}", position.EntryPrice);
            } 
        }
    }
}

Operasi segerak dan tak segerak

Seperti yang dinyatakan sebelum ini, C# menyokong sepenuhnya operasi tak segerak. Rajah di bawah menentukan contoh asas bagaimana aktiviti dagangan dilaksanakan dalam pelaksanaan segerak.

graph TD
    A(Menemui Isyarat Teknikal) ==> B(Laksanakan Pesanan Pasaran) 
    B ==> C(Ambilan Untung/Henti <br>Rugi Dicapai) 
    C ==> D(Tutup Posisi)
    D ==> A

Pelaksanaan segerak membawa satu kelemahan penting. Dalam contoh di atas, tindakan melaksanakan pesanan pasaran sepenuhnya menduduki semua bebenang pelayan, bermakna robot dagangan anda tidak dapat melakukan apa-apa lagi sebelum operasi ini selesai.

Ini kurang ideal apabila anda ingin bertindak balas dengan cepat terhadap peristiwa pasaran dan turun naik. Sebaik-baiknya, bot anda harus dapat menyimpan pelbagai tindakan atau menangguhkan tugas tertentu untuk melibatkan diri dalam aktiviti lain yang lebih mendesak. Kita akan mengembangkan contoh kita untuk mencerminkan dengan lebih baik bagaimana operasi tak segerak dilaksanakan.

graph TD
    A([Menemui Isyarat Teknikal]) ==> B([Letakkan Pesanan Beli]) & C([Letakkan Pesanan Jual <br>untuk Perlindungan Nilai]) ==> D([Suatu Pesanan Mencapai <br>Ambilan Untung/Henti Rugi]) 
    D ==> E([Tutup Kedudukan])
    E ==> A

Dalam contoh di atas, bot dagangan kita secara serentak meletakkan pesanan dalam kedua-dua arah untuk melindungi nilai posisinya. Berbeza dengan operasi segerak, tidak perlu menunggu satu operasi selesai sebelum meneruskan operasi yang lain. Ini secara ketara mengembangkan peluang pembangun untuk mencipta robot dagangan yang cekap dan boleh dipercayai.

Perhatikan bahawa pelaksanaan tak segerak adalah berbeza daripada pelbagai bebenang:

  • Dalam pelaksanaan tak segerak, semua tugas dimulakan pada bebenang yang sama. Apabila ia disimpan atau ditangguhkan, ia membebaskan bebenang ini dan, apabila pelaksanaannya diteruskan kemudian, ia berlaku pada bebenang berbeza yang dipilih daripada kumpulan bebenang.
  • Apabila menggunakan pelbagai bebenang, semua tugas bermula pada bebenang yang berbeza dan meneruskan pelaksanaannya pada bebenang awal mereka. Tiada pertukaran bebenang.

cTrader tidak pernah memanggil kaedah anda secara selari jadi anda tidak perlu risau tentang isu pelbagai bebenang.

Image title