Ver en GitHub

Estrategia de revendedor histórico

Descripción general

Histo Scalper Strategy es una adaptación de C# del asesor experto MetaTrader HistoScalperEA v1.0. El algoritmo fusiona ocho indicadores de estilo histograma (ADX, ATR, Bollinger bandas, potencia de toros/osos, CCI, MACD, RSI y Stochastic) y requiere un acuerdo unánime de todos los filtros habilitados antes de abrir una operación. Un segundo requisito es que al menos un filtro informe la dirección opuesta en la barra anterior, lo que evita que la estrategia entre durante mercados planos e imita la lógica de confirmación original de "dos barras".

Generación de señal

  1. Filtro ADX: comprueba si +DI es mayor que −DI. Opcionalmente, invierta la decisión.
  2. Filtro ATR: compara el ATR actual con una línea base SMA y mide la desviación porcentual. Las operaciones largas requieren una desviación positiva por encima de AtrPositiveThreshold; Las operaciones cortas requieren una desviación negativa por debajo de AtrNegativeThreshold.
  3. Bollinger ruptura: espera que el precio de cierre rompa la banda superior/inferior.
  4. Poder de Bulls/Bears: utiliza Bulls Power para entradas largas y magnitud de Bears Power para entradas cortas.
  5. CCI: se activa cuando el valor de CCI cruza los niveles de sobreventa/sobrecompra configurados.
  6. MACD histograma: mide la distancia entre MACD y su línea de señal.
  7. RSI – utiliza zonas clásicas de sobreventa/sobrecompra.
  8. Stochastic: lee la línea %K y la compara con los límites configurados.

Si algún filtro habilitado produce un valor neutral, la estrategia cancela el procesamiento de la vela actual. El estado histórico de cada filtro se almacena para aplicar la regla de "barra anterior opuesta".

Gestión del riesgo

  • Las entradas al mercado utilizan el parámetro TradeVolume.
  • La piramidización opcional se suma a las posiciones abiertas; de lo contrario, la estrategia sólo cambia de dirección cuando cambia la señal.
  • Los niveles de toma de ganancias y límite de pérdidas se expresan en incrementos del precio del instrumento y se aplican inmediatamente después del envío de la orden a través de SetTakeProfit y SetStopLoss.
  • Un filtro de sesión (UseTimeFilter, SessionStart, SessionEnd) puede deshabilitar el comercio fuera del horario configurado.

Parámetros

Parámetro Descripción
TradeVolume Volumen base para nuevas operaciones.
AllowPyramiding Permite acumular operaciones adicionales mientras ya está posicionada.
CloseOnOppositeSignal Cierra posiciones existentes cuando la señal agregada cambia.
UseTimeFilter, SessionStart, SessionEnd Restringe el comercio a una ventana diaria personalizada.
UseTakeProfit, TakeProfitPoints Habilita y configura la toma de ganancias en pasos de precio.
UseStopLoss, StopLossPoints Habilita y configura stop loss en pasos de precio.
UseIndicator1UseIndicator8 Habilite filtros individuales.
ModeIndicatorX Cambie entre lógica directa e invertida para cada filtro.
Configuraciones específicas del indicador Períodos, umbrales y niveles que replican los aportes originales del asesor experto.

Diferencias con el experto MQL

  • Se omiten intencionadamente la gestión de pérdidas y ganancias de la cesta, las alertas sonoras y la gestión de pedidos de la red.
  • No se incluye la automatización de riesgos (tamaño de lote de automóviles, equilibrio y lógica de seguimiento); utilice los parámetros de riesgo anteriores en su lugar.
  • Los controles de diferenciales y las protecciones específicas de los corredores no se transfieren.

Notas de uso

  1. Establezca Security y Portfolio antes de comenzar la estrategia.
  2. Ajuste el tipo de vela (CandleType) para que coincida con el período de tiempo deseado.
  3. Configure los umbrales de los indicadores para que se ajusten a la volatilidad del instrumento objetivo.
  4. Habilite o deshabilite los filtros individualmente para simplificar la optimización.
  5. Utilice AllowPyramiding y CloseOnOppositeSignal para controlar la exposición durante los mercados rápidos.
namespace StockSharp.Samples.Strategies;

using System;

using Ecng.Common;

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

/// <summary>
/// Multi-indicator scalping strategy combining MACD, RSI, and CCI filters.
/// Buys when all indicators agree on bullish signal. Sells on bearish agreement.
/// </summary>
public class HistoScalperStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _rsiPeriod;
	private readonly StrategyParam<int> _cciPeriod;

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

	public int RsiPeriod
	{
		get => _rsiPeriod.Value;
		set => _rsiPeriod.Value = value;
	}

	public int CciPeriod
	{
		get => _cciPeriod.Value;
		set => _cciPeriod.Value = value;
	}

	public HistoScalperStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");

		_rsiPeriod = Param(nameof(RsiPeriod), 14)
			.SetGreaterThanZero()
			.SetDisplay("RSI Period", "RSI period", "Indicators");

		_cciPeriod = Param(nameof(CciPeriod), 14)
			.SetGreaterThanZero()
			.SetDisplay("CCI Period", "CCI period", "Indicators");
	}

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

		var macd = new MovingAverageConvergenceDivergence();
		var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
		var cci = new CommodityChannelIndex { Length = CciPeriod };

		decimal? prevMacd = null;

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(macd, rsi, cci, (candle, macdLine, rsiVal, cciVal) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				if (prevMacd.HasValue)
				{
					if (prevMacd.Value <= 0 && macdLine > 0 && rsiVal < 70m && cciVal > -100m && Position <= 0)
						BuyMarket();
					else if (prevMacd.Value >= 0 && macdLine < 0 && rsiVal > 30m && cciVal < 100m && Position >= 0)
						SellMarket();
				}

				prevMacd = macdLine;
			})
			.Start();

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