Ver en GitHub

Sistema de Confirmación de Volumen para una Tendencia (Estrategia)

Esta estrategia utiliza el Indicador de Impulso de Tendencia (TTI), el Indicador de Confirmación de Precio por Volumen (VPCI) y el ADX para confirmar tendencias alcistas.

Detalles

  • Criterios de entrada:
    • Largo: ADX > 30, TTI > señal, VPCI > 0.
  • Largo/Corto: Solo largos.
  • Criterios de salida:
    • VPCI < 0.
  • Stops: No.
  • Valores predeterminados:
    • ADX Length = 14
    • ADX Smoothing = 14
    • TTI Fast Average = 13
    • TTI Slow Average = 26
    • TTI Signal Length = 9
    • VPCI Short Avg = 5
    • VPCI Long Avg = 25
  • Filtros:
    • Categoría: Tendencia
    • Dirección: Largo
    • Indicadores: ADX, TTI, VPCI
    • Stops: No
    • Complejidad: Medio
    • Marco temporal: Medio plazo
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>
/// Volume Confirmation For A Trend System strategy using EMA crossover.
/// </summary>
public class VolumeConfirmationForATrendSystemStrategy : Strategy
{
	private readonly StrategyParam<int> _slowLength;
	private readonly StrategyParam<DataType> _candleType;

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

	public VolumeConfirmationForATrendSystemStrategy()
	{
		_slowLength = Param(nameof(SlowLength), 40)
			.SetGreaterThanZero()
			.SetDisplay("Slow Length", "Slow EMA period", "General");

		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
			.SetDisplay("Candle Type", "Candle type", "General");
	}

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

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		var fast = new ExponentialMovingAverage { Length = 14 };
		var slow = new ExponentialMovingAverage { Length = SlowLength };
		var prevF = 0m; var prevS = 0m; var init = false;
		var lastSignal = DateTimeOffset.MinValue;
		var cooldown = TimeSpan.FromMinutes(360);
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(fast, slow, (candle, f, s) =>
		{
			if (candle.State != CandleStates.Finished) return;
			if (!fast.IsFormed || !slow.IsFormed) return;
			if (!init) { prevF = f; prevS = s; init = true; return; }
			if (candle.OpenTime - lastSignal >= cooldown)
			{
				if (prevF <= prevS && f > s && Position <= 0) { BuyMarket(); lastSignal = candle.OpenTime; }
				else if (prevF >= prevS && f < s && Position >= 0) { SellMarket(); lastSignal = candle.OpenTime; }
			}
			prevF = f; prevS = s;
		}).Start();
		var area = CreateChartArea();
		if (area != null) { DrawCandles(area, subscription); DrawIndicator(area, fast); DrawIndicator(area, slow); DrawOwnTrades(area); }
	}
}