Ten artykuł uzupełnia naszą obszerną listę przykładów kodu wskaźników. Rozwijamy niektóre koncepcje wspomniane w tych przykładach kodu i omawiamy kilka zaawansowanych funkcji, które możesz zaimplementować podczas tworzenia nowych wskaźników.
Atrybut chmury
Prawdopodobnie widziałeś przezroczyste chmury na wykresach handlowych.
Możesz dodać chmury do wyników swojego wskaźnika, używając atrybutu klasy CloudAttribute, jak pokazano w poniższym przykładzie:
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}}
Konstruktor CloudAttribute przyjmuje dwie nazwy linii wyjściowych. Następnie automatycznie rysuje chmurę, aby dopasować przestrzeń między tymi dwoma wynikami.
Możesz również ustawić krycie chmury, używając właściwości Opacity. Aby ustawić kolor chmury, użyj właściwości FirstColor. Domyślnie kolor chmury będzie odpowiadał kolorowi pierwszej linii w wyniku wskaźnika.
Pracuj z kolorami
Algo API zawiera enumColor, który może być używany do konfigurowania kolorów dla obiektów Chart, kontrolek wykresu i wyników.
Wartości enumColor reprezentują powszechnie używane kolory. Możesz ich używać bez konieczności zajmowania się szesnastkowymi lub ARGB kodami kolorów.
Podczas dostosowywania wyników możesz ustawić ich kolory, używając właściwości ciągu LineColor. Jak pokazano poniżej, akceptuje ona zarówno nazwane kolory, jak i szesnastkowe kody kolorów.
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);
Kolory mogą być również traktowane jako parametry konfigurowalne. Aby umożliwić użytkownikom wybór niestandardowych kolorów (na przykład kolorów linii rysowanych przez wskaźnik), zadeklaruj parametr typu Color.
W poniższym przykładzie tworzymy prosty wskaźnik (high minus low), który po zainicjowaniu wyświetla tekst na wykresie handlowym, do którego jest dołączony.
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);}}}
Typy wyników
Dostępnych jest kilka różnych typów wyników dla wskaźników niestandardowych:
Line - ciągła linia.
DiscontinuousLine - linia nieciągła, która jest przydatna w przypadkach, gdy wskaźnik nie zawsze ma wartość obliczeniową.
Points - punkt lub kropka dla każdego słupka.
Histogram - seria pionowych słupków. Podczas używania tego typu ustaw właściwość IsOverlay swojego wskaźnika na false.
Aby ustawić typ wyniku, użyj właściwości PlotType, jak pokazano poniżej.
Typ enum jest potrzebny do tworzenia parametrów, które mają kilka predefiniowanych opcji, z których użytkownicy mogą wybierać. Używamy typu enum w następującym przykładzie:
Właściwość Server.Time reprezentuje bieżący czas w strefie czasowej Twojego wskaźnika lub cBota ustalonej za pomocą właściwości TimeZone.
Czas otwarcia słupka
Użyj kolekcji Bars.OpenTime, aby uzyskać czasy otwarcia słupków. Strefa czasowa będzie oparta na strefie czasowej określonej w atrybucie klasy TimeZone.
Użyj właściwości Application.UserTimeOffset, aby uzyskać strefę czasową platformy użytkownika. Jest to używane głównie do konwersji czasu wskaźnika na strefę czasową użytkownika.
Właściwość Application.UserTimeOffset zwraca obiekt TimeSpan reprezentujący przesunięcie czasu ustawione przez użytkownika na jego platformie cTrader w porównaniu do czasu UTC.
Możesz również wybrać otrzymywanie powiadomień, gdy użytkownik zmieni przesunięcie czasu swojej platformy. Aby to zrobić, użyj zdarzenia Application.UserTimeOffsetChanged.
cTrader obsługuje dedykowane typy parametrów daty i czasu, które pozwalają uzyskać silnie typowane wartości daty i czasu jako dane wejściowe dla Twoich algorytmów zamiast używania typu parametru string.
Używając nowych typów parametrów daty i czasu, możesz uzyskać wartości w strefie czasowej swojego algorytmu z wbudowaną walidacją minimum i maksimum oraz pełną obsługą optymalizacji, tak jak w przypadku innych typów parametrów.
Aby uzyskać określoną wartość czasu za pomocą konfigurowalnego parametru, możesz użyć tych typów C#:
DateTime
DateOnly
TimeSpan
Poniżej znajduje się przykład, jak można to zrobić: