Przejdź do treści

Typy parametrów w cTrader Algo

W tym artykule i odpowiadającym mu filmie pokażemy, jak możesz deklarować i używać konfigurowalnych parametrów w swoich cBotach i wskaźnikach. Opracujemy prosty wskaźnik i pokażemy Ci, jak skonfigurować parametry z interfejsu użytkownika cTrader. Wyjaśnimy również, jakiego rodzaju parametrów możesz używać w cBocie lub wskaźniku cTrader i zilustrujemy, jak są one deklarowane i używane w Twoim kodzie.

Konfigurowalne parametry

Konfigurowalne parametry to konfigurowalne wartości, które można ustawić podczas dodawania, uruchamiania lub używania algorytmu. Pozwalają Tobie i innym użytkownikom dostosować zachowanie cBotów, wskaźników i wtyczek bez modyfikowania kodu źródłowego.

Używanie parametrów w cBotach, wskaźnikach i wtyczkach

  • W przypadku cBotów możesz konfigurować zmienne lub ustawienia, które wpływają na wykonanie, takie jak poziomy stop loss i take profit.
  • W przypadku wskaźników możesz konfigurować zmienne, które wpływają na wyniki wskaźnika, takie jak rozważane okresy lub źródło danych, które ma być używane.
  • W przypadku wtyczek możesz konfigurować zmienne, takie jak opcje interfejsu użytkownika lub klucze API, które określają, jak wtyczka współdziała z interfejsem lub usługami zewnętrznymi.

Jak wyjaśniono wcześniej, cTrader obsługuje te typy parametrów:

  • int
  • double
  • string
  • bool
  • DataSeries
  • TimeFrame
  • enum
  • Color
  • DateTime
  • DateOnly
  • TimeSpan
  • Symbol
  • Symbol[] (multi-symbol)
  • Enum[] (multi-enum)
  • TimeFrame[] (multi-period)

Uwaga

Algorytmy Python używają konfigurowalnych parametrów zadeklarowanych w ich plikach .cs.

Tworzenie prostego wskaźnika z parametrami

Aby zademonstrować, jak możesz używać parametrów we wskaźnikach niestandardowych, utworzymy nowy wskaźnik i nazwiemy go Standard Deviation.

Aby obliczyć odchylenie standardowe, musimy najpierw obliczyć średnią ruchomą ceny. Następnie zadeklarujemy parametry potrzebne dla wskaźnika średniej ruchomej, zaczynając od okresu średniej ruchomej.

1
public int MaPeriod { get; set; }

Każda właściwość publiczna, która ma jeden z obsługiwanych typów, może stać się parametrem wskaźnika. Aby przekształcić naszą właściwość MaPeriod w parametr, wystarczy dodać wymaganą deklarację.

1
2
[Parameter("MA Period")]
public int MaPeriod { get; set; }

Atrybut Parameter instruuje cTrader, aby przedstawił tę właściwość jako parametr w panelu parametrów wskaźnika, używając zdefiniowanej nazwy ("MA Period").

Jak pokazano poniżej, atrybut Parameter pozwala również zdefiniować niektóre właściwości parametru, takie jak wyświetlana nazwa, wartość domyślna, grupa, w której ten parametr zostanie umieszczony, wartości maksymalne i minimalne, a także krok, o który parametr będzie się zmieniał po naciśnięciu strzałek w górę i w dół (tylko dla wartości liczbowych).

1
2
[Parameter("SMA Period", DefaultValue = 14, Group = "MA", MaxValue = 100, MinValue = 1, Step = 1)]
public int MaPeriod { get; set; }

Teraz dodamy pozostałe parametry potrzebne dla wskaźnika średniej ruchomej. Parametr MaType pomoże nam określić typ średniej ruchomej. Jest to enum, który pojawi się jako menu rozwijane w interfejsie użytkownika cTrader.

1
2
[Parameter("MA Type", Group = "MA")]
public MovingAverageType MaType { get; set; }

