Diese Strategie reproduziert den MetaTrader-Experten Expert_ABC_WS_Stoch.mq5, der klassische Drei-Kerzen-Umkehrmuster mit einer Stochastic-Oszillatorbestätigung kombiniert. Ein Long-Signal erfordert die bullische „Three White Soldiers“-Formation zusammen mit einer überverkauften Stochastic-Signallinie, während ein Short-Signal auf der bärischen „Three Black Crows“-Formation basiert, die durch eine überkaufte Stochastic bestätigt wird. Die Ausgangslogik überwacht Überkreuzungen der Signalleitung über konfigurierbare Bänder bis hin zu Schließpositionen.
Handelslogik
Mustererkennung
Verfolgen Sie die letzten drei abgeschlossenen Kerzen.
Identifizieren Sie drei weiße Soldaten, wenn alle drei Kerzen bullisch sind und jeder Schlusskurs höher ist als der vorherige.
Identifizieren Sie Three Black Crows, wenn alle drei Kerzen bärisch sind und jeder Schlusskurs niedriger ist als der vorherige.
Oszillatorbestätigung
Berechnen Sie einen Stochastic-Oszillator mit %K-, %D- und Slowing-Perioden, die mit denen des ursprünglichen Experten identisch sind (standardmäßig 47, 9, 13).
Verwenden Sie die Signalleitung (%D) als Bestätigung:
Geben Sie „long“ ein, wenn der Wert der vorherigen Signallinie unter dem Überverkaufsschwellenwert liegt (Standard: 30).
Geben Sie Short ein, wenn der vorherige Signallinienwert über dem Überkauft-Schwellenwert liegt (Standard: 70).
Ausstiegsbedingungen
Schließen Sie einen Long-Trade, wenn die Signallinie die untere oder obere Ausstiegsschwelle überschreitet (Standard: 20 und 80).
Schließen Sie einen Short-Trade, wenn die Signallinie wieder unter diese Schwellenwerte fällt.
Beide Ausgangsprüfungen stützen sich auf die vorherigen und vorherigen Signalleitungswerte, um echte Überkreuzungen zu erkennen.
Parameter
Name
Standard
Beschreibung
CandleType
1h Zeitrahmen
Zeitrahmen für das Kerzenabonnement.
StochKPeriod
47
Lookback-Zeitraum für %K.
StochDPeriod
9
Gleitende durchschnittliche Länge der Signalleitung.
StochSlowing
13
Zusätzliche Glättung wurde auf %K angewendet.
OversoldLevel
30
Signalleitungspegel zur Bestätigung einer langen Eingabe erforderlich.
OverboughtLevel
70
Signalleitungspegel zur Bestätigung einer kurzen Eingabe erforderlich.
ExitLowerLevel
20
Untere Grenze, die für lange Ausgangs-Crossovers verwendet wird.
ExitUpperLevel
80
Obergrenze für kurze Ausgangskreuzungen.
Alle numerischen Parameter unterstützen Optimierungsbereiche, die der Vorlage MetaTrader entsprechen, sodass das Verhalten über den Strategie-Designer fein abgestimmt werden kann.
Orderverwaltung
Die Strategie kehrt die Positionen um, wenn ein entgegengesetztes Signal auftritt, indem die absolute Größe der aktuellen Position zum konfigurierten Volume addiert wird.
StartProtection() ist für die Integration in die Risikokontrollen der Plattform aktiviert, obwohl standardmäßig keine expliziten Stop-Loss- oder Take-Profit-Werte erzwungen werden.
Visualisierung
Bei der Ausführung im Strategie-Designer zeichnet sich die Strategie durch Folgendes aus:
Preiskerzen für das ausgewählte Symbol und den ausgewählten Zeitrahmen.
Der konfigurierte Stochastic-Oszillator.
Handelsmarkierungen zur Markierung von Ein- und Ausgängen.
Nutzungshinweise
Stellen Sie sicher, dass das Instrument genügend Historie liefert, damit sich der Stochastic-Oszillator aufwärmen kann, bevor Signale erwartet werden.
Erwägen Sie, die Strategie bei der Live-Bereitstellung mit zusätzlichen Risikofiltern (Volatilität, Sitzungsfilter usw.) zu kombinieren.
Die Schwellenwerte werden als Parameter bereitgestellt und ermöglichen ein schnelles Experimentieren mit verschiedenen Bestätigungsbändern, ohne Code bearbeiten zu müssen.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Three Soldiers Stochastic strategy: detects three consecutive bullish/bearish candles
/// confirmed by RSI levels.
/// </summary>
public class ThreeSoldiersStochasticStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _rsiPeriod;
private readonly StrategyParam<int> _signalCooldownCandles;
private int _bullCount;
private int _bearCount;
private int _candlesSinceTrade;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }
public int SignalCooldownCandles { get => _signalCooldownCandles.Value; set => _signalCooldownCandles.Value = value; }
public ThreeSoldiersStochasticStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(60).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_rsiPeriod = Param(nameof(RsiPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("RSI Period", "RSI period for confirmation", "Indicators");
_signalCooldownCandles = Param(nameof(SignalCooldownCandles), 6)
.SetGreaterThanZero()
.SetDisplay("Signal Cooldown", "Bars to wait between trades", "Trading");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_bullCount = 0;
_bearCount = 0;
_candlesSinceTrade = SignalCooldownCandles;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_bullCount = 0;
_bearCount = 0;
_candlesSinceTrade = SignalCooldownCandles;
var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(rsi, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal rsi)
{
if (candle.State != CandleStates.Finished) return;
if (_candlesSinceTrade < SignalCooldownCandles)
_candlesSinceTrade++;
if (candle.ClosePrice > candle.OpenPrice)
{
_bullCount++;
_bearCount = 0;
}
else if (candle.ClosePrice < candle.OpenPrice)
{
_bearCount++;
_bullCount = 0;
}
else
{
_bullCount = 0;
_bearCount = 0;
}
if (_bullCount >= 3 && rsi < 65 && Position <= 0 && _candlesSinceTrade >= SignalCooldownCandles)
{
BuyMarket();
_bullCount = 0;
_candlesSinceTrade = 0;
}
else if (_bearCount >= 3 && rsi > 35 && Position >= 0 && _candlesSinceTrade >= SignalCooldownCandles)
{
SellMarket();
_bearCount = 0;
_candlesSinceTrade = 0;
}
}
}
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 RelativeStrengthIndex
from StockSharp.Algo.Strategies import Strategy
class three_soldiers_stochastic_strategy(Strategy):
def __init__(self):
super(three_soldiers_stochastic_strategy, self).__init__()
self._rsi_period = self.Param("RsiPeriod", 14) \
.SetDisplay("RSI Period", "RSI period for confirmation", "Indicators")
self._signal_cooldown = self.Param("SignalCooldownCandles", 6) \
.SetDisplay("Signal Cooldown", "Bars to wait between trades", "Trading")
self._rsi = None
self._bull_count = 0
self._bear_count = 0
self._candles_since_trade = 0
@property
def rsi_period(self):
return self._rsi_period.Value
@property
def signal_cooldown(self):
return self._signal_cooldown.Value
def OnReseted(self):
super(three_soldiers_stochastic_strategy, self).OnReseted()
self._rsi = None
self._bull_count = 0
self._bear_count = 0
self._candles_since_trade = self.signal_cooldown
def OnStarted2(self, time):
super(three_soldiers_stochastic_strategy, self).OnStarted2(time)
self._rsi = RelativeStrengthIndex()
self._rsi.Length = self.rsi_period
self._bull_count = 0
self._bear_count = 0
self._candles_since_trade = self.signal_cooldown
subscription = self.SubscribeCandles(DataType.TimeFrame(TimeSpan.FromMinutes(60)))
subscription.Bind(self._rsi, self._process_candle)
subscription.Start()
def _process_candle(self, candle, rsi_value):
if candle.State != CandleStates.Finished:
return
if not self._rsi.IsFormed:
return
rsi_val = float(rsi_value)
if self._candles_since_trade < self.signal_cooldown:
self._candles_since_trade += 1
close = float(candle.ClosePrice)
open_p = float(candle.OpenPrice)
if close > open_p:
self._bull_count += 1
self._bear_count = 0
elif close < open_p:
self._bear_count += 1
self._bull_count = 0
else:
self._bull_count = 0
self._bear_count = 0
if self._bull_count >= 3 and rsi_val < 65.0 and self.Position <= 0 and self._candles_since_trade >= self.signal_cooldown:
self.BuyMarket()
self._bull_count = 0
self._candles_since_trade = 0
elif self._bear_count >= 3 and rsi_val > 35.0 and self.Position >= 0 and self._candles_since_trade >= self.signal_cooldown:
self.SellMarket()
self._bear_count = 0
self._candles_since_trade = 0
def CreateClone(self):
return three_soldiers_stochastic_strategy()