Ana içeriğe geç

Göstergelerle gelişmiş işlemler

Bu makale, kapsamlı gösterge kodu örnekleri listemizi tamamlar. Bu kod örneklerinde bahsedilen bazı kavramları genişletiyor ve yeni göstergeler oluştururken uygulayabileceğiniz çeşitli gelişmiş özellikleri tartışıyoruz.

Bulut özniteliği

Muhtemelen işlem grafiklerinde şeffaf bulutlar görmüşsünüzdür.

Image title

Aşağıdaki örnekte gösterildiği gibi CloudAttribute sınıf özniteliğini kullanarak gösterge çıktılarınıza bulutlar ekleyebilirsiniz:

 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
81
82
83
84
85
86
87
88
using cAlgo.API;
using cAlgo.API.Indicators;
using System;

namespace cAlgo
{
    /// <summary>
    /// This indicator shows how to make a built-in cTrader indicator multi time frame and how to use cloud attribute
    /// </summary>
    [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None), Cloud("Top", "Bottom", Opacity = 0.2)]
    public class BollingerBandsMTFCloudSample : Indicator
    {
        private BollingerBands _bollingerBands;

        private Bars _baseBars;

        [Parameter("Base TimeFrame", DefaultValue = "Daily")]
        public TimeFrame BaseTimeFrame { get; set; }

        [Parameter("Source", DefaultValue = DataSeriesType.Close)]
        public DataSeriesType DataSeriesType { get; set; }

        [Parameter("Periods", DefaultValue = 14, MinValue = 0)]
        public int Periods { get; set; }

        [Parameter("Standard Deviation", DefaultValue = 2, MinValue = 0)]
        public double StandardDeviation { get; set; }

        [Parameter("MA Type", DefaultValue = MovingAverageType.Simple)]
        public MovingAverageType MaType { get; set; }

        [Output("Main", LineColor = "Yellow", PlotType = PlotType.Line, Thickness = 1)]
        public IndicatorDataSeries Main { get; set; }

        [Output("Top", LineColor = "Red", PlotType = PlotType.Line, Thickness = 1)]
        public IndicatorDataSeries Top { get; set; }

        [Output("Bottom", LineColor = "Red", PlotType = PlotType.Line, Thickness = 1)]
        public IndicatorDataSeries Bottom { get; set; }

        protected override void Initialize()
        {
            _baseBars = MarketData.GetBars(BaseTimeFrame);

            var baseSeries = GetBaseSeries();

            _bollingerBands = Indicators.BollingerBands(baseSeries, Periods, StandardDeviation, MaType);
        }

        public override void Calculate(int index)
        {
            var baseIndex = _baseBars.OpenTimes.GetIndexByTime(Bars.OpenTimes[index]);

            Main[index] = _bollingerBands.Main[baseIndex];
            Top[index] = _bollingerBands.Top[baseIndex];
            Bottom[index] = _bollingerBands.Bottom[baseIndex];
        }

        private DataSeries GetBaseSeries()
        {
            switch (DataSeriesType)
            {
                case DataSeriesType.Open:
                    return _baseBars.OpenPrices;

                case DataSeriesType.High:
                    return _baseBars.HighPrices;

                case DataSeriesType.Low:
                    return _baseBars.LowPrices;

                case DataSeriesType.Close:
                    return _baseBars.ClosePrices;
                default:

                    throw new ArgumentOutOfRangeException("DataSeriesType");
            }
        }
    }

    public enum DataSeriesType
    {
        Open,
        High,
        Low,
        Close
    }
}

CloudAttribute kurucusu iki çıktı çizgisi adı alır. Daha sonra, bu iki çıktı arasındaki boşluğa uyacak şekilde bulutu otomatik olarak çizer.

Opacity özelliğini kullanarak bulutun opaklığını da ayarlayabilirsiniz. Bulut rengini ayarlamak için FirstColor özelliğini kullanın. Varsayılan olarak, bulutun rengi gösterge çıktısındaki ilk çizginin rengiyle eşleşecektir.

Renklerle çalışın

Algo API, Chart nesneleri, grafik kontrolleri ve çıktıları için renkleri yapılandırmak için kullanılabilecek Color enum'unu içerir.

Color enum'unun değerleri yaygın olarak kullanılan renkleri temsil eder. Bunları onaltılık veya ARGB renk kodlarıyla uğraşmak zorunda kalmadan kullanabilirsiniz.

