
Diese Strategie ist eine Variante meiner vorherigen Strategie für einen anderen Durchbruchstrender. In einer anderen Strategie können Sie den Moving Average als Filter für den Handel verwenden (d.h. wenn der Preis unter dem Moving Average liegt, wird er nicht viel tun). Nachdem ich ein Tool entwickelt hatte, das Trends in höheren Zeitrahmen erkennt, wollte ich sehen, ob es möglicherweise ein besserer Filter als der Moving Average ist.
Die Strategie ermöglicht es Ihnen, Trends in höheren Zeitrahmen zu sehen (d.h. ob es höhere Höhen und niedrigere Tiefen gibt? Wenn ja, dann ist es ein Aufwärtstrend). Sie setzen nur in die Richtung des Trends. Sie können bis zu zwei Trends als Filter auswählen.
Ich habe festgestellt, dass diese Strategie im Vergleich zu anderen Strategien im Allgemeinen nicht sehr gut abschneidet, aber es scheint wirklich, dass sie den Handel schärfer durchsucht. Es zeigt eine höhere Gewinnrate und bessere Gewinnfaktoren.
Die Kernlogik der Strategie besteht darin, Trends anhand von Support- und Resistance-Punkten zu identifizieren, die über höhere Zeiträume hinausgehen, und entsprechend der Richtung des Trends zu handeln.
Insbesondere wird es durch folgende Schritte umgesetzt:
Berechnung von Unterstützungs- und Widerstandspunkten für den aktuellen Zeitrahmen (z. B. für die 1-Stunden-Linie). Dies wird durch die Suche nach Höchst- und Tiefstpreisen innerhalb eines bestimmten Zeitraums erreicht.
Berechnen von Unterstützungs- und Widerstandspositionen für einen oder mehrere höhere Zeiträume (z. B. 4 Stunden- und Tageszeiten). Dies wird mit der gleichen Logik wie für den aktuellen Zeitrahmen umgesetzt.
Zeichnen Sie die horizontalen Linien dieser Unterstützungs- und Widerstandspunkte auf der Grafik. Wenn der Preis diese Linien durchbricht, ändert sich der Trend in höheren Zeitrahmen.
Die Richtung des Trends wird danach bestimmt, ob der Preis diese Schlüsselniveaus überschreitet. Wenn der Preis einen Höchststand überschreitet, wird er als Aufwärtstrend betrachtet.
Erlaubt dem Benutzer, die Trends eines oder mehrerer höherer Zeitrahmen als Filterbedingungen auszuwählen. Das heißt, ein Handel wird nur dann in Betracht gezogen, wenn die Trendrichtung des aktuellen Zeitrahmens mit der der höheren Zeitrahmen übereinstimmt.
Kaufen oder verkaufen, wenn die Trendfilterbedingungen erfüllt sind und der aktuelle Preis die kritische Ebene überschreitet. Die Stop-Loss-Ebene wird als die vorherige kritische Unterstützung oder Widerstandslage festgelegt.
Wenn ein neuer Höhen- oder Tiefpunkt entsteht, wird der Stop-Loss auf einen neuen Tiefpunkt verschoben, um Gewinne zu sichern und Trends zu verfolgen.
Wenn ein Stop-Loss ausgelöst wird oder eine wichtige Unterstützung/Widerstandsstufe durchbrochen wird, wird der Ausgang aus der Position ausgeschlossen.
Durch die Analyse von Trends in diesen mehreren Zeitrahmen versucht die Strategie, nur in die Richtung des stärkeren Trends zu handeln, um die Gewinnwahrscheinlichkeit zu erhöhen. Gleichzeitig bieten die kritischen Ebenen klare Einstiegs- und Stop-Loss-Signale.
Die Verwendung von mehreren Zeitrahmen zur Beurteilung von Trends ermöglicht eine genauere Identifizierung der stärkeren Trendrichtung und verhindert, dass man vom Marktlärm irregeführt wird.
Nur in Richtung der Haupttrends zu handeln, kann die Gewinnrate erheblich erhöhen. Nach den Testergebnissen zeigt die Strategie eine höhere Gewinnrate und ein besseres Gewinn-Risiko-Verhältnis im Vergleich zu einfachen Moving Average-Filtern.
Unterstützung und Widerstand bieten klare Einstiegs- und Stopp-Levels. Es ist nicht notwendig, sich mit der Auswahl der spezifischen Einstiegspunkte zu beschäftigen.
Die Stop-Loss-Position kann mit dem Laufen des Trends angepasst werden, um maximale Gewinne zu erzielen.
Die Strategie ist klar und einfach zu verstehen und zu optimieren.
Trendbeurteilungen, die auf längeren Strecken beruhen, können bei einer Trendwende leicht beeinflusst werden. Die Zeiträume für die Beurteilung von Trends sollten entsprechend verkürzt werden oder andere Indikatoren sollten zur Unterstützung der Beurteilung verwendet werden.
Es kann eine Abweichung von den Aktienkursen bei einem wichtigen Ereignis ohne Berücksichtigung der fundamentalen Auswirkungen auftreten. Filterbedingungen wie ATM-Ereignisse oder Umsatzdatum können hinzugefügt werden.
Keine Kontrolle über die Größe der Position. Die Größe der Position kann anhand der Größe des Kontos, der Volatilität usw. festgelegt werden.
Die Rückmeldungsdauer ist begrenzt. Die Rückmeldungsdauer sollte erweitert werden, um die Stabilität in verschiedenen Marktumgebungen zu testen.
Die Auswirkungen der Transaktionskosten werden nicht berücksichtigt. Die Strategieparameter sollten in der Realität an die spezifischen Transaktionskosten angepasst werden.
Es kann auch mit anderen Strategien kombiniert werden, um Short-Line-Trading-Signale zu entwickeln, um mehrzeitige Arbitrage zu erzielen.
Filterbedingungen hinzufügen:
Grundlegende Daten wie Geschäftsberichte, Nachrichten und so weiter
Indikatoren, wie der Umsatz, der ATR-Stillstand usw.
Optimierungsparameter:
Adjustierung der Unterstützung/Widerstand-Bit-Berechnungszyklen
Der Zeitrahmen für die Anpassung von Trends
Erweiterung der Strategie:
Entwicklung von Short-Line-Handelsstrategien
Erwägen Sie einen Ausverkauf
Mehrsprachige Arbitrage
Bessere Risikomanagement:
Optimierte Positionsgröße basierend auf Volatilität und Kapitalgröße
Optimierung von Stop-Loss-Strategien, wie beispielsweise mobile Stop-Loss-Strategien oder Stop-Loss-Strategien
Einführung eines Risiko-Prämien-Strafmechanismus
Optimierung der Ausführungslogik
Die Wahl der Zeit des Eintritts
Eintritt für einige Positionen
Optimierung der Stop-Loss-Mobil-Strategie
Die Strategie entwirft ein robustes Durchbruchsystem, indem sie Trends in mehreren Zeitrahmen analysiert. Sie weist eine höhere Gewinn-Risiko-Relation auf als Indikatoren wie einfache bewegliche Durchschnitte. Es gibt jedoch einige Aspekte, die optimiert werden können, z. B. unvollständige Risikomanagementmechanismen ohne Berücksichtigung grundlegender Faktoren.
/*backtest
start: 2023-10-24 00:00:00
end: 2023-10-26 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
// Revision: 1
// Author: @millerrh
// Strategy: Enter long when recent swing high breaks out, using recent swing low as stop level. Move stops up as higher lows print to act
// as trailing stops. Ride trend as long as it is there and the higher lows aren't breached.
// The difference between this one and the previous Breakout Trend Follower is that this one uses higher timeframe higher highs/higher lows as a filter instead
// of an arbitrary Moving Average. I wanted to test out whether waiting for longer term actual trend changes produced better stats than just the moving average.
// Conditions/Variables
// 1. Manually configure which dates to back test
// 2. Can add a filter to only take setups that are above (or below for shorts) user-defined larger timeframe trends (helps avoid trading counter trend)
// === CALL STRATEGY/STUDY, PROGRAMATICALLY ENTER STRATEGY PARAMETERS HERE SO YOU DON'T HAVE TO CHANGE THEM EVERY TIME YOU RUN A TEST ===
// (STRATEGY ONLY) - Comment out srategy() when in a study()
strategy("Breakout Trend Follower V2", overlay=true, initial_capital=10000, currency='USD',
default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)
// (STUDY ONLY) - Comment out study() when in a strategy()
//study("Breakout Trend Follower V2", overlay=true)
// === BACKTEST RANGE ===
Start = input(defval = timestamp("01 Jan 2019 06:00 +0000"), title = "Backtest Start Date", type = input.time, group = "Backtest Range")
Finish = input(defval = timestamp("01 Jan 2100 00:00 +0000"), title = "Backtest End Date", type = input.time, group = "Backtest Range")
// == USER INPUTS ==
tableLocation = input(defval="Top", options=["Top", "Bottom"], title = "Info Table Location", group = "Display",
tooltip = "Place information table on the top of the pane or the bottom of the pane.")
lookback = input(defval = 3, title = "Pivot Lookback Period", group = "Pivot Points",
tooltip = "Looks for pivot points within this number of bars both left and right.")
showPivotPoints = input(title = "Show Historical Pivot Points?", type = input.bool, defval = false, group = "Pivot Points",
tooltip = "Toggle this on to see the historical pivot points that were used. Change the Lookback Period to adjust the frequency of these points.
The pivot points are only shown for the current chart timeframe - to see the Daily pivot pionts, use the Daily timeframe, etc.")
trendFilter = input(defval="1st Timeframe", options=["1st Timeframe", "Both Timeframes", "None"], title = "Use HTF Trend for Filtering?", group = "Higher Timeframe Levels",
tooltip = "Signals will be ignored when price is not aligned with the higher timeframe trend(s). The intent is to keep you out of bear periods and only buying when
price is showing strength and you are trading with the trend.")
twoSet = input(defval="D", title="1st High Timeframe", type=input.resolution, group = "Higher Timeframe Levels",
tooltip = "Allows you to set two different time frames for looking at the trend.")
threeSet = input(defval="W", title="2nd High Timeframe", type=input.resolution, group = "Higher Timeframe Levels")
showMTFLevels = input(title = "Show Multiple Timeframe S/R Levels?", type = input.bool, defval = true, group = "Higher Timeframe Levels",
tooltip = "Displays the pivot highs and lows of higher timeframes to use as support/resistance levels. When these levels break, the trend
will change on these higher timeframes.")
currentColorS = input(color.new(color.orange,50), title = "Current Timeframe Support", type = input.color, group = "Higher Timeframe Levels", inline = "MTF1")
currentColorR = input(color.new(color.blue,50), title = " Resistance", type = input.color, group = "Higher Timeframe Levels", inline = "MTF1")
oneColorS = input(color.new(color.yellow,50), title = "1st High Timeframe Support", type = input.color, group = "Higher Timeframe Levels", inline = "MTF2")
oneColorR = input(color.new(color.yellow,50), title = " Resistance", type = input.color, group = "Higher Timeframe Levels", inline = "MTF2")
twoColorS = input(color.new(color.white,50), title = "2nd High Timeframe Support", type = input.color, group = "Higher Timeframe Levels", inline = "MTF3")
twoColorR = input(color.new(color.white,50), title = " Resistance", type = input.color, group = "Higher Timeframe Levels", inline = "MTF3")
// == DEFINE FUNCTIONS FOR USE IN MULTIPLE TIMEFRAMES (USING A TUPLE TO AVOID SO MANY SECURITY CALLS) ==
f_getHTF() =>
ph = pivothigh(high, lookback, lookback)
pl = pivotlow(low, lookback, lookback)
highLevel = valuewhen(ph, high[lookback], 0)
lowLevel = valuewhen(pl, low[lookback], 0)
barsSinceHigh = barssince(ph) + lookback
barsSinceLow = barssince(pl) + lookback
timeSinceHigh = time[barsSinceHigh]
timeSinceLow = time[barsSinceLow]
[ph, pl, highLevel, lowLevel, barsSinceHigh, barsSinceLow, timeSinceHigh, timeSinceLow]
[ph_01, pl_01, hL_01, lL_01, bsSH_01, bsSL_01, tSH_01, tSL_01] = security(syminfo.tickerid, "", f_getHTF())
[ph_02, pl_02, hL_02, lL_02, bsSH_02, bsSL_02, tSH_02, tSL_02] = security(syminfo.tickerid, twoSet, f_getHTF())
[ph_03, pl_03, hL_03, lL_03, bsSH_03, bsSL_03, tSH_03, tSL_03] = security(syminfo.tickerid, threeSet, f_getHTF())
// Plot historical pivot points for debugging and configuring the lookback period.
plot(showPivotPoints ? ph_01 : na, style=plot.style_cross, linewidth=3, color=color.new(color.yellow,50), offset=-lookback)
plot(showPivotPoints ? pl_01 : na, style=plot.style_cross, linewidth=3, color=color.new(color.yellow,50), offset=-lookback)
// == PLOT SUPPORT/RESISTANCE LINES ON THE HIGHER TIMEFRAMES ==
// Use a function to define the lines
f_line(x1, y1, y2, _color) =>
var line id = na
// line.delete(id)
// id := line.new(x1, y1, time, y2, xloc.bar_time, extend.right, _color)
// 1st Timeframe
highLine1 = showMTFLevels ? f_line(tSH_01, hL_01, hL_01, currentColorR) : na
lowLine1 = showMTFLevels ? f_line(tSL_01, lL_01, lL_01, currentColorS) : na
// 2nd Timeframe
highLine2 = showMTFLevels ? f_line(tSH_02, hL_02, hL_02, oneColorR) : na
lowLine2 = showMTFLevels ? f_line(tSL_02, lL_02, lL_02, oneColorS) : na
// 3rd Timeframe
highLine3 = showMTFLevels ? f_line(tSH_03, hL_03, hL_03, twoColorR) : na
lowLine3 = showMTFLevels ? f_line(tSL_03, lL_03, lL_03, twoColorS) : na
// == TREND CALCULATIONS (USING A TUPLE TO CONSOLIDATE REPETATIVE CODE AND GENERATE MULTIPE VARIABLES WITH ONE FUNCTION ==
f_signal(highLevel, lowLevel) =>
uptrendSignal = high > highLevel
downtrendSignal = low < lowLevel
inUptrend = bool(na)
inDowntrend = bool(na)
inUptrend := uptrendSignal[1] ? true : downtrendSignal[1] ? false : inUptrend[1]
inDowntrend := not inUptrend
[uptrendSignal, downtrendSignal, inUptrend, inDowntrend]
[uptrendSignal1, downtrendSignal1, inUptrend1, inDowntrend1] = f_signal(hL_01, lL_01) // 1st Timeframe
[uptrendSignal2, downtrendSignal2, inUptrend2, inDowntrend2] = f_signal(hL_02, lL_02) // 2nd Timeframe
[uptrendSignal3, downtrendSignal3, inUptrend3, inDowntrend3] = f_signal(hL_03, lL_03) // 3rd Timeframe
// == TREND TABLE PLOTTING ==
tablePos = tableLocation == "Top" ? position.top_right : position.bottom_right
var table trendTable = table.new(tablePos, 3, 1, border_width = 3)
upColor = color.rgb(38, 166, 154)
downColor = color.rgb(240, 83, 80)
f_fillCell(_column, _row, _cellText, _c_color) =>
table.cell(trendTable, _column, _row, _cellText, bgcolor = color.new(_c_color, 70), text_color = _c_color, width = 6)
if barstate.islast or barstate.islastconfirmedhistory
f_fillCell(0, 0, inUptrend1 ? "▲" : "▼", inUptrend1 ? upColor : downColor)
f_fillCell(1, 0, inUptrend2 ? "▲ " + twoSet : "▼ " + twoSet, inUptrend2 ? upColor : downColor)
f_fillCell(2, 0, inUptrend3 ? "▲ " + threeSet : "▼ " + threeSet, inUptrend3 ? upColor : downColor)
// Conditions for entry and exit
buyConditions = true
buySignal = high > hL_01 and buyConditions // Code to act like a stop-buy for the Study
sellSignal = low < lL_01 // Code to act like a stop-loss for the Study
// (STRATEGY ONLY) Comment out for Study
strategy.entry("Long", strategy.long, stop = hL_01, when = buyConditions)
// strategy.entry("Long", strategy.long, stop = buyLevel2, when = time > Start and time < Finish and high > maFilterCheck)
strategy.exit("Exit Long", from_entry = "Long", stop=lL_01)