Przejdź do treści

Jak zarządzać cBotami i wskaźnikami za pomocą algo

Funkcjonalność zarządzania algorytmem przez inny algorytm umożliwia traderom dodawanie cBotów i wskaźników do wykresu za pomocą kodu. Dzięki tej możliwości mogą planować i rozwijać skuteczne strategie handlowe, dokonywać dynamicznych dostosowań, wykonywać wiele strategii i stosować zautomatyzowane kontrole ryzyka.

W tym artykule i odpowiadającym mu filmie pokażemy Ci, jak tworzyć i pracować z cBotami, które zarządzają innymi algorytmami.

Dodaj wskaźnik za pomocą cBota

W aplikacji Algo otwórz zakładkę cBoty. Wyszukaj i wybierz przykład Sample Trend cBot, który używa średnich kroczących.

Zdefiniuj dwa wskaźniki.

1
2
ChartIndicator _indicator1;
ChartIndicator _indicator2;

Dodaj dwa wskaźniki do wykresu.

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

Wygląd wskaźnika można dostosować za pomocą ustawień jego linii wyjściowej. Opcje dostosowywania obejmują kolor, grubość i styl linii.

Uczynimy linię dla pierwszego wskaźnika czerwoną i grubą.

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

Tę samą operację można zastosować, aby usunąć wskaźniki z wykresu w dowolnym momencie. Sprawimy, że zmiany zaczną obowiązywać, gdy słupek się zmieni.

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

Możesz skopiować pełny kod poniżej:

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

Aby zbudować cBota, użyj skrótu klawiszowego Ctrl+B lub kliknij Zbuduj.

Przejdź do aplikacji Trade. Wybierz wykres EURUSD, kliknij ikonę cBot, wyszukaj i wybierz Sample Trend cBot.

Gdy pojawi się okno Dodaj instancję, kliknij Zastosuj, a następnie uruchom cBota.

Powinieneś zobaczyć, że do wykresu zostały dodane dwie średnie kroczące używane do handlu.

Uruchom cBota za pomocą innego cBota

Pokażemy, jak zarządzać cBotem za pomocą innego cBota. Tym razem stworzymy nowego pustego cBota od podstaw.

Przejdź do aplikacji Algo i kliknij przycisk Nowy w zakładce cBoty. Wybierz opcję Pusty, wprowadź nazwę, taką jak Add cBots, a następnie kliknij Utwórz.

Zaczynamy od zdefiniowania dwóch obiektów robotów wykresowych.

1
2
ChartRobot _robot1;
ChartRobot _robot2;

Następnie dodajemy te roboty do wykresu w metodzie 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);

Możemy również dodać procedurę obsługi zdarzeń, aby wydrukować komunikat za każdym razem, gdy cBot zostanie uruchomiony.

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

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

Napisz logikę wewnątrz metody OnBarClosed(), aby uruchomić pierwszego robota, gdy słupek się zmieni, zatrzymać go, a następnie uruchomić drugiego robota na następnym słupku.

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

Możesz skopiować pełny kod poniżej:

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

Po zbudowaniu cBota wróć do aplikacji Trade, wyszukaj i wybierz Add cBots, a następnie uruchom cBota.

Gdy pojawi się okno dialogowe Wniosek o uprawnienie, kliknij Zezwól.

Dwie instancje Sample Trend cBot powinny pojawić się na wykresie.

Poczekaj na zakończenie pierwszego słupka, a powinieneś zobaczyć, jak pierwsza instancja Sample Trend cBot uruchamia się automatycznie.

Na następnym słupku powinieneś zobaczyć, jak druga instancja Sample Trend cBot uruchamia się automatycznie.

Możesz obserwować, jak cBot wykonuje naszą logikę i zarządza dwoma innymi cBotami w oparciu o zmieniające się warunki.

Modyfikuj parametry cBota podczas wykonywania

Możesz potrzebować zmienić parametry cBota, gdy jest uruchomiony. Na przykład decydujesz się szybko zaktualizować kod w locie po otrzymaniu ważnych wiadomości finansowych lub aktualizacji.

Zamiast zatrzymywać i uruchamiać naszego cBota, natychmiast zmodyfikujmy parametr SlowPeriods dla pierwszego cBota.

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

Teraz przebudujemy cBota.

Możesz skopiować pełny kod poniżej:

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

Przejdź do aplikacji Trade i uruchom cBota, aby zobaczyć, jak wartość wskaźnika zmienia się na każdym słupku.

Podsumowanie

Mamy nadzieję, że ten artykuł pomógł Ci zrozumieć, jak używać algorytmów do uruchamiania, kontrolowania i zarządzania innymi algorytmami.