Strategi Dagangan Crypto Bullish/Bearish berasaskan korelasi Berdasarkan Indeks Wall Street CCI

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

img

Ringkasan

Ini adalah strategi dagangan automatik yang menghasilkan isyarat panjang/pendek/dekat pada mata wang kripto sasaran berdasarkan trend yang dikira mata wang kripto penanda aras yang dianggap berkorelasi dengannya, menggunakan Indeks Wall Street Chasing Ring.

Dengan parameter lalai dan ETH / USDT sebagai simbol asas, strategi menunjukkan hasil backtest yang baik pada simbol seperti DENT / USDT, BTT / USDT, FTT / USDT, DOT / USDT dll. Ini masuk akal kerana ETH agak berpengaruh di pasaran crypto sehingga banyak crypto cenderung mengikuti pergerakan utama ETH.

Nota: Strategi dengan parameter lalai bertujuan untuk jangka masa 4h. Pada jangka masa lain, cuba panjang sokongan yang berbeza.

Bagaimana Strategi Berfungsi

  1. WMA dikira pada simbol asas, dengan panjang 200 secara lalai.

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

  3. TakeProfit untuk Long/Short dan StopLoss untuk Long/Short adalah peratusan yang dikira sehingga 0.05 = 5% dan sebagainya. Juga, TakeProfit/StopLoss dikira pada simbol asas bukan simbol carta.

  4. Strategi ini menggunakan pesanan pasaran untuk masuk dan keluar berdasarkan logik berikut:

    • Apabila WMA meningkat dan tiada kedudukan, masuk panjang

    • Apabila WMA jatuh dan tiada kedudukan, entri pendek

    • Apabila keuntungan kedudukan panjang >= TakeProfitPeratusan panjang, tutup panjang

    • Apabila keuntungan kedudukan pendek >= TakeProfitPeratusan pendek, tutup pendek

    • Apabila kerugian kedudukan panjang >= StopLossPeratusan panjang, tutup panjang

    • Apabila kerugian kedudukan pendek >= StopLossShort peratus, tutup pendek

  5. Harga TakeProfit dan StopLoss dikemas kini dalam masa nyata berdasarkan perubahan harga simbol asas.

Analisis Kelebihan

  1. Strategi ini sangat dapat disesuaikan untuk digunakan pada pelbagai mata wang kripto dengan menyesuaikan parameter.

  2. Menggunakan CCI Wall Street untuk menentukan trend mengelakkan perdagangan yang salah yang diketuai oleh bunyi bising.

  3. Menggabungkan TakeProfit dan StopLoss membolehkan trend mengikuti sambil mengawal kerugian setiap perdagangan.

  4. Perdagangan automatik sepenuhnya tanpa campur tangan manual membolehkan 24/7 runtime.

Analisis Risiko

  1. Risiko harga crypto sasaran dipisahkan dari crypto asas, yang membawa kepada kegagalan strategi. Dapat mengoptimumkan dengan menggunakan beberapa crypto asas dan memilih yang paling tinggi.

  2. Risiko turun naik tiba-tiba menghentikan kedudukan. boleh menyesuaikan StopLoss peratus atau menggunakan penangguhan.

  3. Risiko TakeProfit peratusan terlalu kecil untuk menangkap keuntungan trend yang mencukupi.

  4. Risiko pecah palsu yang membawa kepada stop loss keluar. boleh menyesuaikan parameter CCI atau menambah logik masuk semula.

Arahan pengoptimuman

  1. Menggunakan analisis korelasi di pelbagai kripto asas dan menggabungkan penunjuk untuk mengurangkan risiko kripto asas tunggal.

  2. Tambah pengesanan trend untuk menyesuaikan TakeProfit / StopLoss secara dinamik berdasarkan turun naik.

  3. Tambah berhenti bertahap untuk mengelakkan pergerakan melampau berhenti kedudukan.

  4. Tambah logik masuk semula untuk mengelakkan kehilangan trend lanjut selepas keluar stop loss.

  5. Mengoptimumkan parameter dan tetapan CCI untuk meningkatkan keberkesanan isyarat.

  6. Mengoptimumkan parameter secara berasingan untuk setiap crypto sasaran untuk meningkatkan daya adaptasi.

  7. Mengoptimumkan saiz kedudukan berdasarkan saiz akaun.

Ringkasan

Secara keseluruhan, ini adalah strategi trend berikut. Idea utama adalah untuk menentukan arah trend crypto penanda aras menggunakan Wall Street CCI dan berdagang crypto sasaran dengan sewajarnya. Strategi ini mempunyai beberapa kelebihan tetapi juga risiko untuk diperhatikan. Peningkatan lanjut dalam penyesuaian, penjejakan trend, kawalan risiko dan lain-lain dapat meningkatkan kestabilan dan keuntungan.


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