Создан cBot, который использует CRTIndicator для установки уровней стоп-лосса и тейк-профита.
Идея заключается в использовании уровней CRT (high, mid, low) предыдущей свечи (указанной параметром CandleIndex) для установки стоп-лосса и тейк-профита для новой сделки.
Шаги:
- Мы создадим cBot, который открывает сделку (покупку или продажу) на основе некоторого условия (которое мы определим как параметр для тестирования).
- Мы используем CRTIndicator, чтобы получить уровни с предыдущей свечи (индекс свечи задаётся пользователем).
- Для сделки на покупку мы установим стоп-лосс на CRT low и тейк-профит на CRT high эталонной свечи.
- Для сделки на продажу мы установим стоп-лосс на CRT high и тейк-профит на CRT low эталонной свечи.
Однако обратите внимание, что CRTIndicator, который у нас есть, только вычисляет уровни для каждой свечи и отображает их.
Нам нужно получить доступ к индикатору из cBot и получить значения для конкретной свечи, которая нас интересует.
Давайте спроектируем cBot:
Параметры:
- CandleIndex: какую предыдущую свечу использовать (0 = текущая, 1 = предыдущая и т.д.)
- TradeType: мы можем задать параметр для выбора между покупкой и продажей для тестирования, или использовать сигнал (например, пересечение скользящих средних) для принятия решения.
Для простоты сделаем параметр для выбора типа сделки.
Но учтите: в реальной торговле мы бы использовали условия для входа. Мы сделаем простой cBot, который открывает сделку на текущей свече, если нет открытой позиции.
Предположим, что мы торгуем на таймфрейме графика.
Шаги в cBot:
- Проверить, есть ли открытая позиция. Если нет, рассмотреть возможность открытия.
- Получить значения CRTIndicator для указанного CandleIndex (который является прошлой свечой относительно текущей).
- Для сделки на покупку:
Стоп-лосс = CRT Low эталонной свечи
Тейк-профит = CRT High эталонной свечи - Для сделки на продажу:
Стоп-лосс = CRT High эталонной свечи
Тейк-профит = CRT Low эталонной свечи
Однако обратите внимание, что индикатор вычисляет для каждого индекса. Мы отображаем одни и те же значения для каждого индекса (потому что используем фиксированный сдвиг CandleIndex).
Но в cBot мы хотим получить уровни из индикатора в текущий момент (самая последняя завершённая свеча) для указанного CandleIndex.
Важно: метод Calculate индикатора вызывается для каждого индекса, и он сохраняет значения для эталонной свечи (индекс - CandleIndex) на текущем индексе.
Так что если мы хотим получить уровни CRT для конкретной исторической свечи, мы можем просто прочитать выходные серии индикатора на индексе этой свечи?
Но обратите внимание: выходы индикатора выровнены по текущему индексу. Фактически индикатор отображает одно и то же значение для каждой свечи, потому что мы устанавливаем:
CRTHigh[index] = crtHigh; // где crtHigh — это максимум свечи (index - CandleIndex)
Так что если мы находимся на индексе 100 и CandleIndex=1, то мы получаем максимум индекса 99 и отображаем его на индексе 100.
Это означает, что если нам нужны уровни CRT для свечи, которая была CandleIndex свечей назад, мы можем получить выход индикатора на текущей свече (индексе) и это даст нам уровни с задержкой в CandleIndex свечей.
Но подождите, в cBot мы будем запускать OnBar или OnTick. Нас интересует самая последняя завершённая свеча (индекс = MarketSeries.Close.Count - 2), а свеча, которая нам нужна — это (текущий индекс - CandleIndex).
Альтернативно, мы можем изменить индикатор, чтобы он выводил уровни на том же индексе, что и эталонная свеча, но тогда нам пришлось бы сдвигать график на CandleIndex.
Однако текущий индикатор спроектирован так, чтобы отображать уровни на текущей свече, взятые с предыдущей. Так что если мы установим CandleIndex=1, то на каждой свече мы отображаем уровни с предыдущей свечи.
Как мы можем использовать это в cBot:
Мы добавим индикатор в cBot и затем получим значения для самой последней свечи (индекс = MarketSeries.Close.Count - 1), и это даст нам уровни с задержкой в CandleIndex свечей.
Пример:
Индекс текущей свечи = последняя свеча (индекс = MarketSeries.Close.Count - 1)
Тогда выход индикатора на этом индексе (CRTHigh[MarketSeries.Close.Count-1]) — это максимум свечи (текущий индекс - CandleIndex).
Но обратите внимание: метод Calculate индикатора вызывается для каждой исторической свечи, а затем для каждой новой. Так что выходная серия для последней свечи будет содержать нужное нам значение.
Давайте напишем код cBot:
У нас будут параметры:
[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; }
Также создадим экземпляр CRTIndicator.
Шаги в OnBar:
если нет открытой позиции, то открыть новую с установленными стоп-лоссом и тейк-профитом, взятыми из выхода индикатора для текущей свечи (что соответствует уровням с задержкой в CandleIndex свечей).
Однако обратите внимание: выход индикатора для текущей свечи (последней) установлен на уровни свечи (индекс текущей свечи - CandleIndex). Но когда мы в самом начале, нужно убедиться, что у нас достаточно свечей.