Эта статья дополняет наш обширный список примеров кода индикаторов. Мы расширяем некоторые концепции, упомянутые в этих примерах кода, и обсуждаем несколько расширенных функций, которые вы можете реализовать при создании новых индикаторов.
Атрибут облака
Вы, вероятно, видели прозрачные облака на торговых графиках.
Вы можете добавить облака к выходным данным вашего индикатора, используя атрибут класса CloudAttribute, как показано в примере ниже:
usingcAlgo.API;usingcAlgo.API.Indicators;usingSystem;namespacecAlgo{/// <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)]publicclassBollingerBandsMTFCloudSample:Indicator{privateBollingerBands_bollingerBands;privateBars_baseBars;[Parameter("Base TimeFrame", DefaultValue = "Daily")]publicTimeFrameBaseTimeFrame{get;set;}[Parameter("Source", DefaultValue = DataSeriesType.Close)]publicDataSeriesTypeDataSeriesType{get;set;}[Parameter("Periods", DefaultValue = 14, MinValue = 0)]publicintPeriods{get;set;}[Parameter("Standard Deviation", DefaultValue = 2, MinValue = 0)]publicdoubleStandardDeviation{get;set;}[Parameter("MA Type", DefaultValue = MovingAverageType.Simple)]publicMovingAverageTypeMaType{get;set;}[Output("Main", LineColor = "Yellow", PlotType = PlotType.Line, Thickness = 1)]publicIndicatorDataSeriesMain{get;set;}[Output("Top", LineColor = "Red", PlotType = PlotType.Line, Thickness = 1)]publicIndicatorDataSeriesTop{get;set;}[Output("Bottom", LineColor = "Red", PlotType = PlotType.Line, Thickness = 1)]publicIndicatorDataSeriesBottom{get;set;}protectedoverridevoidInitialize(){_baseBars=MarketData.GetBars(BaseTimeFrame);varbaseSeries=GetBaseSeries();_bollingerBands=Indicators.BollingerBands(baseSeries,Periods,StandardDeviation,MaType);}publicoverridevoidCalculate(intindex){varbaseIndex=_baseBars.OpenTimes.GetIndexByTime(Bars.OpenTimes[index]);Main[index]=_bollingerBands.Main[baseIndex];Top[index]=_bollingerBands.Top[baseIndex];Bottom[index]=_bollingerBands.Bottom[baseIndex];}privateDataSeriesGetBaseSeries(){switch(DataSeriesType){caseDataSeriesType.Open:return_baseBars.OpenPrices;caseDataSeriesType.High:return_baseBars.HighPrices;caseDataSeriesType.Low:return_baseBars.LowPrices;caseDataSeriesType.Close:return_baseBars.ClosePrices;default:thrownewArgumentOutOfRangeException("DataSeriesType");}}}publicenumDataSeriesType{Open,High,Low,Close}}
Конструктор CloudAttribute принимает два имени выходных линий. После этого он автоматически строит облако, соответствующее пространству между этими двумя выходами.
Вы также можете установить непрозрачность облака, используя свойство Opacity. Чтобы настроить цвет облака, используйте свойство FirstColor. По умолчанию цвет облака будет соответствовать цвету первой линии в выходных данных индикатора.
Работа с цветами
Algo API включает enumColor, который можно использовать для настройки цветов объектов Chart, элементов управления графиком и выходных данных.
Значения enumColor представляют часто используемые цвета. Вы можете использовать их без необходимости работать с шестнадцатеричными кодами или кодами цветов ARGB.
При настройке выходных данных вы можете установить их цвета, используя строковое свойство LineColor. Как показано ниже, оно принимает как именованные цвета, так и шестнадцатеричные коды цветов.
1234
_=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 910111213
varstackPanel=newStackPanel{Orientation=Orientation.Vertical,HorizontalAlignment=HorizontalAlignment.Center,VerticalAlignment=VerticalAlignment.Center};stackPanel.AddChild(newTextBlock{Text="Red Color property",BackgroundColor=Color.Red});stackPanel.AddChild(newTextBlock{Text="Hexadecimal Color code",BackgroundColor=Color.FromHex("#FF5733")});stackPanel.AddChild(newTextBlock{Text="ARGB Color",BackgroundColor=Color.FromArgb(200,100,40,80)});stackPanel.AddChild(newTextBlock{Text="Color Name",BackgroundColor=Color.FromName("Green")});Chart.AddControl(stackPanel);
Цвета также могут рассматриваться как настраиваемые параметры. Чтобы позволить пользователям выбирать пользовательские цвета (например, цвета линий, нарисованных индикатором), объявите параметр типа Color.
В приведенном ниже примере мы создаем простой индикатор (максимум минус минимум), который при инициализации отображает текст на торговом графике, к которому он прикреплен.
1 2 3 4 5 6 7 8 910111213141516171819
usingcAlgo.API;usingcAlgo.API.Indicators;usingcAlgo.API.Collections;usingcAlgo.API.Internals;namespacecAlgo{[Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]publicclassHighMinusLowColor:Indicator{[Parameter("Text Color", DefaultValue="#f54242")]publicColorTextColor{get;set;}publicoverridevoidInitialize(){varstaticText=Chart.DrawStaticText("static","This text shows how color parameters work",VerticalAlignment.Center,HorizontalAlignment.Center,TextColor);}}}
Типы выходных данных
Для пользовательских индикаторов доступно несколько различных типов выходных данных:
Line - непрерывная линия.
DiscontinuousLine - прерывистая линия, которая полезна в случаях, когда ваш индикатор не всегда имеет вычисленное значение.
Points - точка или точка для каждого бара.
Histogram - серия вертикальных столбцов. При использовании этого типа установите свойство IsOverlay вашего индикатора в false.
Чтобы установить тип выходных данных, используйте свойство PlotType, как показано ниже.
Тип enum необходим для создания параметров, которые имеют несколько предопределенных опций, из которых пользователи могут выбирать. Мы используем тип enum в следующем примере:
Если вы добавите этот параметр к индикатору или сиБоту, вы увидите интерактивное меню с несколькими опциями, позволяющее выбрать одно из указанных значений enum.
Работа со временем
Время платформы и сервера
Вы можете получить текущее время сервера, обратившись к свойствам Server.Time или Server.TimeInUtc.
Свойство Server.Time представляет текущее время в часовом поясе вашего индикатора или сиБота, установленном через свойство TimeZone.
Время открытия бара
Используйте коллекцию Bars.OpenTime, чтобы получить время открытия баров. Часовой пояс будет основан на часовом поясе, который вы указали в атрибуте класса TimeZone.
Используйте свойство Application.UserTimeOffset, чтобы получить часовой пояс платформы пользователя. Это в основном используется для преобразования времени вашего индикатора в часовой пояс пользователя.
Свойство Application.UserTimeOffset возвращает объект TimeSpan, представляющий смещение времени, установленное пользователем на его платформе cTrader, по сравнению со временем UTC.
Вы также можете получать уведомления, когда пользователь изменяет смещение времени своей платформы. Для этого используйте событие Application.UserTimeOffsetChanged.
cTrader поддерживает специальные типы параметров даты и времени, которые позволяют получать строго типизированные значения даты и времени в качестве входных данных для ваших алгоритмов вместо использования типа параметра string.
Используя новые типы параметров даты и времени, вы можете получать значения в часовом поясе вашего алгоритма со встроенной проверкой минимальных и максимальных значений и полной поддержкой оптимизации, как и для других типов параметров.
Чтобы получить определенное значение времени через настраиваемый параметр, вы можете использовать следующие типы C#: