Langkau tajuk talian

Operasi lanjutan dengan indikator

Artikel ini melengkapi senarai contoh kod indikator yang luas kami. Kami mengembangkan beberapa konsep yang disebut dalam contoh kod ini dan membincangkan beberapa ciri lanjutan yang boleh anda laksanakan semasa mencipta indikator baharu.

Atribut awan

Anda mungkin pernah melihat awan lutsinar pada carta dagangan.

Image title

Anda boleh menambah awan pada output indikator anda dengan menggunakan atribut kelas CloudAttribute seperti yang ditunjukkan dalam contoh 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
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
    }
}

Pembina CloudAttribute mengambil dua nama garis output. Selepas itu, ia secara automatik memplot awan untuk sepadan dengan ruang antara kedua-dua output ini.

Anda juga boleh menetapkan kelegapan awan dengan menggunakan sifat Opacity. Untuk menetapkan warna awan, gunakan sifat FirstColor. Secara lalai, warna awan akan sepadan dengan warna garis pertama dalam output indikator.

Bekerja dengan warna

API Algo merangkumi enum Color yang boleh digunakan untuk mengkonfigurasi warna untuk objek Chart, kawalan carta dan output.

Nilai enum Color mewakili warna yang biasa digunakan. Anda boleh menggunakannya tanpa perlu berurusan dengan kod warna heksadesimal atau ARGB.

Apabila menyesuaikan output, anda boleh menetapkan warnanya dengan menggunakan sifat rentetan LineColor. Seperti yang ditunjukkan di bawah, ia menerima kedua-dua warna bernama dan kod warna heksadesimal.

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

Nota

Warna juga boleh dianggap sebagai parameter yang boleh disesuaikan. Untuk membolehkan pengguna memilih warna tersuai (contohnya, warna garis yang dilukis oleh indikator), isytiharkan parameter jenis Color.

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

Dalam contoh di bawah, kita mencipta indikator mudah (tinggi tolak rendah) yang, apabila diinisialisasikan, memaparkan teks pada carta dagangan yang dilampirkan.

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

Jenis output

Terdapat beberapa jenis output yang berbeza tersedia untuk indikator tersuai:

  • Line - garis berterusan.
  • DiscontinuousLine - garis tidak berterusan yang berguna untuk kes di mana indikator anda tidak sentiasa mempunyai nilai pengiraan.
  • Points - titik atau bintik untuk setiap bar.
  • Histogram - siri bar menegak. Apabila menggunakan jenis ini, tetapkan sifat IsOverlay indikator anda kepada false.

Untuk menetapkan jenis output, gunakan sifat PlotType seperti yang ditunjukkan di bawah.

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

Parameter enum

Jenis enum diperlukan untuk mencipta parameter yang mempunyai beberapa pilihan yang telah ditetapkan yang boleh dipilih oleh pengguna. Kami menggunakan jenis enum dalam contoh berikut:

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

Jika anda menambah parameter ini kepada indikator atau cBot, anda akan melihat menu interaktif pelbagai pilihan yang membolehkan anda memilih salah satu nilai enum yang dinyatakan.

Bekerja dengan masa

Masa platform dan pelayan

Anda boleh mendapatkan masa pelayan semasa dengan mengakses sama ada sifat Server.Time atau Server.TimeInUtc.

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

Sifat Server.Time mewakili masa semasa dalam zon masa indikator atau cBot anda yang ditetapkan melalui sifat TimeZone.

Masa pembukaan bar

Gunakan koleksi Bars.OpenTime untuk mendapatkan masa pembukaan bar. Zon masa akan berdasarkan zon masa yang anda telah nyatakan dalam atribut kelas TimeZone.

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

Ofset masa platform

Gunakan sifat Application.UserTimeOffset untuk mendapatkan zon masa platform pengguna. Ini terutamanya digunakan untuk menukar masa indikator anda kepada zon masa pengguna.

1
var userPlatformTimeOffset = Application.UserTimeOffset;

Sifat Application.UserTimeOffset mengembalikan objek TimeSpan yang mewakili ofset masa yang ditetapkan oleh pengguna dalam platform cTrader mereka berbanding dengan masa UTC.

Anda juga boleh memilih untuk dimaklumkan apabila pengguna menukar ofset masa platform mereka. Untuk berbuat demikian, gunakan acara Application.UserTimeOffsetChanged.

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

Dapatkan masa dengan parameter

cTrader menyokong jenis parameter tarikh dan masa khusus yang membolehkan anda mendapatkan nilai tarikh dan masa yang kuat sebagai input untuk algo anda dan bukannya menggunakan jenis parameter string.

Dengan menggunakan jenis parameter tarikh dan masa baharu, anda boleh mendapatkan nilai dalam zon masa algo anda dengan pengesahan minimum dan maksimum terbina dalam dan sokongan pengoptimuman penuh, sama seperti jenis parameter lain.

Untuk mendapatkan nilai masa tertentu melalui parameter yang boleh disesuaikan, anda boleh menggunakan jenis C# ini:

  • DateTime
  • DateOnly
  • TimeSpan

Di bawah adalah contoh bagaimana ini boleh dilakukan:

 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