Die Gonna Scalp-Strategie ist ein hochfrequenter MetaTrader-Expertenberater, der auf die StockSharp-Hochebene API portiert wurde. Das System sucht auf einem kurzfristigen Chart nach schnellen Mean-Reversion-Einträgen und respektiert dabei den vorherrschenden Markttrend. Die Bestätigung erfolgt durch einen Abstimmungsmechanismus, der Momentum-, CCI-, ATR-, stochastische Oszillator- und MACD-Filter bewertet, bevor ein Handel zugelassen wird. Es kann jeweils nur eine Position offen sein und jeder Trade ist durch feste Stop-Loss- und Take-Profit-Abstände geschützt, ausgedrückt in MetaTrader Punkten.
Handelslogik
Indikatorvorbereitung
Schnelle und langsame gewichtete gleitende Durchschnitte (WMA), berechnet auf Basis typischer Preise.
Momentum (Periode 14) wird im Handelszeitraum bewertet und in einen absoluten Abstand vom neutralen Wert 100 umgerechnet.
Commodity Channel Index (Periode 20) und Average True Range (Periode 12) werden als Richtungsfilter verwendet.
Stochastic-Oszillator %K/%D (5/3/3) und MACD (26.12.9) wurden auf derselben Kerzenserie verarbeitet.
Signalabstimmung
Jeder Indikator gibt eine Stimme für die bullische oder bärische Seite, wenn sein aktueller Wert den im ursprünglichen MetaTrader-Code identifizierten Trend unterstützt.
Die Strategie erfasst drei aktuelle Momentum-Distanzen und erfordert, dass mindestens eine davon einen konfigurierbaren Schwellenwert überschreitet, bevor ein neuer Trade zugelassen wird.
Zusätzliche Strukturprüfungen erfordern, dass das Tief des Balkens vor zwei Kerzen unter dem Hoch des vorherigen Balkens für Long-Positionen bleibt (Spiegelbedingung für Shorts).
Auftragsausführung
Wenn die bullischen Stimmen die bärischen Stimmen übersteigen und alle Filter übereinstimmen, eröffnet die Strategie eine Long-Position mit der konfigurierten Losgröße.
Wenn die bärischen Stimmen die bullischen Stimmen überwiegen und der Momentumfilter zustimmt, wird eine Short-Position eröffnet.
Risikomanagement
Jeder offene Handel wird von festen Stop-Loss- und Take-Profit-Abständen begleitet, die in MetaTrader Punkten gemessen und in Instrumentenpreisschritte übersetzt werden.
Die Schutzlogik schließt die Position auf der aktuellen Kerze, sobald eines der Niveaus durchbrochen wurde.
Schlüsselparameter
Name
Beschreibung
Standard
TradeVolume
Basisauftragsgröße in Losen nach Volumenausrichtung.
0.01
FastMaPeriod
Länge des schnellen WMA-Filters.
1
SlowMaPeriod
Länge des langsamen WMA-Filters.
5
MomentumPeriod
Anzahl der vom Momentum-Indikator verwendeten Balken.
14
MomentumBuyThreshold
Minimale absolute Impulsabweichung, die für lange Einstiege erforderlich ist.
0.3
MomentumSellThreshold
Minimale absolute Impulsabweichung, die für Short-Einstiege erforderlich ist.
0.3
StopLossSteps
Stop-Loss-Distanz, ausgedrückt in MetaTrader Punkten.
200
TakeProfitSteps
Take-Profit-Distanz ausgedrückt in MetaTrader Punkten.
200
CandleType
Für alle Indikatoren verwendeter Zeitrahmen (standardmäßig 5-Minuten-Kerzen).
M5
Nutzungshinweise
Passen Sie das Strategievolumen an das gehandelte Instrument an, indem Sie TradeVolume anpassen; Die Implementierung normalisiert es automatisch auf den Austauschlosschritt.
Die Stop-Loss- und Take-Profit-Parameter arbeiten in MetaTrader Punkten. Sie werden basierend auf der Präzision des Instruments in Instrumentenpreiseinheiten umgerechnet.
Aufgrund des Momentum-History-Puffers sind mindestens drei abgeschlossene Kerzen erforderlich, bevor die Abstimmungslogik Signale erzeugen kann.
Die Strategie vermeidet bewusst Pyramidenbildung; Ein neuer Trade wird erst dann eröffnet, wenn die vorherige Position durch das Risikomanagement oder ein gegenteiliges Signal geschlossen wurde.
Sie können die Strategie mit StockSharp-Diagrammen verbinden, um die WMAs, stochastischen und MACD-Reihen zur Signalvalidierung zu visualisieren.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Gonna Scalp strategy: WMA crossover with CCI momentum filter.
/// Buys when fast WMA above slow WMA and CCI above -100.
/// Sells when fast WMA below slow WMA and CCI below 100.
/// </summary>
public class GonnaScalpStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private readonly StrategyParam<int> _cciPeriod;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int FastPeriod
{
get => _fastPeriod.Value;
set => _fastPeriod.Value = value;
}
public int SlowPeriod
{
get => _slowPeriod.Value;
set => _slowPeriod.Value = value;
}
public int CciPeriod
{
get => _cciPeriod.Value;
set => _cciPeriod.Value = value;
}
public GonnaScalpStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_fastPeriod = Param(nameof(FastPeriod), 10)
.SetGreaterThanZero()
.SetDisplay("Fast WMA", "Fast WMA period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 30)
.SetGreaterThanZero()
.SetDisplay("Slow WMA", "Slow WMA period", "Indicators");
_cciPeriod = Param(nameof(CciPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("CCI Period", "CCI period", "Indicators");
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var fast = new WeightedMovingAverage { Length = FastPeriod };
var slow = new WeightedMovingAverage { Length = SlowPeriod };
var cci = new CommodityChannelIndex { Length = CciPeriod };
decimal? prevFast = null;
decimal? prevSlow = null;
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(fast, slow, cci, (candle, fastVal, slowVal, cciVal) =>
{
if (candle.State != CandleStates.Finished)
return;
if (!IsFormedAndOnlineAndAllowTrading())
return;
if (prevFast.HasValue && prevSlow.HasValue)
{
var crossUp = prevFast.Value <= prevSlow.Value && fastVal > slowVal;
var crossDown = prevFast.Value >= prevSlow.Value && fastVal < slowVal;
if (crossUp && cciVal > -100m && Position <= 0)
BuyMarket();
else if (crossDown && cciVal < 100m && Position >= 0)
SellMarket();
}
prevFast = fastVal;
prevSlow = slowVal;
})
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, fast);
DrawIndicator(area, slow);
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 WeightedMovingAverage, CommodityChannelIndex
from StockSharp.Algo.Strategies import Strategy
class gonna_scalp_strategy(Strategy):
def __init__(self):
super(gonna_scalp_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(30))) \
.SetDisplay("Candle Type", "Candle timeframe", "General")
self._fast_period = self.Param("FastPeriod", 10) \
.SetGreaterThanZero() \
.SetDisplay("Fast WMA", "Fast WMA period", "Indicators")
self._slow_period = self.Param("SlowPeriod", 30) \
.SetGreaterThanZero() \
.SetDisplay("Slow WMA", "Slow WMA period", "Indicators")
self._cci_period = self.Param("CciPeriod", 14) \
.SetGreaterThanZero() \
.SetDisplay("CCI Period", "CCI period", "Indicators")
self._prev_fast = None
self._prev_slow = None
@property
def candle_type(self):
return self._candle_type.Value
def OnReseted(self):
super(gonna_scalp_strategy, self).OnReseted()
self._prev_fast = None
self._prev_slow = None
def OnStarted2(self, time):
super(gonna_scalp_strategy, self).OnStarted2(time)
self._fast_ind = WeightedMovingAverage()
self._fast_ind.Length = self._fast_period.Value
self._slow_ind = WeightedMovingAverage()
self._slow_ind.Length = self._slow_period.Value
self._cci_ind = CommodityChannelIndex()
self._cci_ind.Length = self._cci_period.Value
subscription = self.SubscribeCandles(self.candle_type)
subscription.Bind(self._fast_ind, self._slow_ind, self._cci_ind, self._process_candle).Start()
def _process_candle(self, candle, fast_value, slow_value, cci_value):
if candle.State != CandleStates.Finished:
return
if not self.IsFormedAndOnlineAndAllowTrading():
return
fast_val = float(fast_value)
slow_val = float(slow_value)
cci_val = float(cci_value)
if self._prev_fast is not None and self._prev_slow is not None:
cross_up = self._prev_fast <= self._prev_slow and fast_val > slow_val
cross_down = self._prev_fast >= self._prev_slow and fast_val < slow_val
if cross_up and cci_val > -100.0 and self.Position <= 0:
self.BuyMarket()
elif cross_down and cci_val < 100.0 and self.Position >= 0:
self.SellMarket()
self._prev_fast = fast_val
self._prev_slow = slow_val
def CreateClone(self):
return gonna_scalp_strategy()