Lewati ke isi

Cara mengelola cBot dan indikator menggunakan algo

Fungsi algoritma yang mengelola algoritma lain memungkinkan trader untuk menambahkan cBot dan indikator ke grafik menggunakan kode. Dengan kemampuan ini, mereka dapat merencanakan dan mengembangkan strategi trading yang efektif, membuat penyesuaian dinamis, menjalankan beberapa strategi, dan menerapkan kontrol risiko otomatis.

Dalam artikel ini dan video terkaitnya, kami akan menunjukkan kepada Anda cara membuat dan bekerja dengan cBot yang mengelola algoritma lain.

Tambahkan indikator menggunakan cBot

Di aplikasi Algo, buka tab cBots. Cari dan pilih sampel Sample Trend cBot, yang menggunakan moving average.

Definisikan dua indikator.

1
2
ChartIndicator _indicator1;
ChartIndicator _indicator2;

Tambahkan dua indikator ke grafik.

1
2
_indicator1 = Chart.Indicators.Add("Simple Moving Average", SourceSeries, FastPeriods, MAType);
_indicator2 = Chart.Indicators.Add("Simple Moving Average", SourceSeries, SlowPeriods, MAType);

Tampilan indikator dapat disesuaikan melalui pengaturan garis keluarannya. Opsi yang dapat disesuaikan termasuk warna, ketebalan, dan gaya garis.

Kita akan membuat garis untuk indikator pertama berwarna merah dan tebal.

1
2
_indicator1.Lines[0].Color = Color.Red;
_indicator1.Lines[0].Thickness = 3;

Operasi yang sama dapat diterapkan untuk menghapus indikator dari grafik kapan saja. Kita akan membuat perubahan berlaku ketika bar berubah.

1
2
3
4
5
protected override void OnBarClosed()
{
    Chart.Indicators.Remove(_indicator1);
    Chart.Indicators.Remove(_indicator2);
}

Anda dapat menyalin kode lengkapnya di bawah ini:

 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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
using cAlgo.API;
using cAlgo.API.Indicators;

namespace cAlgo
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None, AddIndicators = true)]
    public class SampleTrendcBot : Robot
    {
        [Parameter("Quantity (Lots)", Group = "Volume", DefaultValue = 1, MinValue = 0.01, Step = 0.01)]
        public double Quantity { get; set; }

        [Parameter("MA Type", Group = "Moving Average")]
        public MovingAverageType MAType { get; set; }

        [Parameter("Source", Group = "Moving Average")]
        public DataSeries SourceSeries { get; set; }

        [Parameter("Slow Periods", Group = "Moving Average", DefaultValue = 10)]
        public int SlowPeriods { get; set; }

        [Parameter("Fast Periods", Group = "Moving Average", DefaultValue = 5)]
        public int FastPeriods { get; set; }

        private MovingAverage slowMa;
        private MovingAverage fastMa;
        private const string label = "Sample Trend cBot";   

        ChartIndicator _indicator1;
        ChartIndicator _indicator2;

        protected override void OnStart()
        {
            fastMa = Indicators.MovingAverage(SourceSeries, FastPeriods, MAType);
            slowMa = Indicators.MovingAverage(SourceSeries, SlowPeriods, MAType);

            _indicator1 = Chart.Indicators.Add("Simple Moving Average", SourceSeries, FastPeriods, MAType);
            _indicator2 = Chart.Indicators.Add("Simple Moving Average", SourceSeries, SlowPeriods, MAType);

            _indicator1.Lines[0].Color = Color.Red;
            _indicator1.Lines[0].Thickness = 3;
        }

        protected override void OnBarClosed()
        {
            Chart.Indicators.Remove(_indicator1);
            Chart.Indicators.Remove(_indicator2);
        }

        protected override void OnTick()
        {
            var longPosition = Positions.Find(label, SymbolName, TradeType.Buy);
            var shortPosition = Positions.Find(label, SymbolName, TradeType.Sell);

            var currentSlowMa = slowMa.Result.Last(0);
            var currentFastMa = fastMa.Result.Last(0);
            var previousSlowMa = slowMa.Result.Last(1);
            var previousFastMa = fastMa.Result.Last(1);

            if (previousSlowMa > previousFastMa && currentSlowMa <= currentFastMa && longPosition == null)
            {
                if (shortPosition != null)
                    ClosePosition(shortPosition);

                ExecuteMarketOrder(TradeType.Buy, SymbolName, VolumeInUnits, label);
            }
            else if (previousSlowMa < previousFastMa && currentSlowMa >= currentFastMa && shortPosition == null)
            {
                if (longPosition != null)
                    ClosePosition(longPosition);

                ExecuteMarketOrder(TradeType.Sell, SymbolName, VolumeInUnits, label);
            }
        }

        private double VolumeInUnits
        {
            get { return Symbol.QuantityToVolumeInUnits(Quantity); }
        }
    }
}

Untuk membangun cBot, gunakan hotkey Ctrl+B atau klik Build.

Buka aplikasi Trade. Pilih grafik EURUSD, klik ikon cBot, cari dan pilih Sample Trend cBot.

Ketika jendela Add instance muncul, klik Apply dan kemudian mulai cBot.

Anda seharusnya melihat bahwa dua moving average yang digunakan untuk trading telah ditambahkan ke grafik.

Mulai cBot menggunakan cBot lain

Kita akan mendemonstrasikan cara mengelola cBot melalui cBot lain. Kali ini, kita akan membuat cBot kosong baru dari awal.

