Ana içeriğe geç

Algoritmalar kullanarak cBot'ları ve göstergeleri nasıl yönetilir

Bir algoritmanın başka bir algoritmayı yönetme işlevi, trader'ların kod kullanarak bir grafiğe cBot'lar ve göstergeler eklemesini sağlar. Bu yetenekle, etkili işlem stratejileri planlayabilir ve geliştirebilir, dinamik ayarlamalar yapabilir, birden fazla strateji uygulayabilir ve otomatik risk kontrolleri uygulayabilirler.

Bu makalede ve ilgili videoda, diğer algoritmaları yöneten cBot'ları nasıl oluşturacağınızı ve bunlarla nasıl çalışacağınızı göstereceğiz.

Bir cBot kullanarak gösterge ekleme

Algo uygulamasında, cBot'lar sekmesini açın. Moving Averages kullanan Örnek Trend cBot örneğini arayın ve seçin.

İki gösterge tanımlayın.

1
2
ChartIndicator _indicator1;
ChartIndicator _indicator2;

Grafiğe iki gösterge ekleyin.

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

Gösterge görünümü, çıktı çizgisi ayarları aracılığıyla özelleştirilebilir. Özelleştirilebilir seçenekler arasında renk, kalınlık ve çizgi stili bulunur.

İlk göstergenin çizgisini kırmızı ve kalın yapacağız.

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

Aynı işlem, göstergeleri istediğiniz zaman bir grafikten kaldırmak için de uygulanabilir. Çubuk değiştiğinde değişikliklerin etkili olmasını sağlayacağız.

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

Aşağıdaki kodun tamamını kopyalayabilirsiniz:

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

cBot'u oluşturmak için Ctrl+B kısayolunu kullanın veya Oluştur'a tıklayın.

İşlem uygulamasına gidin. EURUSD grafiğini seçin, cBot simgesine tıklayın, Örnek Trend cBot'u arayın ve seçin.

Örnek Ekle penceresi göründüğünde, Uygula'ya tıklayın ve ardından cBot'u başlatın.

İşlem için kullanılan iki Moving Averages'ın grafiğe eklendiğini görmelisiniz.

Başka bir cBot kullanarak cBot başlatma

Bir cBot'u başka bir cBot aracılığıyla nasıl yöneteceğimizi göstereceğiz. Bu sefer, sıfırdan yeni bir boş cBot oluşturacağız.

Algo uygulamasına gidin ve cBot'lar sekmesinin altındaki Yeni düğmesine tıklayın. Boş seçeneğini seçin, cBot Ekle gibi bir ad girin ve ardından Oluştur'a tıklayın.

İki grafik robotu nesnesi tanımlayarak başlıyoruz.

1
2
ChartRobot _robot1;
ChartRobot _robot2;

Daha sonra bu robotları OnStart() yönteminde grafiğe ekliyoruz.

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

cBot her başlatıldığında bir mesaj yazdırmak için bir olay işleyici de ekleyebiliriz.

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

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

Çubuk değiştiğinde ilk robotu başlatmak, durdurmak ve ardından bir sonraki çubukta ikinci robotu başlatmak için OnBarClosed() yönteminin içine bazı mantıklar yazın.

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

Aşağıdaki kodun tamamını kopyalayabilirsiniz:

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

cBot'u oluşturduktan sonra İşlem uygulamasına geri dönün, cBot Ekle'yi arayın ve seçin, ardından cBot'u başlatın.

İzin isteği iletişim kutusu göründüğünde İzin Ver'e tıklayın.

Örnek Trend cBot'un iki örneği grafikte görünmelidir.

İlk çubuğun tamamlanmasını bekleyin; Örnek Trend cBot'un ilk örneğinin otomatik olarak başladığını görmelisiniz.

Bir sonraki çubukta, Örnek Trend cBot'un ikinci örneğinin otomatik olarak başladığını görmelisiniz.

cBot'un mantığımızı nasıl yürüttüğünü ve değişen koşullara göre diğer iki cBot'u nasıl yönettiğini gözlemleyebilirsiniz.

Çalışma sırasında cBot parametrelerini değiştirin

Bir cBot çalışırken parametrelerini değiştirmeniz gerekebilir. Örneğin, önemli finansal haberler veya güncellemeler aldıktan sonra kodu hareket halindeyken hızlıca güncellemeye karar verirsiniz.

cBot'umuzu durdurup başlatmak yerine, ilk cBot için SlowPeriods parametresini hemen değiştirelim.

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

Şimdi cBot'u yeniden oluşturacağız.

Aşağıdaki kodun tamamını kopyalayabilirsiniz:

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

İşlem uygulamasına gidin ve gösterge değerinin her çubukta nasıl değiştiğini görmek için cBot'u başlatın.

Özet

Bu makalenin, diğer algoritmaları başlatmak, kontrol etmek ve yönetmek için algoritmaları nasıl kullanacağınızı anlamanıza yardımcı olduğunu umuyoruz.