Ver en GitHub

Estrategia de Scalping Renko

Esta estrategia intenta capturar momentum a corto plazo comparando el cierre actual con el cierre anterior. Si la última vela cierra más alto que la anterior, la estrategia abre una posición larga. Si la última vela cierra más bajo que la anterior, abre una posición corta.

Los stops y el trailing stop opcional son gestionados a través del módulo de protección integrado. El enfoque funciona en ambos lados del mercado y se basa únicamente en la acción del precio.

Detalles

  • Criterios de entrada:
    • Largo: Close(t) > Close(t-1).
    • Corto: Close(t) < Close(t-1).
  • Largo/Corto: Ambos.
  • Criterios de salida: Señal opuesta o stops de protección.
  • Stops: Trailing stop, stop loss y take profit opcionales mediante StartProtection.
  • Valores predeterminados:
    • CandleType = 1 minuto.
    • StopLossPercent = 1.
    • TakeProfitPercent = 2.
    • IsTrailingStop = true.
  • Filtros:
    • Categoría: Scalping.
    • Dirección: Ambos.
    • Indicadores: Ninguno.
    • Stops: Sí.
    • Complejidad: Simple.
    • Marco temporal: Corto plazo.
    • Estacionalidad: No.
    • Redes neuronales: No.
    • Divergencia: No.
    • Nivel de riesgo: Alto.
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>
/// Renko scalper strategy.
/// Opens long when close moves significantly above previous close, short when below.
/// </summary>
public class RenkoScalperStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;

	private decimal _previousClose;
	private bool _hasPrev;

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

	public RenkoScalperStrategy()
	{
		_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 OnReseted()
	{
		base.OnReseted();
		_previousClose = 0;
		_hasPrev = false;
	}

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

		var stdev = new StandardDeviation { Length = 20 };
		SubscribeCandles(CandleType).Bind(stdev, ProcessCandle).Start();
	}

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

		var close = candle.ClosePrice;

		if (!_hasPrev)
		{
			_previousClose = close;
			_hasPrev = true;
			return;
		}

		if (stdevVal <= 0) { _previousClose = close; return; }

		var diff = close - _previousClose;

		if (diff > stdevVal && Position <= 0)
		{
			if (Position < 0) BuyMarket();
			BuyMarket();
		}
		else if (diff < -stdevVal && Position >= 0)
		{
			if (Position > 0) SellMarket();
			SellMarket();
		}

		_previousClose = close;
	}
}