ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

主升浪买点确认指标源码解析:基于麦语言的量化捕捉策略

主升浪买点确认指标源码解析:基于麦语言的量化捕捉策略

很多人在盯盘时都有过这种经历:行情已经启动,K线一根接一根往上冲,但等你想进场的时候,价格已经在半山腰,追进去就遇到回调,不追又看着它一路狂奔。其实这种行情就是典型的主升浪特征,而问题的核心不在于你能不能看到它,而在于你能不能提前用一套明确的标准去定义它、捕捉它。我平时在软件里写指标,最喜欢做的事就是把这种模糊的盘感转化为可执行的程序化信号。今天就把这套主升浪买点确认指标源码拿出来,完整拆解一遍设计思路和实现细节,顺便把我踩过的坑也一并说了。

这套指标基于文华财经的麦语言编写,核心逻辑围绕趋势方向、量能配合、动能共振三个维度展开,输出的不是一长串复杂的画线,而是一个足够明确的“买点确认”信号。它适合正在做短线波段、或者想捕捉趋势加速段的交易者参考,也适合刚接触指标编程、想搞懂麦语言如何落地真实策略的朋友。看完之后你不仅能直接拿去用,还能根据自己操作的品种周期去调整参数、优化逻辑。

1. 内容整体设计与思路拆解

1.1 主升浪的定义与识别难点

所谓主升浪,简单理解就是一轮上涨趋势中涨幅最大、速度最快、持续性最好的那个阶段。它通常出现在底部横盘整理结束之后,也可能出现在趋势中段的加速期。识别主升浪最大的难点在于:任何一段上涨在发生之前,都只是“疑似主升浪”,只有事后回头看才能100%确认。所以指标的作用不是预测未来,而是用一系列历史条件去提高判断的胜率,在行情启动初期给出一个相对早、相对可靠的提醒。

从技术分析角度看,主升浪启动前一般具备三个共性特征:均线系统由粘合转为多头发散、成交量出现明显放大、MACD等动能指标同步走强。这三者缺一都有可能导致信号质量下降。比如均线多头但没放量,可能是缩量反弹,持续性存疑;放量但均线尚未理顺,可能是底部第一波异动,后面还有反复。因此指标设计的第一步,就是把这三个维度分别量化,再通过“共振”的方式合并成一个买入信号。

1.2 选中麦语言作为实现工具的原因

文华财经的麦语言在圈子里的普及度非常高,尤其是面向国内期货市场和部分股票软件的用户。它的优势在于语法足够简洁,常用的技术指标函数都有内置支持,像MA、EMA、CROSS、HHV、LLV这些,写起来很顺手。相比其他平台的语言,麦语言对于不擅长编程的人来说门槛低很多,几乎就是“按技术分析思路直译成代码”。

另一个考虑点是信号的稳定性。麦语言本身运行在软件内核中,数据处理效率高,尤其是在分钟周期上做实时监控时,响应速度让人放心。我自己在多个周期上跑过这套指标,无论是日线的波段确认,还是15分钟级别的短线加速,运行都很流畅。当然,麦语言也有它的限制——不能像通用编程语言那样做复杂的循环和对象处理,但用来表达主升浪这种基于经典指标的逻辑,已经绰绰有余。

2. 核心源码逻辑与实现要点

2.1 指标源码主体展示

先贴上完整的源码,然后逐段拆解。这里我用的是文华财经麦语言的语法,大家直接新建技术指标,把代码复制进去就能编译。

{主升浪买点确认指标源码} N1:=5; N2:=10; N3:=20; MA5:=MA(CLOSE,N1); MA10:=MA(CLOSE,N2); MA20:=MA(CLOSE,N3); 多头排列:=MA5>MA10 AND MA10>MA20 AND MA20>REF(MA20,3); VOL5:=MA(VOL,5); 量比:=VOL/VOL5; 放量:=量比>=1.5 AND VOL>REF(VOL,1); DIFF:=EMA(CLOSE,12)-EMA(CLOSE,26); DEA:=EMA(DIFF,9); MACD:=2*(DIFF-DEA); DIF上穿:=CROSS(DIFF,DEA); 红柱放大:=MACD>REF(MACD,1) AND MACD>0; 启动确认:=多头排列 AND 放量 AND (DIF上穿 OR 红柱放大); 回踩不破:=LOW>=MA10 OR LOW>=MA20; 二次启动:=REF(启动确认,1) AND 回踩不破 AND MA5>REF(MA5,1); 买点:=启动确认 OR 二次启动; 买点过滤:=FILTER(买点,5); DRAWICON(买点过滤,LOW,1); DRAWTEXT(买点过滤,LOW*0.98,'主升浪买点'); STICKLINE(买点过滤,LOW,HIGH,0,0),COLORRED;

