8.7. Money Flow Indicators (Chỉ báo dòng tiền)
8.7.1. Multi Color Dragon Extended (MCDX)
Chỉ báo MCDX (Multi Color Dragon Extended) là một công cụ phân tích kỹ thuật giúp nhà đầu tư nhận diện dòng tiền tạo lập và xu hướng đầu tư trên thị trường chứng khoán. Chỉ báo này sử dụng các màu sắc khác nhau để phân biệt các nhóm nhà đầu tư: màu đỏ đại diện cho nhà đầu tư lớn (Banker), màu xanh cho nhà đầu tư nhỏ lẻ (Retailer) và màu vàng cho nhà đầu cơ (Hot Money). Nhà đầu tư có thể sử dụng MCDX để theo dõi dòng tiền và đưa ra quyết định mua bán cổ phiếu phù hợp.
def mcdx_banker(close: pandas.Series, rsi_base_banker: int = 50, rsi_period_banker: int = 50, rsi_base_hot_money: int = 30, rsi_period_hot_money: int = 40, sensitivity_banker: float = 1.5, sensitivity_hot: float = 0.7, banker_ma: int = 10)
def mcdx_hot_money(close: pandas.Series, rsi_base_banker: int = 50, rsi_period_banker: int = 50, rsi_base_hot_money: int = 30, rsi_period_hot_money: int = 40, sensitivity_banker: float = 1.5, sensitivity_hot: float = 0.7, banker_ma: int = 10)
def mcdx_retail(close: pandas.Series, rsi_base_banker: int = 50, rsi_period_banker: int = 50, rsi_base_hot_money: int = 30, rsi_period_hot_money: int = 40, sensitivity_banker: float = 1.5, sensitivity_hot: float = 0.7, banker_ma: int = 10)Tham số
close
Cột chứa giá đóng cửa.
pandas.Series
rsi_base_banker
Mức ngưỡng RSI nền (base) của dòng tiền Banker (smart money). Đại diện cho mức “trung hòa” mà trên đó được coi là dòng tiền lớn đang vào.
int
50
rsi_period_banker
Chu kỳ RSI dùng để tính dòng tiền Banker. Chu kỳ dài → đo động lượng dài hạn → phản ánh tích lũy/phân phối dài.
int
50
rsi_base_hot_money
Ngưỡng RSI nền cho dòng tiền Hot money (đầu cơ ngắn hạn, lướt sóng). Thấp hơn rsi_base_banker vì hot money nhạy hơn, vào sớm, rút sớm.
int
30
rsi_period_hot_money
Chu kỳ RSI cho dòng tiền Hot money (ngắn hơn banker). Mặc định = 40 → phản ứng nhanh hơn, phù hợp nhịp trading ngắn hạn.
int
40
sensitivity_banker
Hệ số nhạy điều chỉnh độ mạnh của dòng tiền Banker. Càng lớn → đường Banker tăng nhanh khi RSI vượt ngưỡng → dễ thấy khi dòng tiền lớn thật sự vào (thường trong khoảng 1.2 – 1.8).
float
1.5
sensitivity_hot
Hệ số nhạy cho dòng tiền Hot money. Vì dòng này biến động nhanh, nên hệ số < 1 để tránh nhiễu quá mức (thường từ 0.5 – 0.8).
float
0.7
banker_ma
Độ dài trung bình động (Moving Average) để làm mượt đường Banker. Giúp loại bỏ nhiễu ngắn hạn, dễ nhìn xu hướng dòng tiền lớn.
int
10
Ví dụ:
fi = client.FiinIndicator()
df["banker"] = fi.mcdx_banker(df["close"], rsi_base_banker=50, rsi_period_banker=50, rsi_base_hot_money=30, rsi_period_hot_money=40, sensitivity_banker=1.5, sensitivity_hot=0.7, banker_ma=10)
df["hotmoney"] = fi.mcdx_hot_money(df["close"], rsi_base_banker=50, rsi_period_banker=50, rsi_base_hot_money=30, rsi_period_hot_money=40, sensitivity_banker=1.5, sensitivity_hot=0.7, banker_ma=10)
df["retail"] = fi.mcdx_retail(df["close"], rsi_base_banker=50, rsi_period_banker=50, rsi_base_hot_money=30, rsi_period_hot_money=40, sensitivity_banker=1.5, sensitivity_hot=0.7, banker_ma=10)
print(df)Biểu đồ trực quan:

Source code:
import pandas as pd
import matplotlib.pyplot as plt
import mplfinance as mpf
from FiinQuantX import FiinSession
username = "REPLACE_WITH_YOUR_USERNAME"
password = "REPLACE_WITH_YOUR_PASSWORD"
client = FiinSession(username=username, password=password).login()
df = client.Fetch_Trading_Data(
realtime=False,
tickers=["MWG"],
fields=["open","high","low","close"],
adjusted=True,
by="1d",
from_date="2024-10-23",
lasted=True
).get_data()
fi = client.FiinIndicator()
df["banker"] = fi.mcdx_banker(df["close"])
df["hotmoney"] = fi.mcdx_hot_money(df["close"])
df["retail"] = fi.mcdx_retail(df["close"])
df['timestamp'] = pd.to_datetime(df['timestamp'])
df.set_index('timestamp', inplace=True)
# --- Vẽ biểu đồ ---
fig = mpf.figure(style='yahoo', figsize=(12, 8))
# Biểu đồ nến (trên)
ax1 = fig.add_subplot(2, 1, 1)
mpf.plot(df, type='candle', ax=ax1)
ax1.set_title('Biểu đồ nến MWG')
# Biểu đồ MCDX (dưới)
ax2 = fig.add_subplot(2, 1, 2, sharex=ax1)
# Dùng numeric index để khớp trục với mplfinance
x = range(len(df))
# Bar chart đè nhau
width = 0.5
ax2.bar(x, df['banker'] + df['hotmoney'] + df['retail'], width=width, color='green', label='Retail')
ax2.bar(x, df['banker'] + df['hotmoney'], width=width, color='gold', label='Hot Money')
ax2.bar(x, df['banker'], width=width, color='red', label='Banker')
ax2.set_title('MCDX - Dòng tiền thông minh')
ax2.legend()
ax2.grid(True, linestyle='--', alpha=0.3)
plt.tight_layout()
plt.show()
Last updated