Lewati ke isi

Operasi lanjutan dengan indikator

Artikel ini melengkapi daftar sampel kode indikator yang ekstensif. Kami memperluas beberapa konsep yang disebutkan dalam sampel kode ini dan membahas beberapa fitur lanjutan yang dapat Anda implementasikan saat membuat indikator baru.

Atribut cloud

Anda mungkin pernah melihat awan transparan pada grafik trading.

Image title

Anda dapat menambahkan awan ke output indikator Anda dengan menggunakan atribut kelas CloudAttribute seperti yang ditunjukkan dalam contoh di bawah ini:

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

Konstruktor CloudAttribute mengambil dua nama garis output. Setelah itu, secara otomatis akan memplot awan untuk mencocokkan ruang di antara kedua output ini.

Anda juga dapat mengatur opasitas awan dengan menggunakan properti Opacity. Untuk mengatur warna awan, gunakan properti FirstColor. Secara default, warna awan akan cocok dengan warna garis pertama dalam output indikator.

Bekerja dengan warna

Algo API menyertakan enum Color yang dapat digunakan untuk mengonfigurasi warna untuk objek Chart, kontrol grafik, dan output.

Nilai-nilai enum Color mewakili warna-warna yang umum digunakan. Anda dapat menggunakannya tanpa harus berurusan dengan kode warna heksadesimal atau ARGB.

Saat menyesuaikan output, Anda dapat mengatur warnanya dengan menggunakan properti string LineColor. Seperti yang ditunjukkan di bawah ini, properti ini menerima baik nama warna maupun kode 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; }

Catatan

Warna juga dapat diperlakukan sebagai parameter yang dapat disesuaikan. Untuk memungkinkan pengguna memilih warna kustom (misalnya, warna garis yang digambar oleh indikator), deklarasikan parameter dengan tipe Color.

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

Dalam contoh di bawah ini, kami membuat indikator sederhana (high minus low) yang, saat diinisialisasi, menampilkan teks pada grafik trading tempat indikator tersebut 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);
        }
    }
}

Tipe output

Ada beberapa tipe output berbeda yang tersedia untuk indikator kustom:

  • Line - garis kontinu.
  • DiscontinuousLine - garis tidak kontinu yang berguna untuk kasus di mana indikator Anda tidak selalu memiliki nilai perhitungan.
  • Points - titik atau dot untuk setiap bar.
  • Histogram - serangkaian bar vertikal. Saat menggunakan tipe ini, atur properti IsOverlay indikator Anda ke false.

Untuk mengatur tipe output, gunakan properti PlotType seperti yang ditunjukkan di bawah ini.

 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

Tipe enum diperlukan untuk membuat parameter yang memiliki beberapa opsi yang telah ditentukan sebelumnya yang dapat dipilih oleh pengguna. Kami menggunakan tipe 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 menambahkan parameter ini ke indikator atau cBot, Anda akan melihat menu interaktif multi-opsi yang memungkinkan Anda memilih salah satu nilai enum yang ditentukan.

Bekerja dengan waktu

Waktu platform dan server

Anda dapat mendapatkan waktu server saat ini dengan mengakses properti Server.Time atau Server.TimeInUtc.

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

Properti Server.Time mewakili waktu saat ini dalam zona waktu indikator atau cBot Anda yang ditetapkan melalui properti TimeZone.

Waktu pembukaan bar

Gunakan koleksi Bars.OpenTime untuk mendapatkan waktu pembukaan bar. Zona waktu akan didasarkan pada zona waktu yang telah Anda tentukan dalam atribut kelas TimeZone.

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

Offset waktu platform

Gunakan properti Application.UserTimeOffset untuk mendapatkan zona waktu platform pengguna. Ini terutama digunakan untuk mengonversi waktu indikator Anda ke zona waktu pengguna.

1
var userPlatformTimeOffset = Application.UserTimeOffset;

Properti Application.UserTimeOffset mengembalikan objek TimeSpan yang mewakili offset waktu yang diatur oleh pengguna di platform cTrader mereka dibandingkan dengan waktu UTC.

Anda juga dapat memilih untuk mendapatkan notifikasi ketika pengguna mengubah offset waktu platform mereka. Untuk melakukannya, gunakan event 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 waktu dengan parameter

cTrader mendukung tipe parameter tanggal dan waktu khusus yang memungkinkan Anda mendapatkan nilai tanggal dan waktu yang bertipe kuat sebagai input untuk algo Anda, alih-alih menggunakan tipe parameter string.

Dengan menggunakan tipe parameter tanggal dan waktu baru, Anda dapat memperoleh nilai dalam zona waktu algo Anda dengan validasi minimum dan maksimum bawaan dan dukungan optimisasi penuh, sama seperti tipe parameter lainnya.

Untuk mendapatkan nilai waktu tertentu melalui parameter yang dapat disesuaikan, Anda dapat menggunakan tipe C# berikut:

  • DateTime
  • DateOnly
  • TimeSpan

Di bawah ini adalah contoh bagaimana hal ini dapat 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