Pengikut Trend Breakout V2

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

img

Ringkasan

Strategi ini adalah variasi pada strategi Breakout Trend Follower saya yang lain. Dalam strategi lain, anda boleh menggunakan purata bergerak untuk bertindak sebagai penapis untuk perdagangan anda (iaitu jika harga di bawah purata bergerak, ia tidak akan lama).

Oleh itu skrip ini membolehkan anda melihat trend jangka masa yang lebih tinggi (iaitu adakah terdapat puncak yang lebih tinggi dan terendah yang lebih tinggi? Jika ya, ini adalah trend menaik). Anda hanya mengambil perdagangan apabila anda berada dengan trend. Anda mempunyai keupayaan untuk memilih sehingga dua trend untuk bertindak sebagai penapis. Setiap arah trend ditunjukkan pada jadual pada carta untuk rujukan yang mudah.

Apa yang saya dapati adalah bahawa secara umum ini tidak berfungsi dengan baik seperti strategi lain, tetapi ia nampaknya lebih memilih dengan perdagangan. menunjukkan kadar kemenangan yang lebih tinggi dan faktor keuntungan yang lebih baik. Ia hanya mengambil banyak perdagangan dan keuntungan bersih tidak sebaik.

Logika Strategi

Logik teras strategi ini adalah untuk mengenal pasti trend menggunakan pecah tahap sokongan dan rintangan pada jangka masa yang lebih tinggi, dan mengambil perdagangan ke arah trend.

Khususnya, ia melaksanakan langkah-langkah berikut:

  1. Mengira tahap sokongan dan rintangan pivot pada jangka masa semasa (contohnya 1 jam).

  2. Mengira tahap sokongan dan rintangan pivot pada satu atau lebih jangka masa yang lebih tinggi (contohnya 4 jam dan harian).

  3. Menggambar tahap sokongan dan rintangan ini sebagai garis mendatar pada carta.

  4. Tentukan arah trend berdasarkan sama ada harga memecahkan titik tinggi atau rendah sebelumnya. Menembusi masa lalu yang tinggi menunjukkan trend menaik. Menembusi masa lalu yang rendah menunjukkan trend menurun.

  5. Membolehkan pengguna memilih satu atau lebih trend jangka masa yang lebih tinggi sebagai keadaan penapis. iaitu hanya mempertimbangkan mengambil perdagangan apabila trend jangka masa semasa sejajar dengan trend jangka masa yang lebih tinggi.

  6. Apabila keadaan penapis trend dipenuhi dan harga semasa melanggar tahap utama, masuk panjang atau pendek. Stop loss ditetapkan pada tahap sokongan atau rintangan utama sebelumnya.

  7. Apabila harga bergerak, sesuaikan stop loss ke titik rendah baru untuk mengunci keuntungan dan mengikuti trend.

  8. Keluar apabila stop loss dicetuskan atau tahap sokongan/perlawanan utama dilanggar.

Dengan menganalisis trend di pelbagai jangka masa, strategi ini hanya berusaha untuk berdagang ke arah trend yang lebih kuat untuk meningkatkan kadar kemenangan. Sementara itu, tahap utama memberikan isyarat kemasukan dan berhenti kerugian yang jelas.

Kelebihan Strategi

  • Menggunakan pelbagai jangka masa untuk menilai trend dapat mengenal pasti arah trend yang lebih kuat dengan lebih tepat, mengelakkan bunyi bising.

  • Hanya perdagangan dengan trend utama yang meningkatkan kadar kemenangan dengan ketara. Berbanding dengan penapis purata bergerak yang mudah, strategi ini menunjukkan kadar kemenangan dan nisbah risiko-ganjaran yang lebih tinggi.

  • Tahap sokongan dan rintangan memberikan tahap masuk dan stop loss yang jelas.

  • Menyesuaikan berhenti mengikut trend untuk memaksimumkan kunci keuntungan.

  • Logik strategi yang mudah dan jelas, mudah difahami dan dioptimumkan.

Risiko Strategi

  • Bergantung pada trend jangka panjang, cenderung untuk terperangkap pada pembalikan trend.

  • Tidak mengambil kira kesan asas, mungkin menyimpang dari harga pada peristiwa utama.

  • Tiada kawalan saiz kedudukan ditetapkan. Harus mengoptimumkan saiz mengikut saiz akaun, turun naik dan lain-lain

  • Tempoh backtest yang terhad. Harus meluaskan ujian di pelbagai persekitaran pasaran.

  • Tiada pertimbangan kos perdagangan. Harus menyesuaikan parameter berdasarkan kos sebenar.

  • Hanya mempertimbangkan perdagangan jangka panjang. Boleh membangunkan isyarat untuk perdagangan jangka pendek untuk melaksanakan strategi pelbagai jangka masa.

Arahan pengoptimuman

  • Tambah keadaan penapis:

    • Asas seperti pendapatan, peristiwa berita

    • Penunjuk seperti jumlah, ATR berhenti

  • Mengoptimumkan parameter:

    • Tempoh untuk pengiraan sokongan / rintangan

    • Jangka masa untuk penentuan trend

  • Memperluas skop strategi:

    • Membangunkan strategi perdagangan jangka pendek

    • Pertimbangkan peluang pendek

    • Perbezaan antara pasaran

  • Meningkatkan pengurusan risiko:

    • Mengoptimumkan saiz kedudukan mengikut turun naik dan saiz

    • Meningkatkan strategi stop loss seperti bergerak / braket berhenti

    • Memperkenalkan metrik yang disesuaikan dengan risiko

  • Meningkatkan logik pelaksanaan:

    • Pilihan masa kemasukan

    • Entri saiz separa

    • Pengoptimuman pergerakan Stop Loss

Kesimpulan

Strategi ini direka sistem breakout yang agak kukuh dengan menganalisis trend merentasi pelbagai kerangka masa. Berbanding dengan penapis mudah seperti purata bergerak, ia menunjukkan kadar kemenangan dan nisbah risiko-balasan yang lebih tinggi. Tetapi terdapat beberapa bidang yang boleh diperbaiki, seperti kekurangan mekanisme pengurusan risiko yang kukuh dan pertimbangan asas. Dengan pengoptimuman lanjut, ia boleh menjadi strategi trend yang sangat praktikal. Secara keseluruhan, reka bentuk strategi adalah baik, meningkatkan ketepatan melalui analisis pelbagai kerangka masa, dan bernilai penyelidikan dan penerapan lanjut.


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