
Strategi ini adalah varian dari strategi penelusur tren lainnya yang saya lakukan sebelumnya. Dalam strategi lain, Anda dapat menggunakan rata-rata bergerak sebagai filter untuk perdagangan (yaitu, jika harga lebih rendah dari rata-rata bergerak, itu tidak akan melakukan banyak). Setelah membuat alat untuk mendeteksi tren pada kerangka waktu yang lebih tinggi, saya ingin melihat apakah itu mungkin filter yang lebih baik daripada rata-rata bergerak.
Oleh karena itu, strategi ini memungkinkan Anda untuk melihat tren pada jangka waktu yang lebih tinggi (yaitu, apakah ada titik tinggi yang lebih tinggi dan titik rendah yang lebih rendah? Jika demikian, ini adalah tren naik). Anda hanya berposisi di arah tren. Anda dapat memilih hingga dua tren sebagai filter.
Saya menemukan bahwa strategi ini umumnya tidak bekerja dengan baik dibandingkan dengan strategi lain, tetapi tampaknya lebih memilih perdagangan. Ini menunjukkan tingkat kemenangan yang lebih tinggi dan faktor keuntungan yang lebih baik.
Logika inti dari strategi ini adalah untuk mengidentifikasi tren dan melakukan perdagangan sesuai dengan arah tren dengan menggunakan titik dukungan dan resistensi yang menerobos kerangka waktu yang lebih tinggi.
Secara khusus, hal ini dilakukan melalui langkah-langkah berikut:
Menghitung posisi support dan resistance pada kerangka waktu saat ini (seperti 1 jam). Hal ini dilakukan dengan mencari harga tertinggi dan terendah dalam periode tertentu.
Menghitung titik dukungan dan titik resistensi untuk satu atau lebih frame waktu yang lebih tinggi (seperti 4 jam dan garis matahari). Ini dilakukan dengan menggunakan logika yang sama dengan frame waktu saat ini.
Garis horisontal dari titik-titik dukungan dan resistensi ini dipetakan pada grafik. Ketika harga menembus level-level ini, tren pada frame waktu yang lebih tinggi akan berubah.
Jika harga melewati titik tinggi, maka dianggap sebagai tren naik. Jika harga melewati titik rendah, maka dianggap sebagai tren turun.
Memungkinkan pengguna untuk memilih satu atau lebih tren dari kerangka waktu yang lebih tinggi sebagai kondisi penyaringan. Artinya, perdagangan hanya akan dipertimbangkan jika arah tren dari kerangka waktu saat ini sesuai dengan arah tren dari kerangka waktu yang lebih tinggi.
Ketika kondisi penyaringan tren terpenuhi dan harga saat ini menembus level kritis, maka dilakukan pembelian atau penjualan. Level stop loss ditetapkan sebagai support atau resistance level dari level kritis sebelumnya.
Ketika harga bergerak, ketika titik tinggi atau rendah baru terbentuk, stop loss akan dipindahkan ke titik rendah baru untuk mengunci keuntungan dan mengikuti tren.
Ketika stop loss dipicu atau titik support / resistance yang penting terjatuh, posisi kosong keluar.
Melalui analisis tren multi-frame ini, strategi mencoba untuk melakukan perdagangan hanya di arah tren yang lebih kuat untuk meningkatkan probabilitas kemenangan. Pada saat yang sama, tingkat kritis memberikan sinyal masuk dan berhenti yang jelas.
Menggunakan beberapa kerangka waktu untuk menilai tren, Anda dapat lebih akurat mengidentifikasi arah tren yang lebih kuat dan menghindari kebingungan dari kebisingan pasar.
Strategi ini menunjukkan tingkat kemenangan yang lebih tinggi dan rasio risiko keuntungan yang lebih baik dibandingkan dengan penyaringan rata-rata bergerak sederhana, menurut hasil pengujian.
Dukungan dan resistensi memberikan tingkat masuk dan berhenti yang jelas. Tidak perlu memilih titik masuk tertentu.
Dengan mengoperasikan tren, Anda dapat menyesuaikan posisi stop loss Anda untuk mengunci keuntungan maksimum.
Logika strategi sederhana dan jelas, mudah dipahami dan disesuaikan.
Penilaian tren yang bergantung pada segmen garis yang lebih panjang, mudah ditiru ketika tren berbalik. Periode waktu penilaian tren harus dipersingkat secara tepat, atau penilaian tambahan menggunakan indikator lain.
Tidak mempertimbangkan dampak fundamental, mungkin terjadi pergeseran harga saham ketika terjadi peristiwa besar. Anda dapat menambahkan filter seperti peristiwa ATM atau tanggal laporan keuangan.
Tidak ada kontrol skala posisi yang diatur. Ukuran posisi dapat diatur berdasarkan faktor-faktor seperti ukuran dana akun, volatilitas.
Jangka waktu pengembalian terbatas. Periode pengembalian harus diperluas untuk menguji stabilitas dalam lingkungan pasar yang berbeda.
Tidak mempertimbangkan dampak dari biaya transaksi. Parameter strategi harus disesuaikan dengan biaya transaksi spesifik di real time.
Hanya pertimbangkan perdagangan garis panjang. Dapat dikombinasikan dengan strategi lain untuk mengembangkan sinyal perdagangan garis pendek, untuk mencapai arbitrage berkala.
Tambahkan kondisi filter:
Data dasar, seperti laporan keuangan, berita, dan lainnya
Indikator seperti volume transaksi, ATR stop loss, dan lain-lain.
Parameter optimasi:
Siklus penyesuaian bit dukungan / resistensi
Kerangka waktu untuk menilai tren
Memperluas jangkauan strategi:
Mengembangkan strategi perdagangan singkat
Pertimbangkan Peluang Penjualan
Arbitrage multi-varietas
Meningkatkan manajemen risiko:
Ukuran posisi yang dioptimalkan berdasarkan volatilitas dan ukuran dana
Optimalkan strategi stop loss, seperti stop loss bergerak, stop loss tetap, dan sebagainya
Mengenalkannya sebagai sistem sanksi penghargaan risiko.
Pengoptimalan Logika Eksekusi
Pemilihan waktu masuk
Mempertimbangkan beberapa posisi masuk
Mengoptimalkan strategi stop loss mobile
Strategi ini dirancang untuk memiliki sistem penembusan yang lebih kuat dengan menganalisis tren dalam beberapa kerangka waktu. Dengan penyaringan indikator seperti rata-rata bergerak sederhana, strategi ini menunjukkan rasio kemenangan dan risiko keuntungan yang lebih tinggi. Namun, ada juga beberapa aspek yang dapat dioptimalkan, seperti mekanisme manajemen risiko yang tidak sempurna, tanpa mempertimbangkan faktor-faktor mendasar, dll.
/*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)