Çıktıları özelleştirirken, LineColor dize özelliğini kullanarak renklerini ayarlayabilirsiniz. Aşağıda gösterildiği gibi, hem adlandırılmış renkleri hem de onaltılık renk kodlarını kabul eder.

1
2
3
4
_ = Chart.DrawStaticText("NamedColor", "This is text using Color class color name properties", VerticalAlignment.Center, HorizontalAlignment.Center, Color.Red);
_ = Chart.DrawStaticText("HexadecimalColor", "This is text using Hexadecimal color", VerticalAlignment.Bottom, HorizontalAlignment.Center, Color.FromHex("#FF5733"));
_ = Chart.DrawStaticText("ARGBColor", "This is text using ARGB color", VerticalAlignment.Top, HorizontalAlignment.Center, Color.FromArgb(255, 200, 100, 60));
_ = Chart.DrawStaticText("ParsedNameColor", "This is text using color name by parsing it from string", VerticalAlignment.Center, HorizontalAlignment.Left, Color.FromName("Yellow"));
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
var stackPanel = new StackPanel
{
    Orientation = Orientation.Vertical,
    HorizontalAlignment = HorizontalAlignment.Center,
    VerticalAlignment = VerticalAlignment.Center
};

stackPanel.AddChild(new TextBlock { Text = "Red Color property", BackgroundColor = Color.Red });
stackPanel.AddChild(new TextBlock { Text = "Hexadecimal Color code", BackgroundColor = Color.FromHex("#FF5733") });
stackPanel.AddChild(new TextBlock { Text = "ARGB Color", BackgroundColor = Color.FromArgb(200, 100, 40, 80) });
stackPanel.AddChild(new TextBlock { Text = "Color Name", BackgroundColor = Color.FromName("Green") });

Chart.AddControl(stackPanel);
1
2
3
4
5
[Output("Hexadecimal", LineColor = "#FF5733", PlotType = PlotType.Line, Thickness = 1)]
public IndicatorDataSeries Hexadecimal { get; set; }

[Output("Name", LineColor = "Red", PlotType = PlotType.Line, Thickness = 1)]
public IndicatorDataSeries Name { get; set; }

Not

Renkler özelleştirilebilir parametreler olarak da ele alınabilir. Kullanıcıların özel renkler seçmesine (örneğin, bir gösterge tarafından çizilen çizgilerin renkleri) izin vermek için Color türünde bir parametre bildirin.

1
2
[Parameter("Drawing Color", DefaultValue = "#f54242")]
public Color DrawingColor { get; set; }

Aşağıdaki örnekte, başlatıldığında eklendiği işlem grafiğinde metin görüntüleyen basit bir (High Minus Low) göstergesi oluşturuyoruz.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Collections;
using cAlgo.API.Internals;

namespace cAlgo
{
    [Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class HighMinusLowColor: Indicator
    {
        [Parameter("Text Color", DefaultValue="#f54242")]
        public Color TextColor { get; set; }

        public override void Initialize()
        {
            var staticText = Chart.DrawStaticText("static", "This text shows how color parameters work", VerticalAlignment.Center, HorizontalAlignment.Center, TextColor);
        }
    }
}

Çıktı türleri

Özel göstergeler için çeşitli farklı çıktı türleri mevcuttur:

