Ver no GitHub

Estratégia de Inteligência Artificial Perceptron

Esta estratégia usa os valores do Accelerator Oscillator (AC) como entradas de um perceptron linear simples. Quatro leituras de AC espaçadas sete barras são ponderadas por coeficientes definidos pelo usuário. Uma saída positiva do perceptron abre uma posição comprada, e uma saída negativa abre uma posição vendida.

A estratégia sempre aplica um stop-loss. Se um sinal oposto aparecer depois que o lucro ultrapassar o dobro do stop-loss, a posição é revertida com volume aumentado. Caso contrário, o stop-loss é movido para o ponto de equilíbrio.

Detalhes

  • Critérios de entrada:
    • Comprado: Saída do perceptron > 0.
    • Vendido: Saída do perceptron < 0.
  • Comprado/Vendido: Ambos.
  • Critérios de saída:
    • Sinal oposto com lucro > 2 * StopLoss → reversão.
    • Sinal oposto com lucro menor → stop movido para a entrada.
    • Stop-loss atingido.
  • Stops: Stop-loss fixo em pontos.
  • Filtros: Nenhum.

Parâmetros

  • StopLoss – distância do stop-loss em pontos (padrão 850).
  • Shift – deslocamento de barra para valores do indicador (padrão 1).
  • X1, X2, X3, X4 – pesos do perceptron.
  • CandleType – período 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;
	}
}