Rotasi Momentum Melalui Tempoh Trend Mengikuti Strategi

Penulis:ChaoZhang, Tarikh: 2023-11-17 17:32:11
Tag:

img

Ringkasan

Strategi ini menggunakan gabungan purata bergerak dalam bingkai masa, mengenal pasti pergantian trend pada carta jam pertengahan dan besar, dan mencapai pengesanan perdagangan trend yang rendah risiko. Strategi ini mempunyai kelebihan yang fleksibel, mudah, cekap dana yang tinggi, sesuai untuk pedagang yang memegang jangka panjang dan sederhana untuk mengikuti trend.

Pengertian Asli

Strategi ini menggunakan tiga purata bergerak 5, 20, dan 40 hari untuk menentukan kombinasi susunan trend di bawah bingkai masa yang berbeza. Mengikut prinsip konsistensi trend carta jam besar, menentukan tempoh berbilang ruang kosong.

Khususnya, laluan 20 hari di garis laju 5 hari dianggap sebagai isyarat kenaikan garis pendek dan laluan 40 hari di garis perlahan 20 hari dianggap sebagai isyarat kenaikan garis tengah. Apabila laluan 3 hari adalah betul (hari 5 > 20 > 40 hari), ia dianggap sebagai kitaran berbilang kepala; apabila laluan 3 hari adalah berbalik (hari 5 < 20 < 40 hari), ia dianggap sebagai kitaran kosong.

Dengan cara ini, berdasarkan arah trend kitaran besar, kemudian dikombinasikan dengan kekuatan kitaran kecil untuk mengesan kemasukan tertentu; iaitu, hanya apabila trend besar adalah serentak dan kitaran kecil kuat, perdagangan dibuka, yang dapat menapis secara berkesan terbalik palsu terobosan, untuk mencapai operasi kadar kemenangan yang tinggi.

Di samping itu, strategi ini juga menggunakan ATR stop loss untuk mengawal risiko wang tunggal dan meningkatkan keuntungan lebih lanjut.

Analisis Kelebihan

  • Konfigurasi fleksibel, pengguna boleh menyesuaikan sendiri parameter purata bergerak untuk menyesuaikan diri dengan jenis dan keutamaan dagangan yang berbeza

  • Perisian ini mudah digunakan dan mudah digunakan oleh pengguna baru.

  • Penggunaan modal yang cekap dan menggunakan kuasa kuasa sepenuhnya

  • Pengendalian risiko, mekanisme menghentikan kerugian yang berkesan untuk mengelakkan kerugian besar

  • Kemampuan untuk mengikuti trend yang kuat, keuntungan berterusan selepas kitaran besar menentukan arah

  • Kadar kemenangan yang lebih tinggi, kualiti isyarat dagangan yang lebih baik, dan kesalahan laluan yang lebih sedikit

Risiko dan Penambahbaikan

  • Penghakiman kitaran besar bergantung pada susunan garis rata perpindahan, terdapat risiko kesalahan penghakiman lewat

  • Pengesanan intensiti kitaran kecil hanya dengan satu garis K, mungkin dipicu lebih awal, boleh santai dengan betul

  • Penghentian yang tetap dan boleh dioptimumkan untuk penghentian dinamik

  • Syarat penapisan tambahan seperti tenaga jumlah dagangan boleh dipertimbangkan

  • Cuba kombinasi parameter purata bergerak yang berbeza untuk mengoptimumkan strategi

Ringkasan

Strategi ini mengintegrasikan analisis pelbagai bingkai masa dan pengurusan stop loss, yang mencapai perdagangan trend tracking yang rendah risiko. Dengan menyesuaikan parameter, ia boleh digunakan untuk pelbagai jenis untuk memenuhi keperluan pengikut trend. Ia memberikan keputusan perdagangan yang lebih kukuh dan isyarat yang lebih cekap berbanding dengan sistem bingkai masa tunggal tradisional. Secara keseluruhan, strategi ini mempunyai kesesuaian pasaran dan prospek pertumbuhan yang baik.

Ringkasan

Strategi ini menggunakan gabungan purata bergerak merentasi bingkai masa untuk mengenal pasti putaran trend pada carta jam, harian dan mingguan. Ia membolehkan trend berisiko rendah selepas perdagangan. Strategi ini fleksibel, mudah dilaksanakan, cekap modal dan sesuai untuk peniaga trend jangka menengah dan panjang.

Logik Perdagangan

Strategi ini menggunakan purata bergerak 5, 20 dan 40 hari untuk menentukan keselarasan trend dalam jangka masa yang berbeza. Berdasarkan konsistensi antara jangka masa yang lebih besar dan lebih kecil, ia mengenal pasti kitaran menaik dan menurun.

Secara khusus, melintasi MA cepat 5 hari di atas MA sederhana 20 hari menunjukkan trend menaik dalam jangka pendek. Melintasi MA sederhana 20 hari di atas MA perlahan 40 hari menandakan trend menaik dalam jangka sederhana. Apabila MA cepat, sederhana dan perlahan sejajar positif (5 hari > 20 hari > 40 hari), ia adalah kitaran lembu. Apabila mereka sejajar negatif (5 hari < 20 hari < 40 hari), ia adalah kitaran beruang.

Dengan menentukan arah dari kitaran yang lebih besar dan mengesahkan kekuatan pada kitaran yang lebih kecil, strategi ini membuka kedudukan hanya apabila trend utama dan momentum kecil sejajar.

Strategi ini juga menggunakan hentian trailing ATR untuk mengawal risiko perdagangan tunggal dan meningkatkan keuntungan.

Kelebihan

  • Konfigurasi fleksibel untuk menyesuaikan instrumen dan gaya dagangan yang berbeza

  • Mudah dilaksanakan walaupun untuk peniaga pemula

  • Kecekapan modal yang tinggi untuk memaksimumkan leverage

  • Kawalan risiko yang berkesan untuk mengelakkan kerugian besar

  • Trend yang kuat mengikuti keupayaan untuk keuntungan yang berterusan

  • Kadar kemenangan yang tinggi disebabkan oleh isyarat yang kuat dan kurang whipsaws

Risiko dan Penambahbaikan

  • Persalinan MA mungkin terlambat dan menyebabkan pengesanan trend lewat

  • Pengesanan kekuatan lilin tunggal boleh mencetuskan kemasukan awal, keadaan santai

  • Tetap kehilangan hentian ATR, mengoptimumkan hentian dinamik

  • Pertimbangkan untuk menambah penapis tambahan seperti jumlah

  • meneroka parameter MA yang berbeza untuk pengoptimuman

Kesimpulan

Strategi ini mengintegrasikan pelbagai analisis jangka masa dan pengurusan risiko untuk trend berisiko rendah selepas perdagangan. Dengan menyesuaikan parameter, ia boleh disesuaikan dengan instrumen yang berbeza untuk memenuhi peniaga trend. Berbanding dengan sistem jangka masa tunggal, ia membuat keputusan perdagangan yang lebih kukuh dan menghasilkan isyarat kecekapan yang lebih tinggi. Kesimpulannya, strategi ini mempunyai daya adaptasi pasaran yang baik dan potensi pembangunan.