Parametr Source da użytkownikom możliwość określenia źródła danych dla naszego wskaźnika średniej ruchomej. Ten parametr jest typu DataSeries.

1
2
[Parameter("Source", Group = "MA")]
public DataSeries Source { get; set; }

Teraz, gdy wymagane parametry są zadeklarowane, zdefiniujemy i zainicjujemy naszą średnią ruchomą.

1
2
3
4
5
6
private MovingAverage movingAverage;

protected override void Initialize()
{
    movingAverage = Indicators.MovingAverage(Source, MaPeriod, MaType);
}

W tym momencie jesteśmy gotowi do zaimplementowania obliczeń dla naszego odchylenia standardowego. Domyślny szablon kodu zawiera już właściwość Output, której możemy użyć do wyświetlenia wyników obliczeń.

1
2
[Output("Result", LineColor = "Orange")]
public IndicatorDataSeries Result { get; set; }

Wreszcie, ale nie mniej ważne, zaimplementujemy obliczenia odchylenia standardowego w metodzie Calculate().

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public override void Calculate(int index)
{
    var average = movingAverage.Result[index];

    double sum = 0;

    for (var period = 0; period < MaPeriod; period++)
    {
        sum += Math.Pow(Source[index - period] - average, 2.0);
    }

    Result[index] = Math.Sqrt(sum / MaPeriod);
}

Jeśli dodamy nasz wskaźnik do wykresu, powinniśmy zobaczyć wszystkie nasze parametry w oknie Dodaj instancję.

Dodaj dodatkowe parametry

Po ukończeniu naszego odchylenia standardowego możemy również dodać linię poziomą, która będzie służyć jako wizualny próg dla wskaźnika. W tym celu będziemy musieli dodać kilka dodatkowych parametrów.

Pierwszy z nich będzie parametrem logicznym, który określi, czy nasza linia będzie wyświetlana, czy nie.

1
2
[Parameter("Show Line", DefaultValue = true, Group = "Line")]
public bool ShowLine { get; set; }

Parametr LineLevel pozwoli nam określić poziom ceny, na którym linia powinna zostać narysowana.

1
2
[Parameter("Line Level", DefaultValue = 0.001, Step = 0.001, Group = "Line")]
public double LineLevel { get; set; }

Dodamy również parametr umożliwiający wybór koloru linii.

1
2
[Parameter("Line Color", DefaultValue = "Blue", Group = "Line")]
public Color LineColor { get; set; }

Mając wszystkie niezbędne parametry na miejscu, możemy napisać kod do narysowania linii na wykresie, do którego dołączony jest nasz wskaźnik.

1
2
3
4
if (ShowLine)
{
    Chart.IndicatorAreas[0].DrawHorizontalLine("Line", LineLevel, LineColor);
}

Jeśli ponownie zbudujemy wskaźnik i dodamy nową instancję, będziemy mogli ukryć/pokazać linię, przesunąć ją w górę lub w dół i wybrać kolor według naszego wyboru jako kolor linii.

Jak pokazano w poniższym przykładzie, parametry mogą być również używane do zapewnienia, że nasz wskaźnik jest wyświetlany tylko wtedy, gdy zostanie dodany do wykresów dla określonych ram czasowych.

1
2
[Parameter("Timeframe")]
public TimeFrame TF { get; set; }

W metodzie Initialize() sprawdzimy ramy czasowe wykresu, do którego dołączony jest nasz wskaźnik. Jeśli nie są równe wartości parametru TF, zapobiegniemy wyświetlaniu wskaźnika.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
protected override void Initialize()
{
    if (TimeFrame != TF)
        return;

    movingAverage = Indicators.MovingAverage(Source, MaPeriod, MaType);

    if (ShowLine)
    {
        Chart.IndicatorAreas[0].DrawHorizontalLine("Line", LineLevel, LineColor);
    }
}

Mamy nadzieję, że ten przewodnik był pomocny w zrozumieniu parametrów i sposobu ich działania w handlu algorytmicznym cTrader.