Langkau tajuk talian

Cara menguruskan cBot dan indikator menggunakan algo

Fungsi algoritma yang menguruskan algoritma lain membolehkan pedagang menambah cBot dan indikator kepada carta menggunakan kod. Dengan keupayaan ini, mereka boleh merancang dan membangunkan strategi dagangan yang berkesan, membuat pelarasan dinamik, melaksanakan pelbagai strategi dan menggunakan kawalan risiko automatik.

Dalam artikel ini dan video yang berkaitan, kami akan menunjukkan kepada anda cara mencipta dan bekerja dengan cBot yang menguruskan algoritma lain.

Tambah indikator menggunakan cBot

Dalam aplikasi Algo, buka tab cBot. Cari dan pilih sampel Sample Trend cBot, yang menggunakan purata bergerak.

Takrifkan dua indikator.

1
2
ChartIndicator _indicator1;
ChartIndicator _indicator2;

Tambah dua indikator kepada carta.

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

Penampilan indikator boleh disuaikan melalui tetapan garis output. Pilihan yang boleh disuaikan termasuk warna, ketebalan dan gaya garis.

Kami akan menjadikan garis untuk indikator pertama merah dan tebal.

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

Operasi yang sama boleh digunakan untuk mengalih keluar indikator daripada carta pada bila-bila masa. Kami akan menjadikan perubahan berkuat kuasa apabila bar berubah.

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

Anda boleh menyalin kod penuh di bawah:

 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 membina cBot, gunakan kekunci pintas Ctrl+B atau klik Build.

Pergi ke aplikasi Dagangan. Pilih carta EURUSD, klik ikon cBot, cari dan pilih Sample Trend cBot.

Apabila tetingkap Tambah tika muncul, klik Guna dan kemudian mulakan cBot.

Anda sepatutnya melihat bahawa dua purata bergerak yang digunakan untuk dagangan telah ditambah kepada carta.

Mulakan cBot menggunakan cBot lain

Kami akan menunjukkan cara menguruskan cBot melalui cBot lain. Kali ini, kami akan mencipta cBot kosong baharu dari awal.

Pergi ke aplikasi Algo dan klik butang Baharu di bawah tab cBot. Pilih pilihan Kosong, masukkan nama seperti Tambah cBot dan kemudian klik Cipta.

Kami mula dengan mentakrifkan dua objek robot carta.

1
2
ChartRobot _robot1;
ChartRobot _robot2;

Kami kemudian menambah robot tersebut kepada carta dalam kaedah 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);

Kami juga boleh menambah pengendali peristiwa untuk mencetak mesej apabila cBot dimulakan.

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

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

Tulis beberapa logik dalam kaedah OnBarClosed() untuk memulakan robot pertama apabila bar berubah, menghentikannya dan kemudian memulakan robot kedua pada bar seterusnya.

 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 boleh menyalin kod penuh di bawah:

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

Selepas anda membina cBot, kembali ke aplikasi Dagangan, cari dan pilih Tambah cBot dan kemudian mulakan cBot.

Apabila dialog Permintaan kebenaran muncul, klik Benarkan.

Dua tika Sample Trend cBot sepatutnya muncul pada carta.

Tunggu sehingga bar pertama selesai dan anda sepatutnya melihat tika pertama Sample Trend cBot bermula secara automatik.

Pada bar seterusnya, anda sepatutnya melihat tika kedua Sample Trend cBot bermula secara automatik.

Anda boleh perhatikan bagaimana cBot melaksanakan logik kami dan menguruskan dua cBot lain berdasarkan keadaan yang berubah.

Ubah suai parameter cBot semasa pelaksanaan

Anda mungkin perlu mengubah parameter cBot semasa ia sedang berjalan. Contohnya, anda memutuskan untuk segera mengemas kini kod semasa selepas menerima berita atau kemas kini kewangan penting.

Daripada menghentikan dan memulakan semula cBot kami, mari kita segera ubah suai 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, kami akan membina semula cBot.

Anda boleh menyalin kod penuh di bawah:

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

Navigasi ke aplikasi Dagangan dan mulakan cBot untuk melihat bagaimana nilai indikator berubah pada setiap bar.

Ringkasan

Kami berharap artikel ini telah membantu anda memahami cara menggunakan algoritma untuk memulakan, mengawal dan menguruskan algoritma lain.