Utworzono cBot, który używa CRTIndicator do ustawiania poziomów stop loss i take profit.
Pomysł polega na wykorzystaniu poziomów CRT (wysoki, średni, niski) z poprzedniej świecy (określonej przez CandleIndex) do ustawienia stop loss i take profit dla nowej transakcji.
Kroki:
- Stworzymy cBot, który otwiera transakcję (kupno lub sprzedaż) na podstawie pewnego warunku (który zdefiniujemy jako parametr do testów).
- Użyjemy CRTIndicator, aby pobrać poziomy z poprzedniej świecy (indeks świecy jest ustawiany przez użytkownika).
- Dla transakcji kupna ustawimy stop loss na CRT low i take profit na CRT high świecy referencyjnej.
- Dla transakcji sprzedaży ustawimy stop loss na CRT high i take profit na CRT low świecy referencyjnej.
Jednak zauważ, że CRTIndicator, który mamy, tylko oblicza poziomy dla każdej świecy i je wyświetla.
Musimy uzyskać dostęp do wskaźnika z cBota i pobrać wartości dla konkretnej świecy, którą nas interesuje.
Zaprojektujmy cBot:
Parametry:
- CandleIndex: która poprzednia świeca ma być użyta (0 = bieżąca, 1 = poprzednia itd.)
- TradeType: możemy ustawić parametr, aby wybrać między Kupnem a Sprzedażą do testów, lub możemy użyć sygnału (np. przecięcia średnich kroczących) do decyzji.
Dla uproszczenia zróbmy parametr do wyboru typu transakcji.
Ale uwaga: w handlu na żywo używalibyśmy pewnych warunków do wejścia. Zrobimy prostego cBota, który otwiera transakcję na bieżącej świecy, jeśli nie ma otwartej pozycji.
Załóżmy, że handlujemy na ramie czasowej wykresu.
Kroki w cBocie:
- Sprawdź, czy mamy otwartą pozycję. Jeśli nie, rozważ otwarcie.
- Pobierz wartości CRTIndicator dla określonego CandleIndex (który jest świecą z przeszłości względem bieżącej).
- Dla transakcji Kupna:
Stop Loss = CRT Low świecy referencyjnej
Take Profit = CRT High świecy referencyjnej - Dla transakcji Sprzedaży:
Stop Loss = CRT High świecy referencyjnej
Take Profit = CRT Low świecy referencyjnej
Jednak zauważ, że wskaźnik oblicza dla każdego indeksu. Wyświetlamy te same wartości dla każdego indeksu (ponieważ używamy stałego przesunięcia CandleIndex).
Ale w cBocie chcemy pobrać poziomy ze wskaźnika w czasie bieżącym (najbardziej ostatnia zakończona świeca) dla określonego CandleIndex.
Ważne: Metoda Calculate wskaźnika jest wywoływana dla każdego indeksu i przechowuje wartości dla świecy referencyjnej (indeks - CandleIndex) na bieżącym indeksie.
Więc jeśli chcemy pobrać poziomy CRT dla konkretnej świecy historycznej, możemy po prostu odczytać serię wyjściową wskaźnika na indeksie tej świecy?
Ale uwaga: wyjścia wskaźnika są wyrównane do bieżącego indeksu. W rzeczywistości wskaźnik wyświetla tę samą wartość dla każdego słupka, ponieważ ustawiamy:
CRTHigh[index] = crtHigh; // gdzie crtHigh to high świecy (index - CandleIndex)
Więc jeśli jesteśmy na indeksie 100 i CandleIndex=1, to pobieramy high z indeksu 99 i wyświetlamy go na indeksie 100.
To oznacza, że jeśli chcemy poziomy CRT dla świecy sprzed CandleIndex słupków, możemy pobrać wyjście wskaźnika na bieżącym słupku (indeks) i to da nam poziomy sprzed CandleIndex słupków.
Ale chwila, w cBocie będziemy uruchamiać OnBar lub OnTick. Interesuje nas najbardziej ostatni zakończony słupek (indeks = MarketSeries.Close.Count - 2), a świeca, którą chcemy, to (bieżący indeks - CandleIndex).
Alternatywnie możemy zmienić wskaźnik, aby wyświetlał poziomy na tym samym indeksie co świeca referencyjna, ale wtedy musielibyśmy przesunąć wykres o CandleIndex.
Jednak obecny wskaźnik jest zaprojektowany do wyświetlania poziomów na bieżącym słupku z poprzedniego słupka. Więc jeśli ustawimy CandleIndex=1, to na każdym słupku wyświetlamy poziomy z poprzedniego słupka.
Jak możemy go użyć w cBocie:
Dodamy wskaźnik do cBota, a następnie pobierzemy wartości dla najbardziej ostatniego słupka (indeks = MarketSeries.Close.Count - 1), co da nam poziomy sprzed CandleIndex słupków.
Przykład:
Indeks bieżącego słupka = ostatni słupek (indeks = MarketSeries.Close.Count - 1)
Wtedy wyjście wskaźnika na tym indeksie (CRTHigh[MarketSeries.Close.Count-1]) to high słupka (bieżący indeks - CandleIndex).
Ale uwaga: metoda Calculate wskaźnika jest wywoływana dla każdego historycznego słupka, a potem dla każdego nowego słupka. Więc seria wyjściowa dla ostatniego słupka będzie miała wartość, której chcemy.
Zakodujmy cBota:
Będziemy mieli parametry:
[Parameter("Candle Index", DefaultValue = 1, MinValue = 0)]
public int CandleIndex { get; set; }
[Parameter("Trade Type", DefaultValue = TradeType.Buy)]
public TradeType SelectedTradeType { get; set; }
[Parameter("Volume (Lots)", DefaultValue = 1, MinValue = 0.01, Step = 0.01)]
public double Volume { get; set; }
Stworzymy również instancję CRTIndicator.
Kroki w OnBar:
jeśli nie ma pozycji, otwórz nową pozycję ze stop lossem i take profitem ustawionym na podstawie wyjścia wskaźnika dla bieżącego słupka (który odpowiada poziomom sprzed CandleIndex słupków).
Jednak uwaga: wyjście wskaźnika dla bieżącego słupka (ostatniego słupka) jest ustawione na poziomy słupka (bieżący indeks - CandleIndex). Ale gdy jesteśmy na samym początku, musimy upewnić się, że mamy wystarczającą liczbę słupków.