Strategi perdagangan kripto bullish/bearish berbasis korelasi berdasarkan indeks Wall Street CCI

Penulis:ChaoZhang, Tanggal: 2023-11-01 11:27:20
Tag:

img

Gambaran umum

Ini adalah strategi perdagangan otomatis yang menghasilkan sinyal panjang/pendek/pendek pada mata uang kripto target berdasarkan tren yang dihitung dari mata uang kripto acuan yang dianggap berkorelasi dengannya, menggunakan Indeks Wall Street Chasing Ring.

Dengan parameter default dan ETH/USDT sebagai simbol dasar, strategi menunjukkan hasil backtest yang baik pada simbol seperti DENT/USDT, BTT/USDT, FTT/USDT, DOT/USDT dll. Ini masuk akal karena ETH cukup berpengaruh di pasar crypto sehingga banyak crypto cenderung mengikuti pergerakan utama ETH.

Catatan: Strategi dengan parameter default dimaksudkan untuk jangka waktu 4 jam. Pada jangka waktu lain, coba panjang dukungan yang berbeda.

Cara Kerja Strategi

  1. WMA dihitung pada simbol dasar, dengan panjang 200 secara default.

  2. Ketika WMA naik, pergi panjang. Ketika jatuh pergi pendek.

  3. TakeProfit untuk Long/Short dan StopLoss untuk Long/Short adalah persentase yang dihitung sehingga 0,05 = 5% dll. Juga, TakeProfit/StopLoss dihitung pada simbol dasar bukan simbol grafik.

  4. Strategi ini menggunakan pesanan pasar untuk masuk dan keluar berdasarkan logika berikut:

    • Ketika WMA naik dan tidak ada posisi, entri panjang

    • Ketika WMA jatuh dan tidak ada posisi, entri pendek

    • Jika keuntungan posisi panjang >= TakeProfitLong persentase, tutup panjang

    • Jika keuntungan posisi pendek >= TakeProfitShort persentase, tutup pendek

    • Jika posisi panjang kehilangan >= StopLossLong persen, tutup panjang

    • Jika kerugian posisi pendek >= StopLossShort persentase, menutup posisi pendek

  5. Harga TakeProfit dan StopLoss diperbarui secara real time berdasarkan perubahan harga simbol dasar.

Analisis Keuntungan

  1. Strategi ini sangat dapat disesuaikan untuk digunakan pada beberapa mata uang kripto dengan menyesuaikan parameter.

  2. Menggunakan CCI Wall Street untuk menentukan tren menghindari perdagangan yang salah yang dipimpin oleh kebisingan.

  3. Menggabungkan TakeProfit dan StopLoss memungkinkan tren mengikuti sementara mengendalikan kerugian per perdagangan.

  4. Perdagangan sepenuhnya otomatis tanpa intervensi manual memungkinkan waktu berjalan 24/7.

Analisis Risiko

  1. Risiko harga crypto target terputus dari crypto dasar, yang mengarah pada kegagalan strategi. Dapat mengoptimalkan dengan menggunakan beberapa cryptos dasar dan memilih yang paling berkorelasi.

  2. Risiko volatilitas tiba-tiba menghentikan posisi. Dapat menyesuaikan StopLoss persen atau menggunakan trailing stop.

  3. Risiko TakeProfit persentase terlalu kecil untuk menangkap keuntungan tren yang cukup.

  4. Bisa menyesuaikan parameter CCI atau menambahkan logika re-entry.

Arahan Optimasi

  1. Menggunakan analisis korelasi di beberapa basis crypto dan menggabungkan indikator untuk mengurangi risiko crypto basis tunggal.

  2. Tambahkan pelacakan tren untuk menyesuaikan TakeProfit / StopLoss secara dinamis berdasarkan volatilitas.

  3. Tambahkan berhenti bertahap untuk mencegah gerakan ekstrem menghentikan posisi.

  4. Tambahkan logika re-entry untuk menghindari kehilangan tren lebih lanjut setelah stop loss exit.

  5. Mengoptimalkan parameter dan pengaturan CCI untuk meningkatkan efektivitas sinyal.

  6. Mengoptimalkan parameter secara terpisah untuk setiap target crypto untuk meningkatkan kemampuan beradaptasi.

  7. Mengoptimalkan ukuran posisi berdasarkan ukuran akun.

Ringkasan

Secara keseluruhan, ini adalah strategi trend berikut yang khas. Ide inti adalah untuk menentukan arah tren crypto benchmark menggunakan Wall Street CCI dan memperdagangkan crypto target sesuai dengan itu. Strategi ini memiliki beberapa keuntungan tetapi juga risiko untuk dicatat. Peningkatan lebih lanjut dalam penyetelan, pelacakan tren, pengendalian risiko dll dapat meningkatkan stabilitas dan profitabilitas.


