Estrategia Parabolic SAR de Compra Anticipada con Salida Basada en MA
Esta estrategia utiliza el indicador Parabolic SAR para entrar en operaciones cuando el indicador cambia de lado respecto al precio. Una media móvil simple proporciona una regla de salida adicional: las posiciones largas se cierran cuando el precio cae por debajo de la media móvil mientras el SAR está por encima del precio.
Detalles
Criterios de entrada: El SAR cambia de lado respecto al precio.
Largo/Corto: Ambos.
Criterios de salida: Para posiciones largas, salir cuando SAR > precio y precio < MA.
Stops: No definidos.
Valores predeterminados:
Acceleration = 0.02
AccelerationStep = 0.02
MaxAcceleration = 0.2
MaPeriod = 11
CandleType = 5 minutos
Filtros:
Categoría: Seguimiento de tendencia
Dirección: Ambos
Indicadores: Parabolic SAR, SMA
Stops: Ninguno
Complejidad: Básico
Marco temporal: Intradía
Estacionalidad: No
Redes neuronales: No
Divergencia: No
Nivel de riesgo: Medio
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// EMA crossover with RSI filter strategy.
/// </summary>
public class ParabolicSarEarlyBuyMaBasedExitStrategy : Strategy
{
private readonly StrategyParam<int> _maPeriod;
private readonly StrategyParam<DataType> _candleType;
public int MaPeriod { get => _maPeriod.Value; set => _maPeriod.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public ParabolicSarEarlyBuyMaBasedExitStrategy()
{
_maPeriod = Param(nameof(MaPeriod), 40).SetGreaterThanZero();
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame());
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var fast = new ExponentialMovingAverage { Length = 14 };
var slow = new ExponentialMovingAverage { Length = MaPeriod };
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);
}
}
}