精准成交量分析指标
显示 Tick 量、真实成交量、均线及买卖力量对比,识别异常放量
MT5 真机运行截图 · 服务器把编译好的 EX5 挂到黄金 H1 图表上截的,你装上去看到的就是这个样子
#property copyright "XAUOF 指标工坊"
#property version "1.10"
#property strict
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots 4
// 绘图1:买方成交量(绿色柱)
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrLimeGreen
#property indicator_width1 3
#property indicator_label1 "买方量"
// 绘图2:卖方成交量(红色柱)
#property indicator_type2 DRAW_HISTOGRAM
#property indicator_color2 clrRed
#property indicator_width2 3
#property indicator_label2 "卖方量"
// 绘图3:异常放量买(亮绿色加粗柱)
#property indicator_type3 DRAW_HISTOGRAM
#property indicator_color3 clrLime
#property indicator_width3 5
#property indicator_label3 "异常买量"
// 绘图4:异常放量卖(深红色加粗柱)
#property indicator_type4 DRAW_HISTOGRAM
#property indicator_color4 clrMaroon
#property indicator_width4 5
#property indicator_label4 "异常卖量"
//--- 输入参数
input int InpMAPeriod = 20; // 成交量均线周期(识别放量/缩量基准)
input double InpAbnormalRatio = 1.8; // 异常放量阈值(倍数,超过均线此倍数视为放量)
input bool InpUseRealVolume = true; // 优先使用真实成交量(如果可用)
input bool InpShowVolumeMA = true; // 在图表标题显示均线数值
//--- 指标缓冲区
double BuyVolumeBuffer[]; // 普通买方量
double SellVolumeBuffer[]; // 普通卖方量
double BuyAbnormalBuffer[]; // 异常买方量
double SellAbnormalBuffer[]; // 异常卖方量
double VolumeMABuffer[]; // 成交量均线(用于判断,不绘图)
double RawVolumeBuffer[]; // 原始成交量(中间计算用)
//--- 全局变量
int volumeMAHandle = INVALID_HANDLE;
bool hasRealVolume = false;
//+------------------------------------------------------------------+
//| 自定义指标初始化 |
//+------------------------------------------------------------------+
int OnInit()
{
//--- 绑定缓冲区(前4个是绘图,后2个是计算辅助)
SetIndexBuffer(0, BuyVolumeBuffer, INDICATOR_DATA);
SetIndexBuffer(1, SellVolumeBuffer, INDICATOR_DATA);
SetIndexBuffer(2, BuyAbnormalBuffer, INDICATOR_DATA);
SetIndexBuffer(3, SellAbnormalBuffer, INDICATOR_DATA);
SetIndexBuffer(4, VolumeMABuffer, INDICATOR_CALCULATIONS);
SetIndexBuffer(5, RawVolumeBuffer, INDICATOR_CALCULATIONS);
//--- 设置空值
PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0);
PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0);
PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, 0);
PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, 0);
//--- 检测是否有真实成交量
long volumeType[1];
if(CopyTickVolume(_Symbol, PERIOD_CURRENT, 0, 1, volumeType) > 0)
{
hasRealVolume = (volumeType[0] > 0);
}
//--- 创建成交量均线句柄(对成交量做 SMA)
// 注意:iMA 不能直接对 volume 做均线,需要在 OnCalculate 里手动计算
//--- 设置指标名称
string volumeTypeName = (InpUseRealVolume && hasRealVolume) ? "真实成交量" : "Tick量";
IndicatorSetString(INDICATOR_SHORTNAME, "精准成交量分析 (" + volumeTypeName + ", MA" + IntegerToString(InpMAPeriod) + ")");
IndicatorSetInteger(INDICATOR_DIGITS, 0);
//--- 设置副图最小值为0(成交量不会是负数)
IndicatorSetInteger(INDICATOR_LEVELCOLOR, clrSilver);
IndicatorSetInteger(INDICATOR_LEVELSTYLE, STYLE_DOT);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 自定义指标迭代 |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
if(rates_total < InpMAPeriod) return 0;
int start = (prev_calculated > InpMAPeriod) ? prev_calculated - 1 : InpMAPeriod;
//--- 初始化缓冲区(首次计算)
if(prev_calculated == 0)
{
ArrayInitialize(BuyVolumeBuffer, 0);
ArrayInitialize(SellVolumeBuffer, 0);
ArrayInitialize(BuyAbnormalBuffer, 0);
ArrayInitialize(SellAbnormalBuffer, 0);
}
for(int i = start; i < rates_total && !IsStopped(); i++)
{
if(i < 1) continue; // 需要前一根K线做对比
//--- 获取原始成交量(优先真实量,否则用 tick 量)
double vol = 0;
if(InpUseRealVolume && hasRealVolume && volume[i] > 0)
{
vol = (double)volume[i];
}
else
{
vol = (double)tick_volume[i];
}
RawVolumeBuffer[i] = vol;
//--- 计算成交量移动平均
double sumVol = 0;
int count = 0;
for(int j = 0; j < InpMAPeriod; j++)
{
if(i - j < 0) break;
sumVol += RawVolumeBuffer[i - j];
count++;
}
VolumeMABuffer[i] = (count > 0) ? sumVol / count : 0;
//--- 判断买卖方向(阳线=买方、阴线=卖方、十字星=平分)
bool isBullish = (close[i] > open[i]);
bool isBearish = (close[i] < open[i]);
//--- 判断是否异常放量
bool isAbnormal = (VolumeMABuffer[i] > 0) && (vol > VolumeMABuffer[i] * InpAbnormalRatio);
//--- 分配到对应缓冲区
BuyVolumeBuffer[i] = 0;
SellVolumeBuffer[i] = 0;
BuyAbnormalBuffer[i] = 0;
SellAbnormalBuffer[i] = 0;
if(isBullish)
{
if(isAbnormal)
BuyAbnormalBuffer[i] = vol; // 异常买量用亮绿色
else
BuyVolumeBuffer[i] = vol; // 普通买量用绿色
}
else if(isBearish)
{
if(isAbnormal)
SellAbnormalBuffer[i] = vol; // 异常卖量用深红色
else
SellVolumeBuffer[i] = vol; // 普通卖量用红色
}
else // 十字星(开收平)
{
// 平分成交量,按前一根K线方向倾向
if(close[i-1] > open[i-1])
BuyVolumeBuffer[i] = vol * 0.5;
else
SellVolumeBuffer[i] = vol * 0.5;
}
//--- 在图表标题显示当前均线值(可选)
if(InpShowVolumeMA && i == rates_total - 1)
{
string comment = StringFormat("成交量均线(MA%d): %.0f", InpMAPeriod, VolumeMABuffer[i]);
Comment(comment);
}
}
return rates_total;
}
//+------------------------------------------------------------------+
//| 指标反初始化 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Comment(""); // 清除图表注释
if(volumeMAHandle != INVALID_HANDLE)
{
IndicatorRelease(volumeMAHandle);
}
}
//+------------------------------------------------------------------+作品说明
从您的需求来看,您需要一个能精确显示成交量和交易量的指标。MT5 默认的成交量指标比较简单,我会做一个增强版,同时显示:
- Tick Volume(报价次数):MT5 默认提供的成交量
- Real Volume(真实成交量):如果经纪商提供(期货、股票有,外汇大多没有)
- 成交量移动平均线:帮助识别放量/缩量
- 买卖力量对比:用 K 线颜色判断是买方还是卖方主导
副图用柱状图显示,颜色区分多空,超过均线的用高亮色标记异常放量。
使用说明
安装方法:
- 将代码保存为
PreciseVolume.mq5 - 放入
数据文件夹/MQL5/Indicators目录 - 重启 MT5 或在导航器中右键「刷新」
- 拖到图表上,会在副图窗口显示成交量柱状图
参数说明:
- 成交量均线周期:默认 20,用于计算平均成交量。周期越大越平滑,20-30 适合日内,50-100 适合日线级别
- 异常放量阈值:默认 1.8 倍,成交量超过均线此倍数时用高亮柱标记。1.5-2.0 是常用范围,越
已手动停止生成。
AI 解读根据源码逐行分析写成,供参考,以实际运行为准
这是什么
这是一个增强版成交量指标,在副图用四种颜色的柱状图显示:普通买量(绿)、普通卖量(红)、异常买量(亮绿加粗)、异常卖量(深红加粗)。通过 K 线涨跌判断买卖方力量,用成交量均线识别放量缩量,帮你在量价配合时抓住行情启动信号。
逻辑原理
指标从两个数据源取成交量:有真实成交量数据的品种(期货、股票)优先用真实量,外汇等品种用 Tick 量(报价变动次数)。
每根 K 线的成交量按涨跌分配:阳线(收盘>开盘)算买方量,阴线算卖方量,十字星(开收相等)按前一根方向倾向各分一半。
同时计算最近 N 根 K 线的成交量移动平均(默认 20 周期),当某根 K 线的量超过均线的 1.8 倍时,标记为异常放量,用加粗柱高亮显示。这样你能一眼看出:当前是买方还是卖方主导,量能是放大还是萎缩。
参数说明
- 成交量均线周期(默认 20):计算平均成交量的 K 线根数,用作判断放量缩量的基准。日内短线用 10-20,日线级别用 50-100
- 异常放量阈值(默认 1.8):成交量超过均线多少倍算异常。1.5 倍较敏感会频繁标记,2.0 倍以上只抓极端放量
- 优先使用真实成交量(默认 true):如果经纪商提供真实成交量数据就用真实量,否则自动回退到 Tick 量。外汇品种通常没有真实量
- 在图表标题显示均线数值(默认 true):在副图窗口顶部实时显示当前成交量均线值
怎么用
将 mq5 文件放到 MT5 的数据文件夹 MQL5/Indicators 目录,重启 MT5 或在导航器刷新后,拖到任意品种任意周期的图表上,会在下方副图窗口显示四色柱状图。
看柱子颜色判断买卖力量:连续绿柱表示买方持续进场,连续红柱表示卖方占优。重点关注加粗的亮绿或深红柱,那是异常放量信号——突然放量配合价格突破或反转时,往往是行情启动的标志;如果放量后价格没跟上,可能是假突破或多空分歧加剧。
结合 K 线形态使用效果更好:突破关键位时出现异常买量,确认突破有效;下跌途中出现异常卖量,说明抛压沉重要回避。
适用场景
适合所有品种和周期,但真实成交量数据只在期货、股票、少数 ECN 外汇商可用,大部分外汇经纪商只能用 Tick 量(Tick 量在外汇市场也有参考价值,报价频繁说明市场活跃)。
日内短线(M5-H1)用 10-20 周期均线,捕捉快速放量;波段交易(H4-D1)用 50-100 周期,过滤日常波动只抓大级别量能变化。
最适合趋势突破和反转确认场景:放量突破压力位做多,放量跌破支撑做空。震荡行情中成交量参考意义较弱,横盘时量能自然萎缩,别误判为信号。
风险提示
成交量是滞后指标,放量出现时价格已经走了一段,追高追低容易被套。异常放量可能是主力对倒或洗盘,不是所有放量都跟趋势,需结合价格结构和支撑阻力综合判断。
Tick 量不等于真实成交量,外汇市场 Tick 量只反映报价频率,高频报价未必有大资金进场。节假日、重大新闻前后 Tick 量会异常波动,此时信号可靠性下降。
指标用 K 线颜色简单判断买卖方向,十字星和小实体 K 线可能分类不准。极端行情(跳空、闪崩)单根 K 线成交量暴增会扭曲均线,建议配合价格形态和趋势指标过滤信号,不要单独依赖成交量做交易决策。
常见问题
- 这个指标的成交量是真实成交量还是 Tick 量?
- 代码会优先尝试读取真实成交量,如果经纪商不提供(大部分外汇平台没有)就自动用 Tick 量。装上后看指标标题,会显示当前用的是哪种量。
- 异常放量的阈值 1.8 倍怎么调?
- 1.8 是经验值,抓中等偏强的放量。想更敏感就调到 1.5,会频繁标记;只要极端放量就调到 2.5 或 3.0。建议先用默认值跑一周历史,看标记频率是否合适再调。
- 为什么有时候 K 线是阳线但显示的是红色卖量柱?
- 不会出现这种情况。代码逻辑是阳线(收盘>开盘)固定分到买方量(绿色或亮绿),阴线分到卖方量(红色或深红)。如果看到颜色不对,检查图表是否叠加了其他成交量指标。
- 这个指标可以用在黄金、原油、股指期货吗?
- 可以,所有品种所有周期都能用。期货和股票有真实成交量数据,信号比外汇更可靠。商品期货(黄金、原油)和股指期货的成交量对趋势确认很有效。
- 副图窗口的柱子太矮看不清怎么办?
- 右键点副图窗口边界选"窗口属性",调整"固定最大值"或拉高窗口。也可以缩短成交量均线周期(比如从 20 改到 10),基准降低后异常放量会更突出。
Precise Volume Analysis Indicator for MT5
A volume indicator that displays buy/sell volume in four colors, identifies abnormal volume spikes with moving average baseline, supports both real volume and tick volume, suitable for intraday and swing traders.
Source code is shown above. Compiled EX5 files are available to VIP members.
评论
还没有人评论,来抢个沙发。