diff --git a/3in1 copy.pine b/3in1 copy.pine index bd69bdd..dd2a258 100644 --- a/3in1 copy.pine +++ b/3in1 copy.pine @@ -566,6 +566,92 @@ mtf_rsi_segment_count(long_threshold, short_threshold) => get_mtf_rsi_crossover_count(tf, long_threshold, short_threshold) => request.security(syminfo.tickerid, tf, mtf_rsi_segment_count(long_threshold, short_threshold), lookahead=barmerge.lookahead_off) +// ═════════ SRBR核心计算函数(完整保留原始逻辑) ════════ +// Function to identify support and resistance boxes - 完全按照原始SRBR逻辑 +calcSupportResistance(src, lookbackPeriod) => + // Volume - 使用SRBR专用成交量函数 + Vol = srbr_upAndDownVolume() + vol_hi = ta.highest(Vol/2.5, srbr_vol_len) + vol_lo = ta.lowest(Vol/2.5, srbr_vol_len) + + var float supportLevel = na + var float supportLevel_1 = na + var float resistanceLevel = na + var float resistanceLevel_1 = na + // 注释掉绘图相关变量,但保留计算逻辑 + // var box sup = na + // var box res = na + // var color res_color = na + // var color sup_color = na + var float multi = na + + var bool brekout_res = na + var bool brekout_sup = na + var bool res_holds = na + var bool sup_holds = na + + // Find pivot points + pivotHigh = ta.pivothigh(src, lookbackPeriod, lookbackPeriod) + pivotLow = ta.pivotlow (src, lookbackPeriod, lookbackPeriod) + // Box width + atr = ta.atr(200) + withd = atr * srbr_box_width + + // Find support levels with Positive Volume + if (not na(pivotLow)) and Vol > vol_hi + supportLevel := pivotLow + supportLevel_1 := supportLevel-withd + + // 注释掉绘图部分,保留计算逻辑 + // topLeft = chart.point.from_index(bar_index-lookbackPeriod, supportLevel) + // bottomRight = chart.point.from_index(bar_index, supportLevel_1) + // sup_color := color.from_gradient(Vol, 0, ta.highest(Vol, 25), color(na), color.new(color.green, 30)) + // sup := box.new(...) + + // Find resistance levels with Negative Volume + if (not na(pivotHigh)) and Vol < vol_lo + resistanceLevel := pivotHigh + resistanceLevel_1 := resistanceLevel+withd + + // 注释掉绘图部分,保留计算逻辑 + // topLeft = chart.point.from_index(bar_index-lookbackPeriod, resistanceLevel) + // bottomRight = chart.point.from_index(bar_index, resistanceLevel_1) + // res_color := color.from_gradient(Vol, ta.lowest(Vol, 25), 0, color.new(color.red, 30), color(na)) + // res := box.new(...) + + // 注释掉绘图相关的box操作 + // Adaptive Box Len + // sup.set_right(bar_index+1) + // res.set_right(bar_index+1) + + // Break of support or resistance conditions - 保留完整计算逻辑 + brekout_res := ta.crossover(low, resistanceLevel_1) + res_holds := ta.crossunder(high, resistanceLevel) + + sup_holds := ta.crossover(low, supportLevel) + brekout_sup := ta.crossunder(high, supportLevel_1) + + // 注释掉颜色变化逻辑,但保留状态计算 + // Change Color of Support to red if it was break, change color of resistance to green if it was break + // if brekout_sup + // sup.set_bgcolor(color.new(color.red, 80)) + // sup.set_border_color(color.red) + // sup.set_border_style(line.style_dashed) + // if sup_holds + // sup.set_bgcolor(sup_color) + // sup.set_border_color(color.green) + // sup.set_border_style(line.style_solid) + // if brekout_res + // res.set_bgcolor(color.new(color.green, 80)) + // res.set_border_color(color.new(color.green, 0)) + // res.set_border_style(line.style_dashed) + // if res_holds + // res.set_bgcolor(res_color) + // res.set_border_color(color.new(color.red, 0)) + // res.set_border_style(line.style_solid) + + [supportLevel, resistanceLevel, brekout_res, res_holds, sup_holds, brekout_sup, Vol, vol_hi, vol_lo] + //************************************************************************************************************ // 多时间框架计算函数 //************************************************************************************************************ @@ -607,6 +693,43 @@ rsi = ta.rsi(rsi_src, rsiLength) if smooth rsi := ma(rsi, smoothP, maType, sig) +// ═════════ SRBR 计算 ═════════ +// Calculate support and resistance levels and their breakouts - 完全按照原始SRBR逻辑 +[srbr_supportLevel, + srbr_resistanceLevel, + srbr_brekout_res, + srbr_res_holds, + srbr_sup_holds, + srbr_brekout_sup, + srbr_vol, + srbr_vol_hi, + srbr_vol_lo] = calcSupportResistance(close, srbr_lookback_period) + +// Check if Resistance become Support or Support Become Resistance - 完全按照原始SRBR逻辑 +var bool srbr_res_is_sup = na +var bool srbr_sup_is_res = na + +switch + srbr_brekout_res => srbr_res_is_sup := true + srbr_res_holds => srbr_res_is_sup := false + +switch + srbr_brekout_sup => srbr_sup_is_res := true + srbr_sup_holds => srbr_sup_is_res := false + +// SRBR状态分析 +srbr_resistance_holds = srbr_res_holds +srbr_support_holds = srbr_sup_holds +srbr_resistance_as_support_holds = srbr_brekout_res and srbr_res_is_sup[1] +srbr_support_as_resistance_holds = srbr_brekout_sup and srbr_sup_is_res[1] +srbr_break_support = srbr_brekout_sup and not srbr_sup_is_res[1] +srbr_break_resistance = srbr_brekout_res and not srbr_res_is_sup[1] + +// SRBR过滤条件(用于高级警报) +srbr_bullish_signal = srbr_break_resistance or srbr_resistance_as_support_holds or srbr_support_holds +srbr_bearish_signal = srbr_break_support or srbr_support_as_resistance_holds or srbr_resistance_holds +srbr_neutral_signal = not srbr_bullish_signal and not srbr_bearish_signal + // RSI 机器学习阈值计算(简化版) var rsi_values = array.new_float(0) if last_bar_index - bar_index <= 1000