Diese Strategie ist ein StockSharp-Port des MetaTrader-Expert-Advisors Exp_BW-wiseMan-1. Sie automatisiert Bill Williams' WiseMan-1-Ausbruchslogik, die auf dem Alligator-Indikator aufgebaut ist. Signale werden erzeugt, wenn eine abgeschlossene Kerze aus den Kiefern des Alligators ausbricht und gleichzeitig die jüngsten Swing-Extreme bricht. Ein optionaler Gegentrendmodus tauscht die Signale aus, sodass die Strategie dieselben Ausbrüche verblassen lassen kann.
Kernidee
Berechnen Sie den Bill Williams Alligator mit geglätteten gleitenden Durchschnitten des Medianpreises (hoch + tief) / 2.
Verschieben Sie die Kiefer-, Zahn- und Lippenlinien nach vorne durch konfigurierbare Versätze, um die Visualisierung des ursprünglichen Indikators zu entsprechen.
Bestätigen Sie einen Ausbruch nur, wenn die aktuelle Kerze über die Hochs oder Tiefs der letzten N Balken hinausgeht und sicherstellen, dass die Bewegung stärker als das jüngste Rauschen ist.
Verzögern Sie die Ausführung um die ausgewählte Anzahl abgeschlossener Kerzen, damit der Trader bei Bedarf auf ältere Signale reagieren kann.
Handelsregeln
Long-Richtung
Der Balken muss unterhalb aller drei Alligator-Linien enden (Hochpreis kleiner als Kiefer, Zähne und Lippen).
Der Schlusskurs muss sich in der oberen Hälfte der Kerze befinden, d.h. über dem Median der Kerze.
Das Tief der Kerze muss strikt niedriger sein als die Tiefs der vorherigen Back-Balken.
Wenn das Signal nach der SignalBar-Verzögerung aktiv wird:
Schließen Sie jeden offenen Short, wenn Close Short aktiviert ist.
Eröffnen Sie eine neue Long-Position, wenn Enable Long aktiviert ist und derzeit keine Position offen ist.
Short-Richtung
Der Balken muss oberhalb aller drei Alligator-Linien enden (Tiefpreis größer als Kiefer, Zähne und Lippen).
Der Schlusskurs muss sich in der unteren Hälfte der Kerze befinden, d.h. unter dem Median der Kerze.
Das Hoch der Kerze muss größer sein als die Hochs der vorherigen Back-Balken.
Wenn das Signal aktiv wird:
Schließen Sie jeden bestehenden Long, wenn Close Long aktiviert ist.
Eröffnen Sie eine neue Short-Position, wenn Enable Short aktiviert ist und keine aktuelle Position vorhanden ist.
Gegentrendmodus
Das Setzen von Counter-Trend Mode auf true tauscht die Kauf- und Verkaufssignale aus, sodass die Strategie Trades gegen die Alligator-Ausbruchsrichtung eingeht.
Parameter
Candle Type – Zeitrahmen zur Erstellung von Kerzen und Berechnung aller Indikatorwerte (Standard: 1 Stunde).
Counter-Trend Mode – Ausbruchslogik umkehren, um gegen den primären Trend zu handeln (Standard: aktiviert, entsprechend dem ursprünglichen EA).
Breakout Depth (Back) – Anzahl der vorherigen Balken, die mit dem aktuellen Hoch/Tief bei der Ausbruchsvalidierung verglichen werden (Standard: 2).
Jaw Length / Shift – geglättete MA-Länge und Vorwärtsverschiebung für die Kieferlinie (Standards: 13 / 8).
Teeth Length / Shift – geglättete MA-Länge und Vorwärtsverschiebung für die Zahnlinie (Standards: 8 / 5).
Lips Length / Shift – geglättete MA-Länge und Vorwärtsverschiebung für die Lippenlinie (Standards: 5 / 3).
Signal Bar – Anzahl bereits abgeschlossener Kerzen, die vor der Ausführung eines erkannten Signals gewartet werden sollen (Standard: 1).
Enable Long / Enable Short – Schalter zum Öffnen neuer Long- oder Short-Positionen.
Close Long / Close Short – Schalter zum Schließen entgegengesetzter Positionen, wenn das Signal ausgelöst wird.
Hinweise
Die Strategie verlässt sich ausschließlich auf Market Orders und setzt keine harten Stop-Loss- oder Take-Profit-Niveaus. Jeder Ausstieg wird durch das entgegengesetzte Signal oder durch Deaktivierung des entsprechenden Schließ-Schalters gesteuert.
Alle Berechnungen werden auf fertigen Kerzen durchgeführt; partielle Intrabar-Daten werden ignoriert, um mit dem ursprünglichen MetaTrader-Experten konsistent zu bleiben.
Das Volumen wird von den StockSharp-Strategieeinstellungen geerbt. Passen Sie das Basisvolumen in der Plattformkonfiguration an, wenn Sie eine andere Positionsgröße benötigen.
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>
/// Bill Williams Wiseman 1 strategy using Alligator-style triple EMA crossover.
/// </summary>
public class BwWiseman1Strategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _jawPeriod;
private readonly StrategyParam<int> _teethPeriod;
private readonly StrategyParam<int> _lipsPeriod;
private decimal? _prevLips;
private decimal? _prevTeeth;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int JawPeriod
{
get => _jawPeriod.Value;
set => _jawPeriod.Value = value;
}
public int TeethPeriod
{
get => _teethPeriod.Value;
set => _teethPeriod.Value = value;
}
public int LipsPeriod
{
get => _lipsPeriod.Value;
set => _lipsPeriod.Value = value;
}
public BwWiseman1Strategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame())
.SetDisplay("Candle Type", "Timeframe", "General");
_jawPeriod = Param(nameof(JawPeriod), 34)
.SetGreaterThanZero()
.SetDisplay("Jaw Period", "Slow EMA (Jaw)", "Indicators");
_teethPeriod = Param(nameof(TeethPeriod), 13)
.SetGreaterThanZero()
.SetDisplay("Teeth Period", "Medium EMA (Teeth)", "Indicators");
_lipsPeriod = Param(nameof(LipsPeriod), 5)
.SetGreaterThanZero()
.SetDisplay("Lips Period", "Fast EMA (Lips)", "Indicators");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
{
return [(Security, CandleType)];
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevLips = null;
_prevTeeth = null;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevLips = null;
_prevTeeth = null;
var jaw = new SmoothedMovingAverage { Length = JawPeriod };
var teeth = new SmoothedMovingAverage { Length = TeethPeriod };
var lips = new SmoothedMovingAverage { Length = LipsPeriod };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(jaw, teeth, lips, ProcessCandle)
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, jaw);
DrawIndicator(area, teeth);
DrawIndicator(area, lips);
DrawOwnTrades(area);
}
}
private void ProcessCandle(ICandleMessage candle, decimal jawVal, decimal teethVal, decimal lipsVal)
{
if (candle.State != CandleStates.Finished)
return;
if (!IsFormedAndOnlineAndAllowTrading())
{
_prevLips = lipsVal;
_prevTeeth = teethVal;
return;
}
if (_prevLips == null || _prevTeeth == null)
{
_prevLips = lipsVal;
_prevTeeth = teethVal;
return;
}
// Lips crosses above teeth → buy
if (_prevLips.Value <= _prevTeeth.Value && lipsVal > teethVal)
{
if (Position < 0)
BuyMarket();
if (Position <= 0)
BuyMarket();
}
// Lips crosses below teeth → sell
else if (_prevLips.Value >= _prevTeeth.Value && lipsVal < teethVal)
{
if (Position > 0)
SellMarket();
if (Position >= 0)
SellMarket();
}
_prevLips = lipsVal;
_prevTeeth = teethVal;
}
}
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 SmoothedMovingAverage
from StockSharp.Algo.Strategies import Strategy
class bw_wiseman1_strategy(Strategy):
def __init__(self):
super(bw_wiseman1_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(1))) \
.SetDisplay("Candle Type", "Timeframe", "General")
self._jaw_period = self.Param("JawPeriod", 34) \
.SetDisplay("Jaw Period", "Slow EMA (Jaw)", "Indicators")
self._teeth_period = self.Param("TeethPeriod", 13) \
.SetDisplay("Teeth Period", "Medium EMA (Teeth)", "Indicators")
self._lips_period = self.Param("LipsPeriod", 5) \
.SetDisplay("Lips Period", "Fast EMA (Lips)", "Indicators")
self._prev_lips = None
self._prev_teeth = None
@property
def CandleType(self):
return self._candle_type.Value
@property
def JawPeriod(self):
return self._jaw_period.Value
@property
def TeethPeriod(self):
return self._teeth_period.Value
@property
def LipsPeriod(self):
return self._lips_period.Value
def OnReseted(self):
super(bw_wiseman1_strategy, self).OnReseted()
self._prev_lips = None
self._prev_teeth = None
def OnStarted2(self, time):
super(bw_wiseman1_strategy, self).OnStarted2(time)
self._prev_lips = None
self._prev_teeth = None
jaw = SmoothedMovingAverage()
jaw.Length = self.JawPeriod
teeth = SmoothedMovingAverage()
teeth.Length = self.TeethPeriod
lips = SmoothedMovingAverage()
lips.Length = self.LipsPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(jaw, teeth, lips, self._on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, jaw)
self.DrawIndicator(area, teeth)
self.DrawIndicator(area, lips)
self.DrawOwnTrades(area)
def _on_process(self, candle, jaw_value, teeth_value, lips_value):
if candle.State != CandleStates.Finished:
return
lv = float(lips_value)
tv = float(teeth_value)
if self._prev_lips is None or self._prev_teeth is None:
self._prev_lips = lv
self._prev_teeth = tv
return
# Lips crosses above teeth
if self._prev_lips <= self._prev_teeth and lv > tv:
if self.Position < 0:
self.BuyMarket()
if self.Position <= 0:
self.BuyMarket()
# Lips crosses below teeth
elif self._prev_lips >= self._prev_teeth and lv < tv:
if self.Position > 0:
self.SellMarket()
if self.Position >= 0:
self.SellMarket()
self._prev_lips = lv
self._prev_teeth = tv
def CreateClone(self):
return bw_wiseman1_strategy()