Ver en GitHub

Alligator Estrategia de cruce de velas

Esta estrategia transfiere los expertos de MetaTrader vela de cocodrilo cruzada hacia arriba/abajo al API de alto nivel de StockSharp. Supervisa el indicador Bill Williams Alligator creado a partir de promedios móviles suavizados del precio medio y reacciona cada vez que el cuerpo de una vela completa viaja de un lado de la boca Alligator al otro. Las entradas se pueden restringir a direcciones alcistas, bajistas o ambas a través de un parámetro, mientras que los objetivos y paradas fijos basados ​​en pips se encargan de la gestión de riesgos.

Lógica comercial

Preparación de indicadores

  • Calcule la Alligator Mandíbula, Dientes y Labios usando promedios móviles suavizados con las longitudes clásicas 13/8/5.
  • Aplique los tradicionales desplazamientos hacia adelante (8/5/3 barras por defecto) para que cada línea se compare con la vela que se forma frente a ella.
  • Todos los precios se toman como muestra de la mediana de velas (High + Low) / 2 para que coincidan con la implementación de MetaTrader.

Configuración larga ("vela cruzada hacia arriba")

  1. La vela terminada anterior debe cerrar en o por debajo de la línea Alligator más baja (después de aplicar el cambio).
  2. El cuerpo de la vela actual se abre en o por debajo del valor Alligator desplazado más alto y cierra por encima de ese mismo valor, lo que demuestra que el cuerpo cruzó la boca Alligator en dirección ascendente.
  3. Actualmente no hay ninguna posición abierta y se permite la negociación.
  4. Cuando todas las condiciones se alinean, la estrategia envía una Compra de mercado para el volumen configurado.

Configuración corta ("vela cruzada hacia abajo")

  1. El cierre anterior debe estar en o por encima de la línea Alligator desplazada más alta.
  2. El cuerpo de la vela actual se abre en o por encima del valor más bajo desplazado Alligator y termina por debajo de él, confirmando un cruce bajista a través del Alligator.
  3. No hay ninguna posición abierta y el comercio está habilitado.
  4. Se envía una orden de mercado Venta para el volumen configurado.

Gestión de posiciones

  • Cuando se abre una nueva posición, la estrategia convierte las distancias de stop-loss y take-profit de pips en precios absolutos utilizando el paso del precio del símbolo.
  • Las posiciones largas salen cuando la vela toca el stop-loss, alcanza el objetivo o se cierra por debajo del mínimo de las líneas desplazadas de Dientes y Labios.
  • Las posiciones cortas salen en el stop-loss, el objetivo o un cierre por encima del máximo de los valores desplazados de Dientes y Labios.
  • La llamada incorporada StartProtection se activa al inicio para garantizar que los llenados anormales se cierren de forma segura.

Parámetros

Nombre Tipo Predeterminado Descripción
OrderVolume decimal 0.1 Tamaño del comercio en lotes o contratos.
StopLossPips int 50 Distancia desde el precio de entrada hasta el stop de protección en pips. Cero desactiva la parada.
TakeProfitPips int 50 Distancia desde la entrada hasta el objetivo de beneficio fijo en pips. Cero desactiva el objetivo.
JawPeriod int 13 Longitud promedio móvil suavizada para la línea de la mandíbula (azul) Alligator.
JawShift int 8 Desplazamiento hacia adelante aplicado a la línea de la mandíbula antes de evaluar las señales.
TeethPeriod int 8 Longitud promedio móvil suavizada para la línea de dientes Alligator (roja).
TeethShift int 5 Desplazamiento hacia adelante de la línea de dientes.
LipsPeriod int 5 Longitud promedio móvil suavizada para la línea de labios (verde) Alligator.
LipsShift int 3 Desplazamiento hacia adelante de la línea de los labios.
CandleType DataType TimeSpan.FromHours(1).TimeFrame() Serie de velas utilizadas para los cálculos.
EntryMode AlligatorCrossMode Both Elige si la estrategia opera con configuraciones largas, cortas o ambas.

Notas de uso

  • Funciona en cualquier instrumento compatible con StockSharp; asegúrese de que CandleType coincida con el período de tiempo utilizado en la plantilla MetaTrader original.
  • Los pips se deducen del paso del precio del instrumento: para cotizaciones de 3 o 5 decimales (por ejemplo, EURUSD), el pip equivale a diez pasos del precio.
  • La lógica actúa solo en velas completadas y no se basa en datos de ticks, lo que la mantiene alineada con MetaTrader backtests.
namespace StockSharp.Samples.Strategies;

using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;

/// <summary>
/// Alligator Candle Cross strategy: DEMA trend crossover.
/// Buys when close crosses above DEMA, sells when close crosses below.
/// </summary>
public class AlligatorCandleCrossStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _period;

	private decimal _prevClose;
	private decimal _prevDema;
	private bool _hasPrev;

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

	public AlligatorCandleCrossStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(60).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
		_period = Param(nameof(Period), 50)
			.SetGreaterThanZero()
			.SetDisplay("Period", "DEMA period", "Indicators");
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevClose = 0;
		_prevDema = 0;
		_hasPrev = false;
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_prevClose = 0;
		_prevDema = 0;
		_hasPrev = false;
		var dema = new ExponentialMovingAverage { Length = Period };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(dema, ProcessCandle).Start();
	}

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

		if (_hasPrev)
		{
			if (_prevClose <= _prevDema && candle.ClosePrice > demaValue && Position <= 0)
				BuyMarket();
			else if (_prevClose >= _prevDema && candle.ClosePrice < demaValue && Position >= 0)
				SellMarket();
		}

		_prevClose = candle.ClosePrice;
		_prevDema = demaValue;
		_hasPrev = true;
	}
}