Die Histo Scalper Strategy ist eine C#-Portierung des MetaTrader Expert Advisors HistoScalperEA v1.0. Der Algorithmus verschmilzt acht Indikatoren im Histogrammstil (ADX, ATR, Bollinger Bands, Bulls/Bears Power, CCI, MACD, RSI und Stochastic) und erfordert die einstimmige Zustimmung aller aktivierten Filter, bevor ein Handel eröffnet wird. Eine zweite Anforderung besteht darin, dass mindestens ein Filter die entgegengesetzte Richtung des vorherigen Balkens meldet, was verhindert, dass die Strategie bei flachen Märkten eintritt, und die ursprüngliche Bestätigungslogik „zwei Balken“ nachahmt.
Signalerzeugung
ADX-Filter – prüft, ob +DI größer als −DI ist. Optional können Sie die Entscheidung umkehren.
ATR-Filter – vergleicht den aktuellen ATR mit einer SMA-Basislinie und misst die prozentuale Abweichung. Long-Trades erfordern eine positive Abweichung über AtrPositiveThreshold; Short-Trades erfordern eine negative Abweichung unter AtrNegativeThreshold.
Bollinger Ausbruch – erwartet, dass der Schlusskurs das obere/untere Band durchbricht.
Bullen-/Bears-Power – nutzt Bulls-Power für Long-Einstiege und Bears-Power-Größe für Short-Einstiege.
CCI – wird ausgelöst, wenn der Wert CCI die konfigurierten überverkauften/überkauften Ebenen überschreitet.
MACD-Histogramm – misst den Abstand zwischen MACD und seiner Signallinie.
RSI – verwendet klassische überverkaufte/überkaufte Zonen.
Stochastic – liest die %K-Zeile und vergleicht sie mit konfigurierten Grenzen.
Wenn ein aktivierter Filter einen neutralen Wert erzeugt, bricht die Strategie die Verarbeitung für die aktuelle Kerze ab. Der historische Zustand jedes Filters wird gespeichert, um die Regel „vorheriger Balken gegenüber“ durchzusetzen.
Risikomanagement
Markteinträge verwenden den Parameter TradeVolume.
Optionales Pyramiding erhöht die Zahl der offenen Positionen; Andernfalls ändert die Strategie nur die Richtung, wenn sich das Signal ändert.
Take-Profit- und Stop-Loss-Level werden in Preisschritten des Instruments ausgedrückt und unmittelbar nach Auftragserteilung über SetTakeProfit und SetStopLoss angewendet.
Ein Sitzungsfilter (UseTimeFilter, SessionStart, SessionEnd) kann den Handel außerhalb der konfigurierten Zeiten deaktivieren.
Parameter
Parameter
Beschreibung
TradeVolume
Basisvolumen für neue Trades.
AllowPyramiding
Ermöglicht das Stapeln zusätzlicher Trades, während bereits positioniert.
CloseOnOppositeSignal
Schließt bestehende Positionen, wenn das aggregierte Signal umkehrt.
UseTimeFilter, SessionStart, SessionEnd
Beschränkt den Handel auf ein benutzerdefiniertes Tagesfenster.
UseTakeProfit, TakeProfitPoints
Ermöglicht und konfiguriert Take-Profit in Preisschritten.
UseStopLoss, StopLossPoints
Aktiviert und konfiguriert Stop-Loss in Preisschritten.
UseIndicator1 … UseIndicator8
Aktivieren Sie einzelne Filter.
ModeIndicatorX
Wechseln Sie für jeden Filter zwischen gerader und invertierter Logik.
Indikatorenspezifische Einstellungen
Zeiträume, Schwellenwerte und Ebenen, die die ursprünglichen Eingaben des Expertenberaters nachbilden.
Unterschiede zum MQL Expert
Auf die Korb-Gewinn-/Verlustverwaltung, akustische Alarme und die Rasterauftragsverwaltung wurde bewusst verzichtet.
Die Risikoautomatisierung (automatische Losgrößenbestimmung, Break-Even- und Trailing-Logik) ist nicht enthalten; Verwenden Sie stattdessen die oben genannten Risikoparameter.
Spread-Checks und Broker-spezifische Schutzmaßnahmen werden nicht portiert.
Nutzungshinweise
Legen Sie Security und Portfolio fest, bevor Sie mit der Strategie beginnen.
Passen Sie den Kerzentyp (CandleType) an den gewünschten Zeitrahmen an.
Konfigurieren Sie die Indikatorschwellenwerte so, dass sie zur Volatilität des Zielinstruments passen.
Aktivieren oder deaktivieren Sie Filter einzeln, um die Optimierung zu vereinfachen.
Verwenden Sie AllowPyramiding und CloseOnOppositeSignal, um die Präsenz in schnellen Märkten zu kontrollieren.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Multi-indicator scalping strategy combining MACD, RSI, and CCI filters.
/// Buys when all indicators agree on bullish signal. Sells on bearish agreement.
/// </summary>
public class HistoScalperStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _rsiPeriod;
private readonly StrategyParam<int> _cciPeriod;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int RsiPeriod
{
get => _rsiPeriod.Value;
set => _rsiPeriod.Value = value;
}
public int CciPeriod
{
get => _cciPeriod.Value;
set => _cciPeriod.Value = value;
}
public HistoScalperStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_rsiPeriod = Param(nameof(RsiPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("RSI Period", "RSI period", "Indicators");
_cciPeriod = Param(nameof(CciPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("CCI Period", "CCI period", "Indicators");
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var macd = new MovingAverageConvergenceDivergence();
var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
var cci = new CommodityChannelIndex { Length = CciPeriod };
decimal? prevMacd = null;
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(macd, rsi, cci, (candle, macdLine, rsiVal, cciVal) =>
{
if (candle.State != CandleStates.Finished)
return;
if (!IsFormedAndOnlineAndAllowTrading())
return;
if (prevMacd.HasValue)
{
if (prevMacd.Value <= 0 && macdLine > 0 && rsiVal < 70m && cciVal > -100m && Position <= 0)
BuyMarket();
else if (prevMacd.Value >= 0 && macdLine < 0 && rsiVal > 30m && cciVal < 100m && Position >= 0)
SellMarket();
}
prevMacd = macdLine;
})
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawOwnTrades(area);
}
}
}
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 MovingAverageConvergenceDivergence, RelativeStrengthIndex, CommodityChannelIndex
from StockSharp.Algo.Strategies import Strategy
class histo_scalper_strategy(Strategy):
def __init__(self):
super(histo_scalper_strategy, self).__init__()
self._rsi_period = self.Param("RsiPeriod", 14) \
.SetDisplay("RSI Period", "RSI period", "Indicators")
self._cci_period = self.Param("CciPeriod", 14) \
.SetDisplay("CCI Period", "CCI period", "Indicators")
self._macd = None
self._rsi = None
self._cci = None
self._prev_macd = None
@property
def rsi_period(self):
return self._rsi_period.Value
@property
def cci_period(self):
return self._cci_period.Value
def OnReseted(self):
super(histo_scalper_strategy, self).OnReseted()
self._macd = None
self._rsi = None
self._cci = None
self._prev_macd = None
def OnStarted2(self, time):
super(histo_scalper_strategy, self).OnStarted2(time)
self._macd = MovingAverageConvergenceDivergence()
self._rsi = RelativeStrengthIndex()
self._rsi.Length = self.rsi_period
self._cci = CommodityChannelIndex()
self._cci.Length = self.cci_period
subscription = self.SubscribeCandles(DataType.TimeFrame(TimeSpan.FromMinutes(30)))
subscription.Bind(self._macd, self._rsi, self._cci, self._process_candle)
subscription.Start()
def _process_candle(self, candle, macd_value, rsi_value, cci_value):
if candle.State != CandleStates.Finished:
return
if not self._macd.IsFormed or not self._rsi.IsFormed or not self._cci.IsFormed:
return
macd_line = float(macd_value)
rsi_val = float(rsi_value)
cci_val = float(cci_value)
if self._prev_macd is not None:
if self._prev_macd <= 0.0 and macd_line > 0.0 and rsi_val < 70.0 and cci_val > -100.0 and self.Position <= 0:
self.BuyMarket()
elif self._prev_macd >= 0.0 and macd_line < 0.0 and rsi_val > 30.0 and cci_val < 100.0 and self.Position >= 0:
self.SellMarket()
self._prev_macd = macd_line
def CreateClone(self):
return histo_scalper_strategy()