Ver en GitHub

Estrategia Limits Martin

Esta estrategia coloca órdenes límite pareadas por encima y por debajo del precio de mercado actual. Cada operación usa una distancia de paso configurable y un dimensionamiento de posición martingala opcional para recuperar pérdidas anteriores.

Parámetros

  • Step – distancia en pips entre el precio de mercado y las órdenes límite pendientes.
  • Stop Loss – tamaño del stop protector en pips para posiciones abiertas.
  • Take Profit – tamaño del objetivo de ganancia en pips para posiciones abiertas.
  • Use Martingale – habilita el incremento de volumen tras una operación perdedora.
  • Loss Limit – número máximo de operaciones perdedoras consecutivas antes de restablecer el volumen.
  • Volume – volumen inicial de la orden.
  • Use MegaLot – duplica el volumen en lugar de agregar el volumen base cuando el martingala está activo.
  • Candle Type – tipo de datos de velas usado para el procesamiento.

Lógica de operación

  1. Cuando no hay posición abierta ni orden activa, la estrategia coloca una orden Buy Limit por debajo del último cierre y una orden Sell Limit por encima, ambas a la distancia Step especificada.
  2. Tras la ejecución de una orden, la orden pendiente opuesta permanece, permitiendo solo una posición activa a la vez.
  3. La posición se cierra cuando se alcanza el nivel de stop loss o take profit.
  4. Tras una operación perdedora, el volumen de posición puede incrementarse según la configuración del martingala.

Notas

  • La estrategia utiliza la API de alto nivel de StockSharp con el enfoque Bind para el manejo de datos de velas.
  • Todos los comentarios dentro del código están escritos en inglés para cumplir las convenciones del repositorio.
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>
/// Simple martingale strategy with RSI-based entries.
/// Buys when RSI is oversold, sells when overbought.
/// </summary>
public class LimitsMartinStrategy : Strategy
{
	private readonly StrategyParam<int> _rsiPeriod;
	private readonly StrategyParam<decimal> _oversold;
	private readonly StrategyParam<decimal> _overbought;
	private readonly StrategyParam<DataType> _candleType;

	public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }
	public decimal Oversold { get => _oversold.Value; set => _oversold.Value = value; }
	public decimal Overbought { get => _overbought.Value; set => _overbought.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public LimitsMartinStrategy()
	{
		_rsiPeriod = Param(nameof(RsiPeriod), 14)
			.SetGreaterThanZero()
			.SetDisplay("RSI Period", "Period for RSI", "Indicators");

		_oversold = Param(nameof(Oversold), 30m)
			.SetDisplay("Oversold", "RSI oversold level", "Indicators");

		_overbought = Param(nameof(Overbought), 70m)
			.SetDisplay("Overbought", "RSI overbought level", "Indicators");

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

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

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

		var rsi = new RelativeStrengthIndex { Length = RsiPeriod };

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

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

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

		if (!IsFormedAndOnlineAndAllowTrading())
			return;

		if (rsiValue < Oversold && Position <= 0)
			BuyMarket();
		else if (rsiValue > Overbought && Position >= 0)
			SellMarket();
	}
}