Auf GitHub ansehen

Maybeawo222-Strategie

Überblick

Die Maybeawo222-Strategie repliziert den MetaTrader-Expertenberater „maybeawo222“ unter Verwendung des High-Level-API von StockSharp. Es handelt ein einzelnes Instrument mit einem einfachen Crossover des gleitenden Durchschnitts (SMA) der vorherigen Kerze und begrenzt die Aktivität auf ein konfigurierbares Zeitfenster. Durch die Umstellung bleibt das abgestufte Breakeven-Management erhalten, das versucht, Gewinne zu sichern, sobald der Preis um vordefinierte Distanzen steigt.

Handelslogik

  1. Die Strategie abonniert die durch CandleType ausgewählte Hauptkerzenserie und berechnet einen einfachen gleitenden Durchschnitt mit dem durch MovingPeriod angegebenen Zeitraum.
  2. Am Ende jeder Kerze wird der SMA-Wert um MovingShift Balken verschoben, bevor er in der Entscheidung verwendet wird. Dies reproduziert den ursprünglichen iMA-Aufruf mit einem Verschiebungsparameter.
  3. Handelssignale werden nur ausgewertet, wenn die Schlusszeit der fertigen Kerze in den Bereich [StartHour, EndHour) fällt. Außerhalb dieses Fensters werden keine neuen Aufträge erstellt, offene Positionen werden jedoch weiterhin verwaltet.
  4. Ein Kaufsignal erscheint, wenn die vorherige Kerze (diejenige, die gerade geschlossen wurde) unterhalb des verschobenen SMA öffnet und darüber schließt. Ein Verkaufssignal erfordert den umgekehrten Crossover. Die Strategie kehrt bei Bedarf bestehende Positionen um, so dass nur eine Richtung offen bleibt.
  5. Bei jeder fertigen Kerze überprüft die Engine die Höchst-/Tiefstwerte, um Stop-Loss- oder Take-Profit-Treffer zu erkennen. Immer wenn eines der Level berührt wird, wird sofort der entsprechende Marktausstieg ausgelöst.
  6. Die Position aktiviert außerdem bis zu zwei abgestufte Break-Even-Anpassungen. Sobald der variable Gewinn BreakevenPips1 überschreitet, bewegt sich der Stop gemäß DesiredBreakevenDistancePips1 näher an den Einstieg. In einer zweiten Stufe wird der Vorgang mit BreakevenPips2 und DesiredBreakevenDistancePips2 wiederholt.

Risikomanagement

  • Die anfänglichen Stop-Loss- und Take-Profit-Abstände werden in Pips konfiguriert. Die Umrechnung verwendet das Instrument PriceStep und wendet den herkömmlichen MetaTrader-Faktor von 10 für drei- und fünfstellige Notierungen an.
  • Breakeven-Level werden nur einmal pro Positionsseite angewendet. Jeder neue Eintrag setzt die Flags zurück, sodass der Stop während der Laufzeit des Handels zweimal nachlaufen kann.
  • Positionsausstiege nutzen Marktaufträge, sodass die Engine Geschäfte auch dann schließen kann, wenn die Stop- oder Zielniveaus auf der Brokerseite nicht verfügbar sind.

Parameter

Name Standard Bereich / Hinweise Beschreibung
MovingPeriod 14 Positive ganze Zahl SMA Länge, die für die Crossover-Prüfung verwendet wird.
MovingShift 0 010 (empfohlen) Anzahl der abgeschlossenen Kerzen, um den SMA-Wert nach hinten zu verschieben.
StopLossPips 100 0 deaktiviert Abstand vom Einstiegspreis zum schützenden Stop-Loss, gemessen in Pips.
TakeProfitPips 800 0 deaktiviert Abstand vom Einstiegspunkt zum Take-Profit-Level, gemessen in Pips.
BreakevenPips1 180 0 deaktiviert Gewinnschwelle (in Pips), die die erste Breakeven-Anpassung auslöst.
DesiredBreakevenDistancePips1 60 Alles, was nicht negativ ist Neuer Stoppabstand vom Einstieg nach Breakeven-Stufe 1.
BreakevenPips2 500 0 deaktiviert Gewinnschwelle (in Pips), die die zweite Breakeven-Anpassung auslöst.
DesiredBreakevenDistancePips2 350 Alles, was nicht negativ ist Neuer Stoppabstand vom Einstieg nach Break-Even-Stufe 2-Feuern.
StartHour 3 023 Inklusive Startstunde der Handelssitzung, basierend auf der Börsenzeit.
EndHour 22 023 Exklusive Endstunde der Handelssitzung.
OrderVolume 0.5 Größer als 0 Mit jeder Marktorder gesendetes Volumen vor Positionsverrechnung.
CandleType H1 Beliebiger Kerzendatentyp Kerzenserie, die zum Erzeugen von Signalen und zur Berechnung des SMA verwendet wird.

Hinweise zur Verwendung

  • Stellen Sie sicher, dass die verbundene Sicherheit ein gültiges PriceStep bereitstellt. andernfalls fällt die Pip-Konvertierung auf 1 zurück. Passen Sie die Pip-bezogenen Parameter entsprechend an, wenn Ihr Instrument in großen Ticks notiert.
  • Die Strategie erwartet ein Einzelsymbol-Setup. Fügen Sie es einem Schema mit dem gewünschten Instrument hinzu, bevor Sie mit der Strategie beginnen.
  • Erwägen Sie beim Live-Handel die Aktivierung von Slippage-Zulagen oder schützenden Stop-Orders durch Broker-spezifische Erweiterungen, wenn Marktaustritte nicht ausreichen.
using System;

using Ecng.Common;

using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Moving average crossover strategy with price crossing the SMA line.
/// Buys when candle opens below MA and closes above it, sells vice versa.
/// </summary>
public class Maybeawo222Strategy : Strategy
{
	private readonly StrategyParam<int> _movingPeriod;
	private readonly StrategyParam<DataType> _candleType;
	private ExponentialMovingAverage _ema;
	private decimal? _prevClose;
	private decimal? _prevMa;

	public int MovingPeriod
	{
		get => _movingPeriod.Value;
		set => _movingPeriod.Value = value;
	}

	public DataType CandleType
	{
		get => _candleType.Value;
		set => _candleType.Value = value;
	}

	public Maybeawo222Strategy()
	{
		_movingPeriod = Param(nameof(MovingPeriod), 20)
			.SetDisplay("MA Period", "Simple moving average period", "Indicators");

		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
			.SetDisplay("Candle Type", "Primary candle series", "General");
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		_ema = new ExponentialMovingAverage { Length = MovingPeriod };
		_prevClose = null;
		_prevMa = null;

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(_ema, ProcessCandle)
			.Start();

		var area = CreateChartArea();
		if (area != null)
		{
			DrawCandles(area, subscription);
			DrawIndicator(area, _ema);
			DrawOwnTrades(area);
		}
	}

	private void ProcessCandle(ICandleMessage candle, decimal maValue)
	{
		if (candle.State != CandleStates.Finished)
			return;

		if (!_ema.IsFormed)
		{
			_prevClose = candle.ClosePrice;
			_prevMa = maValue;
			return;
		}

		var close = candle.ClosePrice;
		if (_prevClose is null || _prevMa is null)
		{
			_prevClose = close;
			_prevMa = maValue;
			return;
		}

		// Buy signal: candle crosses MA from below to above
		var buySignal = _prevClose <= _prevMa && close > maValue;
		// Sell signal: candle crosses MA from above to below
		var sellSignal = _prevClose >= _prevMa && close < maValue;

		if (buySignal && Position <= 0)
		{
			BuyMarket(Position < 0 ? Math.Abs(Position) + 1 : 1);
		}
		else if (sellSignal && Position >= 0)
		{
			SellMarket(Position > 0 ? Math.Abs(Position) + 1 : 1);
		}

		_prevClose = close;
		_prevMa = maValue;
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		_ema = null;
		_prevClose = null;
		_prevMa = null;

		base.OnReseted();
	}
}