Strategie, die den DeMarker-Indikator verwendet, der einen Schwellenwert von 0.5 kreuzt, um Positionen zu eröffnen.
Wenn DeMarker nach einem Rückgang unter den Schwellenwert fällt, kauft die Strategie. Wenn DeMarker nach einem Anstieg über den Schwellenwert steigt, verkauft sie. Der Ausstieg erfolgt beim entgegengesetzten Signal. Es werden weder Stop-Loss noch Take-Profit verwendet.
Details
Einstiegskriterien:
Long: DeMarker kreuzt Threshold von oben nach unten
Short: DeMarker kreuzt Threshold von unten nach oben
Long/Short: Beide
Ausstiegskriterien: Entgegengesetztes Signal
Stops: Nein
Standardwerte:
DeMarkerPeriod = 2
Threshold = 0.5
CandleType = TimeSpan.FromMinutes(1).TimeFrame()
Filter:
Kategorie: Indikator
Richtung: Beide
Indikatoren: DeMarker
Stops: Nein
Komplexität: Grundlegend
Zeitrahmen: Intraday
Saisonalität: Nein
Neuronale Netze: Nein
Divergenz: Nein
Risikolevel: Mittel
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()