Gleitende Durchschnitte mit Martingale
Überblick
SmaStrategyMartingaleStrategy ist eine Handelsstrategie auf Basis der Kreuzung zweier einfacher gleitender Durchschnitte (SimpleMovingAverage) mit Martingale-Elementen. Die Strategie verwendet länge und kurze SMAs zur Bestimmung von Ein- und Ausstiegssignalen und erhöht die Positionsgröße bei jedem neuen Trade.
Hauptkomponenten
public class SmaStrategyMartingaleStrategy : Strategy
{
private readonly StrategyParam<int> _longSmaLength;
private readonly StrategyParam<int> _shortSmaLength;
private readonly StrategyParam<DataType> _candleType;
// Variablen zum Speichern vorheriger Indikatorwerte
private decimal _prevLongValue;
private decimal _prevShortValue;
private bool _isFirstValue = true;
}
Strategieparameter
Die Strategie erlaubt die Anpassung der folgenden Parameter:
- LongSmaLength - Periode des langen gleitenden Durchschnitts (Standardwert 80)
- ShortSmaLength - Periode des kurzen gleitenden Durchschnitts (Standardwert 30)
- CandleType - Kerzentyp, mit dem gearbeitet wird (standardmäßig 5 Minuten)
Alle Parameter stehen mit festgelegten Wertebereichen für die Optimierung zur Verfügung.
Initialisierung der Strategie
In der Methode OnStarted2 werden SMA-Indikatoren erstellt, das Kerzenabonnement eingerichtet und die Visualisierung vorbereitet:
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
// Indikatoren erstellen
var longSma = new SimpleMovingAverage { Length = LongSmaLength };
var shortSma = new SimpleMovingAverage { Length = ShortSmaLength };
// Indikatoren zur Strategie-Sammlung hinzufügen, damit IsFormed automatisch verfolgt wird
Indicators.Add(longSma);
Indicators.Add(shortSma);
// Abonnement erstellen und Indikatoren binden
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(longSma, shortSma, ProcessCandle)
.Start();
// Visualisierung im Chart einrichten
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, longSma, System.Drawing.Color.Blue);
DrawIndicator(area, shortSma, System.Drawing.Color.Red);
DrawOwnTrades(area);
}
}
Verarbeitung von Kerzen
Die Methode ProcessCandle wird für jede abgeschlossene Kerze aufgerufen und implementiert die Handelslogik:
private void ProcessCandle(ICandleMessage candle, decimal longValue, decimal shortValue)
{
// Unvollständige Kerzen überspringen
if (candle.State != CandleStates.Finished)
return;
// Prüfen, ob die Strategie handelsbereit ist
if (!IsFormedAndOnlineAndAllowTrading())
return;
// Beim ersten Wert nur Daten speichern, ohne Signale zu erzeugen
if (_isFirstValue)
{
_prevLongValue = longValue;
_prevShortValue = shortValue;
_isFirstValue = false;
return;
}
// Aktuellen und vorherigen Vergleich der Indikatorwerte abrufen
var isShortLessThenLongCurrent = shortValue < longValue;
var isShortLessThenLongPrevious = _prevShortValue < _prevLongValue;
// Aktuelle Werte als vorherige für die nächste Kerze speichern
_prevLongValue = longValue;
_prevShortValue = shortValue;
// Auf Kreuzung prüfen (Signal)
if (isShortLessThenLongPrevious == isShortLessThenLongCurrent)
return;
// Aktive Orders vor dem Platzieren neuer Orders stornieren
CancelActiveOrders();
// Handelsrichtung bestimmen
var direction = isShortLessThenLongCurrent ? Sides.Sell : Sides.Buy;
// Positionengröße berechnen (Position mit jedem Trade erhöhen - Martingale-Ansatz)
var volume = Volume + Math.Abs(Position);
// Order mit dem passenden Preis erstellen und registrieren
var price = Security.ShrinkPrice(shortValue);
RegisterOrder(CreateOrder(direction, price, volume));
}
Handelslogik
- Kaufsignal: Der kurze SMA kreuzt den langen SMA von unten.
- Verkaufssignal: Der kurze SMA kreuzt den langen SMA von oben.
- Die Positionsgröße erhöht sich bei jedem neuen Trade um den Betrag der aktuellen Position (Martingale-Element).
- Der Orderpreis wird auf den aktuellen Wert des kurzen SMA gesetzt und auf die Tickgröße des Instruments gerundet.
Funktionen
- Die Strategie bestimmt die zu verwendenden Instrumente automatisch über die Methode
GetWorkingSecurities(). - Die Strategie arbeitet nur mit abgeschlossenen Kerzen.
- Die Strategie verfolgt Indikatorkreuzungen, indem sie das aktuelle und vorherige Verhältnis zwischen SMAs vergleicht.
- Alle aktiven Orders werden vor dem Platzieren neuer Orders storniert.
- Das Martingale-Prinzip wird umgesetzt: Die Positionsgröße wird bei jedem neuen Trade erhöht.
- Indikatoren und Trades werden im Chart visualisiert, wenn ein grafischer Bereich verfügbar ist.
- Parameteroptimierung wird unterstützt, um optimale Strategieeinstellungen zu finden.