Ein Trendfolge-Ansatz, der einen Satz von gleitenden Durchschnitten verwendet, die wie eine Ampel eingefärbt sind, um die Handelsrichtung zu bestimmen.
Die Strategie wartet darauf, dass der Preis innerhalb einer vordefinierten Zone liegt, und prüft dann die Reihenfolge der Durchschnitte, bevor sie in den Markt einsteigt.
Details
Einstiegszone:
Standard: Der Preis muss zwischen dem roten (langsamen) und dem gelben (mittleren) SMA liegen.
Wenn UseBlueRange aktiviert ist: Der Preis muss zwischen den Hoch- und Tieflinien des blauen EMA-Kanals liegen.
Einstiegskriterien:
Long: green EMA > blueHigh EMA > yellow SMA > red SMA und price > green EMA.
Short: green EMA < blueLow EMA < yellow SMA < red SMA und price < green EMA.
Ausstiegskriterien:
Optional: Wenn CloseOnCross aktiviert ist, wird die Position geschlossen, wenn der grüne EMA den gelben SMA in der entgegengesetzten Richtung kreuzt.
Stops: Optionaler Take-Profit und Stop-Loss gemessen in Preisschritten.
Long/Short: Beide Richtungen.
Standardwerte:
RedMaPeriod = 120
YellowMaPeriod = 55
GreenMaPeriod = 5
BlueMaPeriod = 24
CandleType = TimeSpan.FromMinutes(5).TimeFrame()
TakeProfitTicks = 120
StopLossTicks = 60
UseBlueRange = false
CloseOnCross = true
Filter:
Kategorie: Trendfolge
Richtung: Beide
Indikatoren: Gleitende Durchschnitte
Stops: Optional
Komplexität: Mittel
Zeitrahmen: Intraday
Saisonalität: Nein
Neuronale Netze: Nein
Divergenz: Nein
Risikolevel: Moderat
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>
/// Trend following strategy using multiple moving averages similar to a traffic light.
/// Enter long when fast average is above slower ones, short when below.
/// </summary>
public class TrafficLightStrategy : Strategy
{
private readonly StrategyParam<int> _redMaPeriod;
private readonly StrategyParam<int> _yellowMaPeriod;
private readonly StrategyParam<int> _greenMaPeriod;
private readonly StrategyParam<DataType> _candleType;
public int RedMaPeriod { get => _redMaPeriod.Value; set => _redMaPeriod.Value = value; }
public int YellowMaPeriod { get => _yellowMaPeriod.Value; set => _yellowMaPeriod.Value = value; }
public int GreenMaPeriod { get => _greenMaPeriod.Value; set => _greenMaPeriod.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public TrafficLightStrategy()
{
_redMaPeriod = Param(nameof(RedMaPeriod), 50)
.SetGreaterThanZero()
.SetDisplay("Red MA", "EMA period representing the slow trend", "Parameters");
_yellowMaPeriod = Param(nameof(YellowMaPeriod), 25)
.SetGreaterThanZero()
.SetDisplay("Yellow MA", "EMA period representing the medium trend", "Parameters");
_greenMaPeriod = Param(nameof(GreenMaPeriod), 5)
.SetGreaterThanZero()
.SetDisplay("Green MA", "EMA period representing the fast trend", "Parameters");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Timeframe for calculations", "General");
}
/// <inheritdoc />
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
{
return [(Security, CandleType)];
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var redMa = new ExponentialMovingAverage { Length = RedMaPeriod };
var yellowMa = new ExponentialMovingAverage { Length = YellowMaPeriod };
var greenMa = new ExponentialMovingAverage { Length = GreenMaPeriod };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(redMa, yellowMa, greenMa, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, decimal red, decimal yellow, decimal green)
{
if (candle.State != CandleStates.Finished)
return;
var price = candle.ClosePrice;
// Long: green > yellow > red and price above green
if (green > yellow && yellow > red && price > green && Position <= 0)
{
if (Position < 0) BuyMarket();
BuyMarket();
}
// Short: green < yellow < red and price below green
else if (green < yellow && yellow < red && price < green && Position >= 0)
{
if (Position > 0) SellMarket();
SellMarket();
}
// Close on cross
else if (Position > 0 && green < yellow)
{
SellMarket();
}
else if (Position < 0 && green > yellow)
{
BuyMarket();
}
}
}
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 ExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class traffic_light_strategy(Strategy):
def __init__(self):
super(traffic_light_strategy, self).__init__()
self._red_ma_period = self.Param("RedMaPeriod", 50) \
.SetDisplay("Red MA", "EMA period representing the slow trend", "Parameters")
self._yellow_ma_period = self.Param("YellowMaPeriod", 25) \
.SetDisplay("Yellow MA", "EMA period representing the medium trend", "Parameters")
self._green_ma_period = self.Param("GreenMaPeriod", 5) \
.SetDisplay("Green MA", "EMA period representing the fast trend", "Parameters")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Timeframe for calculations", "General")
@property
def RedMaPeriod(self):
return self._red_ma_period.Value
@RedMaPeriod.setter
def RedMaPeriod(self, value):
self._red_ma_period.Value = value
@property
def YellowMaPeriod(self):
return self._yellow_ma_period.Value
@YellowMaPeriod.setter
def YellowMaPeriod(self, value):
self._yellow_ma_period.Value = value
@property
def GreenMaPeriod(self):
return self._green_ma_period.Value
@GreenMaPeriod.setter
def GreenMaPeriod(self, value):
self._green_ma_period.Value = value
@property
def CandleType(self):
return self._candle_type.Value
@CandleType.setter
def CandleType(self, value):
self._candle_type.Value = value
def OnStarted2(self, time):
super(traffic_light_strategy, self).OnStarted2(time)
red_ma = ExponentialMovingAverage()
red_ma.Length = self.RedMaPeriod
yellow_ma = ExponentialMovingAverage()
yellow_ma.Length = self.YellowMaPeriod
green_ma = ExponentialMovingAverage()
green_ma.Length = self.GreenMaPeriod
self.SubscribeCandles(self.CandleType) \
.Bind(red_ma, yellow_ma, green_ma, self.ProcessCandle) \
.Start()
def ProcessCandle(self, candle, red, yellow, green):
if candle.State != CandleStates.Finished:
return
red_f = float(red)
yellow_f = float(yellow)
green_f = float(green)
price = float(candle.ClosePrice)
if green_f > yellow_f and yellow_f > red_f and price > green_f and self.Position <= 0:
if self.Position < 0:
self.BuyMarket()
self.BuyMarket()
elif green_f < yellow_f and yellow_f < red_f and price < green_f and self.Position >= 0:
if self.Position > 0:
self.SellMarket()
self.SellMarket()
elif self.Position > 0 and green_f < yellow_f:
self.SellMarket()
elif self.Position < 0 and green_f > yellow_f:
self.BuyMarket()
def OnReseted(self):
super(traffic_light_strategy, self).OnReseted()
def CreateClone(self):
return traffic_light_strategy()