Start
/
Strategie-Beispiele
Auf GitHub ansehen
Sammelt detaillierte Statistiken zur Geld-Brief-Spanne des ausgewählten Instruments und benachrichtigt, wenn die Spanne ein konfigurierbares Limit überschreitet. Die Strategie überwacht kontinuierlich Level-1-Updates, verfolgt die maximale, minimale und durchschnittliche Streuung in Punkten und protokolliert eine Zusammenfassung, sobald sie stoppt. Es ist nützlich, um die Liquiditätsbedingungen zu untersuchen, bevor latenzempfindliche Systeme ausgeführt werden, oder um Handelsfenster im Strategietester zu optimieren.
Einzelheiten
Datenquelle : Beste Geld- und Briefkurse der Ebene 1.
Erfasste Statistiken :
Start- und Endzeitstempel des Beobachtungszeitraums.
Maximale Ausbreitung und Zeitpunkt des Auftretens.
Mindestausbreitung und Zeitpunkt des Auftretens.
Durchschnittliche Streuung, berechnet über alle beobachteten Level1-Proben.
Warnungen :
Optionaler Alarm, wenn der Spread (in Punkten) über den konfigurierten Schwellenwert MaxSpreadPoints steigt.
Die Benachrichtigungshäufigkeit ist auf AlertIntervalSeconds begrenzt, um Spam im Protokoll zu vermeiden.
Warnungen werden nur ausgelöst, wenn der Spread den Schwellenwert von unten überschreitet.
Protokollierung :
Echtzeitwarnungen werden über LogInfo geschrieben.
Die endgültige Statistikzusammenfassung wird während OnStopped ausgegeben.
Standardwerte :
MaxSpreadPoints = 0 (Benachrichtigungen deaktiviert).
AlertIntervalSeconds = 0 (keine Drosselung).
Parameter
Name
Beschreibung
Standard
Notizen
MaxSpreadPoints
Maximal zulässiger Spread in Punkten. Auf 0 setzen, um Warnungen zu deaktivieren.
0
Punkte werden anhand der Instrumentenpreisstufe berechnet.
AlertIntervalSeconds
Mindestzeit zwischen aufeinanderfolgenden Warnungen.
0
Verhindert doppelte Warnungen, wenn die Spanne groß bleibt.
Nutzungshinweise
Hängen Sie die Strategie an ein Instrument an und stellen Sie sicher, dass Level1-Daten verfügbar sind.
Konfigurieren Sie MaxSpreadPoints entsprechend der akzeptablen Spanne für das Instrument.
Erhöhen Sie optional AlertIntervalSeconds, um wiederholte Benachrichtigungen in volatilen Zeiten zu unterdrücken.
Stoppen Sie die Strategie, um die protokollierten Statistiken in der Terminalausgabe zu überprüfen.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Spread Informer strategy: CCI momentum crossover.
/// Buys when CCI crosses above zero, sells when crosses below zero.
/// </summary>
public class SpreadInformerStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _cciPeriod;
private readonly StrategyParam<decimal> _cciLevel;
private readonly StrategyParam<int> _signalCooldownCandles;
private decimal _prevCci;
private int _candlesSinceTrade;
private bool _hasPrev;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int CciPeriod { get => _cciPeriod.Value; set => _cciPeriod.Value = value; }
public decimal CciLevel { get => _cciLevel.Value; set => _cciLevel.Value = value; }
public int SignalCooldownCandles { get => _signalCooldownCandles.Value; set => _signalCooldownCandles.Value = value; }
public SpreadInformerStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(60).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_cciPeriod = Param(nameof(CciPeriod), 30)
.SetGreaterThanZero()
.SetDisplay("CCI Period", "CCI period", "Indicators");
_cciLevel = Param(nameof(CciLevel), 100m)
.SetDisplay("CCI Level", "CCI threshold for crossover", "Signals");
_signalCooldownCandles = Param(nameof(SignalCooldownCandles), 4)
.SetGreaterThanZero()
.SetDisplay("Signal Cooldown", "Bars to wait between trades", "Trading");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevCci = 0;
_candlesSinceTrade = SignalCooldownCandles;
_hasPrev = false;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevCci = 0;
_candlesSinceTrade = SignalCooldownCandles;
_hasPrev = false;
var cci = new CommodityChannelIndex { Length = CciPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(cci, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal cciValue)
{
if (candle.State != CandleStates.Finished) return;
if (_candlesSinceTrade < SignalCooldownCandles)
_candlesSinceTrade++;
if (_hasPrev)
{
if (_prevCci < -CciLevel && cciValue >= -CciLevel && Position <= 0 && _candlesSinceTrade >= SignalCooldownCandles)
{
BuyMarket();
_candlesSinceTrade = 0;
}
else if (_prevCci > CciLevel && cciValue <= CciLevel && Position >= 0 && _candlesSinceTrade >= SignalCooldownCandles)
{
SellMarket();
_candlesSinceTrade = 0;
}
}
_prevCci = cciValue;
_hasPrev = true;
}
}
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 CommodityChannelIndex
from StockSharp.Algo.Strategies import Strategy
class spread_informer_strategy(Strategy):
def __init__(self):
super(spread_informer_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(60)))
self._cci_period = self.Param("CciPeriod", 30)
self._cci_level = self.Param("CciLevel", 100.0)
self._signal_cooldown_candles = self.Param("SignalCooldownCandles", 4)
self._prev_cci = 0.0
self._candles_since_trade = 4
self._has_prev = False
@property
def CandleType(self):
return self._candle_type.Value
@CandleType.setter
def CandleType(self, value):
self._candle_type.Value = value
@property
def CciPeriod(self):
return self._cci_period.Value
@CciPeriod.setter
def CciPeriod(self, value):
self._cci_period.Value = value
@property
def CciLevel(self):
return self._cci_level.Value
@CciLevel.setter
def CciLevel(self, value):
self._cci_level.Value = value
@property
def SignalCooldownCandles(self):
return self._signal_cooldown_candles.Value
@SignalCooldownCandles.setter
def SignalCooldownCandles(self, value):
self._signal_cooldown_candles.Value = value
def OnReseted(self):
super(spread_informer_strategy, self).OnReseted()
self._prev_cci = 0.0
self._candles_since_trade = self.SignalCooldownCandles
self._has_prev = False
def OnStarted2(self, time):
super(spread_informer_strategy, self).OnStarted2(time)
self._prev_cci = 0.0
self._candles_since_trade = self.SignalCooldownCandles
self._has_prev = False
cci = CommodityChannelIndex()
cci.Length = self.CciPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(cci, self._process_candle).Start()
def _process_candle(self, candle, cci_value):
if candle.State != CandleStates.Finished:
return
if self._candles_since_trade < self.SignalCooldownCandles:
self._candles_since_trade += 1
cci_val = float(cci_value)
if self._has_prev:
if self._prev_cci < -self.CciLevel and cci_val >= -self.CciLevel and self.Position <= 0 and self._candles_since_trade >= self.SignalCooldownCandles:
self.BuyMarket()
self._candles_since_trade = 0
elif self._prev_cci > self.CciLevel and cci_val <= self.CciLevel and self.Position >= 0 and self._candles_since_trade >= self.SignalCooldownCandles:
self.SellMarket()
self._candles_since_trade = 0
self._prev_cci = cci_val
self._has_prev = True
def CreateClone(self):
return spread_informer_strategy()