
Die Strategie verwendet ein Gleichlinien-System, um die Richtung des aktuellen Trends zu bestimmen. Wenn der Durchschnittskurs steigt, wird er als hoher Kursvertrauen beurteilt. Wenn der Durchschnittskurs sinkt, wird er als hoher Kursvertrauen beurteilt.
Der gewichtete Moving Average (vwma) für einen bestimmten Zeitraum (die Standard 400-Perioden) wird als Mittelwert berechnet.
Beurteilen Sie, ob die Durchschnittslinie wma steigt. Wenn sie steigt, setzen Sie mehrere Auftrendsignale ein. Wenn sie sinkt, setzen Sie einen Abwärtstrendsignal ein.
Wenn der Aufwärtstrend wahr ist, machen Sie mehr; wenn der Abwärtstrend wahr ist, machen Sie die Position leer.
Berechnen Sie die strategische Rendite bar_pnl und die Kauf-Hold-Rendite bar_bh für jede K-Linie.
Quartals- und Jahresrendite berechnen Quartals- und Jahresrendite quarter_pnl und Jahresrendite year_pnl sowie entsprechende Kauf- und Halterrenditen quarter_bh und year_bh.
Die Tabelle zeigt die strategischen Erträge pro Quartal und die Kauf- und Halteerträge pro Jahr.
Die Strategie basiert auf einer durchschnittlichen Markttrend-Richtung und hat folgende Vorteile:
Die Handhabung ist einfach, die Marktentwicklung wird anhand der Durchschnittslinie beurteilt und leicht zu verstehen und zu erfassen.
Die Rückzugskontrolle ist leistungsstark und kann Trendspielern helfen, die Verluste von nicht-trendigen Märkten effektiv zu kontrollieren.
Weniger konfigurierbare Parameter, hauptsächlich für die Anpassung der Durchschnittslinie, leicht zu testen und zu optimieren.
Die Verwendung von Tabellen als visuelle Darstellung der Einnahmen ist einfach.
In der Ertragsform können die Ertragszuwächse der Kauf- und Halteerträge für den Vergleich hinzugefügt werden, um die Strategie für die Ertragszuwächse zu definieren.
Flexible Einstellungen der Tabellenpositionen, die in Kombination mit anderen Strategien verwendet werden können.
Die Strategie birgt auch einige Risiken:
Bulk-Market-Risiko, in einem lang anhaltenden Bullenmarkt kann ein geringfügiger Ertrag im Vergleich zu einer Buy-Hold-Strategie möglich sein. Die Durchschnittszyklus kann entsprechend angepasst werden, um diese zu optimieren.
Whipsaw-Risiken sind in einem wackligen Umfeld hoch. Es kann in Betracht gezogen werden, Filterbedingungen wie die Pre-Breakout-Höhe zu erhöhen, um wiederholte Transaktionen zu reduzieren.
Ein Gleichliniensystem passt nicht gut zu einer Kurve und kann einen Trendwendepunkt verpassen. Verschiedene Arten von Gleichlinienindikatoren können getestet werden.
Ohne Berücksichtigung von Stop-Loss-Exit-Mechanismen besteht ein erhebliches Rücknahmerisiko. Sie können einen dynamischen Stop-Loss einrichten oder eine Verringerung der Position in Betracht ziehen.
Für die Optimierung der Tabelle können Risikomessgrößen wie Sharpe Ratio und Maximum Retraction in Betracht gezogen werden.
Diese Strategie kann in folgenden Bereichen optimiert werden:
Optimierung der Parameter der Durchschnittslinie und Anpassung der Durchschnittslinie-Periode an unterschiedliche Marktbedingungen.
Hinzufügen von Filterbedingungen, wie z. B. Hochpunkte vor dem Durchbruch, um den Whipsaw zu reduzieren.
Versuchen Sie mit verschiedenen Arten von Durchschnittswerten, wie beispielsweise einem gewichteten Moving Average, einem Doppelindex Moving Average usw.
Ein Stop-Loss-Mechanismus kann eingesetzt werden, um dynamische Stop-Loss-Systeme einzusetzen oder Positionen zu reduzieren.
Die Tabellen werden mit Sharpe Ratio, Maximum Retraction usw. bereichert.
In Kombination mit anderen Indikatoren, wie MACD, Bollinger Bands und anderen, um Trends zu beurteilen.
Optimierung der Positionsverwaltung und dynamische Anpassung der Positionen an die Marktlage.
Test der Leistung verschiedener Normen, um die optimale Anwendung zu finden.
Die Strategie ist einfach und direkt, die Tendenz wird durch die Tendenz beurteilt, die Rücknahme ist stark, und sie ist für Trend-Händler geeignet. Es gibt noch viel Optimierungsraum, und die Strategie kann in Bezug auf das Gleichgewichtssystem, den Stop-Loss-Mechanismus und die Positionsverwaltung optimiert werden, um die Strategie besser an die komplexe Marktumgebung anzupassen. Die Tabellengestaltung zeigt die Strategie im Vergleich zu den Erträgen von Kauf und Verkauf und visuell den Mehrwert der Strategie.
/*backtest
start: 2022-10-23 00:00:00
end: 2023-10-29 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/
// © Dannnnnnny
//@version=4
strategy(title="Quarterly Returns in Strategies vs Buy & Hold", initial_capital= 1000, overlay=true,default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, commission_value = 0.1)
maLength= input(400)
wma= vwma(hl2,maLength)
uptrend= rising(wma, 5)
downtrend= falling(wma,5)
plot(wma)
if uptrend
strategy.entry("Buy", strategy.long)
else
strategy.close("Buy")//
///////////////////
// QUARTERLY TABLE //
enableQuarterlyTable = input(title="Enable Quarterly Return table", type=input.bool, defval=false)
enableCompareWithMarket = input(title="Compare with Market Benchmark", type=input.bool, defval=false)
table_position = input(title="Table Position", type=input.string, defval='bottom_right', options=['bottom_right','bottom_left','top_right', 'top_left'])
precision = 2
new_quarter = ceil(month(time)/3) != ceil(month(time[1])/3)
new_year = year(time) != year(time[1])
eq = strategy.equity
bar_pnl = eq / eq[1] - 1
bar_bh = (close-close[1])/close[1]
cur_quarter_pnl = 0.0
cur_year_pnl = 0.0
cur_quarter_bh = 0.0
cur_year_bh = 0.0
// Current Quarterly P&L
cur_quarter_pnl := new_quarter ? 0.0 :
(1 + cur_quarter_pnl[1]) * (1 + bar_pnl) - 1
cur_quarter_bh := new_quarter ? 0.0 :
(1 + cur_quarter_bh[1]) * (1 + bar_bh) - 1
// Current Yearly P&L
cur_year_pnl := new_year ? 0.0 :
(1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1
cur_year_bh := new_year ? 0.0 :
(1 + cur_year_bh[1]) * (1 + bar_bh) - 1
// Arrays to store Yearly and Quarterly P&Ls
var quarter_pnl = array.new_float(0)
var quarter_time = array.new_int(0)
var quarter_bh = array.new_float(0)
var year_pnl = array.new_float(0)
var year_time = array.new_int(0)
var year_bh = array.new_float(0)
end_time = false
end_time:= time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory
if (not na(cur_quarter_pnl[1]) and (new_quarter or end_time))
if (end_time[1])
array.pop(quarter_pnl)
array.pop(quarter_time)
array.push(quarter_pnl , cur_quarter_pnl[1])
array.push(quarter_time, time[1])
array.push(quarter_bh , cur_quarter_bh[1])
if (not na(cur_year_pnl[1]) and (new_year or end_time))
if (end_time[1])
array.pop(year_pnl)
array.pop(year_time)
array.push(year_pnl , cur_year_pnl[1])
array.push(year_time, time[1])
array.push(year_bh , cur_year_bh[1])
// Quarterly P&L Table
var quarterly_table = table(na)
getCellColor(pnl, bh) =>
if pnl > 0
if bh < 0 or pnl > 2 * bh
color.new(color.green, transp = 20)
else if pnl > bh
color.new(color.green, transp = 50)
else
color.new(color.green, transp = 80)
else
if bh > 0 or pnl < 2 * bh
color.new(color.red, transp = 20)
else if pnl < bh
color.new(color.red, transp = 50)
else
color.new(color.red, transp = 80)
if (end_time and enableQuarterlyTable)
quarterly_table := table.new(table_position, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1)
table.cell(quarterly_table, 0, 0, "", bgcolor = #cccccc)
table.cell(quarterly_table, 1, 0, "Q1", bgcolor = #cccccc)
table.cell(quarterly_table, 2, 0, "Q2", bgcolor = #cccccc)
table.cell(quarterly_table, 3, 0, "Q3", bgcolor = #cccccc)
table.cell(quarterly_table, 4, 0, "Q4", bgcolor = #cccccc)
table.cell(quarterly_table, 5, 0, "Year", bgcolor = #999999)
for yi = 0 to array.size(year_pnl) - 1
table.cell(quarterly_table, 0, yi + 1, tostring(year(array.get(year_time, yi))), bgcolor = #cccccc)
y_color = getCellColor(array.get(year_pnl, yi), array.get(year_bh, yi))
table.cell(quarterly_table, 5, yi + 1, enableCompareWithMarket ? tostring(round(array.get(year_pnl, yi) * 100, precision)) + " (" + tostring(round(array.get(year_bh, yi) * 100, precision)) + ")" : tostring(round(array.get(year_pnl, yi) * 100, precision)), bgcolor = y_color, text_color=#bfbfbf)
for mi = 0 to array.size(quarter_time) - 1
m_row = year(array.get(quarter_time, mi)) - year(array.get(year_time, 0)) + 1
m_col = ceil(month(array.get(quarter_time, mi)) / 3)
m_color = getCellColor(array.get(quarter_pnl, mi), array.get(quarter_bh, mi))
table.cell(quarterly_table, m_col, m_row, enableCompareWithMarket ? tostring(round(array.get(quarter_pnl, mi) * 100, precision)) + " (" + tostring(round(array.get(quarter_bh, mi) * 100,precision)) +")" : tostring(round(array.get(quarter_pnl, mi) * 100, precision)), bgcolor = m_color, text_color=#bfbfbf)