Zehn Punkte 3 v005 Strategie
Überblick
Diese Strategie ist eine StockSharp-Portierung des MetaTrader 4-Expertenberaters „10points 3 v005“. Es folgt der MACD-Steigung, um zu entscheiden, ob der aktuelle Durchschnittskorb long oder short sein soll, und eröffnet jedes Mal Martingal-Orders, wenn sich der Preis um eine konfigurierbare Distanz gegen die aktive Position bewegt. Die erweiterte Version „v005“ fügt eigenkapitalbasierte Schutzregeln, Tages- und Zeitfilter und die Option hinzu, entweder den langen oder den kurzen Zyklus zu deaktivieren.
Handelslogik
- Lesen Sie die Richtung aus der Hauptzeile MACD ab. Wenn der Indikator steigt, wird der nächste Korb long sein, wenn er fällt, wird der Korb short sein. Eine Option erlaubt die Umkehrung der Interpretation.
- Eröffnen Sie sofort die erste Marktposition, sobald eine Richtung vorliegt. Nachfolgende Einträge werden hinzugefügt, wenn sich der Preis um
EntryDistancePips gegenüber der Floating-Position bewegt.
- Bestellgrößen wachsen geometrisch. Der Multiplikator wird durch
MartingaleFactor gesteuert (oder HighTradeFactor, wenn mehr als 12 Trades zulässig sind). Die Volumina richten sich nach der Instrumentenvolumenstufe und sind auf 100 Lots begrenzt.
- Jeder Eintrag aktualisiert die aggregierten Stop-Loss- und Take-Profit-Level. Die Anfangswerte werden um
InitialStopPips und TakeProfitPips ausgeglichen, während die nachgestellte Logik aktiviert wird, nachdem die Position EntryDistancePips + TrailingStopPips dafür gewonnen hat.
- Wenn der Kontoschutz aktiviert ist, kann die Strategie das Ziel mit dem besten Eintrag (
ReboundLock) ausrichten und die letzte Order schließen, sobald der variable Gewinn SecureProfit erreicht.
- Die Eigenkapitalschutzregeln schließen den gesamten Korb, wenn der variable Verlust
StopLossAmount übersteigt, wenn das Eigenkapital über ProfitTarget + ProfitBuffer steigt oder wenn das Eigenkapital unter StartProtectionLevel fällt.
- Der Handel ist auf das Zeitfenster
OpenHour/CloseHour beschränkt und freitags standardmäßig vollständig deaktiviert.
Geldmanagement
Wenn UseMoneyManagement deaktiviert ist, verwendet die erste Bestellung das feste LotSize. Wenn das Flag aktiviert ist, wird das Basisvolumen aus dem aktuellen Portfoliowert und dem Parameter RiskPercent berechnet. Die Skalierung von Minikonten kann durch IsStandardAccount simuliert werden.
Parameter
| Parameter |
Beschreibung |
TakeProfitPips |
Abstand (in Pips) des Take-Profits, der auf jeden Eintrag angewendet wird. |
LotSize |
Basislosgröße, wenn die Geldverwaltung deaktiviert ist. |
InitialStopPips |
Anfängliche Stop-Loss-Distanz für jede Order. |
TrailingStopPips |
Trailing-Stop-Distanz, sobald die Triggerschwelle erreicht ist. |
MaxTrades |
Maximale Anzahl gleichzeitiger Martingaleinträge. |
EntryDistancePips |
Mindestens erforderliche Gegenbewegung zum Hinzufügen der nächsten Bestellung. |
SecureProfit |
Variabler Gewinn (in Währungseinheiten), der erforderlich ist, um den Ausstieg aus dem Kontoschutz auszulösen. |
UseAccountProtection |
Aktiviert die Secure-Profit- und Rebound-Lock-Logik. |
OrdersToProtect |
Anzahl der letzten Martingalschritte, die durch die Secure-Profit-Regel geschützt sind. |
ReverseSignals |
Kehrt die Interpretation der MACD-Steigung um. |
UseMoneyManagement |
Ermöglicht die ausgleichsbasierte Größenbestimmung. |
RiskPercent |
Von der Money-Management-Formel verwendeter Risikoprozentsatz. |
IsStandardAccount |
Verwendet die Standardlosskalierung anstelle der Miniskalierung. |
EurUsdPipValue, GbpUsdPipValue, UsdChfPipValue, UsdJpyPipValue, DefaultPipValue |
Pip-Werte, die zur Umrechnung variabler Gewinne in eine Währung verwendet werden. |
CandleType |
Kerzenzeitrahmen, der für die Signalgenerierung verwendet wird. |
MacdFastLength, MacdSlowLength, MacdSignalLength |
MACD-Konfiguration. |
EnableLong, EnableShort |
Aktivieren oder deaktivieren Sie den langen/kurzen Korb. |
OpenHour, CloseHour, MinuteToStop |
Konfiguration des Handelsfensters. |
StopLossProtection, StopLossAmount |
Aktienbasierter Stop-Loss-Schutz. |
ProfitTargetEnabled, ProfitTarget, ProfitBuffer |
Eigenkapitalbasierte Gewinnsperre. |
StartProtectionEnabled, StartProtectionLevel |
Equity-Bodenwächter. |
ReboundLock |
Richtet Ausgänge am besten Eingang aus, wenn der Schutz aktiv ist. |
MartingaleFactor, HighTradeFactor |
Martingale Multiplikatoren. |
CloseOnFriday |
Deaktiviert den Handel freitags. |
Notizen
- Die Strategie verwendet das übergeordnete StockSharp API (
SubscribeCandles + BindEx) und stellt keine rohen Indikatorpuffer bereit.
- Jeder Aktienwächter schließt den aktiven Warenkorb mithilfe von Marktaufträgen, um das ursprüngliche EA-Verhalten zu reproduzieren.
- Überprüfen Sie immer die Parameterwerte, die Pip-Größe und den Pip-Wert anhand Ihrer Broker-Spezifikationen, bevor Sie die Strategie in der Produktion verwenden.
using System;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// 10 Points 3 V005: Dual EMA crossover with RSI confirmation and ATR stops.
/// </summary>
public class TenPoints3V005Strategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _fastEmaLength;
private readonly StrategyParam<int> _slowEmaLength;
private readonly StrategyParam<int> _rsiLength;
private readonly StrategyParam<int> _atrLength;
private decimal _prevFast;
private decimal _prevSlow;
private decimal _entryPrice;
public TenPoints3V005Strategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
.SetDisplay("Candle Type", "Timeframe.", "General");
_fastEmaLength = Param(nameof(FastEmaLength), 10)
.SetDisplay("Fast EMA", "Fast EMA period.", "Indicators");
_slowEmaLength = Param(nameof(SlowEmaLength), 30)
.SetDisplay("Slow EMA", "Slow EMA period.", "Indicators");
_rsiLength = Param(nameof(RsiLength), 14)
.SetDisplay("RSI Length", "RSI period.", "Indicators");
_atrLength = Param(nameof(AtrLength), 14)
.SetDisplay("ATR Length", "ATR period.", "Indicators");
}
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int FastEmaLength { get => _fastEmaLength.Value; set => _fastEmaLength.Value = value; }
public int SlowEmaLength { get => _slowEmaLength.Value; set => _slowEmaLength.Value = value; }
public int RsiLength { get => _rsiLength.Value; set => _rsiLength.Value = value; }
public int AtrLength { get => _atrLength.Value; set => _atrLength.Value = value; }
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevFast = 0; _prevSlow = 0; _entryPrice = 0;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevFast = 0; _prevSlow = 0; _entryPrice = 0;
var fastEma = new ExponentialMovingAverage { Length = FastEmaLength };
var slowEma = new ExponentialMovingAverage { Length = SlowEmaLength };
var rsi = new RelativeStrengthIndex { Length = RsiLength };
var atr = new AverageTrueRange { Length = AtrLength };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(fastEma, slowEma, rsi, atr, ProcessCandle).Start();
var area = CreateChartArea();
if (area != null) { DrawCandles(area, subscription); DrawIndicator(area, fastEma); DrawIndicator(area, slowEma); DrawOwnTrades(area); }
}
private void ProcessCandle(ICandleMessage candle, decimal fastVal, decimal slowVal, decimal rsiVal, decimal atrVal)
{
if (candle.State != CandleStates.Finished) return;
if (_prevFast == 0 || _prevSlow == 0 || atrVal <= 0) { _prevFast = fastVal; _prevSlow = slowVal; return; }
var close = candle.ClosePrice;
if (Position > 0)
{
if ((fastVal < slowVal && _prevFast >= _prevSlow) || close <= _entryPrice - atrVal * 1.5m) { SellMarket(); _entryPrice = 0; }
}
else if (Position < 0)
{
if ((fastVal > slowVal && _prevFast <= _prevSlow) || close >= _entryPrice + atrVal * 1.5m) { BuyMarket(); _entryPrice = 0; }
}
if (Position == 0)
{
if (fastVal > slowVal && _prevFast <= _prevSlow && rsiVal > 50) { _entryPrice = close; BuyMarket(); }
else if (fastVal < slowVal && _prevFast >= _prevSlow && rsiVal < 50) { _entryPrice = close; SellMarket(); }
}
_prevFast = fastVal; _prevSlow = slowVal;
}
}
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 ExponentialMovingAverage, RelativeStrengthIndex, AverageTrueRange
from StockSharp.Algo.Strategies import Strategy
class ten_points_3_v005_strategy(Strategy):
"""Dual EMA crossover with RSI confirmation and ATR stops."""
def __init__(self):
super(ten_points_3_v005_strategy, self).__init__()
self._fast_ema = self.Param("FastEmaLength", 10).SetDisplay("Fast EMA", "Fast EMA period", "Indicators")
self._slow_ema = self.Param("SlowEmaLength", 30).SetDisplay("Slow EMA", "Slow EMA period", "Indicators")
self._rsi_length = self.Param("RsiLength", 14).SetDisplay("RSI Length", "RSI period", "Indicators")
self._atr_length = self.Param("AtrLength", 14).SetDisplay("ATR Length", "ATR period", "Indicators")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(5))).SetDisplay("Candle Type", "Timeframe", "General")
@property
def CandleType(self): return self._candle_type.Value
@CandleType.setter
def CandleType(self, value): self._candle_type.Value = value
def OnReseted(self):
super(ten_points_3_v005_strategy, self).OnReseted()
self._prev_fast = 0
self._prev_slow = 0
self._entry_price = 0
def OnStarted2(self, time):
super(ten_points_3_v005_strategy, self).OnStarted2(time)
self._prev_fast = 0
self._prev_slow = 0
self._entry_price = 0
fast = ExponentialMovingAverage()
fast.Length = self._fast_ema.Value
slow = ExponentialMovingAverage()
slow.Length = self._slow_ema.Value
rsi = RelativeStrengthIndex()
rsi.Length = self._rsi_length.Value
atr = AverageTrueRange()
atr.Length = self._atr_length.Value
sub = self.SubscribeCandles(self.CandleType)
sub.Bind(fast, slow, rsi, atr, self.OnProcess).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, sub)
self.DrawIndicator(area, fast)
self.DrawIndicator(area, slow)
self.DrawOwnTrades(area)
def OnProcess(self, candle, fast_val, slow_val, rsi_val, atr_val):
if candle.State != CandleStates.Finished:
return
if self._prev_fast == 0 or self._prev_slow == 0 or atr_val <= 0:
self._prev_fast = fast_val
self._prev_slow = slow_val
return
close = float(candle.ClosePrice)
if self.Position > 0:
if (fast_val < slow_val and self._prev_fast >= self._prev_slow) or close <= self._entry_price - atr_val * 1.5:
self.SellMarket()
self._entry_price = 0
elif self.Position < 0:
if (fast_val > slow_val and self._prev_fast <= self._prev_slow) or close >= self._entry_price + atr_val * 1.5:
self.BuyMarket()
self._entry_price = 0
if self.Position == 0:
if fast_val > slow_val and self._prev_fast <= self._prev_slow and rsi_val > 50:
self._entry_price = close
self.BuyMarket()
elif fast_val < slow_val and self._prev_fast >= self._prev_slow and rsi_val < 50:
self._entry_price = close
self.SellMarket()
self._prev_fast = fast_val
self._prev_slow = slow_val
def CreateClone(self):
return ten_points_3_v005_strategy()