
Die Strategie ist eine quantitative Trading-Strategie, die mehrere technische Indikatoren kombiniert. Sie kombiniert mehrere Indikatoren wie beispielsweise Moving Averages, MACD, Bollinger Bands und RSI, um einen automatisierten Handel zu ermöglichen, der von einem Multifaktormodell angetrieben wird.
Die Handelssignale für diese Strategie stammen aus folgenden Teilen:
Wenn mehrere der oben genannten Indikatoren gleichzeitig ein Kauf- oder Verkaufssignal senden, führt die Strategie eine entsprechende Kauf- oder Verkaufsposition durch.
Wenn der RSI aus der Überverkaufszone zurückschlägt und der Preis nahe der Bollinger-Absenkung ist, wird der Kurs als umgekehrt betrachtet, was ein Kaufsignal erzeugt.
Wenn der MACD-Histogramm unterhalb des schnellen Moving Averages durch den langsamen Moving Average fällt, wird der RSI aus der Überkaufzone abgesenkt und der Preis in der Nähe des Bollinger Bands auf Kurs gebracht, um einen Verkauf zu signalisieren.
Durch diese Kombination von mehreren Indikatoren kann man die falschen Signale effizient filtern und die Strategie stabilisieren.
Der größte Vorteil dieser Strategie besteht darin, dass ein Multifaktormodell für den Handel verwendet wird, das die Signalzuverlässigkeit erhöht und die Stabilität und Ertragsrate der Strategie erhöht.
Multi-Faktor-Modelle können gegenseitige Verifizierung von Handelssignalen ermöglichen, um die Störung durch falsche Signale zu reduzieren.
Die verschiedenen Kategorien der Indikatoren ermöglichen es, ein umfassenderes Merkmal der Marktentwicklung zu erfassen und eine genauere Beurteilung vorzunehmen.
Eine Kombination aus mehreren Faktoren kann die Schwankungen eines einzelnen Indikators ausgleichen und die Erträge stabiler machen.
Flexible Anpassung der Portfolio-Indikatoren und der Gewichte der einzelnen Indikatoren für eine individualisierte Strategie für verschiedene Märkte.
Die Strategie birgt auch einige Risiken, die beachtet werden müssen:
Komplexe Mehrindikator-Kombinationen, Parameter-Einstellungen und Indikator-Auswahl erfordern präzise Berechnungen und Tests, die sonst leicht zu Fehlsignalen führen können.
Die Wirkung einer einzigen Sorte kann instabil sein, und es ist notwendig, die richtige Sortenkombination für den Handel zwischen den Sorten auszuwählen, um das Risiko einer einzigen Sorte zu verteilen.
Es ist notwendig, die Größe der Positionen und die Stop-Loss-Strategie streng zu kontrollieren, um die Verluste aus Extremsituationen zu verhindern.
Die Strategie hat folgende Optimierungsmöglichkeiten:
Versuchen Sie, eine Kombination aus mehr Indikatoren zu testen, um die optimalen Parameter zu finden. Weitere Indikatoren, wie z. B. die Volatilität, die Transaktionsmenge, werden in die Kombination aufgenommen.
Automatische Erzeugung der optimalen Strategie-Kombination und Parameterkonfiguration mit Hilfe von Machine Learning Methoden.
Tests und Optimierungen auf längeren Zeitskala, Gewichte für verschiedene Marktphasen.
In Kombination mit Risikomanagement-Tools, strenge Kontrolle der einzelnen Stop-Loss und Gesamtposition.
Die Strategie nutzt verschiedene Handelsindikatoren, um ein Multifaktormodell zu bilden, um die Vorteile verschiedener Indikatoren zu nutzen und die Signalentscheidungsfähigkeit zu verbessern. Gleichzeitig muss auf Risikokontrolle geachtet werden, um die Stabilität und Ertragsfähigkeit der Strategie durch Parameteroptimierung und -aktualisierung kontinuierlich zu verbessern.
/*backtest
start: 2023-12-31 00:00:00
end: 2024-01-30 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Математическая Торговая Система с Ишимоку, TP/SL, ADX, RSI, OBV", shorttitle="МТС Ишимоку TP/SL ADX RSI OBV", overlay=true)
is_short_enable = input(0, title="Короткие сделки")
is_long_enable = input(1, title="Длинные сделки")
// Входные параметры для скользящих средних
fast_length = input(21, title="Быстрый период")
slow_length = input(26, title="Медленный период")
// Входные параметры для Ишимоку
tenkan_length = input(9, title="Тенкан-сен")
kijun_length = input(26, title="Киджун-сен")
senkou_length = input(52, title="Сенкоу-спан B")
// Входные параметры для ADX
adx_length = input(14, title="ADX период")
adx_level = input(30, title="ADX уровень")
// Входные параметры для RSI
rsi_length = input(14, title="RSI период")
rsi_overbought = input(70, title="RSI перекупленность")
rsi_oversold = input(30, title="RSI перепроданность")
// Входные параметры для OBV
obv_length = input(14, title="OBV период")
// Вычисление скользящих средних
fast_ma = ta.sma(close, fast_length)
slow_ma = ta.sma(close, slow_length)
// Вычисление Ишимоку
tenkan_sen = ta.sma(high + low, tenkan_length) / 2
kijun_sen = ta.sma(high + low, kijun_length) / 2
senkou_span_a = (tenkan_sen + kijun_sen) / 2
senkou_span_b = ta.sma(close, senkou_length)
// Вычисление ADX
[diplus, diminus, adx_value] = ta.dmi(14, adx_length)
// Вычисление RSI
rsi_value = ta.rsi(close, rsi_length)
// Вычисление OBV
f_obv() => ta.cum(math.sign(ta.change(close)) * volume)
f_obv_1() => ta.cum(math.sign(ta.change(close[1])) * volume[1])
f_obv_2() => ta.cum(math.sign(ta.change(close[2])) * volume[2])
f_obv_3() => ta.cum(math.sign(ta.change(close[3])) * volume[3])
obv_value = f_obv()
price_is_up = close[1] > close[3]
price_crossover_fast_ma = close > fast_ma
fast_ma_is_up = ta.sma(close[1], fast_length) > ta.sma(close[3], fast_length)
rsi_is_trand_up = ta.rsi(close[1], rsi_length) > ta.rsi(close[3], rsi_length)
rsi_is_upper_50 = rsi_value > 50
obv_is_trand_up = f_obv_1() > f_obv_3() and obv_value > ta.sma(obv_value, obv_length)
is_up = price_is_up and price_crossover_fast_ma and fast_ma_is_up and rsi_is_trand_up and rsi_is_upper_50 and obv_is_trand_up
fast_ma_is_down = close < fast_ma
rsi_is_trend_down = ta.rsi(close[1], rsi_length) < ta.rsi(close[2], rsi_length)
rsi_is_crossover_sma = rsi_value < ta.sma(rsi_value, rsi_length)
obv_is_trend_down = f_obv_1() < f_obv_2()
obv_is_crossover_sma = obv_value < ta.sma(obv_value, obv_length)
is_down = fast_ma_is_down and rsi_is_trend_down and rsi_is_crossover_sma and obv_is_trend_down and obv_is_crossover_sma
//----------//
// MOMENTUM //
//----------//
ema8 = ta.ema(close, 8)
ema13 = ta.ema(close, 13)
ema21 = ta.ema(close, 21)
ema34 = ta.ema(close, 34)
ema55 = ta.ema(close, 55)
longEmaCondition = ema8 > ema13 and ema13 > ema21 and ema21 > ema34 and ema34 > ema55
exitLongEmaCondition = ema13 < ema55
shortEmaCondition = ema8 < ema13 and ema13 < ema21 and ema21 < ema34 and ema34 < ema55
exitShortEmaCondition = ema13 > ema55
// ---------- //
// OSCILLATORS //
// ----------- //
rsi = ta.rsi(close, 14)
longRsiCondition = rsi < 70 and rsi > 40
exitLongRsiCondition = rsi > 70
shortRsiCondition = rsi > 30 and rsi < 60
exitShortRsiCondition = rsi < 30
// Stochastic
length = 14, smoothK = 3, smoothD = 3
kFast = ta.stoch(close, high, low, 14)
dSlow = ta.sma(kFast, smoothD)
longStochasticCondition = kFast < 80
exitLongStochasticCondition = kFast > 95
shortStochasticCondition = kFast > 20
exitShortStochasticCondition = kFast < 5
// Логика входа и выхода
longCondition = longEmaCondition and longRsiCondition and longStochasticCondition and strategy.position_size == 0
exitLongCondition = (exitLongEmaCondition or exitLongRsiCondition or exitLongStochasticCondition) and strategy.position_size > 0
shortCondition = shortEmaCondition and shortRsiCondition and shortStochasticCondition and strategy.position_size == 0
exitShortCondition = (exitShortEmaCondition or exitShortRsiCondition or exitShortStochasticCondition) and strategy.position_size < 0
enter_long = (ta.crossover(close, senkou_span_a) or is_up) and longCondition
enter_short = (ta.crossunder(close, senkou_span_a) or is_down) and shortCondition
exit_long = ((ta.crossunder(fast_ma, slow_ma) or ta.crossunder(close, senkou_span_b) or enter_short) or exitLongCondition)
exit_short = ((ta.crossover(fast_ma, slow_ma) or ta.crossover(close, senkou_span_b) or enter_long) or exitShortCondition)
// Выполнение сделок
if is_long_enable == 1
strategy.entry("Long", strategy.long, when=enter_long)
strategy.close("Long", when=exit_long)
if is_short_enable == 1
strategy.entry("Short", strategy.short, when=enter_short)
strategy.close("Short", when=exit_short)