Dieser Artikel ergänzt unsere umfangreiche Liste von Indikator-Codebeispielen. Wir erweitern einige in diesen Codebeispielen erwähnte Konzepte und diskutieren mehrere erweiterte Funktionen, die Sie beim Erstellen neuer Indikatoren implementieren können.
Das Cloud-Attribut
Sie haben wahrscheinlich transparente Wolken auf Handelscharts gesehen.
Sie können Wolken zu Ihren Indikatorausgaben hinzufügen, indem Sie das Klassenattribut CloudAttribute wie im folgenden Beispiel gezeigt verwenden:
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}}
Der Konstruktor CloudAttribute nimmt zwei Ausgabeliniennamen. Danach zeichnet er automatisch die Wolke so, dass sie dem Raum zwischen diesen beiden Ausgaben entspricht.
Sie können auch die Deckkraft der Wolke festlegen, indem Sie die Eigenschaft Opacity verwenden. Um die Farbe der Wolke festzulegen, verwenden Sie die Eigenschaft FirstColor. Standardmäßig entspricht die Farbe der Wolke der Farbe der ersten Linie in der Indikatorausgabe.
Mit Farben arbeiten
Die Algo-API enthält das Colorenum, das verwendet werden kann, um die Farben für Chart-Objekte, Chart-Steuerelemente und Ausgaben zu konfigurieren.
Die Werte des Colorenum repräsentieren häufig verwendete Farben. Sie können sie verwenden, ohne sich mit hexadezimalen oder ARGB-Farbcodes befassen zu müssen.
Beim Anpassen von Ausgaben können Sie deren Farben festlegen, indem Sie die String-Eigenschaft LineColor verwenden. Wie unten gezeigt, akzeptiert sie sowohl benannte Farben als auch hexadezimale Farbcodes.
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);
Farben können auch als anpassbare Parameter behandelt werden. Um Benutzern die Auswahl benutzerdefinierter Farben zu ermöglichen (z. B. die Farben der von einem Indikator gezeichneten Linien), deklarieren Sie einen Parameter vom Typ Color.
Im folgenden Beispiel erstellen wir einen einfachen (High Minus Low) Indikator, der nach der Initialisierung Text auf dem Handelschart anzeigt, an den er angehängt ist.
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);}}}
Ausgabetypen
Es gibt mehrere verschiedene Ausgabetypen, die für benutzerdefinierte Indikatoren verfügbar sind:
Line - eine durchgehende Linie.
DiscontinuousLine - eine nicht durchgehende Linie, die für Fälle nützlich ist, in denen Ihr Indikator nicht immer einen Berechnungswert hat.
Points - ein Punkt oder ein Punkt für jeden Balken.
Histogram - eine Reihe von vertikalen Balken. Wenn Sie diesen Typ verwenden, setzen Sie die Eigenschaft IsOverlay Ihres Indikators auf false.
Um einen Ausgabetyp festzulegen, verwenden Sie die Eigenschaft PlotType wie unten gezeigt.
Der Typ enum wird benötigt, um Parameter zu erstellen, die mehrere vordefinierte Optionen haben, aus denen Benutzer wählen können. Wir verwenden den Typ enum im folgenden Beispiel:
Wenn Sie diesen Parameter zu einem Indikator oder cBot hinzufügen, sehen Sie ein interaktives Menü mit mehreren Optionen, mit dem Sie einen der angegebenen enum-Werte auswählen können.
Mit Zeit arbeiten
Plattform- und Serverzeit
Sie können die aktuelle Serverzeit abrufen, indem Sie entweder auf die Eigenschaften Server.Time oder Server.TimeInUtc zugreifen.
Die Eigenschaft Server.Time repräsentiert die aktuelle Zeit in der Zeitzone Ihres Indikators oder cBots, die über die Eigenschaft TimeZone festgelegt wurde.
Balkenöffnungszeit
Verwenden Sie die Sammlung Bars.OpenTime, um die Balkenöffnungszeiten abzurufen. Die Zeitzone basiert auf der Zeitzone, die Sie im Klassenattribut TimeZone angegeben haben.
Verwenden Sie die Eigenschaft Application.UserTimeOffset, um die Zeitzone der Plattform des Benutzers abzurufen. Dies wird hauptsächlich verwendet, um die Zeit Ihres Indikators in die Zeitzone des Benutzers zu konvertieren.
Die Eigenschaft Application.UserTimeOffset gibt ein TimeSpan-Objekt zurück, das den vom Benutzer in seiner cTrader-Plattform festgelegten Zeitversatz im Vergleich zur UTC-Zeit darstellt.
Sie können sich auch benachrichtigen lassen, wenn ein Benutzer den Zeitversatz seiner Plattform ändert. Verwenden Sie dazu das Ereignis Application.UserTimeOffsetChanged.
cTrader unterstützt dedizierte Datums- und Zeitparametertypen, mit denen Sie stark typisierte Datums- und Zeitwerte als Eingabe für Ihre Algos erhalten können, anstatt den Parametertyp string zu verwenden.
Durch die Verwendung der neuen Datums- und Zeitparametertypen können Sie Werte in der Zeitzone Ihres Algos mit integrierter Mindest- und Höchstwertvalidierung und vollständiger Optimierungsunterstützung erhalten, genau wie bei anderen Parametertypen.
Um einen bestimmten Zeitwert über einen anpassbaren Parameter zu erhalten, können Sie diese C#-Typen verwenden:
DateTime
DateOnly
TimeSpan
Nachfolgend finden Sie ein Beispiel, wie dies durchgeführt werden kann: