Auf GitHub ansehen

VR Smart Grid Lite-Mittelungsstrategie

Überblick

Die VR Smart Grid Lite Averaging-Strategie ist ein Grid-Averaging-System, das dem ursprünglichen MetaTrader 5 Expert Advisor folgt. Der Algorithmus öffnet Marktaufträge in Richtung der letzten bullischen oder bärischen Kerze und baut eine Leiter im Martingal-Stil auf, wenn sich der Preis gegen die Position bewegt. Entfernungen, Volumina und Ausgangslogik können so angepasst werden, dass sie der ursprünglichen MQL-Implementierung entsprechen.

Handelslogik

  • Bei jeder abgeschlossenen Kerze überprüft die Strategie ihre Richtung.
    • Eine bullische Kerze ermöglicht eine neue Kauforder, wenn der aktuelle Preis mindestens Order Step (pips) unter dem niedrigsten bestehenden Kaufeinstieg liegt.
    • Eine bärische Kerze ermöglicht einen neuen Verkaufsauftrag, wenn der aktuelle Preis mindestens Order Step (pips) über dem höchsten bestehenden Verkaufseintrag liegt.
  • Die erste Bestellung für jede Seite verwendet Start Volume. Jede weitere Ordnung verdoppelt das Volumen der am weitesten entfernten Ordnung auf dieser Seite, während Max Volume die absolute Größe begrenzt.
  • Wenn auf einer Seite nur eine einzige Position vorhanden ist, wird der Handel geschlossen, sobald der Preis die Distanz Take Profit (pips) erreicht.
  • Bei zwei oder mehr Positionen hängt die Abschlusslogik vom ausgewählten Close Mode ab:
    • Durchschnitt – schließt die höchsten und niedrigsten Orders, sobald der Preis ihren gewichteten Durchschnitt plus Minimal Profit (pips) erreicht.
    • PartialClose – schließt die niedrigste Order vollständig und reduziert die höchste Order um Start Volume, wenn der Preis das gemischte Ziel erreicht.

Risikomanagement

  • Die Volumina werden an die MinVolume, MaxVolume und StepVolume des Brokers angepasst, um eine Ablehnung zu vermeiden.
  • Der integrierte StartProtection()-Aufruf stellt sicher, dass der Kontoschutz von StockSharp vor dem Handel aktiviert wird.

Parameter

Name Beschreibung
Take Profit (pips) Zieldistanz für einzelne offene Positionen.
Start Volume Volumen für die Erstbestellung in jede Richtung.
Max Volume Maximal zulässiges Volumen pro Bestellung (0 deaktiviert das Limit).
Close Mode Wählen Sie zwischen durchschnittlichen Exits oder teilweisen Schließungen.
Order Step (pips) Minimale Gegenbewegung vor dem Hinzufügen einer neuen Bestellung.
Minimal Profit (pips) Zusätzlicher Gewinnpuffer zum durchschnittlichen Ausstieg hinzugefügt.
Candle Type Kerzenserie zur Signalerzeugung.

Notizen

  • Die Strategie verwendet nur Marktaufträge; Ausstehende Aufträge des ursprünglichen EA werden durch die Auswertung der Bedingungen für jede Kerze emuliert.
  • Die Implementierung behält den Status pro Bestellung bei, um die Ticket-basierte Verwaltung von MetaTrader nachzuahmen, einschließlich teilweiser Schließungen und selektiver Ausgänge.
  • Konfigurieren Sie den Kerzentyp und die Symbol-Pip-Größe so, dass sie mit dem im MQL-Skript verwendeten Zeitrahmen übereinstimmen, um ein konsistentes Verhalten zu gewährleisten.
namespace StockSharp.Samples.Strategies;

using System;

using Ecng.Common;

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

/// <summary>
/// VR Smart Grid Lite Averaging: grid with averaging approach using Bollinger Bands.
/// Buys near lower band, sells near upper band.
/// </summary>
public class VrSmartGridLiteAveragingStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _bbPeriod;

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

	public int BbPeriod
	{
		get => _bbPeriod.Value;
		set => _bbPeriod.Value = value;
	}

	public VrSmartGridLiteAveragingStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");

		_bbPeriod = Param(nameof(BbPeriod), 20)
			.SetGreaterThanZero()
			.SetDisplay("BB Period", "Bollinger Bands period", "Indicators");
	}

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		var bb = new BollingerBands { Length = BbPeriod };

		decimal? prevClose = null;
		decimal? prevMid = null;

		var subscription = SubscribeCandles(CandleType);
		subscription
			.BindEx(bb, (candle, bbVal) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				var bbv = (BollingerBandsValue)bbVal;
				if (bbv.UpBand is not decimal upper || bbv.LowBand is not decimal lower)
					return;

				var close = candle.ClosePrice;
				var mid = (upper + lower) / 2m;

				if (prevClose.HasValue && prevMid.HasValue)
				{
					var crossBelow = prevClose.Value >= prevMid.Value && close < mid;
					var crossAbove = prevClose.Value <= prevMid.Value && close > mid;

					if (crossBelow && Position <= 0)
						BuyMarket();
					else if (crossAbove && Position >= 0)
						SellMarket();
				}

				prevClose = close;
				prevMid = mid;
			})
			.Start();

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