Открыть на GitHub

Стратегия Color Schaff JCCX Trend Cycle

Данная стратегия является C# конверсией MQL5 эксперта Exp_ColorSchaffJCCXTrendCycle. Используется осциллятор Schaff Trend Cycle (STC) на основе алгоритма JCCX.

Логика торговли

  • На каждой завершённой свече рассчитывается значение Schaff Trend Cycle.
  • Когда осциллятор опускается ниже уровня High Level после его превышения, открывается длинная позиция и закрываются короткие.
  • Когда осциллятор поднимается выше уровня Low Level после его пробоя снизу, открывается короткая позиция и закрываются длинные.

Параметры

Название Описание
Fast JCCX Быстрый период JCCX индикатора.
Slow JCCX Медленный период JCCX индикатора.
Smoothing Коэффициент сглаживания JJMA.
Phase Параметр фазы JJMA.
Cycle Длина цикла для расчёта Schaff Trend.
High Level Верхний триггерный уровень осциллятора.
Low Level Нижний триггерный уровень осциллятора.
Open Long Разрешить открытие длинных позиций.
Open Short Разрешить открытие коротких позиций.
Close Long Разрешить закрытие длинных позиций.
Close Short Разрешить закрытие коротких позиций.

Примечания

Стратегия использует высокоуровневый API StockSharp и работает только с завершёнными свечами. Управление капиталом упрощено и предназначено для демонстрации возможностей.

using System;
using System.Collections.Generic;

using Ecng.Common;

using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Strategy based on the Schaff Trend Cycle indicator level crossovers.
/// </summary>
public class ColorSchaffJccxTrendCycleStrategy : Strategy
{
	private readonly StrategyParam<decimal> _highLevel;
	private readonly StrategyParam<decimal> _lowLevel;
	private readonly StrategyParam<DataType> _candleType;

	private decimal? _prev;

	public decimal HighLevel { get => _highLevel.Value; set => _highLevel.Value = value; }
	public decimal LowLevel { get => _lowLevel.Value; set => _lowLevel.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public ColorSchaffJccxTrendCycleStrategy()
	{
		_highLevel = Param(nameof(HighLevel), 75m)
			.SetDisplay("High Level", "Upper trigger level", "Signal");

		_lowLevel = Param(nameof(LowLevel), 25m)
			.SetDisplay("Low Level", "Lower trigger level", "Signal");

		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
	}

	/// <inheritdoc />
	public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
	{
		return [(Security, CandleType)];
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prev = null;
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		var stc = new SchaffTrendCycle();

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(stc, ProcessCandle)
			.Start();

		var area = CreateChartArea();
		if (area != null)
		{
			DrawCandles(area, subscription);
			DrawIndicator(area, stc);
			DrawOwnTrades(area);
		}
	}

	private void ProcessCandle(ICandleMessage candle, decimal stc)
	{
		if (candle.State != CandleStates.Finished)
			return;

		if (_prev is null)
		{
			_prev = stc;
			return;
		}

		if (_prev > HighLevel && stc <= HighLevel && Position <= 0)
		{
			if (Position < 0) BuyMarket();
			BuyMarket();
		}
		else if (_prev < LowLevel && stc >= LowLevel && Position >= 0)
		{
			if (Position > 0) SellMarket();
			SellMarket();
		}

		_prev = stc;
	}
}