ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

文华财经指标公式实战:从零构建期货买卖信号系统

文华财经指标公式实战:从零构建期货买卖信号系统 做期货的人十有八九都折腾过文华财经指标公式。我也不例外。从最早混论坛下载现成的“神指标”到后来自己在WH6里一行行改代码再到用WH8跑模组回测这条路走了三四年最大的感触是市面上大量号称“精准买卖”的期货指标公式要么逻辑不自洽要么悄悄依赖未来函数回测曲线漂亮得不像话一上实盘就原形毕露。这篇文章不卖指标只讲两件事——文华财经指标公式到底是怎么工作的以及一套能落地、逻辑可验证的期货买卖信号系统应该怎么搭出来。写给手里有WH6/WH8、想自己写公式而不是到处抄源码的朋友。1. 文华财经指标公式的本质一套把交易逻辑翻译给K线图的语言1.1 指标公式到底在算什么很多刚开始学指标的朋友以为公式是某种“预测工具”输入几个参数就能算出明天涨还是跌。这是最大的误解。文华财经的指标公式本质上做的是一件很朴素的事对每一根K线做一次计算然后把这些计算结果连成一条线、一个柱、一个信号。每根K线自带的数据是固定的开盘价、最高价、最低价、收盘价、成交量、持仓量再加上时间戳。公式就是在这些原始数据上做算术。比如MA(CLOSE,5)是取最近5根K线收盘价的平均值EMA(CLOSE,12)是给近期的价格更高权重ATR(14)是统计最近14根K线真实波幅的平均值。你写出来的每一个指标无论名字多花哨拆到最底层都是这类运算的组合。理解这一点很重要因为这意味着指标公式的“能力上限”是有限的。它只能基于已经产生的价格、成交量和时间信息来陈述事实不能凭空知道明天的主力动向。所谓“精准买卖”本质上是把一套你认为有概率优势的规则翻译成机器可以逐行执行的条件。1.2 从WH6到WH8绘图函数与模组指令的分工文华财经不同版本的公式语言侧重点差异很大这是很多人在网上抄代码后编译报错的第一原因。WH6偏重行情展示和手动交易辅助公式主要用于画线、标信号、写选股条件WH8偏重程序化交易公式里可以直接写BK买入开仓、SK卖出开仓、BP买入平仓、SP卖出平仓这类模组指令跑历史回测甚至对接实盘。两者共用同一套语法内核函数库也基本一致但WH6里你写了BK也不会触发下单只会被当作普通字段处理。反过来WH8里可以加载WH6风格的绘图公式只是如果想用它自动交易就必须额外输出模组信号。用一张表看得更清楚能力方向WH6WH8K线绘图与信号标注完整支持完整支持选股/筛选条件支持支持模组回测BK/SK指令不支持支持实盘程序化下单不支持支持参数优化功能基础版有完整支持我先说清楚这个差异是因为后面给出的代码示例涉及绘图和信号两部分。如果你只在WH6里用把信号输出部分改成DRAWTEXT画文字就行如果要在WH8里跑模组原样保留BK/SK即可。1.3 最核心的那几个函数以及它们的时间轴语义文华财经的公式语言里函数多到几百个但实实在在高频用到的就那么十来个。我把它们按用途分一下组基础统计MA、EMA、HHV、LLV、SUM、ABS处理均线、高低点、求和这类常规计算。时间引用REF(X,N)取N根K线之前的值VALUEWHEN(COND,X)取最近一次条件成立时的X值BARSLAST(COND)统计距离条件最近一次成立过去了多少根K线。交叉判断CROSS(A,B)表示A上穿B返回1否则返回0。这是金叉死叉类信号的标准写法。条件组合AND、OR、NOT、IF用于把多个条件拼成一个完整的买卖前提。绘图与输出DRAWTEXT在图上写文字COLORxxxx设置颜色。这里最需要花功夫理解的是“时间轴语义”。公式是逐根K线从旧到新计算的每一行代码都隐藏着一个“当前K线”的概念。REF是往回看VALUEWHEN是往回找BARSLAST是往回数。想清楚这三者的区别后面大部分错误都能避免。注意文华财经的REF(N)要求N为正整数N为负数时引用的是未来数据这在指标公式里是被严格禁止的一旦出现信号的可靠性就完全没法保证。2. “精准买卖”不是玄学是一套可验证的交易逻辑2.1 先想明白你要赚哪种行情的钱写公式前先问自己一个问题我的方法在什么行情下能赚钱趋势行情和震荡行情的交易逻辑是相反的。趋势行情要追涨杀跌、顺大势而为震荡行情要高抛低吸、逆小势操作。一套逻辑不可能同时适配两者强行融合的结果就是信号频繁、来回止损。期货又和股票有一个本质区别可以做空。所以买卖信号天然是双向的。一个完整的期货指标公式必须同时定义多头进场、多头离场、空头进场、空头离场四个动作而不是简单画一个“买入信号”完事。以我自己的经验给期货品种写指标首先要确定时间框架。日线级别看的趋势和15分钟级别看的趋势常常不一致。最忌讳的是在日线图上用顺势逻辑写了一套均线突破切到分时图又用震荡逻辑去抄底摸顶最后两套逻辑在同一个账户里互相打架。2.2 胜率、盈亏比和交易频率的三角关系很多指标作者喜欢宣传“胜率90%”这话听听就好。胜率、盈亏比、交易频率三个指标存在内在牵制胜率高的策略通常单笔盈利小因为赚一点就跑盈亏比大的策略胜率往往不满50%因为大部分时间都在止损。评价一套期货指标公式的优劣看的不是胜率而是期望值。期望值 胜率 × 平均单笔盈利 - (1 - 胜率) × 平均单笔亏损。举例来说一套趋势跟踪策略胜率40%平均盈利2000元平均亏损800元那么期望值 0.4 × 2000 - 0.6 × 800 320元。也就是说历史样本下每做一次交易统计意义上能赚320元。另一套胜率70%的策略平均盈利300元平均亏损400元期望值 0.7 × 300 - 0.3 × 400 90元。胜率看着高实际赚钱效率反而不如前者。所以不要被指标图上的信号准确率迷惑。回测报告里真正要盯的是期望值、最大回撤、盈亏比这三个数。2.3 多周期确认如何落地“精准买卖”的另一条常见路径是多周期共振。大周期定方向小周期找入场这样能过滤掉很多逆大势的杂音。在文华财经公式里做多周期引用用的函数是“周期加后缀”的方式比如在日线公式里引用60分钟数据需要写成REF(MINUTE_60_CLOSE,1)之类的形式。更通用的做法是用#号周期符在WH6/WH8中支持类似“CLOSE#MIN60”的跨周期取数。不过这里有个细节容易踩坑不同周期的K线数量不同跨周期引用的数据在当前K线未必对齐。日线的收盘时间对应的是60分钟最后一根K线如果公式里引用了未来尚未走完的小周期K线就引入了变相的未来函数。稳妥的做法是向后推迟一根即引用上一根小周期K线的数据做确认。逻辑上等于“等到小周期收盘确认后再决定大周期动作”宁可慢半拍不赚假信号的钱。3. 从零构建一个多空分界指标设计思路与完整代码3.1 指标的设计目标这一节我实际写一个可用于WH6/WH8的期货指标公式名字就叫“多空分界”。它的设计目标很朴素在趋势行情里尽可能拿住仓位在震荡行情里少开仓。信号规则如下多头进场收盘价站上中期均线上方且中期均线方向向上长期均线方向向上MACD的DIFF在DEA上方成交量较前一根K线放大。空头进场收盘价跌破中期均线下方且中期均线方向向下长期均线方向向下MACD的DIFF在DEA下方成交量较前一根K线缩小。离场条件反向条件成立时平仓不单独写止盈止损把仓位管理交给策略层。之所以把“均线方向”和“MACD状态”同时作为过滤条件是因为单一均线金叉死叉在震荡行情里会反复触发。MACD的加入相当于二次确认而量能条件则用来排除无量突破的假信号。这套组合不追求抓住最低点追求的是趋势确认后的确定性。3.2 完整代码与逐行解释以下是主图指标的写法适用于WH6和WH8// 多空分界指标 - 主图版 // 参数N1中期均线周期N2长期均线周期P为ATR周期K为通道倍数 N1:20; N2:60; P:14; K:1.2; // 均线计算 MIDLINE:MA(CLOSE,N1),COLORYELLOW; LONGLINE:MA(CLOSE,N2),COLORGREEN; // 用ATR构造波动通道 UPPER:MIDLINEK*ATR(P),COLORRED; LOWER:MIDLINE-K*ATR(P),COLORBLUE; // 通道填充不同版本的填充函数名可能有差异 FILLRGN(CLOSEMIDLINE,MIDLINE,UPPER),COLORRED; FILLRGN(CLOSEMIDLINE,LOWER,MIDLINE),COLORBLUE; // MACD计算 DIFF:EMA(CLOSE,12)-EMA(CLOSE,26); DEA:EMA(DIFF,9); MACD:(DIFF-DEA)*2; // 多空条件 MID_UP:MIDLINEREF(MIDLINE,1); LONG_UP:LONGLINEREF(LONGLINE,1); VOL_UP:VOLREF(VOL,1); BUY_COND:CLOSEMIDLINE AND MID_UP AND LONG_UP AND DIFFDEA AND VOL_UP; SELL_COND:CLOSEMIDLINE AND NOT MID_UP AND NOT LONG_UP AND DIFFDEA AND NOT VOL_UP; DRAWTEXT(BUY_COND,LOW,多),COLORRED; DRAWTEXT(SELL_COND,HIGH,空),COLORGREEN;如果你用的是WH8需要把它改造成模组指令只需要在原有条件后面追加下单动作// 多空分界指标 - 模组版 BUY_COND,BK; SELL_COND,SK; // 多头持仓中空头条件成立时平多反手 SELL_COND,BP; SELL_COND,SK;逐行解释几个关键点ATR(P)计算的是近P根K线的平均真实波幅用它构造通道比直接算百分比更适应期货品种的波动特性。波动大的品种通道宽波动小的品种通道窄天然完成一次波动率自适应。MID_UP和LONG_UP这两个条件本质上是在确认均线方向。均线向上和向下是趋势是否延续的直观表现比单纯看价格在均线上方更严格。DIFFDEA是MACD多头状态对应上涨动能在延续。这里不用金叉死叉用持续状态是为了避免信号反复切换。VOL_UP这个条件在空头信号里被写成“NOT VOL_UP”意思是放量下跌才更有说服力缩量下跌反而是杀跌动能衰竭的信号。但如果你的品种经常出现缩量阴跌这地方可以改回VOL_UP需要结合品种习惯来定。3.3 这个指标的优势和局限这套指标的优点是没有未来函数、信号条件透明、参数少且含义清晰。N1、N2、P、K这4个参数加起来不超过两位数过拟合风险比网上那些动辄十几个参数的源码低得多。局限也必须说清楚。第一它天然是趋势跟踪逻辑在横盘震荡期会被反复打脸。第二它只负责进场和反向没有止盈止损逻辑回测收益曲线会很难看。第三模组版用的BK单位是“每次开仓1手”实际资金管理需要你在模组设置里配置手数和资金比例。没有一套指标能解决所有问题。指标公式的价值在于把一个思路固化成规则然后交给历史数据去验证而不是代替你做判断。4. 实盘信号里那些坑未来函数、信号闪烁与数据错位4.1 未来函数回测最漂亮的骗局未来函数是指标公式领域最恶劣的问题。它指的是在当前这根K线上计算信号时使用了尚未走完的未来K线数据。回测时看起来每次买在最低点、卖在最高点实盘却完全无法复现因为信号在K线走完后才固定下来甚至会在历史图上“追认”出事后诸葛亮的信号。文华财经里带有未来函数性质的典型函数包括ZIG之字转向、BACKSET向前赋值、PEAK和TROUGH波峰波谷。网上流传的很多看起来神乎其神的“牛熊线”“精准抄底”源码拉出来一看十有八九藏着其中一两个。我见过一个下载量很高的指标回测九年翻四十倍结果是因为ZIG把每次高低点都精确标记了一遍这根本不是交易系统而是绘图工具。检测未来函数有一个土办法把指标加载到历史行情上然后用键盘左右键逐根移动光标观察历史信号是否会随着光标位置变化。如果某根K线上的信号在你移动光标后消失了或者新增了说明它引用了后续数据。这个方法对任何平台都适用。4.2 信号闪烁K线没有走完之前信号反复横跳信号闪烁和未来函数不是一回事但同样坑人。未来函数是引用未来信号闪烁是“当前K线还没定型”。比如你在1分钟图上写条件CLOSEUPPER盘中价格来回穿越通道上轨信号会频繁出现又消失收盘那一刻才能确定最终状态。要规避信号闪烁最直接的做法是“用收盘价确认”把进场条件放到K线收盘后判断盘中不触发不动作。比如上面代码里的BUY_COND和SELL_COND本质都是基于收盘价CLOSE的条件在盘中会随着最新价变化而变化但在WH8模组里跑回测时系统默认按K线收盘确认信号实盘也能保持一致性。如果你在WH6手动看图做决策盘中看到信号后最好等K线走完再确认而不是看到瞬间突破就追进去。此外还可以用缓冲带只在价格突破通道上沿超过一定比例时才确认多头信号比如KK:1.5UPPER:MIDLINEKK*ATR(P)这个KK值就是缓冲。价格在通道边缘反复震荡时缓冲带能有效减少噪音信号。4.3 数据引用错位REF和VALUEWHEN用错是灾难很多看起来没问题的小指标实际信号总是差一根K线问题多半出在REF和VALUEWHEN的误用上。REF(CLOSE,1)是上一根K线的收盘价这是正确的“昨天收盘价”。但有人习惯写REF(CLOSE,-1)想表达“明天的收盘价”这在文华财经里直接报错或者被系统当成未来数据处理。还有一种常见错误是把REF用在跨周期引用中日线公式里引用60分钟CLOSE时想取“上一根60分钟K线的收盘价”却写成了REF(CLOSE#MIN60,1)。这里的问题是当前日线对应的60分钟K线可能还没有收盘你取到的REF(CLOSE#MIN60,1)实际上是“当前日线范围内的上一根60分钟线”依然存在未走完K线参与计算的风险。稳妥的写法是引用上一交易日最后一根60分钟K线需要结合日期判断。DATE函数在这里就派上用场了。DATE返回当前K线的日期格式为YYYYMMDD整数。你可以用它做跨日过滤IS_NEW_DAY:DATEREF(DATE,1);这个条件在每天第一根K线时为真。配合跨周期引用可以强制只取“上一个确认周期的数据”避免当日未走完周期产生偏差。比如你想用60分钟数据判断日线方向就把跨周期取数限制在昨日MIN60_LAST_DAY:VALUEWHEN(DATEREF(DATE,1),REF(CLOSE#MIN60,1));这行代码的含义是仅在每天第一根K线出现时取前一根60分钟K线的收盘价作为参考。逻辑上等于“昨天收盘后确认的60分钟级别状态”彻底避免当天数据干扰。这类错位问题之所以难排查是因为差一根K线不会让系统报错只会让信号整体偏移回测结果可能依然为正但实盘表现会和回测对不上。排查技巧很简单把信号出现的位置和行情走势逐根对照看看是否存在“信号晚了一天”的规律性偏移。5. 让指标从“会跑”到“能用”参数优化与回测思路5.1 参数扫描与过拟合参数是“精准买卖”里最容易自欺欺人的环节。很多人写完指标就开始改参数让历史回测利润最大化这是典型的过拟合。参数越多越容易在历史数据上拟合出完美曲线但未来行情一变化这种完美瞬间崩塌。在WH8里跑参数优化不要只看最优那组参数要看“参数平原”。把N1从5到60、N2从40到120分别扫描每个组合都记录净利润、最大回撤、胜率。如果最优点旁边一圈参数的结果都差不多说明策略逻辑稳定参数不太敏感如果最优点像一根针一样突兀周围全是大幅亏损那基本可以断定是过拟合。我自己的习惯是扫描完把最优参数放到历史样本的另一半时间段里再测一次。前一半赚钱、后一半也赚钱才算逻辑成立。只在前一半赚钱、后一半亏钱说明策略只是“那段行情的函数”。参数数量控制也有讲究。新手写指标最容易犯的错误是堆参数突破周期、过滤周期、止盈系数、止损系数、加减仓倍数全写进去。我的底线是参数不超过6个超过6个复杂度和收益不成正比。5.2 回测里的“纸面富贵”手续费、滑点与撮合假设WH8回测界面的默认设置通常比较乐观新手直接跑出来的年化收益率都是虚高的。真正影响回测真实性的因素有三个手续费、滑点、信号撮合方式。手续费可以直接按期货公司标准填。螺纹钢按成交金额的万分之一点几算一手10吨价格4000时一手成交额4万元单边手续费约5到6元。滑点更关键对流动性好的品种设1个tick就行流动性差的最好设2到3个tick。以螺纹钢为例一个tick是1元/吨一手10吨一个tick就是10元。频繁进出的策略一个月摩擦成本可能占账户资金几个百分点。还有撮合假设。WH8里回测默认信号在K线收盘价成交这已经是相对保守的假设。如果你用的是分钟级周期要考虑信号出现后你能不能保证在下一次K线开盘价附近成交。实盘可能因为价格跳空而成交在更差的位置回测和实盘的收益差主要来自这里。5.3 信号过滤的最后一公里指标公式写完、参数扫描完、回测结果能看之后还有一道工序信号过滤。这一步经常被忽略但对实盘体验影响很大。最常见的过滤手法是“每日限定交易次数”。连续亏损时人心态最容易崩指标也容易在趋势不明时反复给信号。我通常在模组里加一个计数限制当日已开仓一次就不再触发新开仓。逻辑上用BARSLAST配合DATE能实现写法大致是// 当日首次开仓标记 FIRST_OPEN:DATEREF(DATE,1); // 如果当日已经有过开仓信号不再重复触发 HAS_OPENED:COUNT(BUY_COND, BARSLAST(FIRST_OPEN)1)0; BUY_FINAL:BUY_COND AND NOT HAS_OPENED;另外可以参考日内VWAP的思路做过滤。VWAP是成交量加权平均价相当于日内多空成本线。价格在VWAP上方时只做多在下方时只做空。文华财经的分时周期里可以直接调用VWAP函数把它当成一个日内方向的开关。比如// 日线周期下引用当日分时VWAP作为过滤 DAY_VWAP:VALUEWHEN(DATEDATE, VWAP);但要注意VWAP是分时周期函数在日线公式里引用需要跨周期处理稍微有点绕。如果你只做日内直接在分时图上叠加VWAP线手感和效果都比日线引用好得多。关于网上流传的各种“量能饱和度”“主力线”“牛熊点”源码我的建议是可以下载分析但务必先做未来函数检测再上参数平原扫描。很多这类源码本质上是把传统指标换个名字重新排列组合有的甚至植入未来函数让你看上去很准。看代码永远比看宣传语靠谱。最后说一个我自己的实操体会。写完指标后先别急着实盘用WH8的历史回测把最近一年的逐笔信号导出来人工逐条复盘这条信号出现后行情走了多少点、止损点设在哪里合适、最大连续亏损几次。做完这三步你才算真正了解自己的指标。之后再拿最小仓位跑实盘三个月内不改代码只记录问题。这样做看起来慢但比来回调参数、追行情要稳妥得多。这几年我最大的转变是不再追求“每次都对的指标”了。任何期货指标公式都存在亏损的可能“精准买卖”四个字更准确的理解应该是“在逻辑清晰的前提下让概率站在自己这一边”。指标只是把想法翻译成机器能执行的语言真正的功夫还是在想法本身。
返回列表