Diese Strategie repliziert das „Regenbogen"-System gleitender Durchschnitte aus dem ursprünglichen MQL-Experten.
Es werden elf exponentielle gleitende Durchschnitte zusammen mit MACD- und ADX-Filtern verwendet.
Funktionsweise
Berechnung von EMA(2), EMA(3), EMA(5), EMA(8), EMA(13), EMA(21), EMA(34), EMA(55), EMA(89), EMA(144) und EMA(233) auf Schlusskursen.
Berechnung von MACD (Schnell, Langsam, Signal) und Verwendung der Signallinie.
Berechnung von ADX zur Messung der Trendstärke.
Kaufen, wenn:
Die MACD-Signallinie über null liegt.
Alle EMAs strikt aufsteigend sind (jede schnellere EMA über der langsameren).
Der ADX-Wert über dem Schwellenwert liegt.
Verkaufen, wenn:
Die MACD-Signallinie unter null liegt.
Alle EMAs strikt absteigend sind.
Der ADX-Wert über dem Schwellenwert liegt.
Positionen werden umgekehrt, wenn ein entgegengesetztes Signal erscheint.
Parameter
Name
Beschreibung
FastMacd
Schnelle EMA-Periode für MACD.
SlowMacd
Langsame EMA-Periode für MACD.
SignalPeriod
Signallinien-Periode für MACD.
AdxPeriod
Periode für den ADX-Indikator.
AdxThreshold
Mindest-ADX-Wert zum Handeln.
CandleType
Kerzen-Zeitrahmen für Berechnungen.
Hinweise
Die Strategie verwendet Marktorders über BuyMarket und SellMarket.
Es wird jeweils nur eine Position gehalten; ein entgegengesetztes Signal kehrt die Position um.
Dies ist eine direkte Konvertierung der ursprünglichen MQL-Strategie ohne die optionale Martingal-Logik.
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>
/// EMA rainbow trend following strategy.
/// </summary>
public class MagnaRapaxCopperStrategy : Strategy
{
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevFast;
private decimal _prevSlow;
private bool _hasPrev;
public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public MagnaRapaxCopperStrategy()
{
_fastPeriod = Param(nameof(FastPeriod), 13)
.SetGreaterThanZero()
.SetDisplay("Fast Period", "Fast EMA period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 34)
.SetGreaterThanZero()
.SetDisplay("Slow Period", "Slow EMA period", "Indicators");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Candle type", "General");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
=> [(Security, CandleType)];
protected override void OnReseted()
{
base.OnReseted();
_prevFast = 0;
_prevSlow = 0;
_hasPrev = false;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var fast = new ExponentialMovingAverage { Length = FastPeriod };
var slow = new ExponentialMovingAverage { Length = SlowPeriod };
SubscribeCandles(CandleType)
.Bind(fast, slow, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, decimal fastVal, decimal slowVal)
{
if (candle.State != CandleStates.Finished) return;
if (!_hasPrev)
{
_prevFast = fastVal;
_prevSlow = slowVal;
_hasPrev = true;
return;
}
var crossUp = _prevFast <= _prevSlow && fastVal > slowVal;
var crossDown = _prevFast >= _prevSlow && fastVal < slowVal;
if (crossUp && Position <= 0)
{
if (Position < 0) BuyMarket();
BuyMarket();
}
else if (crossDown && Position >= 0)
{
if (Position > 0) SellMarket();
SellMarket();
}
_prevFast = fastVal;
_prevSlow = slowVal;
}
}