Ver en GitHub

Estrategia de Inteligencia Artificial Perceptron

Esta estrategia utiliza los valores del Accelerator Oscillator (AC) como entradas de un perceptrón lineal simple. Cuatro lecturas de AC separadas siete barras se ponderan mediante coeficientes definidos por el usuario. Una salida positiva del perceptrón abre una posición larga, y una salida negativa abre una posición corta.

La estrategia siempre aplica un stop-loss. Si aparece una señal opuesta después de que el beneficio supere el doble del stop-loss, la posición se invierte con volumen aumentado. De lo contrario, el stop-loss se mueve al punto de equilibrio.

Detalles

  • Criterios de entrada:
    • Largo: Salida del perceptrón > 0.
    • Corto: Salida del perceptrón < 0.
  • Largo/Corto: Ambos.
  • Criterios de salida:
    • Señal opuesta con beneficio > 2 * StopLoss → reversión.
    • Señal opuesta con menor beneficio → stop movido a la entrada.
    • Stop-loss alcanzado.
  • Stops: Stop-loss fijo en puntos.
  • Filtros: Ninguno.

Parámetros

  • StopLoss – distancia del stop-loss en puntos (por defecto 850).
  • Shift – desplazamiento de barra para los valores del indicador (por defecto 1).
  • X1, X2, X3, X4 – pesos del perceptrón.
  • CandleType – marco temporal de velas.
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>
/// EMA crossover strategy.
/// </summary>
public class ArtificialIntelligencePerceptronStrategy : Strategy
{
	private readonly StrategyParam<int> _fastPeriod;
	private readonly StrategyParam<int> _slowPeriod;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevFast;
	private decimal _prevSlow;
	private bool _hasPrev;

	public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
	public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public ArtificialIntelligencePerceptronStrategy()
	{
		_fastPeriod = Param(nameof(FastPeriod), 12)
			.SetGreaterThanZero()
			.SetDisplay("Fast Period", "Fast EMA period", "Indicators");
		_slowPeriod = Param(nameof(SlowPeriod), 26)
			.SetGreaterThanZero()
			.SetDisplay("Slow Period", "Slow EMA period", "Indicators");
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
			.SetDisplay("Candle Type", "Candle type", "General");
	}

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

	protected override void OnReseted()
	{
		base.OnReseted();
		_prevFast = 0;
		_prevSlow = 0;
		_hasPrev = false;
	}

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

		var fast = new ExponentialMovingAverage { Length = FastPeriod };
		var slow = new ExponentialMovingAverage { Length = SlowPeriod };

		SubscribeCandles(CandleType)
			.Bind(fast, slow, ProcessCandle)
			.Start();
	}

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

		if (!_hasPrev)
		{
			_prevFast = fastVal;
			_prevSlow = slowVal;
			_hasPrev = true;
			return;
		}

		var crossUp = _prevFast <= _prevSlow && fastVal > slowVal;
		var crossDown = _prevFast >= _prevSlow && fastVal < slowVal;

		if (crossUp && Position <= 0)
		{
			if (Position < 0) BuyMarket();
			BuyMarket();
		}
		else if (crossDown && Position >= 0)
		{
			if (Position > 0) SellMarket();
			SellMarket();
		}

		_prevFast = fastVal;
		_prevSlow = slowVal;
	}
}