Breakout Trend Follower V2

Penulis:ChaoZhang, Tanggal: 2023-11-01 17:24:08
Tag:

img

Gambaran umum

Strategi ini adalah variasi dari strategi Breakout Trend Follower saya yang lain. Dalam strategi lain, Anda dapat menggunakan moving average untuk bertindak sebagai filter untuk perdagangan Anda (yaitu jika harga berada di bawah moving average, itu tidak akan lama). Setelah membuat alat yang mendeteksi tren pada jangka waktu yang lebih tinggi, saya ingin melihat apakah itu mungkin filter yang lebih baik daripada moving average.

Jadi skrip ini memungkinkan Anda untuk melihat tren jangka waktu yang lebih tinggi (yaitu apakah ada puncak yang lebih tinggi dan terendah yang lebih tinggi? Jika demikian, ini adalah tren naik). Anda hanya mengambil perdagangan ketika Anda dengan tren. Anda memiliki kemampuan untuk memilih hingga dua tren untuk bertindak sebagai filter. Setiap arah tren ditunjukkan pada tabel pada grafik untuk referensi yang mudah.

Apa yang saya temukan adalah bahwa secara umum ini tidak berkinerja baik seperti strategi lain, tetapi tampaknya jauh lebih pilih-pilih dengan perdagangan. menunjukkan tingkat kemenangan yang lebih tinggi dan faktor keuntungan yang lebih baik.

Logika Strategi

Logika inti dari strategi ini adalah untuk mengidentifikasi tren menggunakan pecahnya level support dan resistance pada jangka waktu yang lebih tinggi, dan mengambil perdagangan ke arah tren.

Secara khusus, ia menerapkan langkah-langkah berikut:

  1. Menghitung level support dan resistance pivot pada jangka waktu saat ini (misalnya 1 jam).

  2. Menghitung level support dan resistance pivot pada satu atau lebih kerangka waktu yang lebih tinggi (misalnya 4 jam dan harian).

  3. Menggambar level support dan resistance ini sebagai garis horizontal pada grafik. Mematahkan level ini menunjukkan perubahan tren pada jangka waktu yang lebih tinggi.

  4. Tentukan arah tren berdasarkan apakah harga melanggar titik tinggi atau rendah sebelumnya. Menjembatani titik tinggi sebelumnya menunjukkan tren naik. Menjembatani titik rendah sebelumnya menunjukkan tren turun.

  5. Memungkinkan pengguna untuk memilih satu atau lebih tren jangka waktu yang lebih tinggi sebagai kondisi filter. Artinya hanya mempertimbangkan untuk melakukan perdagangan ketika tren jangka waktu saat ini sejajar dengan tren jangka waktu yang lebih tinggi.

  6. Ketika kondisi filter tren terpenuhi dan harga saat ini melanggar level kunci, masukkan panjang atau pendek. Stop loss ditetapkan pada level support atau resistance kunci sebelumnya.

  7. Saat harga bergerak, sesuaikan stop loss ke titik terendah baru untuk mengunci keuntungan dan mengikuti tren.

  8. Keluar ketika stop loss dipicu atau level support/resistance utama dipecahkan.

Dengan menganalisis tren di beberapa kerangka waktu, strategi ini hanya mencoba berdagang ke arah tren yang lebih kuat untuk meningkatkan tingkat kemenangan. Sementara itu, level kunci memberikan sinyal masuk dan stop loss yang jelas.

Keuntungan dari Strategi

  • Menggunakan beberapa kerangka waktu untuk menilai tren dapat lebih akurat mengidentifikasi arah tren yang lebih kuat, menghindari kebisingan.

  • Hanya perdagangan dengan tren utama yang secara signifikan meningkatkan tingkat kemenangan. Dibandingkan dengan filter rata-rata bergerak sederhana, strategi ini menunjukkan tingkat kemenangan dan rasio risiko-manfaat yang lebih tinggi.

  • Tingkat support dan resistance memberikan level entry dan stop loss yang jelas.

  • Menyesuaikan berhenti di sepanjang tren untuk memaksimalkan keuntungan penguncian.

  • Logika strategi yang sederhana dan jelas, mudah dipahami dan dioptimalkan.

Risiko dari Strategi

  • Bergantung pada tren jangka panjang, cenderung terjebak pada pembalikan tren.

  • Tidak mempertimbangkan dampak fundamental, mungkin menyimpang dari harga pada peristiwa besar.

  • Tidak ada kontrol ukuran posisi yang ditetapkan. Harus mengoptimalkan ukuran berdasarkan ukuran akun, volatilitas dll.

  • Periode backtest terbatas. Harus memperluas pengujian di berbagai lingkungan pasar.

  • Tidak memperhitungkan biaya perdagangan. harus menyesuaikan parameter berdasarkan biaya yang sebenarnya.

  • Hanya mempertimbangkan perdagangan jangka panjang. Dapat mengembangkan sinyal untuk perdagangan jangka pendek untuk menerapkan strategi multi-frame waktu.

Arahan Optimasi

  • Tambahkan kondisi filter:

    • Fundamental seperti pendapatan, berita

    • Indikator seperti volume, ATR berhenti

  • Mengoptimalkan parameter:

    • Periode untuk perhitungan support/resistance

    • Kerangka waktu untuk penentuan tren

  • Memperluas ruang lingkup strategi:

    • Mengembangkan strategi perdagangan jangka pendek

    • Pertimbangkan peluang shorting

    • Spread antar pasar

  • Meningkatkan manajemen risiko:

    • Mengoptimalkan ukuran posisi berdasarkan volatilitas dan ukuran

    • Memperbaiki strategi stop loss seperti stop bergerak/bracket

    • Memperkenalkan metrik yang disesuaikan dengan risiko

  • Meningkatkan logika eksekusi:

    • Pemilihan waktu masuk

    • Entri ukuran parsial

    • Optimasi gerakan stop loss

Kesimpulan

Strategi ini merancang sistem breakout yang relatif kuat dengan menganalisis tren di beberapa kerangka waktu. Dibandingkan dengan filter sederhana seperti moving average, ia menunjukkan tingkat kemenangan dan rasio risiko-imbalan yang lebih tinggi. Tetapi ada beberapa bidang yang dapat ditingkatkan, seperti kurangnya mekanisme manajemen risiko yang solid dan pertimbangan dasar. Dengan optimasi lebih lanjut, itu bisa menjadi strategi tren yang sangat praktis. Secara keseluruhan, desain strategi adalah suara, meningkatkan keakuratan melalui analisis multi-kerangka waktu, dan layak penelitian lebih lanjut dan penerapan.


/*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)



Lebih banyak