307 lines
27 KiB
Plaintext
307 lines
27 KiB
Plaintext
// This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
|
||
// https://creativecommons.org/licenses/by-nc-sa/4.0/
|
||
// © BigBeluga
|
||
|
||
//@version=6
|
||
indicator("Max Trend Points [BigBeluga]", overlay = true, max_lines_count = 500, max_labels_count = 500)
|
||
|
||
// INPUTS ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――{
|
||
var line_up = line(na)
|
||
var line_dn = line(na)
|
||
var lbl_up = label(na)
|
||
var lbl_dn = label(na)
|
||
|
||
var highest = array.new_float(0)
|
||
var lowest = array.new_float(0)
|
||
|
||
var int start = na
|
||
var int last_trend_change = 0
|
||
var float last_trend_price = 0.0
|
||
|
||
// Trend Factor Inputs
|
||
factor_default = input.float(2.5, step = 0.1, title="默认趋势因子")
|
||
factor_btc = input.float(3.0, step = 0.1, title="BTCUSD 趋势因子")
|
||
factor_xau = input.float(2.5, step = 0.1, title="XAUUSD 趋势因子")
|
||
factor_eth = input.float(2.8, step = 0.1, title="ETHUSD 趋势因子")
|
||
factor_gbp = input.float(2.5, step = 0.1, title="GBPJPY 趋势因子")
|
||
|
||
// Consolidation Bars Inputs
|
||
consolidation_bars_default = input.int(20, title="默认震荡检测周期", minval=10)
|
||
consolidation_bars_btc = input.int(25, title="BTCUSD 震荡检测周期", minval=10)
|
||
consolidation_bars_xau = input.int(25, title="XAUUSD 震荡检测周期", minval=10)
|
||
consolidation_bars_eth = input.int(20, title="ETHUSD 震荡检测周期", minval=10)
|
||
consolidation_bars_gbp = input.int(18, title="GBPJPY 震荡检测周期", minval=10)
|
||
|
||
// Consolidation Threshold Inputs
|
||
consolidation_threshold_default = input.float(0.1, title="默认震荡阈值(%)", minval=0.1, step=0.02)
|
||
consolidation_threshold_btc = input.float(0.2, title="BTCUSD 震荡阈值(%)", minval=0.1, step=0.02)
|
||
consolidation_threshold_xau = input.float(0.3, title="XAUUSD 震荡阈值(%)", minval=0.1, step=0.02)
|
||
consolidation_threshold_eth = input.float(0.15, title="ETHUSD 震荡阈值(%)", minval=0.1, step=0.02)
|
||
consolidation_threshold_gbp = input.float(0.16, title="GBPJPY 震荡阈值(%)", minval=0.1, step=0.02)
|
||
|
||
// Activity Period Inputs
|
||
activity_period_default = input.int(14, title="默认活跃度检测周期", minval=5)
|
||
activity_period_btc = input.int(20, title="BTCUSD 活跃度检测周期", minval=5)
|
||
activity_period_xau = input.int(20, title="XAUUSD 活跃度检测周期", minval=5)
|
||
activity_period_eth = input.int(20, title="ETHUSD 活跃度检测周期", minval=5)
|
||
activity_period_gbp = input.int(12, title="GBPJPY 活跃度检测周期", minval=5)
|
||
|
||
// Activity Threshold Inputs
|
||
activity_threshold_default = input.float(1.3, title="默认活跃度阈值(ATR倍数)", minval=0.1, step=0.1)
|
||
activity_threshold_btc = input.float(1.5, title="BTCUSD 活跃度阈值(ATR倍数)", minval=0.1, step=0.1)
|
||
activity_threshold_xau = input.float(1.4, title="XAUUSD 活跃度阈值(ATR倍数)", minval=0.1, step=0.1)
|
||
activity_threshold_eth = input.float(1.4, title="ETHUSD 活跃度阈值(ATR倍数)", minval=0.1, step=0.1)
|
||
activity_threshold_gbp = input.float(1.3, title="GBPJPY 活跃度阈值(ATR倍数)", minval=0.1, step=0.1)
|
||
|
||
// Colors
|
||
col_up = input.color(color.rgb(28, 194, 216), "上涨颜色")
|
||
col_dn = input.color(color.rgb(228, 144, 19), "下跌颜色")
|
||
|
||
// Alert Settings
|
||
alert_group = "警报设置"
|
||
enable_trend_alert = input.bool(true, "启用趋势变化警报", group=alert_group)
|
||
enable_consolidation_alert = input.bool(true, "启用震荡警报", group=alert_group)
|
||
enable_activity_alert = input.bool(true, "启用市场活跃度警报", group=alert_group)
|
||
|
||
// Select Parameters Based on Trading Pair
|
||
sym = syminfo.tickerid
|
||
factor =
|
||
sym == "TICKMILL:BTCUSD" ? factor_btc :
|
||
sym == "TICKMILL:XAUUSD" ? factor_xau :
|
||
sym == "TICKMILL:ETHUSD" ? factor_eth :
|
||
sym == "TICKMILL:GBPJPY" ? factor_gbp :
|
||
factor_default
|
||
|
||
consolidation_bars =
|
||
sym == "TICKMILL:BTCUSD" ? consolidation_bars_btc :
|
||
sym == "TICKMILL:XAUUSD" ? consolidation_bars_xau :
|
||
sym == "TICKMILL:ETHUSD" ? consolidation_bars_eth :
|
||
sym == "TICKMILL:GBPJPY" ? consolidation_bars_gbp :
|
||
consolidation_bars_default
|
||
|
||
consolidation_threshold =
|
||
sym == "TICKMILL:BTCUSD" ? consolidation_threshold_btc :
|
||
sym == "TICKMILL:XAUUSD" ? consolidation_threshold_xau :
|
||
sym == "TICKMILL:ETHUSD" ? consolidation_threshold_eth :
|
||
sym == "TICKMILL:GBPJPY" ? consolidation_threshold_gbp :
|
||
consolidation_threshold_default
|
||
|
||
activity_period =
|
||
sym == "TICKMILL:BTCUSD" ? activity_period_btc :
|
||
sym == "TICKMILL:XAUUSD" ? activity_period_xau :
|
||
sym == "TICKMILL:ETHUSD" ? activity_period_eth :
|
||
sym == "TICKMILL:GBPJPY" ? activity_period_gbp :
|
||
activity_period_default
|
||
|
||
activity_threshold =
|
||
sym == "TICKMILL:BTCUSD" ? activity_threshold_btc :
|
||
sym == "TICKMILL:XAUUSD" ? activity_threshold_xau :
|
||
sym == "TICKMILL:ETHUSD" ? activity_threshold_eth :
|
||
sym == "TICKMILL:GBPJPY" ? activity_threshold_gbp :
|
||
activity_threshold_default
|
||
// }
|
||
|
||
// CALCULATIONS――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――{
|
||
trend_line(factor)=>
|
||
src = hl2
|
||
dist = ta.hma(high-low, 200)
|
||
upperBand = src + factor * dist
|
||
lowerBand = src - factor * dist
|
||
prevLowerBand = nz(lowerBand[1])
|
||
prevUpperBand = nz(upperBand[1])
|
||
|
||
lowerBand := lowerBand > prevLowerBand or close[1] < prevLowerBand ? lowerBand : prevLowerBand
|
||
upperBand := upperBand < prevUpperBand or close[1] > prevUpperBand ? upperBand : prevUpperBand
|
||
|
||
int _direction = na
|
||
float trend_line = na
|
||
prevTrendLine = nz(trend_line[1])
|
||
if na(dist[1])
|
||
_direction := 1
|
||
else if prevTrendLine == prevUpperBand
|
||
_direction := close > upperBand ? -1 : 1
|
||
else
|
||
_direction := close < lowerBand ? 1 : -1
|
||
|
||
trend_line := _direction == -1 ? lowerBand : upperBand
|
||
|
||
[trend_line, _direction]
|
||
|
||
[trend_line, _direction] = trend_line(factor)
|
||
|
||
t_change = ta.cross(_direction, 0)
|
||
|
||
// Oscillation Detection
|
||
highest_recent = ta.highest(high, consolidation_bars)
|
||
lowest_recent = ta.lowest(low, consolidation_bars)
|
||
price_range = (highest_recent - lowest_recent) / lowest_recent * 100
|
||
is_consolidating = price_range < consolidation_threshold
|
||
|
||
// Market Activity Detection
|
||
atr_current = ta.atr(activity_period)
|
||
atr_avg = ta.sma(atr_current, activity_period * 2)
|
||
is_active = atr_current > atr_avg * activity_threshold
|
||
|
||
// Calculate Trend Strength
|
||
trend_strength = math.abs(close - trend_line) / trend_line * 100
|
||
|
||
if t_change
|
||
array.clear(highest)
|
||
array.clear(lowest)
|
||
start := bar_index
|
||
last_trend_change := bar_index
|
||
last_trend_price := close
|
||
|
||
if t_change and _direction == 1
|
||
line_dn := line.new(bar_index, close, na, na, color = chart.fg_color, style = line.style_dashed)
|
||
lbl_dn := label.new(bar_index, low, color = color.new(col_dn, 50), textcolor = chart.fg_color, size = size.small, style = label.style_label_up)
|
||
|
||
if t_change and _direction == -1
|
||
lbl_up := label.new(bar_index, high, color = color.new(col_up, 50), textcolor = chart.fg_color, size = size.small, style = label.style_label_down)
|
||
line_up := line.new(bar_index, close, na, na, color = chart.fg_color, style = line.style_dashed)
|
||
|
||
if not t_change and _direction == -1
|
||
array.push(highest, high)
|
||
label.set_xy(lbl_up, start + array.indexof(highest, array.max(highest))+1, array.max(highest))
|
||
line.set_xy2(line_up, start + array.indexof(highest, array.max(highest))+1, array.max(highest))
|
||
|
||
if not t_change and _direction == 1
|
||
array.push(lowest, low)
|
||
label.set_xy(lbl_dn, start + array.indexof(lowest, array.min(lowest))+1, array.min(lowest))
|
||
line.set_xy2(line_dn, start + array.indexof(lowest, array.min(lowest))+1, array.min(lowest))
|
||
|
||
if line.get_y2(line_up) > line.get_y1(line_up)
|
||
label.set_text(lbl_up, str.tostring((line.get_y2(line_up) - line.get_y1(line_up)) / line.get_y1(line_up) * 100, format.percent))
|
||
if line.get_y2(line_dn) < line.get_y1(line_dn)
|
||
label.set_text(lbl_dn, str.tostring((line.get_y2(line_dn) - line.get_y1(line_dn)) / line.get_y1(line_dn) * 100, format.percent))
|
||
|
||
t_color = _direction == -1 ? col_up : col_dn
|
||
|
||
// Track previous states for state change detection
|
||
var bool was_consolidating = false
|
||
var bool was_active = false
|
||
was_consolidating := is_consolidating
|
||
was_active := is_active
|
||
// }
|
||
|
||
// ===== 统一警报系统 =====
|
||
// 统一警报系统 - 只需添加一次警报即可捕获所有信号
|
||
|
||
// 检测所有警报条件并生成对应的JSON消息
|
||
alert_message = ""
|
||
|
||
// 趋势变化警报
|
||
if enable_trend_alert and t_change and _direction == -1
|
||
alert_message := '{"指标名称":"MaxTrendPoints","交易对":"' + syminfo.ticker + '","周期":"' + timeframe.period + '","趋势线":"' + str.tostring(trend_line, '#.####') + '","趋势强度":"' + str.tostring(trend_strength, '#.##') + '","价格范围":"' + str.tostring(price_range, '#.####') + '","当前ATR":"' + str.tostring(atr_current, '#.####') + '","开盘价":"' + str.tostring(open, '#.####') + '","收盘价":"' + str.tostring(close, '#.####') + '","最高价":"' + str.tostring(high, '#.####') + '","最低价":"' + str.tostring(low, '#.####') + '","触发时间":"' + str.tostring(timenow) + '","时间":"' + str.tostring(time) + '","事件":"价格转为上涨趋势","方向":"上涨趋势","信号":"trend_up"}'
|
||
alert(alert_message, alert.freq_once_per_bar_close)
|
||
|
||
if enable_trend_alert and t_change and _direction == 1
|
||
alert_message := '{"指标名称":"MaxTrendPoints","交易对":"' + syminfo.ticker + '","周期":"' + timeframe.period + '","趋势线":"' + str.tostring(trend_line, '#.####') + '","趋势强度":"' + str.tostring(trend_strength, '#.##') + '","价格范围":"' + str.tostring(price_range, '#.####') + '","当前ATR":"' + str.tostring(atr_current, '#.####') + '","开盘价":"' + str.tostring(open, '#.####') + '","收盘价":"' + str.tostring(close, '#.####') + '","最高价":"' + str.tostring(high, '#.####') + '","最低价":"' + str.tostring(low, '#.####') + '","触发时间":"' + str.tostring(timenow) + '","时间":"' + str.tostring(time) + '","事件":"价格转为下跌趋势","方向":"下跌趋势","信号":"trend_down"}'
|
||
alert(alert_message, alert.freq_once_per_bar_close)
|
||
|
||
// 震荡状态变化警报
|
||
// if enable_consolidation_alert and is_consolidating and not was_consolidating[1]
|
||
// alert_message := '{"指标名称":"MaxTrendPoints","交易对":"' + syminfo.ticker + '","周期":"' + timeframe.period + '","趋势线":"' + str.tostring(trend_line, '#.####') + '","趋势强度":"' + str.tostring(trend_strength, '#.##') + '","价格范围":"' + str.tostring(price_range, '#.####') + '","当前ATR":"' + str.tostring(atr_current, '#.####') + '","开盘价":"' + str.tostring(open, '#.####') + '","收盘价":"' + str.tostring(close, '#.####') + '","最高价":"' + str.tostring(high, '#.####') + '","最低价":"' + str.tostring(low, '#.####') + '","触发时间":"' + str.tostring(timenow) + '","时间":"' + str.tostring(time) + '","事件":"市场进入震荡状态","状态":"震荡","信号":"consolidation_start"}'
|
||
// alert(alert_message, alert.freq_once_per_bar_close)
|
||
|
||
// if enable_consolidation_alert and not is_consolidating and was_consolidating[1]
|
||
// direction_text = _direction == -1 ? "上涨趋势" : "下跌趋势"
|
||
// alert_message := '{"指标名称":"MaxTrendPoints","交易对":"' + syminfo.ticker + '","周期":"' + timeframe.period + '","趋势线":"' + str.tostring(trend_line, '#.####') + '","趋势强度":"' + str.tostring(trend_strength, '#.##') + '","价格范围":"' + str.tostring(price_range, '#.####') + '","当前ATR":"' + str.tostring(atr_current, '#.####') + '","开盘价":"' + str.tostring(open, '#.####') + '","收盘价":"' + str.tostring(close, '#.####') + '","最高价":"' + str.tostring(high, '#.####') + '","最低价":"' + str.tostring(low, '#.####') + '","触发时间":"' + str.tostring(timenow) + '","时间":"' + str.tostring(time) + '","事件":"市场突破震荡状态","方向":"' + direction_text + '","信号":"consolidation_break"}'
|
||
// alert(alert_message, alert.freq_once_per_bar_close)
|
||
|
||
// // 活跃度变化警报
|
||
// if enable_activity_alert and is_active and not was_active[1]
|
||
// alert_message := '{"指标名称":"MaxTrendPoints","交易对":"' + syminfo.ticker + '","周期":"' + timeframe.period + '","趋势线":"' + str.tostring(trend_line, '#.####') + '","趋势强度":"' + str.tostring(trend_strength, '#.##') + '","价格范围":"' + str.tostring(price_range, '#.####') + '","当前ATR":"' + str.tostring(atr_current, '#.####') + '","开盘价":"' + str.tostring(open, '#.####') + '","收盘价":"' + str.tostring(close, '#.####') + '","最高价":"' + str.tostring(high, '#.####') + '","最低价":"' + str.tostring(low, '#.####') + '","触发时间":"' + str.tostring(timenow) + '","时间":"' + str.tostring(time) + '","事件":"市场活跃度增加","活跃状态":"活跃","信号":"activity_increase"}'
|
||
// alert(alert_message, alert.freq_once_per_bar_close)
|
||
|
||
// if enable_activity_alert and not is_active and was_active[1]
|
||
// alert_message := '{"指标名称":"MaxTrendPoints","交易对":"' + syminfo.ticker + '","周期":"' + timeframe.period + '","趋势线":"' + str.tostring(trend_line, '#.####') + '","趋势强度":"' + str.tostring(trend_strength, '#.##') + '","价格范围":"' + str.tostring(price_range, '#.####') + '","当前ATR":"' + str.tostring(atr_current, '#.####') + '","开盘价":"' + str.tostring(open, '#.####') + '","收盘价":"' + str.tostring(close, '#.####') + '","最高价":"' + str.tostring(high, '#.####') + '","最低价":"' + str.tostring(low, '#.####') + '","触发时间":"' + str.tostring(timenow) + '","时间":"' + str.tostring(time) + '","事件":"市场活跃度降低","活跃状态":"不活跃","信号":"activity_decrease"}'
|
||
// alert(alert_message, alert.freq_once_per_bar_close)
|
||
|
||
// 综合市场分析警报
|
||
// if t_change and (enable_trend_alert or enable_consolidation_alert or enable_activity_alert)
|
||
// direction_text = _direction == -1 ? "上涨趋势" : "下跌趋势"
|
||
// status_text = is_consolidating ? "震荡" : (is_active ? "活跃" : "正常")
|
||
// alert_message := '{"指标名称":"MaxTrendPoints","交易对":"' + syminfo.ticker + '","周期":"' + timeframe.period + '","趋势线":"' + str.tostring(trend_line, '#.####') + '","趋势强度":"' + str.tostring(trend_strength, '#.##') + '","价格范围":"' + str.tostring(price_range, '#.####') + '","当前ATR":"' + str.tostring(atr_current, '#.####') + '","开盘价":"' + str.tostring(open, '#.####') + '","收盘价":"' + str.tostring(close, '#.####') + '","最高价":"' + str.tostring(high, '#.####') + '","最低价":"' + str.tostring(low, '#.####') + '","触发时间":"' + str.tostring(timenow) + '","时间":"' + str.tostring(time) + '","事件":"综合市场分析","方向":"' + direction_text + '","状态":"' + status_text + '","信号":"market_analysis"}'
|
||
// alert(alert_message, alert.freq_once_per_bar_close)
|
||
|
||
// 状态监控警报(频率较低)
|
||
if enable_trend_alert and _direction == -1
|
||
alert_message := '{"指标名称":"MaxTrendPoints","交易对":"' + syminfo.ticker + '","周期":"' + timeframe.period + '","趋势线":"' + str.tostring(trend_line, '#.####') + '","趋势强度":"' + str.tostring(trend_strength, '#.##') + '","价格范围":"' + str.tostring(price_range, '#.####') + '","当前ATR":"' + str.tostring(atr_current, '#.####') + '","开盘价":"' + str.tostring(open, '#.####') + '","收盘价":"' + str.tostring(close, '#.####') + '","最高价":"' + str.tostring(high, '#.####') + '","最低价":"' + str.tostring(low, '#.####') + '","触发时间":"' + str.tostring(timenow) + '","时间":"' + str.tostring(time) + '","事件":"价格处于上涨趋势","方向":"上涨趋势","信号":"trend_up_status"}'
|
||
alert(alert_message, alert.freq_once_per_bar)
|
||
|
||
if enable_trend_alert and _direction == 1
|
||
alert_message := '{"指标名称":"MaxTrendPoints","交易对":"' + syminfo.ticker + '","周期":"' + timeframe.period + '","趋势线":"' + str.tostring(trend_line, '#.####') + '","趋势强度":"' + str.tostring(trend_strength, '#.##') + '","价格范围":"' + str.tostring(price_range, '#.####') + '","当前ATR":"' + str.tostring(atr_current, '#.####') + '","开盘价":"' + str.tostring(open, '#.####') + '","收盘价":"' + str.tostring(close, '#.####') + '","最高价":"' + str.tostring(high, '#.####') + '","最低价":"' + str.tostring(low, '#.####') + '","触发时间":"' + str.tostring(timenow) + '","时间":"' + str.tostring(time) + '","事件":"价格处于下跌趋势","方向":"下跌趋势","信号":"trend_down_status"}'
|
||
alert(alert_message, alert.freq_once_per_bar)
|
||
|
||
if enable_consolidation_alert and is_consolidating
|
||
alert_message := '{"指标名称":"MaxTrendPoints","交易对":"' + syminfo.ticker + '","周期":"' + timeframe.period + '","趋势线":"' + str.tostring(trend_line, '#.####') + '","趋势强度":"' + str.tostring(trend_strength, '#.##') + '","价格范围":"' + str.tostring(price_range, '#.####') + '","当前ATR":"' + str.tostring(atr_current, '#.####') + '","开盘价":"' + str.tostring(open, '#.####') + '","收盘价":"' + str.tostring(close, '#.####') + '","最高价":"' + str.tostring(high, '#.####') + '","最低价":"' + str.tostring(low, '#.####') + '","触发时间":"' + str.tostring(timenow) + '","时间":"' + str.tostring(time) + '","事件":"价格处于震荡状态","状态":"震荡","信号":"consolidation_status"}'
|
||
alert(alert_message, alert.freq_once_per_bar)
|
||
|
||
if enable_activity_alert and is_active
|
||
alert_message := '{"指标名称":"MaxTrendPoints","交易对":"' + syminfo.ticker + '","周期":"' + timeframe.period + '","趋势线":"' + str.tostring(trend_line, '#.####') + '","趋势强度":"' + str.tostring(trend_strength, '#.##') + '","价格范围":"' + str.tostring(price_range, '#.####') + '","当前ATR":"' + str.tostring(atr_current, '#.####') + '","开盘价":"' + str.tostring(open, '#.####') + '","收盘价":"' + str.tostring(close, '#.####') + '","最高价":"' + str.tostring(high, '#.####') + '","最低价":"' + str.tostring(low, '#.####') + '","触发时间":"' + str.tostring(timenow) + '","时间":"' + str.tostring(time) + '","事件":"价格处于活跃状态","活跃状态":"活跃","信号":"activity_status"}'
|
||
alert(alert_message, alert.freq_once_per_bar)
|
||
|
||
// ===== 传统警报条件(保留兼容性)=====
|
||
// 注意:使用统一警报系统时,建议只使用上面的alert()函数
|
||
// 以下alertcondition保留用于需要单独设置警报的情况
|
||
|
||
// 创建用于警报的plot变量
|
||
plot(trend_line, title = '趋势线', display = display.none)
|
||
plot(trend_strength, title = '趋势强度', display = display.none)
|
||
plot(price_range, title = '价格范围', display = display.none)
|
||
plot(atr_current, title = '当前ATR', display = display.none)
|
||
|
||
// 趋势变化警报
|
||
alertcondition(enable_trend_alert and t_change and _direction == -1, title = '价格转为上涨趋势', message = '{"指标名称":"MaxTrendPoints","交易对":"{{ticker}}","周期":"{{interval}}","趋势线":"{{plot("趋势线")}}","趋势强度":"{{plot("趋势强度")}}","价格范围":"{{plot("价格范围")}}","当前ATR":"{{plot("当前ATR")}}","开盘价":"{{open}}","收盘价":"{{close}}","最高价":"{{high}}","最低价":"{{low}}","触发时间":"{{timenow}}","时间":"{{time}}","事件":"价格转为上涨趋势","方向":"上涨趋势","信号":"trend_up"}')
|
||
|
||
alertcondition(enable_trend_alert and t_change and _direction == 1, title = '价格转为下跌趋势', message = '{"指标名称":"MaxTrendPoints","交易对":"{{ticker}}","周期":"{{interval}}","趋势线":"{{plot("趋势线")}}","趋势强度":"{{plot("趋势强度")}}","价格范围":"{{plot("价格范围")}}","当前ATR":"{{plot("当前ATR")}}","开盘价":"{{open}}","收盘价":"{{close}}","最高价":"{{high}}","最低价":"{{low}}","触发时间":"{{timenow}}","时间":"{{time}}","事件":"价格转为下跌趋势","方向":"下跌趋势","信号":"trend_down"}')
|
||
|
||
// 震荡状态变化警报
|
||
alertcondition(enable_consolidation_alert and is_consolidating and not was_consolidating[1], title = '市场进入震荡状态', message = '{"指标名称":"MaxTrendPoints","交易对":"{{ticker}}","周期":"{{interval}}","趋势线":"{{plot("趋势线")}}","趋势强度":"{{plot("趋势强度")}}","价格范围":"{{plot("价格范围")}}","当前ATR":"{{plot("当前ATR")}}","开盘价":"{{open}}","收盘价":"{{close}}","最高价":"{{high}}","最低价":"{{low}}","触发时间":"{{timenow}}","时间":"{{time}}","事件":"市场进入震荡状态","状态":"震荡","信号":"consolidation_start"}')
|
||
|
||
alertcondition(enable_consolidation_alert and not is_consolidating and was_consolidating[1], title = '市场突破震荡状态', message = '{"指标名称":"MaxTrendPoints","交易对":"{{ticker}}","周期":"{{interval}}","趋势线":"{{plot("趋势线")}}","趋势强度":"{{plot("趋势强度")}}","价格范围":"{{plot("价格范围")}}","当前ATR":"{{plot("当前ATR")}}","开盘价":"{{open}}","收盘价":"{{close}}","最高价":"{{high}}","最低价":"{{low}}","触发时间":"{{timenow}}","时间":"{{time}}","事件":"市场突破震荡状态","信号":"consolidation_break"}')
|
||
|
||
// 活跃度变化警报
|
||
alertcondition(enable_activity_alert and is_active and not was_active[1], title = '市场活跃度增加', message = '{"指标名称":"MaxTrendPoints","交易对":"{{ticker}}","周期":"{{interval}}","趋势线":"{{plot("趋势线")}}","趋势强度":"{{plot("趋势强度")}}","价格范围":"{{plot("价格范围")}}","当前ATR":"{{plot("当前ATR")}}","开盘价":"{{open}}","收盘价":"{{close}}","最高价":"{{high}}","最低价":"{{low}}","触发时间":"{{timenow}}","时间":"{{time}}","事件":"市场活跃度增加","活跃状态":"活跃","信号":"activity_increase"}')
|
||
|
||
alertcondition(enable_activity_alert and not is_active and was_active[1], title = '市场活跃度降低', message = '{"指标名称":"MaxTrendPoints","交易对":"{{ticker}}","周期":"{{interval}}","趋势线":"{{plot("趋势线")}}","趋势强度":"{{plot("趋势强度")}}","价格范围":"{{plot("价格范围")}}","当前ATR":"{{plot("当前ATR")}}","开盘价":"{{open}}","收盘价":"{{close}}","最高价":"{{high}}","最低价":"{{low}}","触发时间":"{{timenow}}","时间":"{{time}}","事件":"市场活跃度降低","活跃状态":"不活跃","信号":"activity_decrease"}')
|
||
|
||
// 综合市场分析警报
|
||
alertcondition(t_change and (enable_trend_alert or enable_consolidation_alert or enable_activity_alert), title = '综合市场分析', message = '{"指标名称":"MaxTrendPoints","交易对":"{{ticker}}","周期":"{{interval}}","趋势线":"{{plot("趋势线")}}","趋势强度":"{{plot("趋势强度")}}","价格范围":"{{plot("价格范围")}}","当前ATR":"{{plot("当前ATR")}}","开盘价":"{{open}}","收盘价":"{{close}}","最高价":"{{high}}","最低价":"{{low}}","触发时间":"{{timenow}}","时间":"{{time}}","事件":"综合市场分析","信号":"market_analysis"}')
|
||
|
||
// 状态监控警报
|
||
alertcondition(enable_trend_alert and _direction == -1, title = '价格处于上涨趋势', message = '{"指标名称":"MaxTrendPoints","交易对":"{{ticker}}","周期":"{{interval}}","趋势线":"{{plot("趋势线")}}","趋势强度":"{{plot("趋势强度")}}","价格范围":"{{plot("价格范围")}}","当前ATR":"{{plot("当前ATR")}}","开盘价":"{{open}}","收盘价":"{{close}}","最高价":"{{high}}","最低价":"{{low}}","触发时间":"{{timenow}}","时间":"{{time}}","事件":"价格处于上涨趋势","方向":"上涨趋势","信号":"trend_up_status"}')
|
||
|
||
alertcondition(enable_trend_alert and _direction == 1, title = '价格处于下跌趋势', message = '{"指标名称":"MaxTrendPoints","交易对":"{{ticker}}","周期":"{{interval}}","趋势线":"{{plot("趋势线")}}","趋势强度":"{{plot("趋势强度")}}","价格范围":"{{plot("价格范围")}}","当前ATR":"{{plot("当前ATR")}}","开盘价":"{{open}}","收盘价":"{{close}}","最高价":"{{high}}","最低价":"{{low}}","触发时间":"{{timenow}}","时间":"{{time}}","事件":"价格处于下跌趋势","方向":"下跌趋势","信号":"trend_down_status"}')
|
||
|
||
alertcondition(enable_consolidation_alert and is_consolidating, title = '价格处于震荡状态', message = '{"指标名称":"MaxTrendPoints","交易对":"{{ticker}}","周期":"{{interval}}","趋势线":"{{plot("趋势线")}}","趋势强度":"{{plot("趋势强度")}}","价格范围":"{{plot("价格范围")}}","当前ATR":"{{plot("当前ATR")}}","开盘价":"{{open}}","收盘价":"{{close}}","最高价":"{{high}}","最低价":"{{low}}","触发时间":"{{timenow}}","时间":"{{time}}","事件":"价格处于震荡状态","状态":"震荡","信号":"consolidation_status"}')
|
||
|
||
alertcondition(enable_activity_alert and is_active, title = '价格处于活跃状态', message = '{"指标名称":"MaxTrendPoints","交易对":"{{ticker}}","周期":"{{interval}}","趋势线":"{{plot("趋势线")}}","趋势强度":"{{plot("趋势强度")}}","价格范围":"{{plot("价格范围")}}","当前ATR":"{{plot("当前ATR")}}","开盘价":"{{open}}","收盘价":"{{close}}","最高价":"{{high}}","最低价":"{{low}}","触发时间":"{{timenow}}","时间":"{{time}}","事件":"价格处于活跃状态","活跃状态":"活跃","信号":"activity_status"}')
|
||
|
||
// PLOT ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――{
|
||
plotshape(t_change ? trend_line : na, "趋势变化", style = shape.circle, location = location.absolute, color = t_color, size = size.tiny)
|
||
|
||
t_p = plot(trend_line, "趋势线", color = t_change ? color.new(t_color, 100) : t_color, linewidth = 2)
|
||
m_p = plot(hl2, color = color.new(color.gray, 100), editable = false)
|
||
|
||
fill(t_p, m_p, hl2, trend_line, color.new(t_color, 95), color.new(t_color, 90))
|
||
|
||
// Status Panel
|
||
var table panel = table.new(position.top_right, 3, 4, bgcolor=color.new(color.black, 80))
|
||
if barstate.islast
|
||
table.cell(panel, 0, 0, "市场状态", text_color=color.white, text_size=size.small)
|
||
table.cell(panel, 1, 0, "当前值", text_color=color.white, text_size=size.small)
|
||
|
||
table.cell(panel, 0, 1, "趋势方向", text_color=color.gray, text_size=size.small)
|
||
table.cell(panel, 1, 1, _direction == -1 ? "↑ 上涨" : "↓ 下跌",
|
||
text_color=_direction == -1 ? col_up : col_dn, text_size=size.small)
|
||
|
||
table.cell(panel, 0, 2, "市场状态", text_color=color.gray, text_size=size.small)
|
||
table.cell(panel, 1, 2, is_consolidating ? "震荡中" : "趋势中",
|
||
text_color=is_consolidating ? color.rgb(43, 43, 39) : color.green, text_size=size.small)
|
||
|
||
table.cell(panel, 0, 3, "活跃度", text_color=color.gray, text_size=size.small)
|
||
table.cell(panel, 1, 3, is_active ? "活跃" : "平静",
|
||
text_color=is_active ? color.rgb(60, 60, 60) : color.blue, text_size=size.small)
|
||
// } |