Die OHLC-Prüfungsstrategie repliziert den klassischen MetaTrader-Expert-Advisor, der die Eröffnungs-, Hoch-, Tief- und Schlusskursstruktur der vorherigen Kerze untersucht. Die Strategie bewertet den Kerzenkörper bei einem konfigurierbaren historischen Versatz und eröffnet eine neue Position in der Richtung dieses Körpers, wobei das Signal optional gespiegelt werden kann. Sie ist für eine einfache preisaktionsbasierte Ausführung ohne Abhängigkeit von Oszillatoren oder gleitenden Durchschnitten ausgelegt.
Handelslogik
Die Strategie abonniert die konfigurierte Kerzenserie und wartet, bis die Kerze abgeschlossen ist, bevor sie verarbeitet wird.
Für jede abgeschlossene Kerze speichert die Engine den Eröffnungs- und Schlusskurs, sodass der benutzerdefinierte Versatz ("SignalShift") auf ältere Kerzen verweisen kann.
Ein bullischer Körper (Schluss über Eröffnung) erzeugt ein Long-Signal, während ein bärischer Körper (Schluss unter Eröffnung) ein Short-Signal erzeugt. Bei einem flachen Körper wird kein Trade erstellt.
Das ReverseSignals-Flag kann die Handelsrichtung umkehren und reproduziert den Reverse-Trading-Modus des ursprünglichen Expert-Advisors.
Wenn keine aktive Position vorhanden ist, versucht die Strategie, eine Marktorder in der erkannten Richtung zu eröffnen, solange der aktuelle Spread innerhalb des erlaubten SpreadLimitPips-Schwellenwerts liegt. Der Spread wird über den Orderbuch-Feed überwacht.
Wenn bereits eine Position vorhanden ist, löst das entgegengesetzte Signal ein Schließen der Position aus, anstatt einer vollständigen Umkehrung, entsprechend der MQL-Logik.
Optionale Stop-Loss- und Take-Profit-Schutzmaßnahmen werden beim Start unter Verwendung von Pip-Distanzen gestartet, die in den Preis-Schritt des Instruments umgerechnet werden, und recreieren das MQL-Money-Management-Verhalten.
Parameter
Parameter
Standard
Beschreibung
CandleType
5-Minuten-Zeitrahmen
Für die OHLC-Auswertung verwendete Datenserie.
StopLossPips
50
Stop-Loss-Abstand gemessen in Pips; 0 deaktiviert den Stop.
TakeProfitPips
100
Take-Profit-Abstand gemessen in Pips; 0 deaktiviert das Ziel.
ReverseSignals
false
Kehrt die Richtung von Long- und Short-Signalen um.
SpreadLimitPips
1
Maximaler Spread in Pips, der beim Eröffnen einer neuen Position erlaubt ist.
SignalShift
1
Anzahl der abgeschlossenen Kerzen zurück für die Signalberechnung (1 = vorherige Kerze).
OrderVolume
1
Mit jeder Marktorder gesendetes Volumen.
Verwendungshinweise
Die Strategie verwendet die Instrumentenmetadaten, um Pip-Werte in Preisschrittabstände umzurechnen. Instrumente mit 3 oder 5 Dezimalstellen erhalten automatisch die standardmäßige Zehn-Punkt-Pip-Anpassung.
Das Orderbuch-Abonnement sollte im Datenfeed aktiviert sein, damit Spread-Prüfungen korrekt funktionieren. Wenn keine Bid/Ask-Kurse verfügbar sind, überspringt die Strategie das Eröffnen neuer Trades.
Schutz-Stops werden einmalig während OnStarted initiiert. Das nachträgliche Ändern von Stop-Parametern erfordert einen Neustart der Strategie, um neue Schutzmaßnahmen anzuwenden.
Da die Strategie nur auf den Kerzenkörper reagiert, werden Hoch- und Tiefwerte genau wie in der ursprünglichen MetaTrader-Version ignoriert.
Bereitstellungsschritte
Fügen Sie die Strategie einem Instrument hinzu, das sowohl Kerzen als auch Orderbuch-Kurse liefert.
Konfigurieren Sie die Parameter entsprechend dem gewünschten Handelsstil (Zeitrahmen, Pip-Abstände und Volumen).
Starten Sie die Strategie. Sie wartet auf die nächste abgeschlossene Kerze, bevor sie eine Aktion durchführt.
Überwachen Sie das Protokoll auf Spread-Ablehnungen oder ausgeführte Trades und passen Sie die Parameter nach Bedarf an.
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>
/// OHLC check strategy. Trades based on candle structure (bullish/bearish body).
/// </summary>
public class OhlcCheckStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _confirmBars;
private int _bullCount;
private int _bearCount;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int ConfirmBars
{
get => _confirmBars.Value;
set => _confirmBars.Value = value;
}
public OhlcCheckStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Timeframe", "General");
_confirmBars = Param(nameof(ConfirmBars), 3)
.SetGreaterThanZero()
.SetDisplay("Confirm Bars", "Consecutive candles to confirm direction", "Trading");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
{
return [(Security, CandleType)];
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_bullCount = 0;
_bearCount = 0;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_bullCount = 0;
_bearCount = 0;
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(ProcessCandle)
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawOwnTrades(area);
}
}
private void ProcessCandle(ICandleMessage candle)
{
if (candle.State != CandleStates.Finished)
return;
if (!IsFormedAndOnlineAndAllowTrading())
return;
if (candle.ClosePrice > candle.OpenPrice)
{
_bullCount++;
_bearCount = 0;
}
else if (candle.ClosePrice < candle.OpenPrice)
{
_bearCount++;
_bullCount = 0;
}
// Consecutive bullish candles → buy
if (_bullCount >= ConfirmBars && Position <= 0)
{
if (Position < 0)
BuyMarket();
BuyMarket();
_bullCount = 0;
}
// Consecutive bearish candles → sell
else if (_bearCount >= ConfirmBars && Position >= 0)
{
if (Position > 0)
SellMarket();
SellMarket();
_bearCount = 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.Strategies import Strategy
class ohlc_check_strategy(Strategy):
def __init__(self):
super(ohlc_check_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Timeframe", "General")
self._confirm_bars = self.Param("ConfirmBars", 3) \
.SetDisplay("Confirm Bars", "Consecutive candles to confirm direction", "Trading")
self._bull_count = 0
self._bear_count = 0
@property
def CandleType(self):
return self._candle_type.Value
@property
def ConfirmBars(self):
return self._confirm_bars.Value
def OnReseted(self):
super(ohlc_check_strategy, self).OnReseted()
self._bull_count = 0
self._bear_count = 0
def OnStarted2(self, time):
super(ohlc_check_strategy, self).OnStarted2(time)
self._bull_count = 0
self._bear_count = 0
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(self._on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawOwnTrades(area)
def _on_process(self, candle):
if candle.State != CandleStates.Finished:
return
close = float(candle.ClosePrice)
open_price = float(candle.OpenPrice)
if close > open_price:
self._bull_count += 1
self._bear_count = 0
elif close < open_price:
self._bear_count += 1
self._bull_count = 0
cb = int(self.ConfirmBars)
# Consecutive bullish candles
if self._bull_count >= cb and self.Position <= 0:
if self.Position < 0:
self.BuyMarket()
self.BuyMarket()
self._bull_count = 0
# Consecutive bearish candles
elif self._bear_count >= cb and self.Position >= 0:
if self.Position > 0:
self.SellMarket()
self.SellMarket()
self._bear_count = 0
def CreateClone(self):
return ohlc_check_strategy()