这段代码总共不到三十行,但包含了我上面提到的所有核心判断。接下来把每一块的逻辑说明白。

2.2 趋势方向与均线系统

第一段定义的是均线参数和趋势方向判断。N1、N2、N3分别对应5日、10日、20日均线,这套参数是短中期搭配里比较常用的组合,既能反映短期走势的强弱变化,又能过滤掉一部分日内杂音。

MA5:=MA(CLOSE,N1); MA10:=MA(CLOSE,N2); MA20:=MA(CLOSE,N3); 多头排列:=MA5>MA10 AND MA10>MA20 AND MA20>REF(MA20,3);

这里最值得注意的是“MA20>REF(MA20,3)”这个条件。它不只要求20日均线向上,还要求它已经连续向上至少3个周期。为什么要加这个限制?因为20日均线刚刚拐头的时候,大概率还在底部区域震荡,这时候均线方向不稳定,很容易被一根阴线再打回去。要求它向上3天以上,相当于确认中期趋势已经从走平转为明确抬头,这时候再去找买点,胜率会明显提高。

多头排列这个条件如果用一句话来解释,就是短均线在最上面、中均线在中间、长均线在最下面,同时长均线还在向上走。这种排列形态是趋势行情的标配,但单纯的排列还不够,因为它可能出现在一波上涨的末期,那时候虽然均线还是多头排列,但价格已经离均线太远,随时面临回踩风险。所以还需要量能和动能的配合。

2.3 量能放大与真实放量判断

量能部分我用了两条判断:一条是量比,一条是当日成交量是否大于昨日。

VOL5:=MA(VOL,5); 量比:=VOL/VOL5; 放量:=量比>=1.5 AND VOL>REF(VOL,1);

量比的计算方式是把当日成交量除以5日均量,这个比值能直观反映当天成交的活跃程度。1.5倍这个阈值是我经过多品种复盘后确定的一个中间值。定得太低,比如1.2,很多普通波动也会被当成放量,进场信号会变多,但准确率明显下降;定得太高,比如2.5,又会错过一些温和放量的启动行情,尤其是流通盘比较大的品种,很少出现暴量拉升的走势。目前用1.5倍在螺纹、甲醇、豆粕这类主力品种上表现比较均衡。

第二条件“VOL>REF(VOL,1)”看起来简单,其实作用很大。它要求今天要比昨天放量,而不是仅仅比过去5天平均量高。因为有些时候可能出现那种“前面连续缩量、今天稍微放量但还是不大”的情况,或者某天因为数据异常出现平滑后的均量偏高,导致量比失真。加上这个当日递增条件之后,信号会更贴近“资金正在进场”的真实状态。

这里有一点要特别说明:成交量指标在文华财经里直接写作VOL,如果你在股票软件里用,量单位是手,在期货软件里则是双边成交量,不同市场的数量级差异很大。好在量比是一个相对值,不受绝对数量级影响,所以这套代码在不同市场之间迁移时,量能部分基本不需要改参数,这也是我坚持用比值而不是绝对值的原因。

2.4 动能指标与MACD共振

动能判断我采用的MACD指标,这是判断趋势延续性最经典的指标之一。代码部分如下:

DIFF:=EMA(CLOSE,12)-EMA(CLOSE,26); DEA:=EMA(DIFF,9); MACD:=2*(DIFF-DEA); DIF上穿:=CROSS(DIFF,DEA); 红柱放大:=MACD>REF(MACD,1) AND MACD>0;

这里设计了两个可以触发共振的条件:一个是DIFF上穿DEA形成金叉,另一个是红柱持续放大。金叉意味着动能由弱转强的拐点出现,适合捕捉刚启动的主升浪;红柱放大则说明多头动能还在持续增强,适合捕捉主升浪中段的加速行情。两个条件用“或”连接,而不是要求同时满足,是为了适应不同启动节奏的行情——有些主升浪是金叉后直接加速,有些是金叉后横盘几天再加速,如果要求两个条件同时成立,会漏掉很多后半段行情。

需要留意的是,MACD参数我刻意保持了系统默认的12、26、9,没有做特殊优化。原因很简单,MACD的敏感性主要由EMA的平滑系数决定,改小参数比如DIFF用8、DEA用5,确实能让金叉出现得更早,但也会带来更多假信号。主升浪本来就讲究“宁可错过,不可做错”,一旦被假金叉骗进去,止损成本远大于错过一小段行情的代价。所以在动能指标上,我建议优先保证信号的稳定而不是速度。

