Questo articolo integra il nostro ampio elenco di esempi di codice per indicatori. Approfondiamo alcuni concetti menzionati in questi esempi di codice e discutiamo diverse funzionalità avanzate che puoi implementare durante la creazione di nuovi indicatori.
L'attributo cloud
Probabilmente hai visto nuvole trasparenti sui grafici di trading.
Puoi aggiungere nuvole ai tuoi output dell'indicatore utilizzando l'attributo di classe CloudAttribute come mostrato nell'esempio seguente:
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}}
Il costruttore CloudAttribute accetta due nomi di linee di output. Successivamente, traccia automaticamente la nuvola in modo da corrispondere allo spazio tra questi due output.
Puoi anche impostare l'opacità della nuvola utilizzando la proprietà Opacity. Per impostare il colore della nuvola, utilizza la proprietà FirstColor. Per impostazione predefinita, il colore della nuvola corrisponderà al colore della prima linea nell'output dell'indicatore.
Lavorare con i colori
L'API Algo include l'enumColor che può essere utilizzato per configurare i colori per gli oggetti Chart, i controlli del grafico e gli output.
I valori dell'enumColor rappresentano i colori comunemente utilizzati. Puoi utilizzarli senza dover gestire codici colore esadecimali o ARGB.
Quando personalizzi gli output, puoi impostare i loro colori utilizzando la proprietà stringa LineColor. Come mostrato di seguito, accetta sia colori denominati che codici colore esadecimali.
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);
I colori possono anche essere trattati come parametri personalizzabili. Per consentire agli utenti di selezionare colori personalizzati (ad esempio, i colori delle linee disegnate da un indicatore), dichiara un parametro di tipo Color.
Nell'esempio seguente, creiamo un semplice indicatore (massimo meno minimo) che, una volta inizializzato, visualizza del testo sul grafico di trading a cui è collegato.
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);}}}
Tipi di output
Sono disponibili diversi tipi di output per gli indicatori personalizzati:
Line - una linea continua.
DiscontinuousLine - una linea non continua utile per i casi in cui il tuo indicatore non ha sempre un valore di calcolo.
Points - un punto o un puntino per ogni barra.
Histogram - una serie di barre verticali. Quando utilizzi questo tipo, imposta la proprietà IsOverlay del tuo indicatore su false.
Per impostare un tipo di output, utilizza la proprietà PlotType come dimostrato di seguito.
Il tipo enum è necessario per creare parametri che hanno diverse opzioni predefinite tra cui gli utenti possono scegliere. Utilizziamo il tipo enum nell'esempio seguente:
Se aggiungi questo parametro a un indicatore o cBot, vedrai un menu interattivo a più opzioni che ti consente di scegliere uno dei valori enum specificati.
Lavora con il tempo
Ora della piattaforma e del server
Puoi ottenere l'ora corrente del server accedendo alle proprietà Server.Time o Server.TimeInUtc.
La proprietà Server.Time rappresenta l'ora corrente nel fuso orario del tuo indicatore o cBot stabilito tramite la proprietà TimeZone.
Ora di apertura della barra
Utilizza la raccolta Bars.OpenTime per ottenere gli orari di apertura delle barre. Il fuso orario sarà basato sul fuso orario che hai specificato nell'attributo di classe TimeZone.
Utilizza la proprietà Application.UserTimeOffset per ottenere il fuso orario della piattaforma dell'utente. Questo viene utilizzato principalmente per convertire l'ora del tuo indicatore nel fuso orario dell'utente.
La proprietà Application.UserTimeOffset restituisce un oggetto TimeSpan che rappresenta l'offset temporale impostato dall'utente nella sua piattaforma cTrader rispetto all'ora UTC.
Puoi anche scegliere di ricevere una notifica quando un utente modifica l'offset dell'orario della propria piattaforma. Per farlo, utilizza l'evento Application.UserTimeOffsetChanged.
cTrader supporta tipi di parametri dedicati per data e ora che ti consentono di ottenere valori di data e ora fortemente tipizzati come input per i tuoi algoritmi invece di utilizzare il tipo di parametro string.
Utilizzando i nuovi tipi di parametri per data e ora, puoi ottenere valori nel fuso orario del tuo algoritmo con convalida minima e massima integrata e supporto completo per l'ottimizzazione, proprio come altri tipi di parametri.
Per ottenere un determinato valore di orario tramite un parametro personalizzabile, puoi utilizzare questi tipi C#:
DateTime
DateOnly
TimeSpan
Di seguito è riportato un esempio di come è possibile farlo: