Files
tradingview/chan_theory_test.pine
T
2025-09-28 11:48:03 +08:00

106 lines
4.3 KiB
Plaintext

//@version=6
indicator("缠论测试版", shorttitle="缠论测试", overlay=true)
// 参数设置
show_merged_k = input.bool(true, "显示合并K线")
show_fenxing = input.bool(true, "显示分型")
show_bi = input.bool(true, "显示笔")
// 数据类型
type MergedK
int bar_index
float high
float low
float open
float close
type FractalPoint
int bar_index
float price
string fractal_type
// 全局变量
var merged_ks = array.new<MergedK>()
var fractal_points = array.new<FractalPoint>()
var current_trend = 0
// 包含关系判断
is_contained(k1_high, k1_low, k2_high, k2_low) =>
(k1_high >= k2_high and k1_low <= k2_low) or (k2_high >= k1_high and k2_low <= k1_low)
// K线合并
if barstate.isconfirmed
current_k = MergedK.new(bar_index, high, low, open, close)
if array.size(merged_ks) == 0
array.push(merged_ks, current_k)
else
last_k = array.get(merged_ks, array.size(merged_ks) - 1)
if is_contained(last_k.high, last_k.low, current_k.high, current_k.low)
// 合并K线
if current_trend > 0
last_k.high := math.max(last_k.high, current_k.high)
last_k.low := math.max(last_k.low, current_k.low)
else if current_trend < 0
last_k.high := math.min(last_k.high, current_k.high)
last_k.low := math.min(last_k.low, current_k.low)
else
if last_k.close > last_k.open
last_k.high := math.max(last_k.high, current_k.high)
last_k.low := math.max(last_k.low, current_k.low)
else
last_k.high := math.min(last_k.high, current_k.high)
last_k.low := math.min(last_k.low, current_k.low)
last_k.bar_index := current_k.bar_index
else
array.push(merged_ks, current_k)
// 更新趋势
if array.size(merged_ks) >= 2
prev_k = array.get(merged_ks, array.size(merged_ks) - 2)
if current_k.high > prev_k.high
current_trend := 1
else if current_k.low < prev_k.low
current_trend := -1
// 分型识别
if array.size(merged_ks) >= 3
k1 = array.get(merged_ks, array.size(merged_ks) - 3)
k2 = array.get(merged_ks, array.size(merged_ks) - 2)
k3 = array.get(merged_ks, array.size(merged_ks) - 1)
// 顶分型
if k2.high > k1.high and k2.high > k3.high and k2.low > k1.low and k2.low > k3.low
new_fractal = FractalPoint.new(k2.bar_index, k2.high, "top")
array.push(fractal_points, new_fractal)
if show_fenxing
label.new(k2.bar_index, k2.high, "顶", color=color.red, style=label.style_label_down)
// 底分型
if k2.high < k1.high and k2.high < k3.high and k2.low < k1.low and k2.low < k3.low
new_fractal = FractalPoint.new(k2.bar_index, k2.low, "bottom")
array.push(fractal_points, new_fractal)
if show_fenxing
label.new(k2.bar_index, k2.low, "底", color=color.green, style=label.style_label_up)
// 构建笔
if show_bi and array.size(fractal_points) >= 2
for i = 0 to array.size(fractal_points) - 2
current_fractal = array.get(fractal_points, i)
next_fractal = array.get(fractal_points, i + 1)
if current_fractal.fractal_type != next_fractal.fractal_type
line.new(current_fractal.bar_index, current_fractal.price, next_fractal.bar_index, next_fractal.price, color=color.blue, width=2)
// 信息面板
if barstate.islast
var info_table = table.new(position.top_right, 2, 4, bgcolor=color.white, border_width=1)
table.cell(info_table, 0, 0, "缠论测试", text_color=color.black)
table.cell(info_table, 1, 0, "", text_color=color.black)
table.cell(info_table, 0, 1, "合并K线", text_color=color.black)
table.cell(info_table, 1, 1, str.tostring(array.size(merged_ks)), text_color=color.black)
table.cell(info_table, 0, 2, "分型数", text_color=color.black)
table.cell(info_table, 1, 2, str.tostring(array.size(fractal_points)), text_color=color.black)
table.cell(info_table, 0, 3, "当前趋势", text_color=color.black)
trend_text = current_trend > 0 ? "向上" : current_trend < 0 ? "向下" : "震荡"
table.cell(info_table, 1, 3, trend_text, text_color=color.black)