  • Line - sürekli bir çizgi.
  • DiscontinuousLine - göstergenizin her zaman bir hesaplama değerine sahip olmadığı durumlar için kullanışlı olan süreksiz bir çizgi.
  • Points - her çubuk için bir nokta veya bir benek.
  • Histogram - bir dizi dikey çubuk. Bu türü kullanırken, göstergenizin IsOverlay özelliğini false olarak ayarlayın.

Bir çıktı türü ayarlamak için, aşağıda gösterildiği gibi PlotType özelliğini kullanın.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[Output("Line", PlotType = PlotType.Line)]
public IndicatorDataSeries Line { get; set; }

[Output("Discontinuous Line", PlotType = PlotType.DiscontinuousLine)]
public IndicatorDataSeries DiscontinuousLine { get; set; }

[Output("Points", PlotType = PlotType.Points)]
public IndicatorDataSeries Points { get; set; }

[Output("Histogram", PlotType = PlotType.Histogram)]
public IndicatorDataSeries Histogram { get; set; }

Enum parametreleri

Kullanıcıların seçebileceği önceden tanımlanmış çeşitli seçeneklere sahip parametreler oluşturmak için enum türü gereklidir. Aşağıdaki örnekte enum türünü kullanıyoruz:

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

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

Bu parametreyi bir göstergeye veya cBot'a eklerseniz, belirtilen enum değerlerinden birini seçmenize olanak tanıyan çok seçenekli etkileşimli bir menü göreceksiniz.

Zamanla çalışma

Platform ve sunucu zamanı

Mevcut sunucu zamanını ya Server.Time ya da Server.TimeInUtc özelliklerine erişerek alabilirsiniz.

1
2
var currentServerTimeInIndicatorTimeZone = Server.Time;
var currentServerTimeInUtc = Server.TimeInUtc;

Server.Time özelliği, TimeZone özelliği aracılığıyla belirlenen göstergenizin veya cBot'unuzun saat dilimindeki mevcut zamanı temsil eder.

Çubuk açılış zamanı

Çubuk açılış zamanlarını almak için Bars.OpenTime koleksiyonunu kullanın. Saat dilimi, TimeZone sınıf özniteliğinde belirttiğiniz saat dilimine dayanacaktır.

1
2
3
4
public override void Calculate(int index)
{
    var barTime = Bars.OpenTimes[index];
}

Platform zaman ofseti

Kullanıcının platformunun saat dilimini almak için Application.UserTimeOffset özelliğini kullanın. Bu, öncelikle gösterge zamanınızı kullanıcının saat dilimine dönüştürmek için kullanılır.

1
var userPlatformTimeOffset = Application.UserTimeOffset;

Application.UserTimeOffset özelliği, kullanıcının cTrader platformunda UTC zamanına kıyasla ayarladığı zaman ofsetini temsil eden bir TimeSpan nesnesi döndürür.

Bir kullanıcı platform zaman ofsetini değiştirdiğinde bildirim almayı da seçebilirsiniz. Bunu yapmak için Application.UserTimeOffsetChanged olayını kullanın.

1
2
3
4
5
6
7
8
9
protected override void Initialize()
{
    Application.UserTimeOffsetChanged += Application_UserTimeOffsetChanged;
}

private void Application_UserTimeOffsetChanged(UserTimeOffsetChangedEventArgs obj)
{
    var platformTimeOffset = obj.UserTimeOffset;
}

Parametre ile zaman alma

cTrader, string parametre türünü kullanmak yerine algolarınız için giriş olarak güçlü türde tarih ve zaman değerleri almanızı sağlayan özel tarih ve zaman parametre türlerini destekler.

Yeni tarih ve zaman parametre türlerini kullanarak, diğer parametre türleri gibi yerleşik minimum ve maksimum doğrulama ve tam optimizasyon desteğiyle algo saat diliminizde değerler elde edebilirsiniz.

Özelleştirilebilir bir parametre aracılığıyla belirli bir zaman değeri almak için bu C# türlerini kullanabilirsiniz:

  • DateTime
  • DateOnly
  • TimeSpan

Bunun nasıl yapılabileceğine dair bir örnek aşağıdadır:

 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
using cAlgo.API;
using System;

namespace cAlgo
{
    [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class Sample : Indicator
    {
        [Parameter("DateTime Parameter", MinValue = "1970-01-01T00:00:00", MaxValue = "2025-11-01T00:00:00", DefaultValue = "2025-01-01T10:00:00")]
        public DateTime DateTimeParameter { get; set; }

        [Parameter("DateOnly Parameter", MinValue = "1970-01-01", MaxValue = "2025-11-01", DefaultValue = "2025-01-01")]
        public DateOnly DateOnlyParameter { get; set; }

        [Parameter("TimeSpan Parameter", MinValue = "00:00:00", MaxValue = "23:59:59", DefaultValue = "04:10:20")]
        public TimeSpan TimeSpanParameter { get; set; }

        protected override void Initialize()
        {
            Print($"DateTimeParameter: {DateTimeParameter:o}");
            Print($"DateOnlyParameter: {DateOnlyParameter:o}");
            Print($"TimeSpanParameter: {TimeSpanParameter}");
        }

        public override void Calculate(int index)
        {
        }
    }
}

Image title