
Die Strategie basiert auf den durchschnittlichen Trendindikatoren DI+ und DI-, wobei die Richtung des Trends anhand der DI-Indikatoren für zwei verschiedene Zeitrahmen ermittelt wird, um dann mehr zu machen. Wenn die DI+ für den größeren Zeitrahmen und die DI+ für den kleineren Zeitrahmen beide höher sind als die DI-, wird der Trend als bullish beurteilt, um mehr zu machen; wenn die beiden Zeitrahmen DI- höher sind als die DI+, wird der Trend als bearish beurteilt, um zu machen.
Die Strategie basiert auf folgenden Prinzipien:
Berechnung von DI+ und DI- durch Erfassung von Hochpreisen, Schlusspreisen und Tiefpreisen
Vergleiche zwei Zeiträume DI+ und DI-。 Berechne DI+ und DI- in den Zeiträumen des Hauptdiagramms (z. B. 1 Stunde) und in den größeren Zeiträumen (z. B. Sonnenlinie) und vergleiche die Größen- und Größenverhältnisse.
Beurteilen Sie die Richtung des Trends. Beurteilen Sie den Trend als mehrköpfig, wenn die DI+ des größeren Zeitrahmens und die DI+ des kleineren Zeitrahmens größer sind als die DI- und die DI- der beiden Zeitrahmen größer sind als die DI+.
Auslösen von Handelssignalen. Mehrkopfsignal für zwei Zeiträume DI+>DI-, mehr machen; Leerkopfsignal für zwei Zeiträume DI->DI+, leere machen.
Einrichtung von Stop-Losses. Stop-Losses basieren auf der Berechnung von ATR-Standards und ermöglichen Trend-Tracking-Stops.
Ausstiegsbedingungen: Befreien Sie sich von Verlusten, die ausgelöst werden, oder wenn der Preis sich umkehrt.
Diese Strategie hat folgende Vorteile:
Mit dem Dual-Time-Frame DI können Trends beurteilt und einige falsche Durchbrüche herausgefiltert werden.
ATR-Dynamic-Tracking-Stop-Loss, um maximale Gewinne zu schützen und zu kleine Stop-Loss zu vermeiden.
Die Verluste werden zeitnah eingestellt, um die Einmalverluste zu kontrollieren.
Trend-Trading ermöglicht es, kontinuierlich Trendchancen zu ergreifen.
Die Regeln sind klar und verständlich, so dass man sie leicht bedienen kann.
Die Strategie birgt auch folgende Risiken:
Die DI-Kennzahlen sind nachlässig und können die Einstiegsmomente verpassen. Die Parameter können entsprechend optimiert oder in Kombination mit anderen Kennzahlen beurteilt werden.
Bei einer doppelten Zeitrahmenbeurteilung kann es zu einer Abweichung von oben und unten kommen. Die Zeitrahmenprüfungssignale können erhöht werden.
Eine zu radikale Stop-Loss-Strategie kann zu einem zu häufigen Handel führen. Die ATR-Modalitäten können entsprechend gelockert werden.
Die Häufigkeit des Handels kann durch die Erhöhung der Filterbedingungen verringert werden.
Die Optimierung von Parametern hängt von historischen Daten ab, die möglicherweise überoptimiert sind. Die Robustheit von Parametern sollte sorgfältig bewertet werden.
Diese Strategie kann optimiert werden durch:
Optimierung der DI-berechneten Parameter und Suche nach der optimalen Parameterkombination
Zusätzliche Filter für andere Indikatoren zur Verbesserung der Signalgenauigkeit, z. B. MACD, KDJ usw.
Optimierung der Stop-Loss-Strategie, um mehr Marktbedingungen anzupassen. Sie können in eine mobile Stop-Loss-Strategie oder eine Stop-Loss-Strategie umgewandelt werden.
Es gibt eine Reihe von Möglichkeiten, wie man die Zeit der Geschäfte filtern kann, um wichtige Ereignisse zu vermeiden.
Tests zur Verbesserung der Anpassungsfähigkeit verschiedener Varietäten.
Die Entwicklung von Modellen, die auf historischen Daten basieren, um ihre Entscheidungsfindung zu trainieren.
Die Strategie ist insgesamt eine typische Trend-Tracking-Strategie, die die Richtung des Trends anhand der DI-Indikatoren beurteilt, Stop-Loss-Sätze für die Verfolgung von Gewinnsätzen festlegt und in Trends nachhaltig profitiert. Die Strategie hat den Vorteil, dass die Strategie klar ist und einfach zu bedienen ist. Es gibt auch einige Verbesserungsmöglichkeiten wie Optimierungsparameter, zusätzliche Filterbedingungen usw.
/*backtest
start: 2022-10-31 00:00:00
end: 2023-11-06 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © DojiEmoji
//@version=5
strategy("DI+/- multi TF Strat [KL]", overlay=true, pyramiding=1, initial_capital=1000000000, default_qty_type=strategy.percent_of_equity, default_qty_value=5)
var string GROUP_ALERT = "Alerts"
var string GROUP_SL = "Stop loss"
var string GROUP_ORDER = "Order size"
var string GROUP_TP = "Profit taking"
var string GROUP_HORIZON = "Time horizon of backtests"
var string GROUP_IND = "Directional IndicatorDI+ DI-"
// ADX Indicator {
adx_len = input(14, group=GROUP_IND, tooltip="Typically 14")
tf1 = input.timeframe("", title="DI +/- in Timeframe 1", group=GROUP_IND, tooltip="Main: DI+ > DI-")
tf2 = input.timeframe("1D", title="DI +/- in Timeframe 2", group=GROUP_IND, tooltip="Confirmation: DI+ > DI-")
// adx_thres = input(20, group=GROUP_IND) //threshold not used in this strategy
get_ADX(_high, _close, _low) =>
// (high, close, mid) -> [plus_DM, minus_DM]
// Based on TradingView user BeikabuOyaji's implementation
_tr = math.max(math.max(_high - _low, math.abs(_high - nz(_close[1]))), math.abs(_low - nz(_close[1])))
smooth_tr = 0.0
smooth_tr := nz(smooth_tr[1]) - nz(smooth_tr[1]) / adx_len + _tr
smooth_directional_mov_plus = 0.0
smooth_directional_mov_plus := nz(smooth_directional_mov_plus[1]) - nz(smooth_directional_mov_plus[1]) / adx_len + (_high - nz(_high[1]) > nz(_low[1]) - _low ? math.max(_high - nz(_high[1]), 0) : 0)
smooth_directional_mov_minus = 0.0
smooth_directional_mov_minus := nz(smooth_directional_mov_minus[1]) - nz(smooth_directional_mov_minus[1]) / adx_len + (nz(_low[1]) - _low > _high - nz(_high[1]) ? math.max(nz(_low[1]) - _low, 0) : 0)
plus_DM = smooth_directional_mov_plus / smooth_tr * 100
minus_DM = smooth_directional_mov_minus / smooth_tr * 100
// DX = math.abs(plus_DM - minus_DM) / (plus_DM + minus_DM) * 100 // DX not used in this strategy
[plus_DM, minus_DM]
// DI +/- from timeframes 1 and 2
[plus_DM_tf1, minus_DM_tf1] = get_ADX(request.security(syminfo.tickerid, tf1, high), request.security(syminfo.tickerid, tf1, close),request.security(syminfo.tickerid, tf1, low))
[plus_DM_tf2, minus_DM_tf2] = get_ADX(request.security(syminfo.tickerid, tf2, high),request.security(syminfo.tickerid, tf2, close),request.security(syminfo.tickerid, tf2, low))
// } end of block: ADX Indicator
var string ENUM_LONG = "LONG"
var string LONG_MSG_ENTER = input.string("Long entered", title="Alert MSG for buying (Long position)", group=GROUP_ALERT)
var string LONG_MSG_EXIT = input.string("Long closed", title="Alert MSG for closing (Long position)", group=GROUP_ALERT)
backtest_timeframe_start = input(defval=timestamp("01 Apr 2020 13:30 +0000"), title="Backtest Start Time", group=GROUP_HORIZON)
within_timeframe = true
// Signals for entry
_uptrend_confirmed = plus_DM_tf1 > minus_DM_tf1 and plus_DM_tf2 > minus_DM_tf2
entry_signal_long = _uptrend_confirmed
plotshape(_uptrend_confirmed, style=shape.triangleup, location=location.bottom, color=color.green)
plotshape(not _uptrend_confirmed, style=shape.triangledown, location=location.bottom, color=color.red)
// Trailing stop loss ("TSL") {
tsl_multi = input.float(2.0, title="ATR Multiplier for trailing stoploss", group=GROUP_SL)
SL_buffer = ta.atr(input.int(14, title="Length of ATR for trailing stoploss", group=GROUP_SL)) * tsl_multi
TSL_source_long = low
var stop_loss_price_long = float(0)
var pos_opened_long = false
stop_loss_price_long := pos_opened_long ? math.max(stop_loss_price_long, TSL_source_long - SL_buffer) : TSL_source_long - SL_buffer
// MAIN: {
if pos_opened_long and TSL_source_long <= stop_loss_price_long
pos_opened_long := false
alert(LONG_MSG_EXIT, alert.freq_once_per_bar)
strategy.close(ENUM_LONG, comment=close < strategy.position_avg_price ? "stop loss" : "take profit")
// (2) Update the stoploss to latest trailing amt.
if pos_opened_long
strategy.exit(ENUM_LONG, stop=stop_loss_price_long, comment="SL")
// (3) INITIAL ENTRY:
if within_timeframe and entry_signal_long
pos_opened_long := true
alert(LONG_MSG_ENTER, alert.freq_once_per_bar)
strategy.entry(ENUM_LONG, strategy.long, comment="long")
// Plotting:
TSL_transp_long = pos_opened_long and within_timeframe ? 0 : 100
plot(stop_loss_price_long, color=color.new(color.green, TSL_transp_long))
// CLEAN UP: Setting variables back to default values once no longer in use
if ta.change(strategy.position_size) and strategy.position_size == 0
pos_opened_long := false
if not pos_opened_long
stop_loss_price_long := float(0)
// } end of MAIN block