Die Alexav SpeedUp M1-Strategie ist eine direkte Portierung des MetaTrader 4-Expertenberaters „Alexav_SpeedUp_M1“. Es wertet die Körper abgeschlossener Intraday-Kerzen aus und reagiert sofort mit Marktaufträgen, wenn der Kerzenkörper einen konfigurierbaren Schwellenwert überschreitet. Nach einem Einstieg emuliert die Strategie ein Risikomanagement im MetaTrader-Stil, indem sie der offenen Position Stop-Loss-, Take-Profit- und Trailing-Stop-Orders hinzufügt.
Die Konvertierung basiert auf der hohen Ebene StockSharp API. Kerzen werden über SubscribeCandles verbraucht, Preisinformationen für das Trailing werden aus Level-1-Daten empfangen und Schutzaufträge werden über die Standardhelfer BuyStop, SellStop, BuyLimit und SellLimit aufgegeben. Es sind keine manuellen Indikatorberechnungen erforderlich.
Signalerzeugung
Jede fertige Kerze im konfigurierten Zeitrahmen wird überprüft.
Wenn die Kerze um mehr als den Körperschwellenwert über ihrem Eröffnungskurs schließt, eröffnet die Strategie eine Long-Position am Markt (oder kehrt sich in diese um).
Wenn die Kerze um mehr als denselben Schwellenwert unter ihrem Eröffnungskurs schließt, eröffnet die Strategie eine Short-Position am Markt (oder kehrt sich in diese um).
Bestehendes Engagement in die entgegengesetzte Richtung wird automatisch durch Erhöhung des Market-Order-Volumens geschlossen, wodurch das Verhalten des ursprünglichen Expertenberaters originalgetreu reproduziert wird.
Auftragsverwaltung
Anfänglicher Stop-Loss: Sobald das Positionsvolumen steigt, wird eine schützende Stop-Order zum Einstiegspreis minus (für Longs) bzw. plus (für Shorts) der konfigurierten Anzahl von Punkten registriert.
Take-Profit: Eine passende Limit-Order wird in der Richtung des Handels in dem durch Take-Profit (Punkte) angegebenen Abstand platziert.
Trailing Stop: Bid/Ask-Aktualisierungen der Stufe 1 überwachen den aktuellen Gewinn. Wenn der nicht realisierte Gewinn die Trailing-Distanz überschreitet, wird der Schutzstopp in Richtung des Preises verschoben, wobei die konfigurierte Lücke beibehalten wird, ohne jedoch einen Rückschritt zu machen.
Alle Schutzaufträge werden storniert, wenn die Position wieder flach wird.
Die Konvertierung hält die Logik bewusst einfach: Es werden keine zusätzlichen Filter, Indikatoren oder Risikokontrollen hinzugefügt, die über das hinausgehen, was in der MQL-Implementierung vorhanden war.
Parameter
Name
Beschreibung
Losgröße
Basishandelsvolumen (in Lots), das für jede Marktorder verwendet wird. Beim Umkehren einer bestehenden Position wird das benötigte Volumen automatisch hinzugefügt.
Take Profit (Punkte)
Abstand vom Einstiegspreis zum Take-Profit-Level, gemessen in MetaTrader Punkten (umgerechnet anhand der Wertpapierpreisstufe).
Erster Stopp (Punkte)
Abstand vom Einstiegspreis bis zum anfänglichen Schutzstopp, ausgedrückt in Punkten.
Trailing Stop (Punkte)
Der Nachlaufabstand wird beibehalten, nachdem sich der Preis zugunsten der Position bewegt hat. Ein Wert von Null deaktiviert die nachgestellte Logik.
Körperschwelle
Minimale absolute Differenz zwischen Kerzenschluss und -eröffnung, die erforderlich ist, um einen neuen Handel auszulösen.
Kerzentyp
Zur Signalauswertung verwendete Kerzenserie (Zeitrahmen). Der Standardwert entspricht dem ursprünglichen Ein-Minuten-Diagramm.
Nutzungshinweise
Stellen Sie sicher, dass die Sicherheit einen gültigen PriceStep bereitstellt. Wenn sie nicht verfügbar ist, greift die Strategie darauf zurück, Punktabstände als Rohpreis-Offsets zu interpretieren.
Die Trailing-Stop-Logik erfordert Level-1-Daten (bester Geld-/Briefkurs). Wenn nur Kerzendaten verfügbar sind, bleibt die Trailing-Funktionalität inaktiv.
Die Strategie ist für den Intraday-Betrieb konzipiert und spiegelt das Ein-Trade-pro-Kerze-Verhalten wider, das der ursprüngliche MQL-Experte über seine internen Zähler durchgesetzt hat.
using System;
using System.Collections.Generic;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// Alexav SpeedUp M1 Body strategy.
/// Trades based on large candle body breakouts.
/// Buys after a large bullish candle, sells after a large bearish candle.
/// Uses ATR to define "large" body threshold.
/// </summary>
public class AlexavSpeedUpM1BodyBreakStrategy : Strategy
{
private readonly StrategyParam<int> _atrPeriod;
private readonly StrategyParam<decimal> _bodyMultiplier;
private readonly StrategyParam<DataType> _candleType;
public int AtrPeriod { get => _atrPeriod.Value; set => _atrPeriod.Value = value; }
public decimal BodyMultiplier { get => _bodyMultiplier.Value; set => _bodyMultiplier.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public AlexavSpeedUpM1BodyBreakStrategy()
{
_atrPeriod = Param(nameof(AtrPeriod), 14)
.SetDisplay("ATR Period", "ATR period for body threshold", "Indicators");
_bodyMultiplier = Param(nameof(BodyMultiplier), 1.0m)
.SetDisplay("Body Multiplier", "Body must exceed ATR * multiplier", "Indicators");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
}
/// <inheritdoc />
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
{
return [(Security, CandleType)];
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var atr = new AverageTrueRange { Length = AtrPeriod };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(atr, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, decimal atrValue)
{
if (candle.State != CandleStates.Finished)
return;
var body = candle.ClosePrice - candle.OpenPrice;
var absBody = Math.Abs(body);
var threshold = atrValue * BodyMultiplier;
if (absBody < threshold)
return;
// Large bullish candle - buy
if (body > 0 && Position <= 0)
{
if (Position < 0)
BuyMarket();
BuyMarket();
}
// Large bearish candle - sell
else if (body < 0 && Position >= 0)
{
if (Position > 0)
SellMarket();
SellMarket();
}
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan, Math
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import AverageTrueRange
from StockSharp.Algo.Strategies import Strategy
class alexav_speed_up_m1_body_break_strategy(Strategy):
"""Alexav SpeedUp M1 Body strategy.
Trades based on large candle body breakouts.
Buys after a large bullish candle, sells after a large bearish candle.
Uses ATR to define large body threshold."""
def __init__(self):
super(alexav_speed_up_m1_body_break_strategy, self).__init__()
self._atr_period = self.Param("AtrPeriod", 14) \
.SetDisplay("ATR Period", "ATR period for body threshold", "Indicators")
self._body_multiplier = self.Param("BodyMultiplier", 1.0) \
.SetDisplay("Body Multiplier", "Body must exceed ATR * multiplier", "Indicators")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Candle timeframe", "General")
@property
def CandleType(self):
return self._candle_type.Value
@CandleType.setter
def CandleType(self, value):
self._candle_type.Value = value
@property
def AtrPeriod(self):
return self._atr_period.Value
@property
def BodyMultiplier(self):
return self._body_multiplier.Value
def OnReseted(self):
super(alexav_speed_up_m1_body_break_strategy, self).OnReseted()
def OnStarted2(self, time):
super(alexav_speed_up_m1_body_break_strategy, self).OnStarted2(time)
atr = AverageTrueRange()
atr.Length = self.AtrPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(atr, self._process_candle).Start()
def _process_candle(self, candle, atr_value):
if candle.State != CandleStates.Finished:
return
close = float(candle.ClosePrice)
open_price = float(candle.OpenPrice)
body = close - open_price
abs_body = abs(body)
atr_val = float(atr_value)
threshold = atr_val * float(self.BodyMultiplier)
if abs_body < threshold:
return
# Large bullish candle - buy
if body > 0 and self.Position <= 0:
if self.Position < 0:
self.BuyMarket()
self.BuyMarket()
# Large bearish candle - sell
elif body < 0 and self.Position >= 0:
if self.Position > 0:
self.SellMarket()
self.SellMarket()
def CreateClone(self):
return alexav_speed_up_m1_body_break_strategy()