Die ASCV BrainTrend Signal-Strategie ist eine Konvertierung des MetaTrader-Experten, der auf BrainTrend1-Indikatorsignalen handelt. Die StockSharp-Version basiert auf High-Level-Indikatorbindungen, um Average True Range (ATR), Stochastischen Oszillator und Jurik Moving Average (JMA) zu kombinieren, um Impulsumkehrungen zu erkennen und Trades mit optionalen Schutzhaltepunkten zu platzieren.
Kernidee
ATR berechnen, um die aktuelle Volatilität zu messen und ein dynamisches Bestätigungsband zu definieren.
Schlusskurse mit einem Jurik Moving Average glätten und den aktuellen Wert mit dem Wert zwei Balken zurück vergleichen.
Wenn der geglättete Unterschied größer als ATR / 2.3 ist, den Zustand der BrainTrend-Logik aktualisieren:
%K des Stochastischen Oszillators unterhalb von 47 schaltet das System in ein potenzielles Short-Setup.
%K oberhalb von 53 schaltet das System in ein potenzielles Long-Setup.
Ein Signal vom vorherigen Balken wird auf der nächsten abgeschlossenen Kerze ausgeführt. Signale können mit dem Parameter Reverse Signals umgekehrt werden.
Stop-Loss-, Take-Profit- und Trailing-Stop-Niveaus werden in Pips (Vielfache des Instrument-Preisschritts) definiert.
Einstiegs- und Ausstiegsregeln
Long-Einstieg: Vorheriger Balken hat ein Kaufsignal ausgegeben und die Strategie ist nicht bereits long. Die Ordergröße entspricht Volume + abs(aktuelle Position), sodass Shorts vor dem Öffnen des neuen Longs gedeckt werden.
Short-Einstieg: Vorheriger Balken hat ein Verkaufssignal ausgegeben und die Strategie ist nicht bereits short.
Stop-Loss: Platziert bei Einstiegspreis ± StopLossPips * Preisschritt. Wenn der Kurs innerhalb der nächsten Kerze über das Stop-Niveau hinaus handelt, wird die Position zu Marktpreisen geschlossen.
Take-Profit: Optionaler Take-Profit bei Einstiegspreis ± TakeProfitPips * Preisschritt.
Trailing-Stop: Aktiviert, wenn sowohl TrailingStopPips als auch TrailingStepPips größer als null sind. Nachdem der Kurs TrailingStopPips + TrailingStepPips zugunsten des Trades bewegt, wird der Stop um TrailingStopPips hinter der Bewegung gezogen.
Parameter
Parameter
Beschreibung
Standard
AtrPeriod
ATR-Mittelungsperiode für Volatilitätsschätzung.
14
StochasticPeriod
Basisperiode für den Stochastischen Oszillator.
12
JmaLength
Jurik Moving Average Glättungslänge.
7
StopLossPips
Stop-Loss-Abstand in Pips (Preisschritte).
15
TakeProfitPips
Take-Profit-Abstand in Pips.
46
TrailingStopPips
Trailing-Stop-Abstand in Pips.
0 (deaktiviert)
TrailingStepPips
Mindestgünstiger Bewegung, die vor dem Trailing erforderlich ist.
Alle Indikatorberechnungen werden auf abgeschlossenen Kerzen durchgeführt, um Mittelbalken-Rauschen zu vermeiden.
Wenn das Instrument kein MinPriceStep liefert, wird ein Standardschritt von 0.0001 beim Umrechnen von Pip-Abständen verwendet.
Die Strategie zeichnet Kerzen, den Stochastischen Oszillator und die JMA auf dem Diagramm zur Überwachung.
Trailing-Stops spiegeln die originale MetaTrader-Logik wider: Sie bewegen sich nur in Richtung des Trades und erfordern, dass sowohl Abstands- als auch Schrittschwellenwerte erfüllt sind.
Verwendungstipps
AtrPeriod und StochasticPeriod an die Volatilität des gehandelten Instruments anpassen.
Pip-basierte Risikoparameter erhöhen, wenn Vermögenswerte mit größeren Tick-Größen (z. B. Futures) gehandelt werden, um sofortige Stop-Outs zu vermeiden.
ReverseSignals aktivieren, um den Umkehrmodus des ursprünglichen Experten-Advisors nachzuahmen.
Mit broker-seitigen Risikokontrollen kombinieren, wenn echter Geldhandel beteiligt ist.
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>
/// ASCV BrainTrend Signal strategy. Uses DEMA crossover (8/25).
/// </summary>
public class AscvBrainTrendSignalStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private decimal? _prevFast;
private decimal? _prevSlow;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
public AscvBrainTrendSignalStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame()).SetDisplay("Candle Type", "Timeframe", "General");
_fastPeriod = Param(nameof(FastPeriod), 8).SetGreaterThanZero().SetDisplay("Fast DEMA", "Fast DEMA period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 25).SetGreaterThanZero().SetDisplay("Slow DEMA", "Slow DEMA period", "Indicators");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities() => [(Security, CandleType)];
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevFast = null;
_prevSlow = null;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevFast = null; _prevSlow = null;
var fast = new DoubleExponentialMovingAverage { Length = FastPeriod };
var slow = new DoubleExponentialMovingAverage { Length = SlowPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(fast, slow, ProcessCandle).Start();
var area = CreateChartArea();
if (area != null) { DrawCandles(area, subscription); DrawIndicator(area, fast); DrawIndicator(area, slow); DrawOwnTrades(area); }
}
private void ProcessCandle(ICandleMessage candle, decimal fast, decimal slow)
{
if (candle.State != CandleStates.Finished) return;
if (!IsFormedAndOnlineAndAllowTrading()) { _prevFast = fast; _prevSlow = slow; return; }
if (_prevFast == null || _prevSlow == null) { _prevFast = fast; _prevSlow = slow; return; }
var prevAbove = _prevFast.Value > _prevSlow.Value;
var currAbove = fast > slow;
_prevFast = fast; _prevSlow = slow;
if (!prevAbove && currAbove && Position <= 0) { if (Position < 0) BuyMarket(); BuyMarket(); }
else if (prevAbove && !currAbove && 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
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import DoubleExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class ascv_brain_trend_signal_strategy(Strategy):
def __init__(self):
super(ascv_brain_trend_signal_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(1))) \
.SetDisplay("Candle Type", "Timeframe", "General")
self._fast_period = self.Param("FastPeriod", 8) \
.SetDisplay("Fast DEMA", "Fast DEMA period", "Indicators")
self._slow_period = self.Param("SlowPeriod", 25) \
.SetDisplay("Slow DEMA", "Slow DEMA period", "Indicators")
self._prev_fast = None
self._prev_slow = None
@property
def CandleType(self):
return self._candle_type.Value
@property
def FastPeriod(self):
return self._fast_period.Value
@property
def SlowPeriod(self):
return self._slow_period.Value
def OnReseted(self):
super(ascv_brain_trend_signal_strategy, self).OnReseted()
self._prev_fast = None
self._prev_slow = None
def OnStarted2(self, time):
super(ascv_brain_trend_signal_strategy, self).OnStarted2(time)
self._prev_fast = None
self._prev_slow = None
fast = DoubleExponentialMovingAverage()
fast.Length = self.FastPeriod
slow = DoubleExponentialMovingAverage()
slow.Length = self.SlowPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(fast, slow, self._on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, fast)
self.DrawIndicator(area, slow)
self.DrawOwnTrades(area)
def _on_process(self, candle, fast_value, slow_value):
if candle.State != CandleStates.Finished:
return
fv = float(fast_value)
sv = float(slow_value)
if self._prev_fast is None or self._prev_slow is None:
self._prev_fast = fv
self._prev_slow = sv
return
prev_above = self._prev_fast > self._prev_slow
curr_above = fv > sv
self._prev_fast = fv
self._prev_slow = sv
if not prev_above and curr_above and self.Position <= 0:
if self.Position < 0:
self.BuyMarket()
self.BuyMarket()
elif prev_above and not curr_above and self.Position >= 0:
if self.Position > 0:
self.SellMarket()
self.SellMarket()
def CreateClone(self):
return ascv_brain_trend_signal_strategy()