Открыть на GitHub

Стратегия Virtual TradePad Signal

Стратегия переносит логику панели VirtualTradePad из MetaTrader в StockSharp. Она отслеживает двенадцать индикаторов (трендовых, каналовых и осцилляторов) и открывает сделку только тогда, когда заданное количество сигналов совпадает по направлению. Таким образом визуальная матрица настроений из оригинальной панели превращается в полностью автоматизированный алгоритм.

Как это работает

  • Данные: торговля одним инструментом на выбранном типе свечей (по умолчанию 15 минут).
  • Индикаторы:
    • Пересечение двух простых скользящих средних.
    • Пересечение линий MACD и сигнальной EMA.
    • Выход стохастика %K из зон 20/80.
    • RSI с порогами 30/70.
    • CCI с уровнями -100/+100.
    • Williams %R с уровнями -80/-20.
    • Возврат цены внутрь полос Боллинджера.
    • Возврат внутрь процентных Envelope вокруг SMA.
    • Расположение челюсти, зубов и губ Аллигатора Билла Вильямса.
    • Наклон адаптивной скользящей Kaufman (рост/падение).
    • Пересечение нулевой линии Awesome Oscillator.
    • Пересечение линий Tenkan и Kijun индикатора Ichimoku.
  • Каждый индикатор даёт голос: +1 (покупка), -1 (продажа) или 0 (нейтрально). Когда число голосов за покупку (или продажу) достигает параметра MinimumConfirmations и превышает противоположное, открывается позиция.
  • Опция CloseOnOpposite закрывает позицию, когда противоположные сигналы удовлетворяют порогу.
  • Управление риском: необязательные тейк-профит и стоп-лосс в шагах цены инструмента.

Параметры

  • FastMaLength, SlowMaLength — длины скользящих средних.
  • MacdFastLength, MacdSlowLength, MacdSignalLength — параметры MACD.
  • StochasticLength, StochasticDLength, StochasticSlowing — настройки стохастика.
  • RsiLength, CciLength, WilliamsLength — периоды осцилляторов.
  • BollingerLength, BollingerDeviation — полосы Боллинджера.
  • EnvelopeLength, EnvelopeDeviation — ширина SMA-Envelope в процентах.
  • AlligatorJawLength, AlligatorTeethLength, AlligatorLipsLength — периоды SММА Аллигатора.
  • AmaLength, AmaFastPeriod, AmaSlowPeriod — параметры адаптивной средней Kaufman.
  • IchimokuTenkanLength, IchimokuKijunLength, IchimokuSenkouLength — линии Ichimoku.
  • AoShortPeriod, AoLongPeriod — окна Awesome Oscillator.
  • MinimumConfirmations — количество совпадающих сигналов для входа.
  • AllowLong, AllowShort — разрешение лонгов и шортов.
  • CloseOnOpposite — закрытие при противоположных сигналах.
  • TakeProfitPips, StopLossPips — необязательные цели/стопы в шагах цены (0 отключает).
  • CandleType — таймфрейм/тип данных.

Алгоритм торговли

  1. На закрытии свечи обновляются все индикаторы.
  2. Подсчитываются «бычьи» и «медвежьи» голоса.
  3. Вход выполняется, когда нужное количество голосов превысило порог и противоположную сторону.
  4. При необходимости позиция закрывается по противоположным сигналам.
  5. Применяются заданные тейк-профит и стоп-лосс.

Стратегия предназначена для трейдеров, которым нравилась панель VirtualTradePad, но требуется автоматизация внутри StockSharp.

using System;
using System.Collections.Generic;

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

namespace StockSharp.Samples.Strategies;

public class VirtualTradePadSignalStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _cciPeriod;
	private decimal? _prevCci;

	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
	public int CciPeriod { get => _cciPeriod.Value; set => _cciPeriod.Value = value; }

	public VirtualTradePadSignalStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame()).SetDisplay("Candle Type", "Timeframe", "General");
		_cciPeriod = Param(nameof(CciPeriod), 20).SetGreaterThanZero().SetDisplay("CCI Period", "CCI lookback", "Indicators");
	}

	public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities() => [(Security, CandleType)];

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

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_prevCci = null;
		var cci = new CommodityChannelIndex { Length = CciPeriod };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(cci, ProcessCandle).Start();
		var area = CreateChartArea();
		if (area != null) { DrawCandles(area, subscription); DrawOwnTrades(area); }
	}

	private void ProcessCandle(ICandleMessage candle, decimal cciVal)
	{
		if (candle.State != CandleStates.Finished) return;
		if (!IsFormedAndOnlineAndAllowTrading()) { _prevCci = cciVal; return; }
		if (_prevCci == null) { _prevCci = cciVal; return; }
		if (_prevCci.Value < 0m && cciVal >= 0m && Position <= 0) { if (Position < 0) BuyMarket(); BuyMarket(); }
		else if (_prevCci.Value > 0m && cciVal <= 0m && Position >= 0) { if (Position > 0) SellMarket(); SellMarket(); }
		_prevCci = cciVal;
	}
}