Auf GitHub ansehen

Shuriken Lite-Strategie

Diese Strategie repliziert die Funktionalität des originalen Shuriken Lite MQL-Tools. Sie verfolgt ausgeführte Trades auf dem Konto und gruppiert sie nach numerischen Identifikatoren, den sogenannten magic numbers. Für jede Gruppe berechnet die Strategie:

  • Anzahl der Trades
  • Gewinn- und Verlust-Trades
  • Gesamtgewinn oder -verlust in Pips
  • Profit-Faktor

Die Statistiken werden nach jedem neuen Trade protokolliert, wenn die Punktanzeigedarstellung aktiviert ist.

Parameter

  • Magic Numbers — kommagetrennte Liste von Identifikatoren zur Gruppierung von Trades. Jeder Identifikator sollte dem numerischen Wert im Orderkommentar entsprechen.
  • Show Scores — Protokollierung der Statistiken aktivieren oder deaktivieren.

Verwendung

  1. Legen Sie die gewünschten magic numbers im Parameter fest.
  2. Führen Sie die Strategie zusammen mit anderen Strategien aus, die numerische Kommentare in ihre Orders schreiben.
  3. Überprüfen Sie das Protokoll auf die aggregierten Performance-Metriken.
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>
/// Shuriken Lite - fast EMA/RSI scalping strategy.
/// </summary>
public class ShurikenLiteStrategy : Strategy
{
	private readonly StrategyParam<int> _emaLength;
	private readonly StrategyParam<int> _rsiLength;
	private readonly StrategyParam<DataType> _candleType;

	public int EmaLength { get => _emaLength.Value; set => _emaLength.Value = value; }
	public int RsiLength { get => _rsiLength.Value; set => _rsiLength.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public ShurikenLiteStrategy()
	{
		_emaLength = Param(nameof(EmaLength), 14)
			.SetGreaterThanZero()
			.SetDisplay("EMA", "EMA period", "Indicators");

		_rsiLength = Param(nameof(RsiLength), 7)
			.SetGreaterThanZero()
			.SetDisplay("RSI", "RSI period", "Indicators");

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

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

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		var ema = new ExponentialMovingAverage { Length = EmaLength };
		var rsi = new RelativeStrengthIndex { Length = RsiLength };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(ema, rsi, ProcessCandle)
			.Start();
	}

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

		var close = candle.ClosePrice;

		// Buy when RSI oversold
		if (rsi < 30 && Position <= 0)
		{
			if (Position < 0) BuyMarket();
			BuyMarket();
		}
		// Sell when RSI overbought
		else if (rsi > 70 && Position >= 0)
		{
			if (Position > 0) SellMarket();
			SellMarket();
		}
	}
}