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.
WMA dihitung pada simbol dasar, dengan panjang 200 secara default.
Ketika WMA naik, pergi panjang. Ketika jatuh pergi pendek.
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.
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
Harga TakeProfit dan StopLoss diperbarui secara real time berdasarkan perubahan harga simbol dasar.
Strategi ini sangat dapat disesuaikan untuk digunakan pada beberapa mata uang kripto dengan menyesuaikan parameter.
Menggunakan CCI Wall Street untuk menentukan tren menghindari perdagangan yang salah yang dipimpin oleh kebisingan.
Menggabungkan TakeProfit dan StopLoss memungkinkan tren mengikuti sementara mengendalikan kerugian per perdagangan.
Perdagangan sepenuhnya otomatis tanpa intervensi manual memungkinkan waktu berjalan 24/7.
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.
Risiko volatilitas tiba-tiba menghentikan posisi. Dapat menyesuaikan StopLoss persen atau menggunakan trailing stop.
Risiko TakeProfit persentase terlalu kecil untuk menangkap keuntungan tren yang cukup.
Bisa menyesuaikan parameter CCI atau menambahkan logika re-entry.
Menggunakan analisis korelasi di beberapa basis crypto dan menggabungkan indikator untuk mengurangi risiko crypto basis tunggal.
Tambahkan pelacakan tren untuk menyesuaikan TakeProfit / StopLoss secara dinamis berdasarkan volatilitas.
Tambahkan berhenti bertahap untuk mencegah gerakan ekstrem menghentikan posisi.
Tambahkan logika re-entry untuk menghindari kehilangan tren lebih lanjut setelah stop loss exit.
Mengoptimalkan parameter dan pengaturan CCI untuk meningkatkan efektivitas sinyal.
Mengoptimalkan parameter secara terpisah untuk setiap target crypto untuk meningkatkan kemampuan beradaptasi.
Mengoptimalkan ukuran posisi berdasarkan ukuran akun.
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)