
Trong lĩnh vực phân tích kỹ thuật, việc xác định bốn mô hình cấu trúc giá cốt lõi là “đỉnh cao hơn (HH)”, “đáy cao hơn (HL)”, “đỉnh thấp hơn (LH)” và “đáy thấp hơn (LL)” là nền tảng để đánh giá hướng xu hướng thị trường và các điểm đảo chiều tiềm năng. Các mô hình này trực quan cho thấy sự cân bằng động của các lực cung cầu thị trường và tâm lý chủ đạo (tăng giá hoặc giảm giá), cung cấp cơ sở khách quan cho các quyết định giao dịch.

Xu hướng tăng giá: Các đỉnh cao hơn và đáy cao hơn là các chỉ báo chính của xu hướng tăng giá. Các đỉnh cao hơn xảy ra khi giá đạt đỉnh vượt quá đỉnh trước đó, cho thấy người mua đang đẩy giá lên cao hơn, phản ánh sức mạnh của thị trường. Các đáy cao hơn xảy ra khi giá giảm dừng ở mức cao hơn mức giảm trước đó, cho thấy thị trường đang duy trì đà tăng. Cùng nhau, các mô hình này chỉ ra xu hướng tăng mạnh, được xác định trên biểu đồ bằng một loạt các đỉnh và đáy tăng.
Xu hướng giảm: Các đỉnh thấp hơn và đáy thấp hơn biểu thị xu hướng giảm. Các đỉnh thấp hơn hình thành khi giá đỉnh không đạt đến mức đỉnh trước đó, biểu thị áp lực mua yếu đi. Các đáy thấp hơn hình thành khi giá giảm xuống dưới mức đáy trước đó, phản ánh áp lực bán tăng lên và thị trường yếu đi. Các mô hình này rất cần thiết để xác định xu hướng giảm, được xác định trên biểu đồ giá bằng một loạt các đỉnh và đáy giảm dần.
Thị trường tiền điện tử được đặc trưng bởi tính biến động cao, giao dịch 24⁄7 và xu hướng đáng kể do tâm lý thúc đẩy. Trong một môi trường như vậy, việc xác định chính xác các mô hình xu hướng trở nên quan trọng hơn nữa. Bằng cách định lượng tính liên tục của “đỉnh cao hơn, đáy cao hơn” hoặc “đỉnh thấp hơn, đáy thấp hơn”, xu hướng thị trường có thể được xác định chính xác hơn, cung cấp cơ sở khách quan cho các quyết định giao dịch.
Nền tảng định lượng FMZ Inventor cung cấp môi trường lý tưởng để phát triển các chỉ số như sau:
Lợi thế dữ liệu:
Môi trường phát triển:
Kiểm tra sự tiện lợi:
Dựa trên những lợi thế này, nền tảng FMZ được chọn để khám phá các chỉ báo xu hướng liên tục của giá cao và giá thấp.
Trước khi thiết kế một chỉ báo, chúng ta cần xem xét sự khác biệt giữa thị trường tiền điện tử và thị trường chứng khoán:
Dựa trên những đặc điểm này, sơ đồ thiết kế như sau:
Sau khi suy nghĩ sâu sắc, chúng tôi đã áp dụng phương pháp phân tích dựa trên “dữ liệu đầy đủ của ngày hôm qua” để tránh phán đoán sai lầm do dữ liệu không đầy đủ của ngày hôm đó. Cấu trúc dữ liệu cốt lõi như sau:
# 每个币种的数据都单独存储
data = defaultdict(lambda: {
"daily_records": [], # 存储每日的昨天数据
"trend_buffer": [], # 当前趋势缓冲区
"patterns": [], # 完整的趋势模式
"current_trend": None, # 当前趋势状态
"last_processed_time": 0
})
Các chức năng chính để xác định xu hướng:
def is_trend_continuing(self, buffer, trend_type):
"""检查趋势是否持续"""
if len(buffer) < 2:
return False
curr = buffer[-1]
prev = buffer[-2]
if trend_type == "BULL":
# 牛市:High和Low都上升
return curr["High"] > prev["High"] and curr["Low"] > prev["Low"]
elif trend_type == "BEAR":
# 熊市:High和Low都下降
return curr["High"] < prev["High"] and curr["Low"] < prev["Low"]
return False
Quản lý trạng thái xu hướng:
def analyze_trend_state(self, symbol):
"""分析趋势状态"""
storage = data[symbol]
buffer = storage["trend_buffer"]
current_trend = storage["current_trend"]
if current_trend is None:
# 尝试检测新趋势
new_trend = self.detect_new_trend(buffer)
if new_trend:
storage["current_trend"] = {
"type": new_trend,
"start_time": buffer[-2]["Time"],
"start_price": buffer[-2]["Close"],
"consecutive_days": 1
}
else:
# 检查现有趋势是否继续
if self.is_trend_continuing(buffer, current_trend["type"]):
current_trend["consecutive_days"] += 1
else:
# 趋势中断,记录完整模式
if current_trend["consecutive_days"] >= MIN_CONSECUTIVE:
# 保存趋势记录
self.save_pattern(symbol, current_trend, buffer)
Ý tưởng thiết kế chính là yêu cầu điểm cao và điểm thấpcùng lúcĐáp ứng các thay đổi liên tục và đạt được thời gian xác nhận tối thiểu là 3 ngày, có thể giảm đáng kể phán đoán sai lầm. Thống kê tỷ lệ hoàn vốn là mức tăng hoặc giảm từ giá mở cửa khi bắt đầu xu hướng đến giá đóng cửa khi kết thúc xu hướng.
Dựa trên dữ liệu lịch sử kiểm tra của nền tảng FMZ từ năm 2020 đến tháng 6 năm 2025, sau đây là hiệu suất thực tế của ba loại tiền tệ chính thống trong 10 chu kỳ xu hướng hoàn chỉnh gần đây nhất:
| kiểu | ngày bắt đầu | Ngày kết thúc | Khoảng thời gian | Năng suất |
|---|---|---|---|---|
| Thị trường gấu | 2025-05-29 | 2025-06-01 | 3 | -5.38% |
| Thị trường tăng giá | 2025-05-19 | 2025-05-22 | 3 | 6.73% |
| Thị trường tăng giá | 2025-05-06 | 2025-05-09 | 3 | 26.94% |
| Thị trường tăng giá | 2025-04-24 | 2025-04-27 | 3 | -0.17% |
| Thị trường gấu | 2025-03-25 | 2025-03-30 | 5 | -13.13% |
| Thị trường tăng giá | 2025-03-21 | 2025-03-24 | 3 | 5.04% |
| Thị trường gấu | 2025-01-06 | 2025-01-10 | 4 | -10.86% |
| Thị trường tăng giá | 2025-01-01 | 2025-01-06 | 5 | 11.2% |
| Thị trường gấu | 2024-12-17 | 2024-12-20 | 3 | -15.5% |
| Thị trường gấu | 2024-12-07 | 2024-12-10 | 3 | -9.96% |
Đặc điểm hiệu suất của ETH:
| kiểu | ngày bắt đầu | Ngày kết thúc | Khoảng thời gian | Năng suất |
|---|---|---|---|---|
| Thị trường tăng giá | 2025-06-06 | 2025-06-11 | 5 | 7.78% |
| Thị trường gấu | 2025-06-03 | 2025-06-06 | 3 | -0.78% |
| Thị trường gấu | 2025-05-27 | 2025-05-31 | 4 | -4.37% |
| Thị trường gấu | 2025-05-22 | 2025-05-25 | 3 | -2.63% |
| Thị trường tăng giá | 2025-05-06 | 2025-05-09 | 3 | 8.4% |
| Thị trường gấu | 2025-05-02 | 2025-05-05 | 3 | -2.37% |
| Thị trường tăng giá | 2025-04-20 | 2025-04-23 | 3 | 10.07% |
| Thị trường tăng giá | 2025-04-09 | 2025-04-13 | 4 | 10.25% |
| Thị trường gấu | 2025-03-26 | 2025-03-29 | 3 | -5.53% |
| Thị trường gấu | 2025-03-08 | 2025-03-11 | 3 | -5.81% |
Đặc điểm hiệu suất của BTC:
| kiểu | ngày bắt đầu | Ngày kết thúc | Khoảng thời gian | Năng suất |
|---|---|---|---|---|
| Thị trường tăng giá | 2025-06-06 | 2025-06-11 | 5 | 5.46% |
| Thị trường gấu | 2025-06-03 | 2025-06-06 | 3 | -2.73% |
| Thị trường tăng giá | 2025-05-19 | 2025-05-22 | 3 | 4.63% |
| Thị trường tăng giá | 2025-05-05 | 2025-05-10 | 5 | 11.95% |
| Thị trường tăng giá | 2025-04-20 | 2025-04-23 | 3 | 2.44% |
| Thị trường tăng giá | 2025-04-09 | 2025-04-12 | 3 | 7.63% |
| Thị trường tăng giá | 2025-03-14 | 2025-03-17 | 3 | 8.18% |
| Thị trường gấu | 2025-03-08 | 2025-03-11 | 3 | -7.49% |
| Thị trường tăng giá | 2025-02-10 | 2025-02-13 | 3 | 9.66% |
| Thị trường gấu | 2025-01-31 | 2025-02-03 | 3 | -12.2% |
Đặc điểm hiệu suất của BNB:
Khi phân tích dữ liệu của mười chu kỳ xu hướng gần đây nhất của ba loại tiền tệ này, một số hiện tượng thú vị đã được phát hiện.
Về thời gian diễn ra xu hướng
Hầu hết các xu hướng kết thúc trong khoảng 3-5 ngày, thực tế phù hợp với cảm nhận của mọi người về thị trường tiền điện tử - nó thay đổi rất nhanh. Thiết lập ban đầu là 3 ngày làm thời gian xác nhận tối thiểu hiện vẫn khá hợp lý, vì nó có thể lọc ra một số biến động ngẫu nhiên trong ngày và sẽ không bỏ lỡ cơ hội do chờ đợi quá lâu. BTC là ổn định nhất về mặt này và thời gian của xu hướng tương đối đều đặn.
Sự khác biệt về “tính chất” của các loại tiền tệ khác nhau
Ba loại tiền tệ này thực sự có những đặc điểm riêng. Hiệu suất gần đây của ETH thực sự bắt mắt hơn, và có thể là do nó đã ngồi xổm quá lâu, nên biến động phục hồi rất lớn. Từ ngày 6 đến ngày 9 tháng 5, nó có thể tăng 26,94% trong 3 ngày, điều này thật đáng ngạc nhiên, nhưng cũng có một “thị trường tăng giá” là -0,17% khiến mọi người phải gãi đầu. BTC chắc chắn ổn định hơn. Mặc dù gần đây có nhiều thị trường giảm giá hơn, nhưng biến động vẫn ở mức chấp nhận được. BNB đã mang đến cho mọi người rất nhiều bất ngờ, với thị trường tăng giá chiếm 70% và tỷ lệ rủi ro-lợi nhuận có vẻ là tốt nhất.
Một số quan sát về phán đoán xu hướng
Đánh giá từ kết quả, chỉ báo đơn giản này vẫn nắm bắt được một số khoảnh khắc quan trọng. Ví dụ, đợt tăng giá 26,94% của ETH, nhiều chu kỳ thị trường tăng giá của BTC và BNB và một số lời nhắc nhở kịp thời về thị trường giảm giá. Tất nhiên, cũng có một số điểm khó hiểu, chẳng hạn như “thị trường tăng giá” -0,17%, cho thấy thuật toán vẫn còn chỗ để cải thiện.
Thành thật mà nói, công cụ này chủ yếu giúp bạnTìm hiểu thị trường hiện tại như thế nào:
Cần phải làm rõ rằng công cụ nàyChắc chắn nó không phải để dự đoán tương lai.:
Trong quá trình vận hành thực tế cũng phát hiện một số hạn chế sau:
Phản hồi hơi chậm:Vì phải mất 3 ngày để xác nhận nên về cơ bản không thể nắm bắt được xu hướng trong vài ngày đầu
Đôi khi tôi “nhìn nhầm người”:Giống như “thị trường tăng giá” -0,17% của ETH, điều này cho thấy rằng trong một số trường hợp đặc biệt, phán đoán của thuật toán có thể sai
Thị trường đi ngang là một cơn đau đầu:Khi thị trường dao động trong một phạm vi, tín hiệu có thể thay đổi thường xuyên, điều này gây khó chịu
Chỉ nhìn vào giá thôi cũng thấy hơi đơn điệu: Không xem xét các yếu tố quan trọng như khối lượng giao dịch và tin tức
Dựa trên những quan sát trong giai đoạn này, tôi nghĩ có một số hướng để thử:
Điều chỉnh các thông số cho các loại tiền tệ khác nhau: Đối với một loại tiền tệ biến động như ETH, có thể cần các điều kiện xác nhận chặt chẽ hơn, trong khi một loại tiền tệ tương đối ổn định như BNB có thể rút ngắn thời gian xác nhận. Bạn cũng có thể đặt ngưỡng lợi nhuận tối thiểu để lọc ra các tín hiệu có lợi nhuận quá thấp.
Thêm một số phán đoán phụ trợ: Ví dụ, kết hợp các thay đổi về khối lượng giao dịch để xác minh xem xu hướng có đáng tin cậy hay không hoặc tính đến phạm vi biến động giá để tránh bị đánh lừa bởi những thay đổi nhỏ.
Tối ưu hóa chính thuật toán: Cải thiện logic phán đoán về sự gián đoạn xu hướng để giảm thiểu phán đoán sai lầm; thêm xếp hạng sức mạnh vào xu hướng để phân biệt giữa xu hướng mạnh và yếu; thiết lập cơ chế xử lý đặc biệt cho một số tình huống bất thường.
Công cụ giám sát thị trường đơn giản này thực sự biến một số khái niệm phân tích kỹ thuật truyền thống thành một hệ thống tự động. Với sự tiện lợi của nền tảng FMZ, chúng tôi đã xây dựng thành công một công cụ có thể giám sát trạng thái của thị trường tiền điện tử theo thời gian thực.
Giá trị chính của nó nằm ở việc cung cấp hồ sơ tương đối khách quan về tình hình thị trường, có thể giúp chúng ta:
Khi dữ liệu tiếp tục tích lũy, công cụ này sẽ ngày càng có giá trị hơn. Tất nhiên, đây chỉ là một trong nhiều công cụ phân tích và không thể mong đợi giải quyết được mọi vấn đề, nhưng với tư cách là điểm khởi đầu, tôi nghĩ nó vẫn rất thú vị.
'''backtest
start: 2020-01-01 00:00:00
end: 2025-06-16 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
'''
import json
from datetime import datetime
from collections import defaultdict
# 配置参数
SYMBOLS = ["ETH_USDT", "BTC_USDT", "BNB_USDT"]
MIN_CONSECUTIVE = 3 # 最少连续天数
MAX_HISTORY = 1000 # 最大历史记录数
# 全局数据存储
data = defaultdict(lambda: {
"daily_records": [], # 存储每日的昨天数据
"trend_buffer": [], # 当前趋势缓冲区
"patterns": [], # 完整的趋势模式
"current_trend": None, # 当前趋势状态
"last_processed_time": 0
})
class TrendAnalyzer:
def get_yesterday_data(self, records):
"""获取昨天的完整数据(records[-2])"""
if len(records) < 2:
return None
return records[-2] # 昨天的完整K线数据
def is_trend_continuing(self, buffer, trend_type):
"""检查趋势是否持续"""
if len(buffer) < 2:
return False
curr = buffer[-1]
prev = buffer[-2]
if trend_type == "BULL":
# 牛市:High和Low都上升
return curr["High"] > prev["High"] and curr["Low"] > prev["Low"]
elif trend_type == "BEAR":
# 熊市:High和Low都下降
return curr["High"] < prev["High"] and curr["Low"] < prev["Low"]
return False
def detect_new_trend(self, buffer):
"""从缓冲区检测新趋势"""
if len(buffer) < 2:
return None
curr = buffer[-1]
prev = buffer[-2]
# 检查是否开始牛市趋势
if curr["High"] > prev["High"] and curr["Low"] > prev["Low"]:
return "BULL"
# 检查是否开始熊市趋势
elif curr["High"] < prev["High"] and curr["Low"] < prev["Low"]:
return "BEAR"
return None
def process_daily_data(self, symbol, records):
"""处理每日数据"""
if not records or len(records) < 2:
return
storage = data[symbol]
yesterday_data = self.get_yesterday_data(records)
if not yesterday_data or yesterday_data["Time"] <= storage["last_processed_time"]:
return # 没有新的昨天数据
# 更新处理时间
storage["last_processed_time"] = yesterday_data["Time"]
# 添加到每日记录
storage["daily_records"].append(yesterday_data)
if len(storage["daily_records"]) > MAX_HISTORY:
storage["daily_records"] = storage["daily_records"][-MAX_HISTORY:]
# 添加到趋势缓冲区
storage["trend_buffer"].append(yesterday_data)
# 分析趋势
self.analyze_trend_state(symbol)
def analyze_trend_state(self, symbol):
"""分析趋势状态"""
storage = data[symbol]
buffer = storage["trend_buffer"]
current_trend = storage["current_trend"]
if len(buffer) < 2:
return
if current_trend is None:
# 尝试检测新趋势
new_trend = self.detect_new_trend(buffer)
if new_trend:
storage["current_trend"] = {
"type": new_trend,
"start_time": buffer[-2]["Time"], # 趋势从前一天开始
"start_price": buffer[-2]["Close"],
"start_open": buffer[-2]["Open"],
"consecutive_days": 1
}
Log(f"{symbol} 检测到{new_trend}趋势开始")
else:
# 没有趋势,只保留最近的数据
storage["trend_buffer"] = buffer[-1:]
else:
# 检查现有趋势是否继续
if self.is_trend_continuing(buffer, current_trend["type"]):
# 趋势继续
current_trend["consecutive_days"] += 1
# 检查是否达到最小天数要求
if current_trend["consecutive_days"] == MIN_CONSECUTIVE:
trend_name = "牛市" if current_trend["type"] == "BULL" else "熊市"
Log(f"{symbol} {trend_name}趋势确认! 连续{MIN_CONSECUTIVE}天")
else:
# 趋势中断
if current_trend["consecutive_days"] >= MIN_CONSECUTIVE:
# 记录完整的趋势
end_data = buffer[-2] # 趋势在前一天结束
duration = current_trend["consecutive_days"]
start_price = current_trend["start_open"]
end_price = end_data["Close"]
return_pct = round((end_price - start_price) / start_price * 100, 2)
storage["patterns"].append({
"trend": current_trend["type"],
"start_time": current_trend["start_time"],
"end_time": end_data["Time"],
"duration": duration,
"return": return_pct
})
trend_name = "牛市" if current_trend["type"] == "BULL" else "熊市"
Log(f"{symbol} {trend_name}趋势结束,持续{duration}天,收益{return_pct}%")
# 重置趋势状态,重新开始检测
storage["current_trend"] = None
storage["trend_buffer"] = buffer[-2:] # 保留最近两天数据重新开始
# 立即检测新趋势
self.analyze_trend_state(symbol)
def generate_tables():
"""生成所有统计表格"""
tables = []
# 概览表
overview_rows = []
for symbol in SYMBOLS:
storage = data[symbol]
if not storage["daily_records"]:
continue
patterns = storage["patterns"]
current_trend = storage["current_trend"]
# 计算统计数据
bull_patterns = [p for p in patterns if p["trend"] == "BULL"]
bear_patterns = [p for p in patterns if p["trend"] == "BEAR"]
stats = {
"bull_avg_return": round(sum(p["return"] for p in bull_patterns) / len(bull_patterns), 2) if bull_patterns else 0,
"bear_avg_return": round(sum(p["return"] for p in bear_patterns) / len(bear_patterns), 2) if bear_patterns else 0,
"bull_avg_days": round(sum(p["duration"] for p in bull_patterns) / len(bull_patterns), 1) if bull_patterns else 0,
"bear_avg_days": round(sum(p["duration"] for p in bear_patterns) / len(bear_patterns), 1) if bear_patterns else 0
}
# 当前状态
current_status = "震荡"
current_return = 0
current_days = 0
consecutive = 0
if current_trend and storage["daily_records"]:
latest_price = storage["daily_records"][-1]["Close"]
start_price = current_trend["start_open"]
current_return = round((latest_price - start_price) / start_price * 100, 2)
current_days = current_trend["consecutive_days"]
current_status = "牛市" if current_trend["type"] == "BULL" else "熊市"
consecutive = current_trend["consecutive_days"]
overview_rows.append([
symbol.replace("_USDT", ""),
current_status,
str(current_days),
f"{current_return}%",
str(consecutive),
str(len(bull_patterns)),
str(len(bear_patterns)),
f"{stats['bull_avg_return']}%",
f"{stats['bear_avg_return']}%",
f"{stats['bull_avg_days']}天",
f"{stats['bear_avg_days']}天"
])
tables.append({
"type": "table",
"title": "每日高低价趋势监控(基于昨日完整数据)",
"cols": ["币种", "状态", "持续", "收益", "强度", "牛市次数", "熊市次数", "牛市均收益", "熊市均收益", "牛市均天数", "熊市均天数"],
"rows": overview_rows
})
# 趋势缓冲区分析表
buffer_rows = []
for symbol in SYMBOLS:
storage = data[symbol]
buffer = storage["trend_buffer"]
current_trend = storage["current_trend"]
if not buffer:
continue
latest_price = buffer[-1]["Close"]
buffer_size = len(buffer)
# 显示最近几天的High/Low变化
if len(buffer) >= 2:
recent_highs = [f"{r['High']:.0f}" for r in buffer[-min(5, len(buffer)):]]
recent_lows = [f"{r['Low']:.0f}" for r in buffer[-min(5, len(buffer)):]]
high_trend = " → ".join(recent_highs)
low_trend = " → ".join(recent_lows)
else:
high_trend = f"{buffer[-1]['High']:.0f}"
low_trend = f"{buffer[-1]['Low']:.0f}"
trend_status = "无趋势"
if current_trend:
trend_status = f"{'牛市' if current_trend['type'] == 'BULL' else '熊市'}{current_trend['consecutive_days']}天"
buffer_rows.append([
symbol.replace("_USDT", ""),
f"{latest_price:.2f}",
trend_status,
str(buffer_size),
high_trend,
low_trend
])
tables.append({
"type": "table",
"title": "趋势缓冲区状态",
"cols": ["币种", "价格", "当前趋势", "缓冲区", "High变化", "Low变化"],
"rows": buffer_rows
})
# 历史记录表
for symbol in SYMBOLS:
patterns = [p for p in data[symbol]["patterns"] if p["duration"] >= MIN_CONSECUTIVE]
coin_name = symbol.replace("_USDT", "")
if not patterns:
tables.append({
"type": "table",
"title": f"{coin_name} 历史趋势",
"cols": ["类型", "开始", "结束", "天数", "收益"],
"rows": [["无数据", "-", "-", "-", "-"]]
})
continue
rows = []
for p in sorted(patterns, key=lambda x: x["end_time"], reverse=True)[:10]: # 只显示最近10条
rows.append([
"牛市" if p["trend"] == "BULL" else "熊市",
datetime.fromtimestamp(p["start_time"] / 1000).strftime('%Y-%m-%d'),
datetime.fromtimestamp(p["end_time"] / 1000).strftime('%Y-%m-%d'),
str(p["duration"]),
f"{p['return']}%"
])
tables.append({
"type": "table",
"title": f"{coin_name} 历史趋势",
"cols": ["类型", "开始", "结束", "天数", "收益"],
"rows": rows
})
return tables
def main():
analyzer = TrendAnalyzer()
Log("趋势分析系统启动 - 基于昨日完整数据的逐日分析")
Log("牛市定义: High和Low连续上升≥3天")
Log("熊市定义: High和Low连续下降≥3天")
while True:
try:
# 处理每个币种的数据
for symbol in SYMBOLS:
records = exchange.GetRecords(symbol)
analyzer.process_daily_data(symbol, records)
# 生成并显示表格
tables = generate_tables()
LogStatus('`' + json.dumps(tables) + '`')
except Exception as e:
Log(f"错误: {str(e)}")
Sleep(1000 * 60 * 60) # 24小时
def onexit():
total = sum(len(data[s]["patterns"]) for s in SYMBOLS)
Log(f"系统停止, 共识别 {total} 个趋势模式")