/*backtest
start: 2022-10-25 00:00:00
end: 2023-10-31 00:00:00
period: 1d
basePeriod: 1h
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/
// © levieux

//@version=5
strategy(title='Correlation Strategy', shorttitle='Correlation Strategy', initial_capital=1000, overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)

supportLength = input.int(200, minval=1, title='Support Length')
supportSymbol = input('BTC_USDT:swap', title='Correlated Symbol')
supportSource = input(hlc3, title='Price Source')
takeprofitLong = input.float(0.2, 'Take Profit Long', step=0.01)
takeprofitShort = input.float(0.15, 'Take Profit Short', step=0.01)
stoplossLong = input.float(0.1, 'Stop Loss Long', step=0.01)
stoplossShort = input.float(0.04, 'Stop Loss Short', step=0.01)
start = input(defval = timestamp("01 Jan 2016 00:00 +0000"), title = "Start Time")
end = input(defval = timestamp("31 Dec 2050 23:59 +0000"), title = "End Time")

supportTicker = request.security(supportSymbol, timeframe.period, supportSource, lookahead=barmerge.lookahead_off)  //input(close, title="Source")
supportLine = ta.wma(supportTicker, supportLength)

window() => true

if not window()
    strategy.cancel_all()

supportLongPrice = close
supportShortPrice = close

if strategy.position_size > 0
    supportLongPrice := supportLongPrice[1]
if strategy.position_size < 0
    supportShortPrice := supportShortPrice[1]

longCondition = ta.rising(supportLine, 5) and window() and strategy.position_size <= 0
shortCondition = ta.falling(supportLine, 5) and window() and window() and strategy.position_size > 0
takeprofitLongCondition = takeprofitLong > 0 and window() and strategy.position_size > 0 and supportTicker > supportLongPrice * (1 + takeprofitLong)
stoplossLongCondition = stoplossLong > 0 and window() and strategy.position_size > 0 and supportTicker < supportLongPrice * (1 - stoplossLong)
takeprofitShortCondition = takeprofitShort > 0 and window() and strategy.position_size < 0 and supportTicker > supportShortPrice * (1 + takeprofitShort)
stoplossShortCondition = stoplossShort > 0 and window() and strategy.position_size < 0 and supportTicker < supportShortPrice * (1 - stoplossShort)

if longCondition
    strategy.entry('Long', strategy.long)
    supportLongPrice := supportTicker

if shortCondition
    strategy.entry('Short', strategy.short)
    supportShortPrice := supportTicker

if takeprofitLongCondition
    strategy.close('Long')
if stoplossLongCondition
    strategy.close('Long')
if takeprofitShortCondition
    strategy.close('Short')
if stoplossShortCondition
    strategy.close('Short')

///////////////////
// MONTHLY TABLE //

new_month = month(time) != month(time[1])
new_year  = year(time)  != year(time[1])

eq = strategy.equity

bar_pnl = eq / eq[1] - 1
bar_bh = (close-close[1])/close[1]

cur_month_pnl = 0.0
cur_year_pnl  = 0.0
cur_month_bh = 0.0
cur_year_bh  = 0.0

// Current Monthly P&L
cur_month_pnl := new_month ? 0.0 : 
                 (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1 
cur_month_bh := new_month ? 0.0 : 
                 (1 + cur_month_bh[1]) * (1 + bar_bh) - 1

// Current Yearly P&L
cur_year_pnl := new_year ? 0.0 : 
                 (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1
cur_year_bh := new_year ? 0.0 : 
                 (1 + cur_year_bh[1]) * (1 + bar_bh) - 1

// Arrays to store Yearly and Monthly P&Ls
var month_pnl  = array.new_float(0)
var month_time = array.new_int(0)
var month_bh  = array.new_float(0)

var year_pnl  = array.new_float(0)
var year_time = array.new_int(0)
var year_bh  = array.new_float(0)

end_time = false

end_time:= time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory

if (not na(cur_month_pnl[1]) and (new_month or end_time))
    if (end_time[1])
        array.pop(month_pnl)
        array.pop(month_time)
        
    array.push(month_pnl , cur_month_pnl[1])
    array.push(month_time, time[1])
    array.push(month_bh , cur_month_bh[1])

if (not na(cur_year_pnl[1]) and (new_year or end_time))
    if (end_time[1])
        array.pop(year_pnl)
        array.pop(year_time)
        
    array.push(year_pnl , cur_year_pnl[1])
    array.push(year_time, time[1])
    array.push(year_bh , cur_year_bh[1])

// Monthly P&L Table    
var monthly_table = table(na)

getCellColor(pnl, bh)  => 
    if pnl > 0
        if bh < 0 or pnl > 2 * bh
            color.new(color.green, transp = 20)
        else if pnl > bh
            color.new(color.green, transp = 50)
        else
            color.new(color.green, transp = 80)
    else
        if bh > 0 or pnl < 2 * bh
            color.new(color.red, transp = 20)
        else if pnl < bh
            color.new(color.red, transp = 50)
        else
            color.new(color.red, transp = 80)

if end_time
    monthly_table := table.new(position.bottom_right, 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 = getCellColor(array.get(year_pnl, yi), array.get(year_bh, yi))
        table.cell(monthly_table, 13, yi + 1, str.tostring(math.round(array.get(year_pnl, yi) * 100)) + " (" + str.tostring(math.round(array.get(year_bh, yi) * 100)) + ")", bgcolor = y_color)
        
    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 = getCellColor(array.get(month_pnl, mi), array.get(month_bh, mi))
        
        table.cell(monthly_table, m_col, m_row, str.tostring(math.round(array.get(month_pnl, mi) * 100)) + " (" + str.tostring(math.round(array.get(month_bh, mi) * 100)) +")", bgcolor = m_color)

Lebih banyak