Стратегия использует индикатор DeMarker и открывает позиции при пересечении уровня 0.5.
Когда DeMarker опускается ниже порога после того, как находился выше, стратегия покупает. Когда DeMarker поднимается выше порога после того, как находился ниже, стратегия продаёт. Выход выполняется по противоположному сигналу. Стопов нет.
Детали
Условия входа:
Long: DeMarker пересекает Threshold сверху вниз
Short: DeMarker пересекает Threshold снизу вверх
Long/Short: Оба направления
Условия выхода: Противоположный сигнал
Стопы: Нет
Значения по умолчанию:
DeMarkerPeriod = 2
Threshold = 0.5
CandleType = TimeSpan.FromMinutes(1).TimeFrame()
Фильтры:
Категория: Индикаторы
Направление: Оба
Индикаторы: DeMarker
Стопы: Нет
Сложность: Базовая
Таймфрейм: Внутридневной
Сезонность: Нет
Нейросети: Нет
Дивергенция: Нет
Уровень риска: Средний
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()