Ver en GitHub

Parabolic SAR Multitemporal

Combina señales de Parabolic SAR de múltiples marcos temporales. Las operaciones largas se activan cuando el precio se mantiene por encima de los niveles SAR seleccionados por los parámetros. Las operaciones cortas aparecen cuando el precio cae por debajo de los SAR elegidos. Hay disponibles stop loss, stop trailing y toma de ganancias opcionales.

Detalles

  • Criterios de entrada:
    • Largo: Precio por encima del SAR según la configuración LongSource.
    • Corto: Precio por debajo del SAR según la configuración ShortSource.
  • Criterios de salida:
    • Cruce opuesto del SAR o activación de protecciones.
  • Indicadores:
    • Parabolic SAR en el marco temporal actual
    • Parabolic SAR opcional en marcos temporales superiores e inferiores
  • Stops: Stop loss, stop trailing y toma de ganancias opcionales mediante StartProtection.
  • Valores predeterminados:
    • Acceleration = 0.02
    • MaxAcceleration = 0.2
    • StopLossPercent = 1
    • TrailingPercent = 0.5
    • TakeProfitPercent = 2
  • Filtros:
    • Marco temporal: principal 5m, superior 1d, inferior 1m
    • Indicadores: Parabolic SAR
    • Stops: opcional
    • Complejidad: Moderado
using System;
using System.Linq;
using System.Collections.Generic;

using Ecng.Common;
using Ecng.Collections;
using Ecng.Serialization;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Parabolic SAR-style strategy using EMA and RSI.
/// </summary>
public class MultiTimeframeParabolicSarStrategy : 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 MultiTimeframeParabolicSarStrategy()
	{
		_emaLength = Param(nameof(EmaLength), 20)
			.SetGreaterThanZero()
			.SetDisplay("EMA", "EMA period", "Indicators");
		_rsiLength = Param(nameof(RsiLength), 14)
			.SetGreaterThanZero()
			.SetDisplay("RSI", "RSI period", "Indicators");
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(2).TimeFrame())
			.SetDisplay("Candle Type", "Type of candles", "General");
	}

	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, (candle, emaVal, rsiVal) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!ema.IsFormed || !rsi.IsFormed)
					return;

				// Buy when price above EMA and RSI confirms uptrend
				if (candle.ClosePrice > emaVal && rsiVal > 50 && Position <= 0)
					BuyMarket();
				// Sell when price below EMA and RSI confirms downtrend
				else if (candle.ClosePrice < emaVal && rsiVal < 50 && Position > 0)
					SellMarket();
			})
			.Start();

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