
Se trata de una estrategia de negociación genérica diseñada para el mercado de criptomonedas, cuyo objetivo es buscar mejores momentos de entrada y mantener una línea media larga en el entorno general del mercado de criptomonedas. La estrategia utiliza una combinación de varios indicadores técnicos, como el indicador MFI, el indicador STOCH y el indicador VWMA, para capturar oportunidades potenciales de reversión de tendencias mediante la determinación de desviaciones ocultas.
La estrategia incluye dos tipos de lógica de entrada:
MFI oculta desviación + filtro de STOCH: Cuando las MFI forman un desviación oculta, es decir, los precios son innovadores pero las MFI no son innovadoras, consideramos que es una señal de reversión de tendencia potencial. Pero para evitar falsas señales, agregamos STOCH> 50% como condición de filtro.
Sistema de tendencia STOCH/MFI: Cuando el STOCH> 50% y el MFI cruza la línea 50 de abajo hacia arriba, indica que se está formando una tendencia en el mercado, en este momento la entrada puede obtener un mejor retorno de riesgo.
Para garantizar la precisión de la determinación de la tendencia, también construimos un sistema de tendencia basado en VWMA y SMA. Sólo en VWMA se ejecuta la SMA, es decir, cuando se determina una tendencia al alza, los dos sistemas anteriores emiten una señal de negociación. Además, utilizamos el indicador OBV para determinar si el mercado en general está en un estado activo o en un estado de equilibrio, que también se utiliza para filtrar algunas señales falsas.
El indicador ATR se utiliza para determinar si el mercado está en un estado de agitación, y priorizamos la intervención en el mercado de agitación en busca de desviaciones ocultas de las MFI. El método de parada de pérdidas se refiere al precio de parada de los niveles de soporte recientes. El método de parada de pérdidas se calcula a partir del precio de entrada.
Esta estrategia utiliza una combinación de varios indicadores para determinar la estructura del mercado y evita la mayor parte del ruido. El sistema oculto de retroceso ofrece una entrada de alta probabilidad y un riesgo controlado en las fases de oscilación y ajuste. El sistema de tendencia STOCH/MFI obtiene ganancias adicionales en tendencias claras.
El mayor riesgo de esta estrategia es que el ocultamiento de un desvío de juicio no siempre es confiable, solo refleja que el sentimiento del mercado está cambiando, y no garantiza que los precios se revertirán de inmediato. Además, la configuración inadecuada de STOCH y otros indicadores también puede causar una tendencia perdida o generar falsas señales. Finalmente, la configuración de stop loss si es demasiado radical, puede causar que se detengan y reabran las posiciones con demasiada frecuencia, lo que afecta a la rentabilidad.
Filtramos las señales mediante el aumento adicional de la tendencia y el estado del mercado, y establecemos niveles de tolerancia de stop loss para reducir el riesgo mencionado anteriormente. Por supuesto, si no se detiene a tiempo, es difícil evitar por completo las pérdidas masivas en caso de eventos macroeconómicos importantes.
La estrategia aún tiene margen de mejora y se centra en los siguientes aspectos:
Optimización de la configuración de los parámetros de MFI y STOCH para mejorar la precisión de los juicios ocultos
Aumentar los modelos de aprendizaje automático para evaluar el estado del mercado y analizar los parámetros óptimos
Intentar detener el deterioro dinámico para controlar aún más el riesgo al tiempo que se garantiza la ganancia
Prueba de las diferencias entre las diferentes variedades de criptomonedas y configura parámetros de personalización
Aumentar el módulo de selección de acciones para que la estrategia se centre más en las acciones con mejor forma tecnológica
A través de estas optimizaciones, se puede esperar una mayor estabilidad y rentabilidad de la estrategia.
Esta es una estrategia de comercio de criptomonedas muy práctica. Utiliza correctamente varios indicadores técnicos para determinar la estructura del mercado y obtener mejores ganancias con un riesgo controlado. El principal problema es que los juicios ocultos no siempre son precisos, y lo mitigamos con una serie de filtros.
/*backtest
start: 2023-11-18 00:00:00
end: 2023-12-18 00:00:00
period: 1h
basePeriod: 15m
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/
// © kifier
//@version=4
strategy("Kifier's MFI/STOCH Hidden Divergence/Trend Beater", shorttitle = "Kifier's MFI/STOCH", overlay=false, margin_long=100, margin_short=100, default_qty_type = strategy.percent_of_equity, default_qty_value = 95, max_boxes_count = 500)
//Values
enb_date = input(false ,"Enable Date Range?", type = input.bool, inline = "1")
enb_current = input(true ,"Today as End Date" , type = input.bool, inline = "1")
i_start_date = input(timestamp("01 Jan 2021 00:00 +0300") ,"Start Date" , type=input.time)
i_end_date = input(timestamp("16 July 2021 00:00 +0300") ,"End Date" , type=input.time)
time_check = true
i_vwma_length = input(50, "VWMA Length" ,type = input.integer, group = "Indicator Settings", inline = "2")
i_sma_length = input(50, "SMA Length" ,type = input.integer, group = "Indicator Settings", inline = "2")
i_stoch_length = input(28, "Stoch Length" ,type = input.integer, group = "Indicator Settings", inline = "3")
i_mfi_length = input(7 , "MFI Length" ,type = input.integer, group = "Indicator Settings", inline = "3")
i_obv_length = input(100, "OBV Length" ,type = input.integer, group = "Indicator Settings")
i_atr_len = input(100, "ATR Ranging-trend len" ,type = input.integer, group = "Indicator Settings", tooltip = "This is the length of the ATR Emas that check when the market in a general trend or is just ranging")
i_div_price = input(5 ,"Price Divergant Pivots" ,type = input.integer, group = "Divergance Settings")
i_inacc = input(0.05 ,"Price Inaccuracy" ,type = input.float , group = "Divergance Settings")
i_div_length = input(3 ,"Divergance Valid Period" ,type = input.integer, group = "Divergance Settings")
i_mfi_left = input(5 ,"MFI Left/Right Pivots" ,type = input.integer, group = "Divergance Settings", inline = "4")
i_mfi_right = input(2 ,"" ,type = input.integer, group = "Divergance Settings", inline = "4")
tp_percentage = input(10 , "TP Percentage" ,type = input.float , group = "Exit Settings")/100
_inacc = input(0.03, "Support Inaccuracy" ,type = input.float, step = 0.01, group = "Exit Settings")
enb_stoch_mfi = input(true, "Use Stoch/MFI Trend" , type = input.bool, group = "Individual Entries")
enb_stoch_mfi_div = input(true, "Use Stoch/MFI Divergance ", type = input.bool, group = "Individual Entries")
c_mfi = input(color.yellow ,"MFI/STOCH Colour " , type = input.color, group = "Indicator Colours", inline = "os")
c_stoch = input(color.silver ,"" , type = input.color, group = "Indicator Colours", inline = "os")
c_buy = input(color.green ,"Buy/Sell Colour " , type = input.color, group = "Indicator Colours", inline = "pos")
c_sell = input(color.red ,"" , type = input.color, group = "Indicator Colours", inline = "pos")
c_flat = input(color.blue ,"Flat/Trending Colours" , type = input.color, group = "Indicator Colours", inline = "trend")
c_longtrend = input(color.green ,"" , type = input.color, group = "Indicator Colours", inline = "trend")
//Global Variables
var float tpprice = na
f_c_gradientAdvDec(_source, _center, _c_bear, _c_bull) =>
var float _maxAdvDec = 0.
var float _qtyAdvDec = 0.
bool _xUp = crossover(_source, _center)
bool _xDn = crossunder(_source, _center)
float _chg = change(_source)
bool _up = _chg > 0
bool _dn = _chg < 0
bool _srcBull = _source > _center
bool _srcBear = _source < _center
_qtyAdvDec :=
_srcBull ? _xUp ? 1 : _up ? _qtyAdvDec + 1 : _dn ? max(1, _qtyAdvDec - 1) : _qtyAdvDec :
_srcBear ? _xDn ? 1 : _dn ? _qtyAdvDec + 1 : _up ? max(1, _qtyAdvDec - 1) : _qtyAdvDec : _qtyAdvDec
_maxAdvDec := max(_maxAdvDec, _qtyAdvDec)
float _transp = 100 - (_qtyAdvDec * 100 / _maxAdvDec)
var color _return = na
_return := _srcBull ? color.new(_c_bull, _transp) : _srcBear ? color.new(_c_bear, _transp) : _return
//Simple Sup/Res
var float _pH = na
var float _pL = na
_ph = pivothigh(high,20,20)
_pl = pivotlow(low,20,20)
_high_inacc = _inacc * high
_low_inacc = _inacc * low
if _ph
_pH := high
if (high-_high_inacc) > _pH and _ph
_pH := high
_pH := nz(_pH)
if _pl
_pL := low
if (low+_low_inacc) < _pL[1]
_pL := low
_pL := nz(_pL)
broke_res = iff(crossover(close, _pH), true, false)
//Indicator Initialisation
s_stoch = stoch(close, high, low, i_stoch_length)
s_vwma = vwma(close,i_vwma_length)
s_sma = sma(close,i_sma_length)
//MONEY FLOW + BBW
atr1 =ema((atr(14)/close),i_atr_len/2)
atr2 =ema((atr(14)/close), i_atr_len)
is_ranging = iff(atr1 < atr2, true, false)
s_mfi = mfi(close,i_mfi_length)
overTop = iff(s_mfi >= 90, true, false)
underBot = iff(s_mfi <= 10, true, false)
//Price Divergance
ph = pivothigh(high, i_div_price,i_div_price)
pl = pivotlow(low,i_div_price,i_div_price)
var float pH = 0.0
var float pL = 0.0
high_acc = high * (i_inacc)
low_acc = low * i_inacc
if (high-high_acc) > pH or (high+high_acc < pH) and ph
pH := high
pH := nz(pH)
if (low+low_acc) < pL or (low-low_acc > pL) and pl
pL := low
pL := nz(pL)
higher_low = false
lower_low = false
//Filter out innacurate
if ph or pl
if pL < pL[1]
lower_low := true
if pL > pL[1]
higher_low := true
//MFI Divergance
mh = pivothigh(s_mfi, i_mfi_left,i_mfi_right)
ml = pivotlow(s_mfi, i_mfi_left,i_mfi_right)
bl = bar_index
var float mH = 0.0
var float mL = 0.0
var int bL = 0
if mh
mH := highest(nz(mh),i_mfi_left)
mH := nz(mH)
if ml
bL := bar_index
mL := ml
mL := nz(mL)
higher_low_m = false
lower_low_m = false
if ml
if mL < mL[1]
lower_low_m := true
if mL > mL[1]
higher_low_m := true
//Combintion
var int price_range = na
var int rsi_range = na
var int mfi_range = na
//Higher low on price, lower low on rsi, then check with stoch
mfi_div_bullish = iff(higher_low and higher_low_m, true, false)
if mfi_div_bullish
price_range := 0
rsi_range := 0
//VWMA/SMA/OBV
_src = s_vwma-s_sma
sd_src = stdev(_src,14)
pooled_src = (_src/sd_src)*2
sd_s_vwma = stdev(s_vwma,14)
sd_s_sma = stdev(s_sma,14)
longTrend = obv > ema(obv,100) and is_ranging == false
crossOver = crossover(s_vwma , s_sma)
crossingOver = (s_vwma > s_sma) and (close >= s_vwma)
crossUnder = crossunder(s_vwma, s_sma)
crossingUnder = (s_vwma < s_sma) and (close <= s_vwma)
hist_color = f_c_gradientAdvDec(s_vwma-s_sma, (s_vwma-s_sma)/2, color.new(c_sell,90), color.new(c_buy,80))
//Strategy Entries
mfi_stoch_trend = iff(enb_stoch_mfi, iff(s_stoch >= 50 and crossover(s_mfi, 50) and crossingOver and longTrend and is_ranging == false, true, false), false)
var buy_counter_rsi = 0
var buy_counter_mfi = 0
mfi_div = iff(enb_stoch_mfi_div, iff(mfi_div_bullish and crossingOver and s_stoch >= 50 and is_ranging, true, false), false)
if mfi_div
buy_counter_mfi := bar_index + 5
mfi_divergent_buy = iff(bar_index <= buy_counter_mfi and strategy.position_size == 0, true, false)
//Strategy Entries
order_fired = false
var float previousRes = 0.0
tpprice := strategy.position_avg_price * (1+tp_percentage)
if time_check
if mfi_stoch_trend
strategy.entry("Buy", true, comment = "[B] STOCH/MFI")
order_fired := true
if mfi_divergent_buy
strategy.entry("Buy", true, comment = "[B] MFI Hidden Divergance")
order_fired := true
if order_fired
previousRes := _pL
if strategy.position_size > 0
strategy.exit("Buy", limit = tpprice, comment = "TP")
if close <= previousRes
strategy.exit("Buy", stop = previousRes, comment = "SL")
//Drawings
hline(0, "Base", color.white)
hline(100, "Max", color.white)
p_stoch = plot(s_stoch, color = c_stoch)
p_mfi = plot(s_mfi, color = c_mfi)
hline(70, "Top Line")
p_mid = plot(50, "Mid Line", color.new(color.white,100))
hline(50, "Mid Line")
hline(30, "Bot Line")
fill(p_stoch, p_mid, color.new(c_stoch, 60))
plotshape(crossOver ? 5 : crossUnder ? -5 : na, style = shape.square, color = crossOver ? c_buy : crossUnder ? c_sell : na, size = size.tiny, location = location.absolute)
plot((_src/sd_src)*2, color = hist_color, style = plot.style_histogram)
//Boxes
// var string same = ""
// var box _box = na
// if longTrend and is_ranging == false and same != "longtrend"
// same := "longtrend"
// _box := box.new(bar_index, 105, bar_index, 100, bgcolor = c_longtrend,border_color = color.new(color.white, 100))
// else if is_ranging and same != "isranging"
// same := "isranging"
// _box := box.new(bar_index, 105, bar_index, 100, bgcolor = c_flat,border_color = color.new(color.white, 100))
// if not na(_box)
// box.set_right(_box,bar_index)
// //Div Lines
// var line _line = na
// if mfi_divergent_buy
// _line = line.new(bL[1] -6, s_mfi[bar_index-bL[1]], bar_index + 6, s_mfi, color = color.green, width = 3)