
Der Kern der Strategie besteht darin, den Übertrend-Indikator mit der Nettowertkurve zu kombinieren. Wenn der Übertrend-Indikator ein Kauf- oder Verkaufssignal sendet, führen wir den Handel nicht direkt aus, sondern beurteilen, ob die aktuelle Nettowertkurve unter ihrem Moving Average liegt.
Die Strategie besteht aus zwei Teilen:
Die Berechnungsformel für den Übertrend-Indikator lautet:
Auffahrt = Quellpreis - ATR multipliziert mit ATR Unterstraße = Quellpreis + ATR multipliziert mit ATR
Die Übertrend-Indikatoren nutzen die ATR, um auf und abzugehen, um zu verkaufen, wenn der Preis auf die Bahn geht, und um zu kaufen, wenn der Preis unter die Bahn geht.
Die Idee des Netto-Wert-Kurven-Handels ist, dass wir den Moving Average der Strategie-Netzwert-Kurve machen und den Handel mit der aktuellen Strategie aussetzen, wenn die Netto-Wert-Kurve unter dem Moving Average liegt, und den Handel erneut eröffnen, wenn die Netto-Wert-Kurve über dem Moving Average zurückgeht.
Diese Strategie kombiniert die beiden, und nachdem der Übertrendindikator ein Handelssignal erzeugt hat, handeln wir nicht direkt, sondern beurteilen, ob die aktuelle Nettowertkurve über dem Moving Average liegt. Nur wenn beide gleichzeitig erfüllt sind, eröffnen wir eine Position. Dies vermeidet effektiv das Risiko des Übertrendindikators selbst und verhindert übermäßige Verluste.
Die wichtigsten Vorteile dieser Strategie sind:
Die Übertrend-Indikatoren selbst sind nicht in der Lage, Verluste effektiv zu vermeiden, und Net-Value-Curve-Trading kann diese Schwachstelle ausgleichen.
Wenn der Handel ungünstig ist, kann der Handel der Strategie ausgesetzt werden, um zu hohe Verluste zu vermeiden. Warten Sie, bis sich der Markt wendet und wieder geöffnet werden kann.
Die Positionen können automatisch verwaltet werden, ohne dass eine manuelle Intervention erforderlich ist. Sie werden automatisch ausgesetzt, wenn die Nettowertkurve unter dem Moving Average liegt, und automatisch geöffnet, wenn sie über dem Moving Average liegt.
Es gibt einige Risiken bei dieser Strategie:
Fehlgeleitete Parameter können dazu führen, dass die Nettowertkurve nicht effektiv genutzt werden kann. Die richtige Moving Average-Periode muss gewählt werden.
Wenn sich die Marktentwicklung ändert, kann es sein, dass die Positionen nicht rechtzeitig angepasst werden können. Dies kann zu einem gewissen Verlust führen.
Es ist möglich, dass man die besten Einstiegsmöglichkeiten verpasst, weil man darauf wartet, dass die Nettowertkurve wieder steigt.
Gegenmaßnahmen:
Optimierung der Parameter und Auswahl der optimalen Moving Average-Periode.
In Kombination mit anderen Indikatoren, um die Trends zu beurteilen, um die Positionen rechtzeitig anzupassen.
Die Zeit für die Aussetzung des Handels sollte angemessen verkürzt werden, um die Wahrscheinlichkeit zu verringern, dass der Eintritt verpasst wird.
Diese Strategie kann in folgenden Bereichen optimiert werden:
Verschiedene Parameterkombinationen werden getestet, um die optimale ATR-Zyklus- und ATR-Multiplikation zu finden.
Versuchen Sie es mit anderen Arten von Moving Averages, wie dem Index Moving Average, dem Hull Moving Average usw.
Das Unternehmen hat sich in der Vergangenheit bemüht, die Markttrends mit anderen Indikatoren zu messen und seine Positionen bei Trends zu korrigieren.
Optimieren Sie die Moving Average-Zyklus, um die optimale Balance zu finden. Zu lange Zyklen verpassen Chancen, zu kurze werden häufig unterbrochen.
Optimierung der Bedingungen für die Aussetzung des Handels, z. B. die Einrichtung einer Stop-Loss-Linie, die nur nach Erreichen eines bestimmten Verlustes ausgesetzt wird.
Diese Strategie kombiniert geschickt Hypertrend-Indikatoren und Net Curve-Trading. Die Übertrend-Indikatoren behalten sowohl die Vorteile, Trends zu beurteilen, als auch die Risiken durch Net Curve-Trading effektiv zu kontrollieren. Die Testergebnisse zeigen, dass der Einsatz von Net Curve-Trading in den meisten Fällen den Gewinn senkt.
/*backtest
start: 2023-01-14 00:00:00
end: 2024-01-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy('Supertrend & Equity curve with EMA', overlay=false, format=format.price, precision=2, initial_capital=100000)
eqlen = input.int(25, "EQ EMA len", group = "New Equity Curve Settings")
shEQandMA = input.bool(true, "Show Original Equity Curve and MA")
shEQfilt = input.bool(true, "Show Filtered Equity Curve by MA")
Periods = input(title='ATR Period', defval=10, group = "SuperTrend Settings")
src = input(hl2, title='Source', group = "SuperTrend Settings")
Multiplier = input.float(title='ATR Multiplier', step=0.1, defval=3.0, group = "SuperTrend Settings")
changeATR = input(title='Change ATR Calculation Method ?', defval=true, group = "SuperTrend Settings")
//SuperTrend Code
atr2 = ta.sma(ta.tr, Periods)
atr = changeATR ? ta.atr(Periods) : atr2
up = src - Multiplier * atr
up1 = nz(up[1], up)
up := close[1] > up1 ? math.max(up, up1) : up
dn = src + Multiplier * atr
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? math.min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
// Strategy main code
buySignal = trend == 1 and trend[1] == -1
sellSignal = trend == -1 and trend[1] == 1
if buySignal
strategy.entry('Long', strategy.long)
if sellSignal
strategy.entry('Short', strategy.short)
//Equity Curve calcs
eq = strategy.netprofit
ch = ta.change(eq)
neq = ch != 0 ? eq : na
mova = ta.ema(neq,eqlen)
// New Equity Curve
var float neweq = 0
var int ttrades = 0
var int wintrades = 0
var int losetrades = 0
switch
strategy.netprofit == strategy.netprofit[1] => na
strategy.netprofit < mova and strategy.netprofit[1] > mova => neweq := neweq + ch
strategy.netprofit < mova and strategy.netprofit[1] < mova => na
strategy.netprofit > mova and strategy.netprofit[1] > mova => neweq := neweq + ch
newch = ta.change(neweq)
switch
newch == 0 => na
newch > 0 =>
wintrades := wintrades +1
ttrades := ttrades +1
newch < 0 =>
losetrades := losetrades +1
ttrades := ttrades +1
//plot(eq, linewidth = 2)
//plot(mova, color=color.red)
//plot(neweq, color= color.green, linewidth = 3)
//Table
var testTable = table.new(position = position.top_right, columns = 5, rows = 10, bgcolor = color.green, border_width = 1)
table.cell(table_id = testTable, column = 0, row = 0, text = "Strategy: ", bgcolor=color.white)
table.cell(table_id = testTable, column = 1, row = 0, text = "Original: ", bgcolor=color.white)
table.cell(table_id = testTable, column = 2, row = 0, text = "Equity Curve EMA: ", bgcolor=color.white)
table.cell(table_id = testTable, column = 0, row = 1, text = "Total Trades: ", bgcolor=color.white)
table.cell(table_id = testTable, column = 0, row = 2, text = "Win Trades: ", bgcolor=color.white)
table.cell(table_id = testTable, column = 0, row = 3, text = "Lose Trades: ", bgcolor=color.white)
table.cell(table_id = testTable, column = 0, row = 4, text = "Win Rate: ", bgcolor=color.white)
table.cell(table_id = testTable, column = 0, row = 5, text = "Net Profit: ", bgcolor=color.white)
//Equity Curve EMA stat
table.cell(table_id = testTable, column = 2, row = 1, text = str.tostring(ttrades), bgcolor=color.white)
table.cell(table_id = testTable, column = 2, row = 2, text = str.tostring(wintrades), bgcolor=color.white)
table.cell(table_id = testTable, column = 2, row = 3, text = str.tostring(losetrades), bgcolor=color.white)
table.cell(table_id = testTable, column = 2, row = 4, text = str.tostring(math.round(100*wintrades/ttrades,2)), bgcolor=color.white)
table.cell(table_id = testTable, column = 2, row = 5, text = str.tostring(math.round(neweq)), bgcolor=color.white)
//Original Strategy stat
// table.cell(table_id = testTable, column = 1, row = 1, text = str.tostring(strategy.closedtrades), bgcolor=color.white)
// table.cell(table_id = testTable, column = 1, row = 2, text = str.tostring(strategy.wintrades), bgcolor=color.white)
// table.cell(table_id = testTable, column = 1, row = 3, text = str.tostring(strategy.losstrades), bgcolor=color.white)
// table.cell(table_id = testTable, column = 1, row = 4, text = str.tostring(math.round(100*strategy.wintrades/strategy.closedtrades,2)), bgcolor=color.white)
// table.cell(table_id = testTable, column = 1, row = 5, text = str.tostring(math.round(strategy.netprofit)), bgcolor=color.white)
//New Equity curve
var newcurve = array.new_float(0)
var int ida = 0
var bool printEQ = false
if newch !=0
array.push(newcurve, neweq)
if bar_index > last_bar_index - array.size(newcurve) - 1 - 20 and array.size(newcurve) > 20
printEQ := true
else
printEQ := false
plot(printEQ and ida < strategy.closedtrades and shEQfilt ? array.get(newcurve, ida) : na, color=color.green, linewidth = 2)
if printEQ
ida := ida + 1
if ida >= array.size(newcurve) and printEQ
ida := array.size(newcurve) -1
//Original Equity curve
var newcurve2 = array.new_float(0)
var int ida2 = 0
var bool printEQ2 = false
if ch !=0
array.push(newcurve2, eq)
if bar_index > last_bar_index - array.size(newcurve2) - 1 - 20 and array.size(newcurve2) > 20
printEQ2 := true
else
printEQ2 := false
plot(printEQ2 and ida2 < strategy.closedtrades and shEQandMA ? array.get(newcurve2, ida2) : na, color=color.blue, linewidth = 2)
if printEQ2
ida2 := ida2 + 1
if ida2 >= array.size(newcurve2) and printEQ2
ida2 := array.size(newcurve2) -1
//Moving Average Array
var marray = array.new_float(0)
if ch
array.push(marray, mova)
plot(printEQ2 and array.size(marray) > 40 and shEQandMA ? array.get(marray, ida2-1) : na, color=color.red, linewidth = 1)
hline(0,"0 line", color=color.black, linestyle = hline.style_dotted)
if (last_bar_index-1) and array.size(newcurve2) > 20 and array.size(newcurve) > 20
l = label.new(bar_index+2, array.get(newcurve2, array.size(newcurve2)-1), "Original Equity Curve", color=color.rgb(33, 149, 243, 85), textcolor = color.black, style = label.style_label_left)
label.delete(l[1])
f = label.new(bar_index+2, array.get(newcurve, array.size(newcurve)-1), "Filtered Equity Curve", color=color.rgb(69, 238, 97, 85), textcolor = color.black, style = label.style_label_left)
label.delete(f[1])