3. 买点触发路径与信号过滤机制

3.1 首次启动条件与二次启动路径

整个指标的买点逻辑分两条路径触发,我分别称为“首次启动确认”和“二次启动确认”。

启动确认:=多头排列 AND 放量 AND (DIF上穿 OR 红柱放大); 回踩不破:=LOW>=MA10 OR LOW>=MA20; 二次启动:=REF(启动确认,1) AND 回踩不破 AND MA5>REF(MA5,1);

首次启动确认就是三个维度全部共振:均线多头、量能放大、动能走强。这个信号对应的是主升浪第一波起涨点,理论上是成本最优的位置,但实际操作中这个信号出现的频率并不高,因为要三个条件同时满足,意味着必须是在一个比较标准的技术形态下才会触发。

二次启动是我比较偏爱的一条路径,它的含义是:前一天已经出现过启动确认信号,但当天价格小幅回踩,没有跌破10日或20日均线,然后短期均线又重新向上,说明回调结束、重新走强。这种“回踩不破再启动”的形态,在实战中往往比第一波追涨更容易拿得住,因为进场位置不是最高点,止损也更好设置——直接放在10日均线或20日均线下方即可。

回踩不破这个条件里用了“OR”而不是强行要求不破10日均线,是因为不同品种的波动幅度差异很大。像股指期货、原油这类波动大的品种,正常回踩可能就会触及10日线,但趋势未必破坏;而波动小的品种,连5日线都不该破。用10日或20日线的“或”关系,相当于是给不同波动率的品种留了一个自适应空间。

3.2 FILTER函数过滤连续信号

买点信号合并之后,最后一层过滤用的是FILTER函数。

买点:=启动确认 OR 二次启动; 买点过滤:=FILTER(买点,5);

FILTER的作用是:当一个条件成立后,在接下来指定的周期数内不再重复输出信号。这里设置为5,意思是买入信号出现后5根K线内,即使条件再次满足也不会重复提示。这个过滤非常重要,因为在主升浪行情里,一旦启动确认,接下来几天可能每天都是“多头排列+放量+红柱放大”,如果不做过滤,屏幕上会连续出现七八个买点提示,既干扰判断,又容易让人在错误的位置反复加仓。

FILTER函数本身的逻辑是“首次触发后屏蔽N周期”,它不会移动历史信号,这点可以放心。但要注意它和“REF”配合时的时序关系——如果你把FILTER放在REF外面,相当于先过滤再判断前值,语义就变了。我自己的习惯是先合并所有逻辑条件,最后一步再做过滤,这样思路最清晰,排查问题也方便。

3.3 画线输出与可读性优化

最后是输出部分,我用了图标、文字和柱线三种方式:

DRAWICON(买点过滤,LOW,1); DRAWTEXT(买点过滤,LOW*0.98,'主升浪买点'); STICKLINE(买点过滤,LOW,HIGH,0,0),COLORRED;

DRAWICON在K线最低价位置画一个图标,DRAWTEXT在最低价下方标注文字,STICKLINE则把当根K线涂成红色实体。这样组合的好处是:即使你把指标叠加在其他主图指标上,买点信号依然非常醒目,一眼就能看到。文字标注我用的是“主升浪买点”,如果你想改成其他提示语,只要把引号里面的内容替换掉即可,不影响任何逻辑。

这里插一句,DRAWICON的最后一个参数是图标编号,1代表默认的向上箭头图标,在文华财经里取值范围是1到6。我个人建议使用1或2,一个箭头一个圆点,它们最简洁,不遮挡K线。3到6号图标在部分软件版本里图案较大,容易盖住关键的价格信息。

4. 常见的坑与排查方案

4.1 信号不会消失的历史条件设定

指标编程里最需要警惕的就是“未来函数”。如果一个信号在你看到它的当下是成立的,但等这根K线走完之后,信号却消失了或者变了位置,那这个指标就是用了未来数据,复盘看到的完美信号全是假的。我的这个源码中全部使用的是当前K线已经收盘确认的数据,以及前面已经走完的历史数据,没有用任何未来函数。

为了做到这一点,关键操作在于:所有比较都基于“当前收盘后的确认值”。比如REF(MA20,3)是取3根K线之前的20日均线值,这是已经确定的;VOL>REF(VOL,1)比较的是今日和昨日成交量,也是确定的。用这种写法,信号只会在K线收盘后出现,并且一旦出现就固定下来,不会因为后面几根K线走出来而发生变化。这也是为什么我强调不要为了追求“提前”而把REF去掉——你提前0.1秒拿到了信号,却可能换来一个会漂移的假信号,得不偿失。

