Start
/
Strategie-Beispiele
Auf GitHub ansehen
Bullisches Engulfing-Muster-Strategie
Dieses Setup sucht nach einer starken bullischen Umkehr, wenn eine Kerze den vorherigen bärischen Balken vollständig umschließt. Eine solche Formation beendet oft einen kurzfristigen Rückgang und deutet auf neuen Aufwärtsschwung hin. Der optionale Abwärtstrend-Filter zählt aufeinanderfolgende rote Kerzen, um die Erschöpfung der Verkäufer zu bestätigen.
Tests zeigen eine durchschnittliche jährliche Rendite von etwa 76%. Sie funktioniert am besten auf dem Forex-Markt.
Im Live-Betrieb beobachtet der Algorithmus jede eingehende Kerze und verfolgt den vorherigen Balken. Wenn die neue Kerze höher schließt als sie öffnet und ihr Körper den vorherigen Balken umschließt, wird ein Long-Einstieg ausgelöst. Der Stop wird knapp unterhalb des Mustertiefs platziert, um das Risiko zu begrenzen.
Trades bleiben offen, bis der Stop ausgelöst wird oder ein anderes Signal auf einen manuellen Ausstieg hindeutet. Da die Bestätigung durch frühere Abwärtsbalken das Setup stärkt, vermeidet die Strategie das Nachjagen schwacher Umkehrungen.
Details
Einstiegskriterien : Bullische Kerze umschließt vorherigen bärischen Balken, optionaler Abwärtstrend vorhanden.
Long/Short : Nur Long.
Ausstiegskriterien : Stop-Loss oder diskretionär.
Stops : Ja, unterhalb des Mustertiefs.
Standardwerte :
CandleType = 15 minute
StopLossPercent = 1
RequireDowntrend = true
DowntrendBars = 3
Filter :
Kategorie: Muster
Richtung: Long
Indikatoren: Candlestick
Stops: Ja
Komplexität: Mittel
Zeitrahmen: Intraday
Saisonalität: Nein
Neuronale Netze: Nein
Divergenz: Nein
Risikolevel: Mittel
using System;
using System.Collections.Generic;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// Bullish Engulfing strategy.
/// Enters long on bullish engulfing pattern below SMA.
/// Enters short on bearish engulfing pattern above SMA.
/// Exits via SMA crossover.
/// </summary>
public class EngulfingBullishStrategy : Strategy
{
private readonly StrategyParam<int> _maPeriod;
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _cooldownBars;
private ICandleMessage _previousCandle;
private int _cooldown;
/// <summary>
/// MA Period.
/// </summary>
public int MAPeriod
{
get => _maPeriod.Value;
set => _maPeriod.Value = value;
}
/// <summary>
/// Candle type.
/// </summary>
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
/// <summary>
/// Cooldown bars.
/// </summary>
public int CooldownBars
{
get => _cooldownBars.Value;
set => _cooldownBars.Value = value;
}
/// <summary>
/// Constructor.
/// </summary>
public EngulfingBullishStrategy()
{
_maPeriod = Param(nameof(MAPeriod), 20)
.SetGreaterThanZero()
.SetDisplay("MA Period", "Period for SMA", "Indicators");
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(1).TimeFrame())
.SetDisplay("Candle Type", "Type of candles to use", "General");
_cooldownBars = Param(nameof(CooldownBars), 500)
.SetRange(1, 1000)
.SetDisplay("Cooldown Bars", "Bars to wait between trades", "General");
}
/// <inheritdoc />
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
{
return [(Security, CandleType)];
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_previousCandle = null;
_cooldown = default;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_previousCandle = null;
_cooldown = 0;
var sma = new SimpleMovingAverage { Length = MAPeriod };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(sma, ProcessCandle)
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, sma);
DrawOwnTrades(area);
}
}
private void ProcessCandle(ICandleMessage candle, decimal smaValue)
{
if (candle.State != CandleStates.Finished)
return;
if (!IsFormedAndOnlineAndAllowTrading())
return;
if (_cooldown > 0)
{
_cooldown--;
_previousCandle = candle;
return;
}
if (_previousCandle != null)
{
var isPrevBearish = _previousCandle.ClosePrice < _previousCandle.OpenPrice;
var isPrevBullish = _previousCandle.ClosePrice > _previousCandle.OpenPrice;
var isCurrBullish = candle.ClosePrice > candle.OpenPrice;
var isCurrBearish = candle.ClosePrice < candle.OpenPrice;
var bullishEngulfing = isPrevBearish && isCurrBullish &&
candle.ClosePrice > _previousCandle.OpenPrice &&
candle.OpenPrice < _previousCandle.ClosePrice;
var bearishEngulfing = isPrevBullish && isCurrBearish &&
candle.ClosePrice < _previousCandle.OpenPrice &&
candle.OpenPrice > _previousCandle.ClosePrice;
if (Position == 0 && bullishEngulfing && candle.ClosePrice < smaValue)
{
BuyMarket();
_cooldown = CooldownBars;
}
else if (Position == 0 && bearishEngulfing && candle.ClosePrice > smaValue)
{
SellMarket();
_cooldown = CooldownBars;
}
else if (Position > 0 && candle.ClosePrice < smaValue)
{
SellMarket();
_cooldown = CooldownBars;
}
else if (Position < 0 && candle.ClosePrice > smaValue)
{
BuyMarket();
_cooldown = CooldownBars;
}
}
_previousCandle = candle;
}
}
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 SimpleMovingAverage
from StockSharp.Algo.Strategies import Strategy
class engulfing_bullish_strategy(Strategy):
"""
Bullish Engulfing strategy.
Enters long on bullish engulfing pattern below SMA.
Enters short on bearish engulfing pattern above SMA.
Exits via SMA crossover.
"""
def __init__(self):
super(engulfing_bullish_strategy, self).__init__()
self._ma_period = self.Param("MAPeriod", 20).SetDisplay("MA Period", "Period for SMA", "Indicators")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(1))).SetDisplay("Candle Type", "Type of candles to use", "General")
self._cooldown_bars = self.Param("CooldownBars", 500).SetDisplay("Cooldown Bars", "Bars to wait between trades", "General")
self._previous_candle = None
self._cooldown = 0
@property
def candle_type(self):
return self._candle_type.Value
def OnReseted(self):
super(engulfing_bullish_strategy, self).OnReseted()
self._previous_candle = None
self._cooldown = 0
def OnStarted2(self, time):
super(engulfing_bullish_strategy, self).OnStarted2(time)
self._previous_candle = None
self._cooldown = 0
sma = SimpleMovingAverage()
sma.Length = self._ma_period.Value
subscription = self.SubscribeCandles(self.candle_type)
subscription.Bind(sma, self._process_candle).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, sma)
self.DrawOwnTrades(area)
def _process_candle(self, candle, sma_val):
if candle.State != CandleStates.Finished:
return
if self._cooldown > 0:
self._cooldown -= 1
self._previous_candle = candle
return
if self._previous_candle is not None:
prev_bearish = self._previous_candle.ClosePrice < self._previous_candle.OpenPrice
prev_bullish = self._previous_candle.ClosePrice > self._previous_candle.OpenPrice
curr_bullish = candle.ClosePrice > candle.OpenPrice
curr_bearish = candle.ClosePrice < candle.OpenPrice
bullish_engulfing = prev_bearish and curr_bullish and candle.ClosePrice > self._previous_candle.OpenPrice and candle.OpenPrice < self._previous_candle.ClosePrice
bearish_engulfing = prev_bullish and curr_bearish and candle.ClosePrice < self._previous_candle.OpenPrice and candle.OpenPrice > self._previous_candle.ClosePrice
sv = float(sma_val)
close = float(candle.ClosePrice)
cd = self._cooldown_bars.Value
if self.Position == 0 and bullish_engulfing and close < sv:
self.BuyMarket()
self._cooldown = cd
elif self.Position == 0 and bearish_engulfing and close > sv:
self.SellMarket()
self._cooldown = cd
elif self.Position > 0 and close < sv:
self.SellMarket()
self._cooldown = cd
elif self.Position < 0 and close > sv:
self.BuyMarket()
self._cooldown = cd
self._previous_candle = candle
def CreateClone(self):
return engulfing_bullish_strategy()