콘텐츠로 이동

지표와의 고급 작업

이 문서는 우리의 광범위한 지표 코드 샘플 목록을 보완합니다. 이 코드 샘플에서 언급된 몇 가지 개념을 확장하고, 새로운 지표를 생성할 때 구현할 수 있는 여러 고급 기능에 대해 논의합니다.

클라우드 속성

트레이딩 차트에서 투명한 클라우드를 본 적이 있을 것입니다.

Image title

아래 예시와 같이 CloudAttribute 클래스 속성을 사용하여 지표 출력에 클라우드를 추가할 수 있습니다:

 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 생성자는 두 개의 출력 라인 이름을 받습니다. 그 후, 이 두 출력 사이의 공간에 맞게 클라우드를 자동으로 플롯합니다.

Opacity 속성을 사용하여 클라우드의 불투명도를 설정할 수도 있습니다. 클라우드 색상을 설정하려면 FirstColor 속성을 사용하세요. 기본적으로 클라우드의 색상은 지표 출력의 첫 번째 라인 색상과 일치합니다.

색상 작업

Algo API에는 Chart 객체, 차트 컨트롤 및 출력을 위한 색상을 구성하는 데 사용할 수 있는 Color enum이 포함되어 있습니다.

Color enum의 값은 일반적으로 사용되는 색상을 나타냅니다. 16진수 또는 ARGB 색상 코드를 다룰 필요 없이 이를 사용할 수 있습니다.

출력을 사용자 정의할 때, LineColor 문자열 속성을 사용하여 색상을 설정할 수 있습니다. 아래와 같이, 이는 명명된 색상과 16진수 색상 코드를 모두 허용합니다.

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

참고

색상은 또한 사용자 정의 가능한 매개변수로 처리될 수 있습니다. 사용자가 사용자 정의 색상을 선택할 수 있도록 하려면(예: 지표가 그린 라인의 색상), Color 타입의 매개변수를 선언하세요.

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

아래 예시에서는 초기화 시 연결된 트레이딩 차트에 텍스트를 표시하는 간단한 (고가에서 저가를 뺀) 지표를 생성합니다.

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

출력 유형

사용자 정의 지표를 위해 사용할 수 있는 여러 유형의 출력이 있습니다:

  • Line - 연속 라인.
  • DiscontinuousLine - 지표가 항상 계산 값을 가지지 않는 경우에 유용한 비연속 라인.
  • Points - 각 바에 대한 점 또는 도트.
  • Histogram - 일련의 수직 막대. 이 유형을 사용할 때, 지표의 IsOverlay 속성을 false로 설정하세요.

출력 유형을 설정하려면 아래와 같이 PlotType 속성을 사용하세요.

 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 타입은 사용자가 선택할 수 있는 여러 사전 정의된 옵션이 있는 매개변수를 생성하는 데 필요합니다. 다음 예시에서 enum 타입을 사용합니다:

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

이 매개변수를 지표나 cBot에 추가하면, 지정된 enum 값 중 하나를 선택할 수 있는 다중 옵션 상호작용 가능 메뉴가 표시됩니다.

시간 작업

플랫폼 및 서버 시간

Server.Time 또는 Server.TimeInUtc 속성에 접근하여 현재 서버 시간을 얻을 수 있습니다.

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

Server.Time 속성은 TimeZone 속성을 통해 설정된 지표 또는 cBot 시간대의 현재 시간을 나타냅니다.

바 열기 시간

Bars.OpenTime 컬렉션을 사용하여 바 열기 시간을 얻으세요. 시간대는 TimeZone 클래스 속성에 지정한 시간대를 기반으로 합니다.

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

플랫폼 시간 오프셋

Application.UserTimeOffset 속성을 사용하여 사용자 플랫폼의 시간대를 얻으세요. 이것은 주로 지표 시간을 사용자 시간대로 변환하는 데 사용됩니다.

1
var userPlatformTimeOffset = Application.UserTimeOffset;

Application.UserTimeOffset 속성은 사용자가 cTrader 플랫폼에서 설정한 UTC 시간과의 시간 오프셋을 나타내는 TimeSpan 객체를 반환합니다.

사용자가 플랫폼 시간 오프셋을 변경할 때 알림을 받도록 선택할 수도 있습니다. 이를 위해 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;
}

매개변수로 시간 얻기

cTrader는 string 매개변수 타입을 사용하는 대신, 알고에 대한 입력으로 강력한 타입의 날짜 및 시간 값을 얻을 수 있도록 전용 날짜 및 시간 매개변수 타입을 지원합니다.

새로운 날짜 및 시간 매개변수 타입을 사용하면, 다른 매개변수 타입과 마찬가지로 알고 시간대의 값을 내장된 최소 및 최대 검증과 완전한 최적화 지원과 함께 얻을 수 있습니다.

사용자 정의 매개변수를 통해 특정 시간 값을 얻으려면 다음 C# 타입을 사용할 수 있습니다:

  • DateTime
  • DateOnly
  • TimeSpan

아래는 이를 수행하는 방법의 예입니다:

 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