Estrategia que utiliza el indicador DeMarker cruzando un umbral de 0.5 para abrir posiciones.
Cuando el DeMarker cae por debajo del umbral después de estar por encima, la estrategia compra. Cuando el DeMarker sube por encima del umbral después de estar por debajo, vende. La salida se produce en la señal opuesta. No se utiliza stop-loss ni take-profit.
Detalles
Criterios de entrada:
Largo: DeMarker cruza por debajo de Threshold
Corto: DeMarker cruza por encima de Threshold
Largo/Corto: Ambos
Criterios de salida: Señal opuesta
Stops: No
Valores predeterminados:
DeMarkerPeriod = 2
Threshold = 0.5
CandleType = TimeSpan.FromMinutes(1).TimeFrame()
Filtros:
Categoría: Indicador
Dirección: Ambos
Indicadores: DeMarker
Stops: No
Complejidad: Básico
Marco temporal: Intradía
Estacionalidad: No
Redes neuronales: No
Divergencia: No
Nivel de riesgo: Medio
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>
/// Strategy based on DeMarker crossing a threshold.
/// </summary>
public class ArdOrderManagementStrategy : Strategy
{
private readonly StrategyParam<int> _deMarkerPeriod;
private readonly StrategyParam<decimal> _threshold;
private readonly StrategyParam<DataType> _candleType;
private decimal _previousValue;
private bool _hasPrev;
public int DeMarkerPeriod
{
get => _deMarkerPeriod.Value;
set => _deMarkerPeriod.Value = value;
}
public decimal Threshold
{
get => _threshold.Value;
set => _threshold.Value = value;
}
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public ArdOrderManagementStrategy()
{
_deMarkerPeriod = Param(nameof(DeMarkerPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("DeMarker Period", "DeMarker indicator period", "Parameters");
_threshold = Param(nameof(Threshold), 0.5m)
.SetDisplay("Threshold", "DeMarker crossing level", "Parameters");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Type of candles", "General");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
=> [(Security, CandleType)];
protected override void OnReseted()
{
base.OnReseted();
_previousValue = 0;
_hasPrev = false;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var deMarker = new DeMarker { Length = DeMarkerPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(deMarker, ProcessCandle).Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, deMarker);
DrawOwnTrades(area);
}
}
private void ProcessCandle(ICandleMessage candle, decimal deMarkerValue)
{
if (candle.State != CandleStates.Finished)
return;
if (!_hasPrev)
{
_previousValue = deMarkerValue;
_hasPrev = true;
return;
}
var buySignal = _previousValue > Threshold && deMarkerValue < Threshold;
var sellSignal = _previousValue < Threshold && deMarkerValue > Threshold;
if (buySignal && Position <= 0)
BuyMarket();
else if (sellSignal && Position >= 0)
SellMarket();
_previousValue = deMarkerValue;
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import DeMarker
from StockSharp.Algo.Strategies import Strategy
class ard_order_management_strategy(Strategy):
def __init__(self):
super(ard_order_management_strategy, self).__init__()
self._de_marker_period = self.Param("DeMarkerPeriod", 14) \
.SetDisplay("DeMarker Period", "DeMarker indicator period", "Parameters")
self._threshold = self.Param("Threshold", 0.5) \
.SetDisplay("Threshold", "DeMarker crossing level", "Parameters")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Type of candles", "General")
self._previous_value = 0.0
self._has_prev = False
@property
def de_marker_period(self):
return self._de_marker_period.Value
@property
def threshold(self):
return self._threshold.Value
@property
def candle_type(self):
return self._candle_type.Value
def OnReseted(self):
super(ard_order_management_strategy, self).OnReseted()
self._previous_value = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(ard_order_management_strategy, self).OnStarted2(time)
de_marker = DeMarker()
de_marker.Length = self.de_marker_period
subscription = self.SubscribeCandles(self.candle_type)
subscription.Bind(de_marker, self.on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, de_marker)
self.DrawOwnTrades(area)
def on_process(self, candle, de_marker_value):
if candle.State != CandleStates.Finished:
return
if not self._has_prev:
self._previous_value = de_marker_value
self._has_prev = True
return
buy_signal = self._previous_value > self.threshold and de_marker_value < self.threshold
sell_signal = self._previous_value < self.threshold and de_marker_value > self.threshold
if buy_signal and self.Position <= 0:
self.BuyMarket()
elif sell_signal and self.Position >= 0:
self.SellMarket()
self._previous_value = de_marker_value
def CreateClone(self):
return ard_order_management_strategy()