/*backtest
start: 2023-10-17 00:00:00
end: 2023-11-16 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © kgynofomo

//@version=5
strategy(title="[Salavi] | Andy Advance Pro Strategy [BTC|M15]",overlay = true, pyramiding = 1,initial_capital = 10000, default_qty_type = strategy.cash,default_qty_value = 10000)

ema_short = ta.ema(close,5)
ema_middle = ta.ema(close,20)
ema_long = ta.ema(close,40)

cycle_1 = ema_short>ema_middle and ema_middle>ema_long
cycle_2 = ema_middle>ema_short and ema_short>ema_long
cycle_3 = ema_middle>ema_long and ema_long>ema_short
cycle_4 = ema_long>ema_middle and ema_middle>ema_short
cycle_5 = ema_long>ema_short and ema_short>ema_middle
cycle_6 = ema_short>ema_long and ema_long>ema_middle

bull_cycle = cycle_1 or cycle_2 or cycle_3
bear_cycle = cycle_4 or cycle_5 or cycle_6
// label.new("cycle_1")
// bgcolor(color=cycle_1?color.rgb(82, 255, 148, 60):na)
// bgcolor(color=cycle_2?color.rgb(82, 255, 148, 70):na)
// bgcolor(color=cycle_3?color.rgb(82, 255, 148, 80):na)
// bgcolor(color=cycle_4?color.rgb(255, 82, 82, 80):na)
// bgcolor(color=cycle_5?color.rgb(255, 82, 82, 70):na)
// bgcolor(color=cycle_6?color.rgb(255, 82, 82, 60):na)

// Inputs
a = input(2, title='Key Vaule. \'This changes the sensitivity\'')
c = input(7, title='ATR Period')
h = false

xATR = ta.atr(c)
nLoss = a * xATR

src = h ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close, lookahead=barmerge.lookahead_off) : close

xATRTrailingStop = 0.0
iff_1 = src > nz(xATRTrailingStop[1], 0) ? src - nLoss : src + nLoss
iff_2 = src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), src + nLoss) : iff_1
xATRTrailingStop := src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), src - nLoss) : iff_2

pos = 0
iff_3 = src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0)
pos := src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0) ? 1 : iff_3

xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue

ema = ta.ema(src, 1)
above = ta.crossover(ema, xATRTrailingStop)
below = ta.crossover(xATRTrailingStop, ema)

buy = src > xATRTrailingStop and above
sell = src < xATRTrailingStop and below

barbuy = src > xATRTrailingStop
barsell = src < xATRTrailingStop




atr = ta.atr(14)
atr_length = input.int(25)
atr_rsi = ta.rsi(atr,atr_length)
atr_valid = atr_rsi>50

long_condition =  buy and bull_cycle and atr_valid
short_condition =  sell and bear_cycle and atr_valid

Exit_long_condition = short_condition
Exit_short_condition = long_condition

if long_condition
    strategy.entry("Andy Buy",strategy.long, limit=close,comment="Andy Buy Here")

if Exit_long_condition
    strategy.close("Andy Buy",comment="Andy Buy Out")
    // strategy.entry("Andy fandan Short",strategy.short, limit=close,comment="Andy 翻單 short Here")
    // strategy.close("Andy fandan Buy",comment="Andy short Out")


if short_condition
    strategy.entry("Andy Short",strategy.short, limit=close,comment="Andy short Here")


// strategy.exit("STR","Long",stop=longstoploss)
if Exit_short_condition
    strategy.close("Andy Short",comment="Andy short Out")
    // strategy.entry("Andy fandan Buy",strategy.long, limit=close,comment="Andy 翻單 Buy Here")
    // strategy.close("Andy fandan Short",comment="Andy Buy Out")




inLongTrade = strategy.position_size > 0
inLongTradecolor = #58D68D
notInTrade = strategy.position_size == 0
inShortTrade = strategy.position_size < 0

// bgcolor(color = inLongTrade?color.rgb(76, 175, 79, 70):inShortTrade?color.rgb(255, 82, 82, 70):na)
plotshape(close!=0,location = location.bottom,color = inLongTrade?color.rgb(76, 175, 79, 70):inShortTrade?color.rgb(255, 82, 82, 70):na)


plotshape(long_condition, title='Buy', text='Andy Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(short_condition, title='Sell', text='Andy Sell', style=shape.labeldown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)


//atr > close *0.01* parameter

// MONTHLY TABLE PERFORMANCE - Developed by @QuantNomad
// *************************************************************************************************************************************************************************************************************************************************************************
show_performance = input.bool(true, 'Show Monthly Performance ?', group='Performance - credits: @QuantNomad')
prec = input(2, 'Return Precision', group='Performance - credits: @QuantNomad')

if show_performance
    new_month = month(time) != month(time[1])
    new_year  = year(time)  != year(time[1])
    
    eq = strategy.equity
    
    bar_pnl = eq / eq[1] - 1
    
    cur_month_pnl = 0.0
    cur_year_pnl  = 0.0
    
    // Current Monthly P&L
    cur_month_pnl := new_month ? 0.0 : 
                     (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1 
    
    // Current Yearly P&L
    cur_year_pnl := new_year ? 0.0 : 
                     (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1  
    
    // Arrays to store Yearly and Monthly P&Ls
    var month_pnl  = array.new_float(0)
    var month_time = array.new_int(0)
    
    var year_pnl  = array.new_float(0)
    var year_time = array.new_int(0)
    
    last_computed = false
    
    if (not na(cur_month_pnl[1]) and (new_month 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])
    
    if (not na(cur_year_pnl[1]) and (new_year 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])
    
    last_computed := barstate.islastconfirmedhistory ? true : nz(last_computed[1])
    
    // Monthly P&L Table    
    var monthly_table = table(na)
    
    if (barstate.islastconfirmedhistory)
        monthly_table := table.new(position.bottom_center, 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, str.tostring(year(array.get(year_time, yi))), bgcolor = #cccccc)
            
            y_color = array.get(year_pnl, yi) > 0 ? color.new(color.teal, transp = 40) : color.new(color.gray, transp = 40)
            table.cell(monthly_table, 13, yi + 1, str.tostring(math.round(array.get(year_pnl, yi) * 100, prec)), bgcolor = y_color, text_color=color.new(color.white, 0))
            
        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 = array.get(month_pnl, mi) > 0 ? color.new(color.teal, transp = 40) : color.new(color.gray, transp = 40)
            
            table.cell(monthly_table, m_col, m_row, str.tostring(math.round(array.get(month_pnl, mi) * 100, prec)), bgcolor = m_color, text_color=color.new(color.white, 0))



Lebih lanjut