
Strategi ini adalah varian dari strategi penjejaki trend yang lain yang saya lakukan sebelum ini. Dalam strategi lain, anda boleh menggunakan purata bergerak sebagai penapis untuk perdagangan (iaitu, jika harga lebih rendah daripada purata bergerak, ia tidak akan melakukan banyak).
Oleh itu, strategi ini membolehkan anda melihat trend pada jangka masa yang lebih tinggi (iaitu, adakah terdapat puncak yang lebih tinggi dan titik rendah yang lebih rendah? Jika ya, ia adalah trend naik). Anda hanya membuat kedudukan di arah trend. Anda boleh memilih sehingga dua trend sebagai penapis.
Saya dapati bahawa strategi ini tidak berfungsi dengan baik berbanding dengan strategi lain, tetapi ia memang kelihatan lebih mencabar dalam perdagangan. Ia menunjukkan kadar kemenangan yang lebih tinggi dan faktor keuntungan yang lebih baik.
Logik teras strategi ini adalah untuk mengenal pasti trend menggunakan sokongan dan rintangan yang menembusi bingkai masa yang lebih tinggi dan berdagang mengikut arah trend.
Secara khusus, ia dicapai melalui langkah-langkah berikut:
Mengira kedudukan sokongan dan rintangan pada jangka masa semasa (seperti garis 1 jam). Ini dilakukan dengan mencari harga tertinggi dan terendah dalam tempoh tertentu.
Mengira kedudukan sokongan dan rintangan pada satu atau lebih bingkai masa yang lebih tinggi (seperti 4 jam dan garis matahari). Ini dilaksanakan menggunakan logik yang sama dengan bingkai masa semasa.
Garis mendatar untuk kedudukan sokongan dan rintangan ini di carta. Apabila harga melepasi tahap ini, trend pada jangka masa yang lebih tinggi akan berubah.
Arah trend ditentukan berdasarkan apakah harga menembusi tahap-tahap penting ini. Jika harga menembusi satu titik tinggi, ia dianggap sebagai tren naik. Jika ia menembusi satu titik rendah, ia dianggap sebagai tren menurun.
Mengizinkan pengguna untuk memilih satu atau lebih trend pada jangka masa yang lebih tinggi sebagai syarat penapisan. Iaitu, perdagangan hanya akan dipertimbangkan jika arah trend pada jangka masa semasa adalah sama dengan arah trend pada jangka masa yang lebih tinggi.
Apabila syarat penapis trend dipenuhi dan harga semasa menembusi tahap kritikal, pembelian atau penjualan dilakukan. Tahap Hentikan Kerosakan ditetapkan sebagai tahap sokongan atau rintangan sebelum kritikal.
Apabila harga bergerak, apabila titik tinggi atau rendah baru terbentuk, hentian akan bergerak ke titik rendah baru untuk mengunci keuntungan dan mengikuti trend.
Apabila stop loss dicetuskan atau tahap sokongan / rintangan kritikal telah ditembusi, keluar dari kedudukan rata.
Melalui analisis trend pada jangka masa ini, strategi berusaha untuk berdagang hanya di arah trend yang lebih kuat untuk meningkatkan kebarangkalian kemenangan. Pada masa yang sama, tahap kritikal memberikan isyarat masuk dan berhenti yang jelas.
Menggunakan pelbagai bingkai masa untuk menilai trend, anda boleh mengenal pasti arah trend yang lebih kuat dengan lebih tepat dan mengelakkan diri anda daripada tertipu oleh bunyi pasaran.
Bergerak hanya ke arah trend utama boleh meningkatkan kadar kemenangan secara besar-besaran. Berdasarkan hasil ujian, strategi ini menunjukkan kemenangan yang lebih tinggi dan nisbah risiko keuntungan yang lebih baik berbanding penapisan purata bergerak sederhana.
Tahap sokongan dan rintangan menyediakan tahap kemasukan dan hentian yang jelas. Tidak perlu terikat dengan pilihan titik kemasukan tertentu.
Dengan cara ini, anda boleh mengunci keuntungan maksimum dengan menyesuaikan kedudukan hentian semasa trend berjalan.
Logik strategi mudah difahami dan disesuaikan.
Penghakiman trend yang bergantung pada segmen garis yang lebih panjang, mudah disadap apabila trend berbalik. Periode masa untuk menilai trend harus dikurangkan dengan sewajarnya, atau penilaian tambahan menggunakan penunjuk lain.
Tidak mengambil kira kesan fundamental, mungkin berlaku percanggahan dengan harga saham apabila berlaku peristiwa besar. Anda boleh memasukkan syarat penapis seperti peristiwa ATM atau tarikh laporan pendapatan.
Tiada kawalan skala kedudukan yang ditetapkan. Ukuran kedudukan boleh ditetapkan berdasarkan faktor seperti saiz dana akaun, kadar turun naik.
Tempoh pengesanan terhad. Tempoh pengesanan perlu diperluaskan untuk menguji kestabilan dalam keadaan pasaran yang berbeza.
Tidak mengambil kira kesan kos urus niaga. Parameter strategi harus disesuaikan dengan kos urus niaga tertentu dalam set nyata.
Hanya pertimbangkan perdagangan garis panjang. Ia boleh digabungkan dengan strategi lain untuk membangunkan isyarat perdagangan garis pendek untuk mencapai pengaliran pelbagai kitaran.
Tambah syarat penapis:
Data asas, seperti laporan kewangan, berita, dan lain-lain
Penunjuk seperti jumlah transaksi, ATR, dan sebagainya
Parameter pengoptimuman:
Siklus pengiraan bit sokongan / rintangan yang disesuaikan
Rangka masa untuk menilai trend
Memperluaskan strategi:
Membangunkan strategi perdagangan garis pendek
Pertimbangkan untuk menjual
Arbitrase pelbagai jenis
Meningkatkan pengurusan risiko:
Saiz kedudukan yang dioptimumkan berdasarkan kadar turun naik dan saiz dana
Mengoptimumkan strategi hentikan kerugian, seperti hentikan bergerak, hentikan hentikan, dan sebagainya
Memperkenalkan sistem ganjaran risiko
Optimumkan logik pelaksanaan:
Pemilihan masa masuk
Pertimbangan untuk memasuki beberapa kedudukan
Mengoptimumkan strategi stop loss bergerak
Strategi ini merancang sistem penembusan yang lebih mantap dengan menganalisis trend dalam pelbagai bingkai masa. Ia menunjukkan kemenangan yang lebih tinggi dan nisbah risiko keuntungan berbanding dengan penapis indikator seperti purata bergerak sederhana. Tetapi ada juga aspek yang dapat dioptimumkan, seperti mekanisme pengurusan risiko yang tidak sempurna, tanpa mempertimbangkan faktor asas, dll. Jika dioptimumkan lebih lanjut, ia boleh menjadi strategi pengesanan trend yang sangat praktikal.
/*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)