TemplateEAbyMarket ist eine direkte StockSharp-Portierung des ursprünglichen MetaTrader 4-Expertenberaters TemplateEAbyMarket.mq4. Die Strategie verwendet den Indikator „Moving Average Convergence Divergence“ (MACD), um Momentumverschiebungen zu erkennen. Wenn die MACD-Hauptlinie die Signallinie kreuzt, während sich beide Komponenten in derselben positiven oder negativen Zone befinden, eröffnet die Strategie eine Marktposition in der Richtung der Kreuzung. Ausstiege werden ausschließlich durch Schutzaufträge (Take Profit und Stop Loss) verwaltet, die über den integrierten StartProtection-Helfer konfiguriert werden.
Die Version StockSharp behält das Verhalten des Programms MQL bei: Sie öffnet nur neue Positionen, ohne zu versuchen, die Gegenseite automatisch zu schließen. Sobald eine Position besetzt ist, muss der Handel durch Schutzniveaus oder manuelle Eingriffe verwaltet werden.
Handelslogik
Abonnieren Sie den vom Benutzer ausgewählten Kerzentyp (Standard: 15-Minuten-Zeitrahmen).
Berechnen Sie MACD (standardmäßig 26.12.9) für jede fertige Kerze.
Verfolgen Sie die relative Position der MACD-Haupt- und Signalleitungen, um ein Crossover-Ereignis zu erkennen:
Bulnisches Setup: Bei der vorherigen Kerze lag die Hauptlinie unter der Signallinie, die aktuelle Kerze schließt mit der Hauptlinie über der Signallinie und beide Linien liegen über Null. Eine Marktkauforder mit OrderVolume wird übermittelt, wenn das aktuelle Engagement unter MaxOrders * OrderVolume liegt.
Bearisches Setup: Bei der vorherigen Kerze lag die Hauptlinie über der Signallinie, die aktuelle Kerze schließt mit der Hauptlinie unter der Signallinie und beide Linien liegen unter Null. Ein Market-Verkaufsauftrag mit OrderVolume wird vorbehaltlich der gleichen Exposure-Obergrenze übermittelt.
Die Schutzstufen takeProfit und stopLoss werden einmalig beim Start aktiviert. Die Strategie schließt entgegengesetzte Positionen nicht automatisch; Das Risiko wird durch das Schutzmodul oder durch den Benutzer kontrolliert.
Parameter
Name
Beschreibung
MacdFastPeriod
Schnelle EMA-Länge für die MACD-Berechnung.
MacdSlowPeriod
Langsame EMA-Länge für die MACD-Berechnung.
MacdSignalPeriod
Signallänge EMA für die MACD-Berechnung.
CandleType
Kerzentyp (Zeitrahmen), der den Indikator speist.
OrderVolume
Mit jeder Market-Order übermitteltes Volumen.
MaxOrders
Maximale Anzahl gleichzeitiger Bestellungen, ausgedrückt als Vielfaches von OrderVolume. Die Strategie prüft abs(Position) < MaxOrders * OrderVolume, bevor eine neue Bestellung gesendet wird.
TakeProfitPoints
Take-Profit-Distanz in Preispunkten. Der Wert 0 deaktiviert den Take-Profit.
StopLossPoints
Stop-Loss-Distanz in Preispunkten. Der Wert 0 deaktiviert den Stop-Loss.
Notizen
Slippage- und Magic Number-Einstellungen aus der MQL-Version werden absichtlich weggelassen, da sie in StockSharp anders gehandhabt werden.
Stellen Sie sicher, dass der Connector die richtigen Preisschritt-Metadaten bereitstellt. StartProtection interpretiert Entfernungen in Instrumentenpreispunkten.
Die Vorlage ist bewusst minimalistisch gehalten und verwaltet keine Teilfüllungen oder Pyramideneinträge über das Limit von MaxOrders hinaus.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Template EA by Market strategy: MACD histogram crossover with signal line.
/// </summary>
public class TemplateEAbyMarketStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private readonly StrategyParam<int> _signalPeriod;
private decimal _prevMacd;
private decimal _prevSignal;
private bool _hasPrev;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
public int SignalPeriod { get => _signalPeriod.Value; set => _signalPeriod.Value = value; }
public TemplateEAbyMarketStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_fastPeriod = Param(nameof(FastPeriod), 12)
.SetGreaterThanZero()
.SetDisplay("Fast Period", "MACD fast EMA", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 26)
.SetGreaterThanZero()
.SetDisplay("Slow Period", "MACD slow EMA", "Indicators");
_signalPeriod = Param(nameof(SignalPeriod), 9)
.SetGreaterThanZero()
.SetDisplay("Signal Period", "MACD signal period", "Indicators");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevMacd = 0m;
_prevSignal = 0m;
_hasPrev = false;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrev = false;
var macd = new MovingAverageConvergenceDivergenceSignal
{
Macd = { ShortMa = { Length = FastPeriod }, LongMa = { Length = SlowPeriod } },
SignalMa = { Length = SignalPeriod }
};
var subscription = SubscribeCandles(CandleType);
subscription.BindEx(macd, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, IIndicatorValue macdValue)
{
if (candle.State != CandleStates.Finished) return;
if (!macdValue.IsFinal) return;
var v = (MovingAverageConvergenceDivergenceSignalValue)macdValue;
if (v.Macd is not decimal macdLine || v.Signal is not decimal signal) return;
if (_hasPrev)
{
var prevHist = _prevMacd - _prevSignal;
var currHist = macdLine - signal;
if (prevHist <= 0 && currHist > 0 && Position <= 0)
BuyMarket();
else if (prevHist >= 0 && currHist < 0 && Position >= 0)
SellMarket();
}
_prevMacd = macdLine;
_prevSignal = signal;
_hasPrev = true;
}
}
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 MovingAverageConvergenceDivergenceSignal
from StockSharp.Algo.Strategies import Strategy
class template_e_aby_market_strategy(Strategy):
def __init__(self):
super(template_e_aby_market_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(30)))
self._fast_period = self.Param("FastPeriod", 12)
self._slow_period = self.Param("SlowPeriod", 26)
self._signal_period = self.Param("SignalPeriod", 9)
self._prev_macd = 0.0
self._prev_signal = 0.0
self._has_prev = False
@property
def CandleType(self):
return self._candle_type.Value
@CandleType.setter
def CandleType(self, value):
self._candle_type.Value = value
@property
def FastPeriod(self):
return self._fast_period.Value
@FastPeriod.setter
def FastPeriod(self, value):
self._fast_period.Value = value
@property
def SlowPeriod(self):
return self._slow_period.Value
@SlowPeriod.setter
def SlowPeriod(self, value):
self._slow_period.Value = value
@property
def SignalPeriod(self):
return self._signal_period.Value
@SignalPeriod.setter
def SignalPeriod(self, value):
self._signal_period.Value = value
def OnReseted(self):
super(template_e_aby_market_strategy, self).OnReseted()
self._prev_macd = 0.0
self._prev_signal = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(template_e_aby_market_strategy, self).OnStarted2(time)
self._has_prev = False
macd = MovingAverageConvergenceDivergenceSignal()
macd.Macd.ShortMa.Length = self.FastPeriod
macd.Macd.LongMa.Length = self.SlowPeriod
macd.SignalMa.Length = self.SignalPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.BindEx(macd, self._process_candle).Start()
def _process_candle(self, candle, macd_value):
if candle.State != CandleStates.Finished:
return
if not macd_value.IsFinal:
return
macd_line = macd_value.Macd
signal = macd_value.Signal
if macd_line is None or signal is None:
return
macd_line = float(macd_line)
signal = float(signal)
if self._has_prev:
prev_hist = self._prev_macd - self._prev_signal
curr_hist = macd_line - signal
if prev_hist <= 0 and curr_hist > 0 and self.Position <= 0:
self.BuyMarket()
elif prev_hist >= 0 and curr_hist < 0 and self.Position >= 0:
self.SellMarket()
self._prev_macd = macd_line
self._prev_signal = signal
self._has_prev = True
def CreateClone(self):
return template_e_aby_market_strategy()