Buka aplikasi Algo dan klik tombol New di bawah tab cBots. Pilih opsi Blank, masukkan nama seperti Add cBots dan kemudian klik Create.

Kita mulai dengan mendefinisikan dua objek chart robot.

1
2
ChartRobot _robot1;
ChartRobot _robot2;

Kemudian kita tambahkan robot-robot tersebut ke grafik dalam metode OnStart().

1
2
_robot1 = Chart.Robots.Add("Sample Trend cBot", 0.01, MovingAverageType.Simple, Bars.ClosePrices, 10, 5);
_robot2 = Chart.Robots.Add("Sample Trend cBot", 0.01, MovingAverageType.Simple, Bars.ClosePrices, 12, 7);

Kita juga dapat menambahkan penangan acara untuk mencetak pesan setiap kali cBot dimulai.

1
2
3
4
5
6
Chart.Robots.RobotStarted += ChartRobots_RobotStarted;

private void ChartRobots_RobotStarted(ChartRobotStartedEventArgs obj)
{
    Print ("Robot Started");
}

Tulis beberapa logika di dalam metode OnBarClosed() untuk memulai robot pertama ketika bar berubah, menghentikannya, dan kemudian memulai robot kedua pada bar berikutnya.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
protected override void OnBarClosed()
{
    if (_robot1.State == RobotState.Stopped)
    {
        _robot1.Start();
        _robot2.Stop();
            }
    else if (_robot1.State == RobotState.Running)
    {
        _robot1.Stop();
        _robot2.Start();
    }
}

Anda dapat menyalin kode lengkapnya di bawah ini:

 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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None, AddIndicators = true)]
    public class AddcBots : Robot
    {

        ChartRobot _robot1;
        ChartRobot _robot2;

        protected override void OnStart()
        {
            _robot1 = Chart.Robots.Add("Sample Trend cBot", 0.01, MovingAverageType.Simple, Bars.ClosePrices, 10, 5);
            _robot2 = Chart.Robots.Add("Sample Trend cBot", 0.01, MovingAverageType.Simple, Bars.ClosePrices, 12, 7);

            Chart.Robots.RobotStarted += ChartRobots_RobotStarted;
        }

        private void ChartRobots_RobotStarted(ChartRobotStartedEventArgs obj)
        {
            Print ("Robot Started");

        }

        protected override void OnBarClosed()
        {
            if (_robot1.State == RobotState.Stopped)
            {
                _robot1.Start();
                _robot2.Stop();
            }

            else if (_robot1.State == RobotState.Running)
            {
                _robot2.Start();
                _robot1.Stop();
            }
        }

        protected override void OnStop()
        {
            // Handle cBot stop here
        }
    }
}

Setelah Anda membangun cBot, kembali ke aplikasi Trade, cari dan pilih Add cBots dan kemudian mulai cBot.

Ketika dialog Permission request muncul, klik Allow.

Dua instance Sample Trend cBot seharusnya muncul di grafik.

Tunggu sampai bar pertama selesai dan Anda seharusnya melihat instance pertama dari Sample Trend cBot mulai secara otomatis.

Pada bar berikutnya, Anda seharusnya melihat instance kedua dari Sample Trend cBot mulai secara otomatis.

Anda dapat mengamati bagaimana cBot mengeksekusi logika kita dan mengelola dua cBot lainnya berdasarkan kondisi yang berubah.

Modifikasi parameter cBot selama eksekusi

Anda mungkin perlu mengubah parameter cBot saat sedang berjalan. Misalnya, Anda memutuskan untuk segera memperbarui kode dengan cepat setelah menerima berita atau pembaruan keuangan penting.

Alih-alih menghentikan dan memulai kembali cBot kita, mari langsung memodifikasi parameter SlowPeriods untuk cBot pertama.

1
2
3
4
5
6
else if(_robot1.State == RobotState.Running)
{
_robot1.Stop();
_robot1.Parameters["SlowPeriods"].Value = (int)_robot2.Parameters["SlowPeriods"].Value + 1;
_robot1.Start();
}

Sekarang, kita akan membangun ulang cBot.

Anda dapat menyalin kode lengkapnya di bawah ini:

 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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None, AddIndicators = true)]
    public class AddcBots : Robot
    {

        ChartRobot _robot1;
        ChartRobot _robot2;

        protected override void OnStart()
        {
            _robot1 = Chart.Robots.Add("Sample Trend cBot", 0.01, MovingAverageType.Simple, Bars.ClosePrices, 10, 5);
            _robot2 = Chart.Robots.Add("Sample Trend cBot", 0.01, MovingAverageType.Simple, Bars.ClosePrices, 12, 7);

            Chart.Robots.RobotStarted += ChartRobots_RobotStarted;
        }

        private void ChartRobots_RobotStarted(ChartRobotStartedEventArgs obj)
        {
            Print ("Robot Started");

        }

        protected override void OnBarClosed()
        {
            if (_robot1.State == RobotState.Stopped)
            {
                _robot1.Start();
                _robot2.Stop();
            }

            else if (_robot1.State == RobotState.Running)
            {
                _robot1.Stop();
                _robot1.Parameters["SlowPeriods"].Value = (int)_robot2.Parameters["SlowPeriods"].Value + 1;
                _robot1.Start();
            }
        }

        protected override void OnStop()
        {
            // Handle cBot stop here
        }
    }
}

Navigasikan ke aplikasi Trade dan mulai cBot untuk melihat bagaimana nilai indikator berubah pada setiap bar.

Ringkasan

Kami berharap artikel ini telah membantu Anda memahami cara menggunakan algoritma untuk memulai, mengontrol, dan mengelola algoritma lain.