
La estrategia se basa en el indicador de la esfera de la rata de Wall Street, que compara la tendencia bajista del mercado de criptomonedas de referencia, y permite una estrategia de negociación automática para realizar operaciones de beca a la baja sobre la criptomoneda objetivo. La estrategia puede establecer parámetros de indicadores de soporte de diferentes criptomonedas para permitir el seguimiento de operaciones en varias criptomonedas.
Calcula el promedio del indicador Wall Street Ratcatcher Sphere para las criptomonedas de referencia, con una longitud de promedio de 200 ciclos.
Determina el estado de caída de la línea media: la estrategia toma una operación de beca cuando la línea media sube; la estrategia toma una operación de beca cuando la línea media baja.
Estrategias para abrir y cerrar posiciones automáticamente según el estado de la línea media y el estado de las posiciones actuales:
El precio de mercado estratégico se abre automáticamente cuando la línea promedio es alta y no hay posición en ese momento.
Cuando la media baja y no hay posición en ese momento, el precio de mercado de la estrategia abre posiciones automáticamente a la baja.
El precio de mercado de la estrategia se estabiliza automáticamente cuando se obtiene el porcentaje de stop-loss establecido para las ganancias de las operaciones múltiples.
El precio de mercado estratégico automáticamente se aplana cuando el beneficio de la posición en descubierto alcanza la proporción de parada establecida;
El precio de mercado de la estrategia se aplana automáticamente cuando la pérdida de la posición de más alcanza el porcentaje de pérdida establecido;
Cuando la pérdida de la posición en descubierto alcanza el porcentaje de pérdidas fijado, el precio de mercado de la estrategia automáticamente aplana la posición en descubierto.
La estrategia es actualizar el precio de parada y pérdida en tiempo real según los cambios en el mercado de criptomonedas de referencia.
La estrategia tiene una gran adaptabilidad y puede configurar diferentes parámetros para diferentes criptomonedas, permitiendo el seguimiento de transacciones en varias criptomonedas.
El uso del índice Wall Street Mouse Ring para determinar la tendencia del mercado evita las transacciones erróneas causadas por el ruido. El indicador tiene un cierto atraso en la subida y bajada de la brecha, lo que reduce los daños causados por la falsa brecha.
La estrategia incluye un mecanismo de stop-loss, que permite seguir la tendencia y controlar las pérdidas individuales.
Las estrategias son totalmente automatizadas, no requieren intervención humana y funcionan las 24 horas.
Existe la posibilidad de que ciertos precios de criptomonedas se desvinculen de las criptomonedas de referencia, lo que lleva al riesgo de que la estrategia no pueda operar correctamente. Se puede optimizar el cálculo de los coeficientes de correlación utilizando varias criptomonedas de referencia y seleccionar la criptomoneda de referencia con la mayor correlación.
Existe el riesgo de que los paros sean superados debido a las fluctuaciones anormales en el mercado. Se puede ajustar la proporción de paros o agregar un seguimiento de paros.
Existe el riesgo de que la configuración del Stop Ratio sea demasiado pequeña para que no pueda capturar suficientes ganancias de la tendencia. Se puede agregar un seguimiento de tendencia o un Stop Dinámico.
Existe el riesgo de una falsa ruptura que conduzca a una pérdida de posición en equilibrio. Se pueden ajustar los parámetros del indicador, los ajustes de identificación o agregar un mecanismo de reingreso.
Utilice el análisis de correlación para seleccionar varias criptomonedas de referencia, combinar los indicadores para calcular y reducir el riesgo de una sola moneda de referencia.
Aumentar el mecanismo de seguimiento de tendencias y ajustar el stop loss en función de la fluctuación de las tasas.
Aumentar el nivel de pérdidas para evitar que se rompan las pérdidas de los eventos extremos.
Aumentar el mecanismo de reingreso para evitar la pérdida de seguimiento.
Optimización de los parámetros de los indicadores, configuraciones de identificación y mejora de la eficacia de los indicadores.
Optimización de los parámetros para las diferentes criptomonedas, mejorando la adaptabilidad de las estrategias.
Optimización de la gestión de posiciones y ajuste dinámico de las posiciones en función del tamaño de los fondos.
La estrategia en su conjunto es una estrategia típica de seguimiento de tendencias. La idea central es juzgar la dirección de la tendencia de la criptomoneda de referencia en función del indicador de la esfera de la caza de ratones de Wall Street para determinar la dirección de la criptomoneda objetivo. La estrategia tiene ciertas ventajas, pero también hay algunos riesgos a tener en cuenta.
/*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)