注意:在文华财经里,如果把“连续N日满足条件”错误地写成“从今日到N日前的某一天都满足”,代码编译可能不报错,但逻辑上会变成未来条件。最稳妥的检查方法就是肉眼复盘——把指标加载到历史行情上,记下每个信号出现的时间点,然后手动把这个时间点后面的K线隐藏,看信号是否依然成立。

4.2 参数敏感度与过度拟合

指标中的均线周期、量比阈值、FILTER屏蔽周期,这几个参数都是可以调整的。但调参有个度的问题,如果为了在某一段历史行情上追求100%的信号准确率,把参数调到非常极端的值,这个指标就脱离了通用性,换一段时间、换一个品种,表现往往一塌糊涂。这就是所谓的过度拟合。

我建议的调参方法是“微调优先”。比如目前量比阈值是1.5,你想提高信号质量,可以按照0.1的步长去尝试1.4、1.6;均线周期按3到5天的步长去试,比如5日线改成8日线。每次只改一个参数,记录调整前后信号数量和质量的变化,而不是一次同时改好几个参数——否则你根本分不清是哪个参数起了作用。另外,至少要用两段以上不同年份的行情做验证,一个只在今年牛市里有效的指标,多半是巧合。

4.3 不同周期切换时的适配策略

这套指标在不同周期上运行的效果差异很大。以日线为主周期时,信号相对较少但级别较大,适合做波段或者趋势跟踪;以15分钟、30分钟周期运行时,信号数量明显增多,适合做短线加速段的跟随。但要注意,小周期上均线本身就比较粘合,多头排列的形成和破坏都会更快,所以同样的信号质量会有所下降。

我的经验是:如果你在日线上看到信号,不要急着追,可以等价格回踩到10日线附近再用小周期指标找具体的进场点;如果你在30分钟上看到信号,可以把它当成日线信号的提前预警,而不是直接下单依据。周期配合比单周期信号更可靠,这也算是指标使用层面的一种“二次确认”。

5. 实战复盘与使用心得

拿最近的一次实际操作来说。某个品种在底部横盘了将近三周,20日均线从走平开始缓慢上翘,5日均线和10日均线在20日线附近反复缠绕。直到某一天,价格放量突破前期整理平台,当天的量比达到1.8,MACD红柱明显放大,系统在收盘后给出了“主升浪买点”的信号。我在第二天开盘回踩时进场,止损放在10日均线下方。之后行情进入加速段,连续三天阳线,最大涨幅超过7%,最后在MACD红柱开始缩短、量能跟不上时主动离场。

这次操作的利润并不是最多的,但整个过程最舒服的地方在于:进场有依据,止损有位置,持有有信心。这正是指标存在的意义——它不替你决策,而是帮你把交易计划中的“进场理由”变得清晰可见。

还有一次反面的教训。在信号出现后我没有等到回踩,而是看到盘中价格上涨就立刻挂单追了进去,结果当天冲高回落,第二天直接跌破10日均线,被迫止损。事后复盘发现,信号本身没问题,问题在于我违背了“等待确认”的原则。指标给出的信号是基于收盘数据的确认,盘中急拉时信号尚未成立,这时候进场就相当于提前行动,风险完全不可控。所以用好这个指标,除了依赖源码,还要形成“信号出现后找次级确认点”的操作习惯。

6. 指标扩展与优化方向

这套指标目前是买点确认版本,如果你已经能熟练使用,还可以朝两个方向继续扩展。一个是加离场模块,比如在MACD红柱连续两日缩短、或者收盘价跌破10日均线时输出“主升浪结束”信号,这样整个交易系统就有了完整的进场和离场闭环。另一个方向是做预警升级,通过文华财经的条件单功能,把买点信号接入盘中预警,一旦条件成立就自动弹出提示,省去盯盘的精力消耗。

参数扩展方面,如果你想让它适应更多品种,可以考虑把均线参数改成当前合约的ATR波动率自适应,不过这需要用到类似ATR的函数组合来动态计算周期,麦语言里实现起来相对绕一些,但确实可行。等后续有时间,我再把离场信号和自适应参数版本整理出来分享。现阶段,先把这套主升浪买点确认指标跑熟、跑透,用历史复盘的信号质量去检验它是否适合你的操作风格,再谈优化,才是更稳妥的路径。

我在写指标的过程中最大的体会是:源码本身并不神秘,真正值钱的是源码背后那一套对市场的理解。能把这套理解用代码表达出来,并且经得起历史行情的检验,比任何花哨的画线都更有意义。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进