Auf GitHub ansehen

Virtual TradePad Signal-Strategie

Diese Strategie recreiert die Multi-Indikator-Dashboard-Logik des MetaTrader VirtualTradePad-Tools. Sie verfolgt zwölf Signale – trendbasiert, auf Momentum und Kanälen basierend – und handelt nur, wenn eine konfigurierbare Anzahl von Indikatoren übereinstimmt. Das Ziel ist, die visuelle Sentiment-Matrix des Originalpanels nachzubilden und in eine vollautomatisierte StockSharp-Strategie umzuwandeln.

Funktionsweise

  • Daten: handelt ein einzelnes Instrument auf dem ausgewählten Kerzentyp (Standard: 15 Minuten).
  • Indikatoren:
    • Schnelle/langsame einfache gleitende Durchschnitte für die Kreuzungsrichtung.
    • MACD-Linie und Signal-Kreuzung.
    • Stochastik %K Überverkauft/Überkauft-Ausstiege (Level 20/80).
    • RSI 30/70 Schwellenwert-Umkehrungen.
    • CCI -100/+100 Umkehrungen.
    • Williams %R -80/-20 Umkehrungen.
    • Bollinger-Bänder Ausbruch zurück in den Kanal.
    • Gleitender Durchschnitt Envelope Ausbruch zurück in den Kanal.
    • Bill Williams Alligator Kiefer/Zähne/Lippen-Ausrichtung.
    • Kaufman Adaptive Moving Average Steigung (steigend/fallend).
    • Awesome Oscillator Nulllinien-Kreuzungen.
    • Ichimoku Tenkan-Kijun-Kreuzung.
  • Jeder Indikator erzeugt eine Kauf- (+1), Verkauf- (-1) oder neutrale (0) Stimme. Wenn die Anzahl der Kaufstimmen (oder Verkaufsstimmen) den Parameter MinimumConfirmations erreicht und die Gegenseite übertrifft, eröffnet die Strategie eine Position in dieser Richtung.
  • Die optionale CloseOnOpposite-Option schließt die Position, wenn die gegenteilige Stimmenzahl den Schwellenwert erreicht.
  • Risikomanagement: optionaler Take-Profit und Stop-Loss, definiert in Preisschritten des Instruments.

Parameter

  • FastMaLength, SlowMaLength – Längen der gleitenden Durchschnitte für die Kreuzung.
  • MacdFastLength, MacdSlowLength, MacdSignalLength – MACD-Konfiguration.
  • StochasticLength, StochasticDLength, StochasticSlowing – Stochastik-Oszillator-Einstellungen.
  • RsiLength, CciLength, WilliamsLength – Lookbacks der Oszillatoren.
  • BollingerLength, BollingerDeviation – Bollinger-Bänder.
  • EnvelopeLength, EnvelopeDeviation – prozentuale Envelopes um den SMA.
  • AlligatorJawLength, AlligatorTeethLength, AlligatorLipsLength – Alligator SMMAs.
  • AmaLength, AmaFastPeriod, AmaSlowPeriod – Kaufman AMA-Konfiguration.
  • IchimokuTenkanLength, IchimokuKijunLength, IchimokuSenkouLength – Ichimoku-Linien.
  • AoShortPeriod, AoLongPeriod – Awesome Oscillator-Fenster.
  • MinimumConfirmations – Anzahl der übereinstimmenden Signale, die für den Einstieg erforderlich sind.
  • AllowLong, AllowShort – Long/Short-Seiten aktivieren.
  • CloseOnOpposite – Ausstieg, wenn die gegenteilige Stimmenzahl den Schwellenwert erfüllt.
  • TakeProfitPips, StopLossPips – optionale Risikoziele in Preisschritten (0 deaktiviert).
  • CandleType – Zeitrahmen/Datentyp für die Analyse.

Zusammenfassung der Handelslogik

  1. Alle Indikatoren aktualisieren, wenn eine Kerze schließt.
  2. Bullische und bärische Stimmen der Indikatoren zählen.
  3. Long/Short einsteigen, wenn Stimmen den Bestätigungsschwellenwert erreichen und die Gegenseite übertreffen.
  4. Optional glätten, wenn die Gegenseite den Schwellenwert erreicht.
  5. Optionalen Take-Profit/Stop-Loss in Preisschritten anwenden.

Die Strategie ist für Ermessenstrader konzipiert, denen das VirtualTradePad-Sentiment-Board gefiel, aber eine automatisierte Implementierung innerhalb des StockSharp-Frameworks wünschen.

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;
	}
}