
Diese Strategie verwendet einen einfachen Moving Average, um die Richtung des Trends zu bestimmen, um bei anhaltend steigenden Trends zu handeln und bei anhaltend rückläufigen Trends zu kaufen, um einen Zwei-Wege-Handel zu ermöglichen.
Diese Strategie verwendet den gewichteten Moving Average VWMA, um die Richtung der Markttrends zu bestimmen. Wenn der VWMA steigt, machen Sie mehr; wenn der VWMA fällt, machen Sie weniger.
Konkret berechnet die Strategie zunächst den VWMA eines bestimmten Zeitraums und entscheidet dann, ob der VWMA über 5 Tage gestiegen ist. Wenn ja, wird eine Position aufgenommen. Wenn der VWMA über 5 Tage fällt, wird die Position aufgenommen.
Um die monatliche und jährliche Ertragsleistung zu berechnen, werden die Ertragswerte monatlich und jährlich aufgezeichnet. Durch den Vergleich der Strategie mit den Markt-Beichenwert-Erträgen kann ein visueller Blick auf die relative Markt-Performance der Strategie erfasst werden.
Diese Strategie hat folgende Vorteile:
Mit VWMA kann Trends beurteilt werden, um Marktgeräusche effektiv zu filtern und die wichtigsten Trends zu erfassen.
Wenn Sie nur nach der Bestätigung des Trends eine Position eröffnen, können Sie das Risiko einer Trendwende vermeiden.
Mit einem Zwei-Wege-Handel kann man unabhängig von der Kursentwicklung profitieren.
Monatliche und jährliche Erträge werden dokumentiert, um die Wirksamkeit der Strategie zu bewerten.
In der Ertragsliste werden die Markt-Benchmark-Erträge hinzugefügt, um die relative Performance der Strategie mit dem Markt zu vergleichen.
Die Strategie birgt auch Risiken:
Mit VWMA kann ein Trend zurückbleiben und die Chance verpasst werden, in der Anfangsphase zu sein.
Wenn Sie nur nach der Trendbestätigung eine Position aufnehmen, können Sie einen Teil der Bewegung verpassen.
Beide Seiten müssen einen Stop-Loss-Punkt festlegen, sonst kann der Verlust noch größer werden.
Der Trend kann nicht vollständig gehalten werden, wenn ein Stop-Loss durch starke Marktschwankungen ausgelöst wird.
Die Umkehrung des Trends kann ungenau sein und die Verluste erhöhen.
Diese Strategie kann optimiert werden durch:
Optimierung der VWMA-Zyklusparameter und Verbesserung der Trendbeurteilung.
Anpassung der Anzahl der Tage für die Bestätigung von Trends und Verbesserung der Einstiegs- und Ausstiegszeiten
Die Einführung von Stop-Loss-Strategien zur Kontrolle von Einzelschäden.
In Kombination mit anderen Indikatoren kann die Umkehrung der Tendenz mit größerer Sicherheit beurteilt werden.
Optimierung der Positionsverwaltung und Anpassung der Positionen an die Marktlage.
Der Wert der Transaktion wird auf die Transaktionskosten berechnet und der Mindestgewinn festgelegt.
Diese Strategie ist klar und einfach, nutzt VWMA, um die Trendrichtung zu beurteilen, und bi-Weg-Handel nach der Trendbestätigung kann die Marktbewegung effektiv verfolgen. Es besteht jedoch ein gewisses Risiko, die Parameter müssen weiter getestet und optimiert werden, die Ausstiegslogik angepasst und die Positionsgröße angemessen kontrolliert werden. Diese Strategie basiert auf einer bi-Weg-Handelsstrategie und legt die Grundlage für quantitative Geschäfte.
/*backtest
start: 2023-01-01 00:00:00
end: 2023-10-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title="Monthly Returns in Strategies with Market Benchmark", shorttitle="Monthly P&L With Market", 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")//
///////////////////
// MONTHLY TABLE //
new_month = month(time) != month(time[1])
new_year = year(time) != year(time[1])
eq = strategy.equity
bar_pnl = eq / eq[1] - 1
bar_bh = (close-close[1])/close[1]
cur_month_pnl = 0.0
cur_year_pnl = 0.0
cur_month_bh = 0.0
cur_year_bh = 0.0
// Current Monthly P&L
cur_month_pnl := new_month ? 0.0 :
(1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1
cur_month_bh := new_month ? 0.0 :
(1 + cur_month_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 Monthly P&Ls
var month_pnl = array.new_float(0)
var month_time = array.new_int(0)
var month_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)
last_computed = false
if (not na(cur_month_pnl[1]) and (new_month or time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory))
if (last_computed[1])
array.pop(month_pnl)
array.pop(month_time)
array.push(month_pnl , cur_month_pnl[1])
array.push(month_time, time[1])
array.push(month_bh , cur_month_bh[1])
if (not na(cur_year_pnl[1]) and (new_year or time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory))
if (last_computed[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])
last_computed := (time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory) ? true : nz(last_computed[1])
// Monthly P&L Table
var monthly_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
color.new(color.red, transp = 20)
else if pnl < bh
color.new(color.red, transp = 50)
else
color.new(color.red, transp = 80)
if last_computed
monthly_table := table.new(position.bottom_right, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1)
table.cell(monthly_table, 0, 0, "", bgcolor = #cccccc)
table.cell(monthly_table, 1, 0, "Jan", bgcolor = #cccccc)
table.cell(monthly_table, 2, 0, "Feb", bgcolor = #cccccc)
table.cell(monthly_table, 3, 0, "Mar", bgcolor = #cccccc)
table.cell(monthly_table, 4, 0, "Apr", bgcolor = #cccccc)
table.cell(monthly_table, 5, 0, "May", bgcolor = #cccccc)
table.cell(monthly_table, 6, 0, "Jun", bgcolor = #cccccc)
table.cell(monthly_table, 7, 0, "Jul", bgcolor = #cccccc)
table.cell(monthly_table, 8, 0, "Aug", bgcolor = #cccccc)
table.cell(monthly_table, 9, 0, "Sep", bgcolor = #cccccc)
table.cell(monthly_table, 10, 0, "Oct", bgcolor = #cccccc)
table.cell(monthly_table, 11, 0, "Nov", bgcolor = #cccccc)
table.cell(monthly_table, 12, 0, "Dec", bgcolor = #cccccc)
table.cell(monthly_table, 13, 0, "Year", bgcolor = #999999)
for yi = 0 to array.size(year_pnl) - 1
table.cell(monthly_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(monthly_table, 13, yi + 1, tostring(round(array.get(year_pnl, yi) * 100)) + " (" + tostring(round(array.get(year_bh, yi) * 100)) + ")", bgcolor = y_color)
for mi = 0 to array.size(month_time) - 1
m_row = year(array.get(month_time, mi)) - year(array.get(year_time, 0)) + 1
m_col = month(array.get(month_time, mi))
m_color = getCellColor(array.get(month_pnl, mi), array.get(month_bh, mi))
table.cell(monthly_table, m_col, m_row, tostring(round(array.get(month_pnl, mi) * 100)) + " (" + tostring(round(array.get(month_bh, mi) * 100)) +")", bgcolor = m_color)