Este artigo complementa a nossa extensa lista de amostras de código de indicadores. Expandimos alguns conceitos mencionados nestas amostras de código e discutimos várias funcionalidades avançadas que pode implementar ao criar novos indicadores.
O atributo cloud
Provavelmente já viu nuvens transparentes em gráficos de negociação.
Pode adicionar nuvens às saídas do seu indicador usando o atributo de classe CloudAttribute como mostrado no exemplo abaixo:
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}}
O construtor CloudAttribute recebe dois nomes de linhas de saída. Depois, ele automaticamente desenha a nuvem para corresponder ao espaço entre estas duas saídas.
Também pode definir a opacidade da nuvem usando a propriedade Opacity. Para definir a cor da nuvem, use a propriedade FirstColor. Por padrão, a cor da nuvem corresponderá à cor da primeira linha na saída do indicador.
Trabalhar com cores
A API Algo inclui o enumColor que pode ser usado para configurar as cores para objetos Chart, controlos de gráfico e saídas.
Os valores do enumColor representam cores comumente usadas. Pode usá-los sem ter que lidar com códigos de cor hexadecimais ou ARGB.
Ao personalizar saídas, pode definir suas cores usando a propriedade string LineColor. Como mostrado abaixo, ela aceita tanto cores nomeadas quanto códigos de cor hexadecimais.
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);
As cores também podem ser tratadas como parâmetros personalizáveis. Para permitir que os utilizadores selecionem cores personalizadas (por exemplo, as cores das linhas desenhadas por um indicador), declare um parâmetro do tipo Color.
No exemplo abaixo, criamos um indicador simples (máximo menos mínimo) que, ao ser inicializado, exibe texto no gráfico de negociação ao qual está anexado.
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);}}}
Tipos de saída
Existem vários tipos diferentes de saída disponíveis para indicadores personalizados:
Line - uma linha contínua.
DiscontinuousLine - uma linha não contínua que é útil para casos em que o seu indicador nem sempre tem um valor de cálculo.
Points - um ponto ou um ponto para cada barra.
Histogram - uma série de barras verticais. Ao usar este tipo, defina a propriedade IsOverlay do seu indicador como false.
Para definir um tipo de saída, use a propriedade PlotType como demonstrado abaixo.
O tipo enum é necessário para criar parâmetros que têm várias opções predefinidas das quais os utilizadores podem escolher. Usamos o tipo enum no seguinte exemplo:
A propriedade Server.Time representa o tempo atual no fuso horário do seu indicador ou cBot estabelecido através da propriedade TimeZone.
Hora de abertura da barra
Utilize a coleção Bars.OpenTime para obter as horas de abertura das barras. O fuso horário será baseado no fuso horário que especificou no atributo da classe TimeZone.
Utilize a propriedade Application.UserTimeOffset para obter o fuso horário da plataforma do utilizador. Isto é utilizado principalmente para converter o tempo do seu indicador para o fuso horário do utilizador.
A propriedade Application.UserTimeOffset retorna um objeto TimeSpan que representa o desvio horário definido pelo utilizador na sua plataforma cTrader em comparação com o tempo UTC.
Também pode optar por ser notificado quando um utilizador altera o desvio horário da sua plataforma. Para tal, utilize o evento Application.UserTimeOffsetChanged.
O cTrader suporta tipos de parâmetros dedicados para data e hora que permitem obter valores de data e hora fortemente tipados como entrada para os seus algos, em vez de utilizar o tipo de parâmetro string.
Ao utilizar os novos tipos de parâmetros de data e hora, pode obter valores no fuso horário do seu algo com validação mínima e máxima integrada e suporte total de otimização, tal como outros tipos de parâmetros.
Para obter um determinado valor de tempo através de um parâmetro personalizável, pode utilizar estes tipos de C#:
DateTime
DateOnly
TimeSpan
Abaixo está um exemplo de como isto pode ser feito: