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.
WMA dikira pada simbol asas, dengan panjang 200 secara lalai.
Apabila WMA naik, pergi panjang. Apabila jatuh pergi pendek.
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.
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
Harga TakeProfit dan StopLoss dikemas kini dalam masa nyata berdasarkan perubahan harga simbol asas.
Strategi ini sangat dapat disesuaikan untuk digunakan pada pelbagai mata wang kripto dengan menyesuaikan parameter.
Menggunakan CCI Wall Street untuk menentukan trend mengelakkan perdagangan yang salah yang diketuai oleh bunyi bising.
Menggabungkan TakeProfit dan StopLoss membolehkan trend mengikuti sambil mengawal kerugian setiap perdagangan.
Perdagangan automatik sepenuhnya tanpa campur tangan manual membolehkan 24/7 runtime.
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.
Risiko turun naik tiba-tiba menghentikan kedudukan. boleh menyesuaikan StopLoss peratus atau menggunakan penangguhan.
Risiko TakeProfit peratusan terlalu kecil untuk menangkap keuntungan trend yang mencukupi.
Risiko pecah palsu yang membawa kepada stop loss keluar. boleh menyesuaikan parameter CCI atau menambah logik masuk semula.
Menggunakan analisis korelasi di pelbagai kripto asas dan menggabungkan penunjuk untuk mengurangkan risiko kripto asas tunggal.
Tambah pengesanan trend untuk menyesuaikan TakeProfit / StopLoss secara dinamik berdasarkan turun naik.
Tambah berhenti bertahap untuk mengelakkan pergerakan melampau berhenti kedudukan.
Tambah logik masuk semula untuk mengelakkan kehilangan trend lanjut selepas keluar stop loss.
Mengoptimumkan parameter dan tetapan CCI untuk meningkatkan keberkesanan isyarat.
Mengoptimumkan parameter secara berasingan untuk setiap crypto sasaran untuk meningkatkan daya adaptasi.
Mengoptimumkan saiz kedudukan berdasarkan saiz akaun.
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)