文华财经期货指标源码实战:从均线到缠论中枢的麦语言编写技巧
“文华财经软件指标公式最准的期货指标源码”——这句话我在做期货交易的这些年里被问过无数次。先泼一盆冷水市面上不存在百分百“最准”的指标源码的价值也不在“预测未来”而在“把规则写死、把信号标准化”。如果你只是想要一个装上去就能躺赚的“圣杯”那大概率会失望但如果你愿意自己动手理解每一条代码背后的逻辑文华财经的公式系统麦语言确实能帮你把盘面看得更清楚也能把人工判断变成可回测、可执行的策略。这篇文章我会按自己实际写指标的经验来写先从最基础的语言规则讲起再给几套我常用的主图、副图指标源码包括均线、布林通道、缠论中枢简化版、MACD参数优化、量能饱和度、多空转折模型最后讲怎么把这些源码变成能回测的模型以及调试过程中最容易踩的坑。适合刚接触文华公式编辑器、想自己写指标但不知道从哪下手的人也适合已经有基础但想优化信号、减少盘中漂移的老手。1. 先搞清楚期货指标里到底有没有“最准”1.1 “最准”是个伪命题但“最适合”是真的我做交易前几年也到处找“胜率90%的指标”后来被市场教育得很老实。任何指标都是历史数据的数学变换均线是价格的平均MACD是均线的差值布林带是均值加减标准差——这些计算没办法知道下一秒的涨跌。期货市场本身是概率博弈震荡行情里金叉死叉会被反复打脸趋势行情里反而能吃到整段利润。所以“最准”应该理解成“最适合”匹配你的交易周期、品种波动特性、资金管理规则那才是真正的好指标。文华财经在国内期货软件里用得最多就是因为它的公式系统开放度高从最简单的均线到复杂的多模型组合都能写。你完全可以把别人的源码拿过来改参数、改过滤条件改成适合自己做螺纹、做豆粕、做原油的那一套。这个过程本身就是提升交易认知的过程。1.2 文华财经公式系统到底能做什么文华财经的公式编辑器入口在K线图界面右键菜单里选“公式管理”快捷键一般是CtrlF。新建公式时会看到两类公式指标公式和模型公式。指标公式只负责画线、画图标、显示文字给人看的不产生交易信号。比如画均线、画MACD柱、画支撑压力位。模型公式在K线图上通过BK、SK、SP、BP这些指令直接产生开平仓信号可以加载到WH8、WH9等程序化平台上做回测甚至接到实盘自动下单。很多人分不清这两者结果把指标公式直接当模型用或者模型里塞了一大堆画线语句导致回测速度慢还容易出错。我的建议是分析归分析交易归交易指标负责“看清楚”模型负责“做决策”两者分开写后期维护也方便。1.3 动手之前必须搞懂的三个基础概念第一最常用的行情变量不要记错收盘价CLOSE、开盘价OPEN、最高价HIGH、最低价LOW、成交量VOL、持仓量OPI。所有指标都建立在这些原始数据之上。第二麦语言的赋值符号和函数要分清楚。一个冒号:表示赋值并画线输出到主图或副图上两个冒号:表示只赋值不画线相当于程序里的中间变量。语句末尾必须加分号这大概是新手报错最多的原因。常用函数比如MA(CLOSE,5)是5周期均线EMA是加权均线HHV(HIGH,20)是20周期最高价LLV是周期最低价REF(CLOSE,1)是上一根K线的收盘价CROSS(A,B)表示A从下方上穿B。第三画线函数要会几个常用的DRAWICON(条件,价格,图标编号)画图标DRAWTEXT(条件,价格,文字)写文字STICKLINE(条件,价格1,价格2,宽度,0)画柱状线。后面都会用到。注意文华公式编辑器里有“语法检查”和“未来函数检测”功能写完代码别急着用先点一下检查。未来函数是实盘最大的坑后面第5节单独讲。2. 主图趋势指标均线、布林通道、缠论中枢的源码2.1 一套能直接用的多周期均线源码主图指标最基础的就是均线系统。网上代码很多但我建议别直接用别人写好的“五彩均线”而是自己从最简版本开始改。下面这套是我常用的基础模板JJ:(CLOSEHIGHLOWOPEN)/4; MA5:MA(JJ,5),COLORWHITE; MA10:MA(JJ,10),COLORYELLOW; MA20:MA(JJ,20),COLORMAGENTA; MA60:MA(JJ,60),COLORGREEN; DRAWICON(CROSS(MA5,MA10),LOW,1); DRAWICON(CROSS(MA10,MA5),HIGH,2);这里有个细节值得多说一句我没有直接用CLOSE而是用开高低收四价的均价JJ。原因很简单期货日内波动剧烈单看收盘价容易被个别K线毛刺带偏四价均线能平滑一小部分噪音。等你用熟之后会发现这个JJ值还能用在很多其他指标的滤波上。金叉死叉的图标提示加在LOW和HIGH位置这样肉眼扫盘面时能快速找到关键点。图标1和2是文华内置的小图标你可以在编辑器里换别的编号看到效果再定。2.2 布林通道和布林极限的源码写法布林带的计算逻辑不复杂先算20周期收盘价的移动平均线再算20周期标准差然后用均值加减两倍标准差形成上轨和下轨。麦语言里标准差函数就是STD写起来很简洁MID:MA(CLOSE,20),COLORYELLOW; UPPER:MID2*STD(CLOSE,20),COLORRED; LOWER:MID-2*STD(CLOSE,20),COLORGREEN;从统计学上看两倍标准差大致覆盖95%的价格波动范围。但这只是“大概率”期货经常走极端行情价格贴着上轨连续跑好多天也是正常的。布林带真正有用的地方是观察开口和收口开口放大说明波动率上升趋势可能启动收口到极窄说明市场在蓄势随时可能变盘。副图里常用的“布林极限”就是从布林带衍生出来的计算当前价格在上下轨之间的相对位置公式可以这样写MID:MA(CLOSE,20); STD20:STD(CLOSE,20); B:(CLOSE-MID)/(2*STD20)*10050;这个B值大致围绕50上下波动超过100说明价格突破了上轨低于0说明跌破了下轨。但注意在强趋势里B值长期维持在80以上或20以下是常态单看超买超卖去抄底摸顶容易被市场教育。2.3 缠论中枢的简化画法与源码思路缠论这几年在期货圈很火很多人在找“缠论自动画线指标”。先说句实话真正代码级实现笔、线段、中枢的递归算法用麦语言写起来非常复杂网上流传的很多版本要么半成品要么为了图面好看偷偷用了未来函数。我的做法是折中用顶底分型做辅助判断用K线区间画出近似的“类中枢区域”。先写顶底分型的判断逻辑。顶分型的意思是中间那根K线的最高价最高底分型是中间那根K线的最低价最低。用麦语言写TOPP:REF(HIGH,1)HIGH AND REF(HIGH,1)REF(HIGH,2); BOTTOMP:REF(LOW,1)LOW AND REF(LOW,1)REF(LOW,2);这段代码的逻辑是把当前这根K线和前一根、前两根做比较当前面那根REF(HIGH,1)的最高价比左右两根都要高时说明前面那根K线就是一个顶分型中轴。用这个条件配合VALUEWHEN函数可以取出最近一个顶分型高点和最近一个底分型低点HIGHEST1:VALUEWHEN(TOPP,REF(HIGH,1)); LOWEST1:VALUEWHEN(BOTTOMP,REF(LOW,1));这样画出来的是最近一个分型结构的高低点不是完整中枢。想看近似中枢区间可以再叠加一个20周期高低点区间HH20:HHV(HIGH,20),COLORRED; LL20:LLV(LOW,20),COLORGREEN;真正做缠论交易的朋友建议把这个简化版当成“视觉辅助”不要当成机器自动识别中枢拿去下单。笔和线段之间的包含关系、新笔旧笔的合并规则这些在麦语言里要写全代码量会膨胀到几百行而且调试成本非常高。我试过几次最后还是回归到“分型确认突破跟进”这个最朴素的用法上。2.4 主图指标设计中最容易犯的三个错第一个错误是堆砌指标线。新手喜欢把均线、布林、MACD、KDJ全放一个主图上画面上红红绿绿几十条线结果哪个信号都不敢信。我自己早期也这么干过后来狠心砍到只剩两条均线加一个通道反而看得更清楚。第二个错误是信号重复闪烁。比如金叉死叉提示图标在震荡行情里会连续出现好几次画面上全是箭头。这时候需要加过滤条件比如只在大周期均线方向向上的时候才画金叉提示或者在两次金叉之间至少隔多少根K线。第三个错误是用未来函数让历史图完美。这个太常见了尤其很多网上下载的指标源码历史图上买卖点标得完美无缺实盘一跑信号全没了。文华的未来函数检测一定要开REFX这类会引用未来数据的函数尽量避开。3. 副图指标MACD、量能饱和度和多空转折的源码3.1 MACD标准源码与参数调整思路MACD是我用得最多的副图指标没有之一。标准源码基本是固定的网上搜到的都差不多SHORT:12; LONG:26; MID:9; DIFF:EMA(CLOSE,SHORT)-EMA(CLOSE,LONG),COLORWHITE; DEA:EMA(DIFF,MID),COLORYELLOW; MACD:(DIFF-DEA)*2,COLORSTICK; DRAWICON(CROSS(DIFF,DEA),DEA,1); DRAWICON(CROSS(DEA,DIFF),DEA,2);这里DRAWICON画在金叉死叉的位置。MACD柱用COLORSTICK画成红绿柱0轴上方多头动能强0轴下方空头动能强。关于调参很多新手喜欢把SHORT改成5、把LONG改成20觉得这样信号更敏感。我态度比较谨慎参数不是不能调但改了之后一定要拿历史数据做样本外验证否则就是在拟合历史噪音。12、26、9这组参数从国外传到国内用了很多年放在日线、2小时、15分钟级别上都还算均衡我建议先原样用一段时间真正理解了它的响应速度再决定要不要动。3.2 量能饱和度指标圆圈提示的原理与源码“量能饱和度圆圈1.00”这类指标的实质就是把当前成交量放到历史成交量的区间里看相对位置。成交量放大到一定程度时在K线上画个圆圈提示意思是“今天的量已经比较饱和了”。逻辑上不复杂我自己写过一个版本N:10; VOL1:VOL; VOLMAX:HHV(VOL1,N); VOLMIN:LLV(VOL1,N); SAT:(VOL1-VOLMIN)/(VOLMAX-VOLMIN0.0001)*100; DRAWICON(SAT80,HIGH,1);SAT就是量能饱和度数值范围被压缩到0到100之间。当SAT大于80时说明当日成交量接近最近10根K线的最大量能区画个图上标。这里的0.0001是防止分母为0的小技巧代码里处理这种边界情况很重要的。但必须提醒一句量能饱和不等于要反转。放巨量可能是趋势中继可能是资金进场也可能是多空大对决得结合价格位置看。如果价格已经涨到前高压力位同时出现量能饱和度极高那才要警惕冲高回落如果刚突破平台放量反而可能是加速信号。3.3 布林极限与多空转折副图源码布林极限%B偏超买超卖多空转折指标偏趋势判断。把我的常用版本贴出来MID:MA(CLOSE,20); STD20:STD(CLOSE,20); UP:MID2*STD20; DN:MID-2*STD20; B:(CLOSE-DN)/(UP-DN)*100; TREND:MA(CLOSE,5)MA(CLOSE,20),COLORRED;B值在0到100之间代表价格在布林带内部的位置。TREND那行判断5周期均线是否在20周期均线之上返回值为1就是多头状态为0就是空头状态。这个TREND变量可以拿来做过滤比如只有TREND为1的时候才允许B值大于80产生“强势多头”提示TREND为0的时候B值大于80反而要当成“超买风险”。多空转折还可以用均线斜率来做。均线斜率等于当前均线值减去前一根均线值用REF函数实现MA5:MA(CLOSE,5); SLOPE:MA5-REF(MA5,1),COLORYELLOW;斜率由负转正代表短期动能向上拐头由正转负代表动能衰减。这个指标单独看线有些抖适合配合MACD柱的变色一起用。3.4 副图指标组合使用的小经验副图指标不要贪多我通常主图放均线加布林通道副图放一个MACD加一个量能饱和度已经足够覆盖“趋势、动能、量能”三个维度。太多副图叠在一起看图效率反而下降。另外所有副图指标的数值范围都不一样MACD的数值可能几百上千量能饱和度在0到100之间B值在0到100之间。放在同一个副图里时要注意量纲是否接近否则小数值指标会被大数值指标压成一条直线根本看不出波动。解决方案是各开各的副图或者把数值统一做归一化。4. 从指标到策略把源码变成能回测的交易模型4.1 从指标公式到模型公式的转换要点指标公式只能画线模型公式才能真正产生交易信号。转换的关键是把“画图逻辑”改成“布尔信号逻辑”。比如均线金叉在指标公式里你写DRAWICON在模型公式里要写成交信号MA10:MA(CLOSE,10); MA30:MA(CLOSE,30); LONG:CROSS(MA10,MA30); SHORT:CROSS(MA30,MA10); LONG,BK; SHORT,SP; SHORT,SK; LONG,BP;这里的BK是买入开仓SP是卖出平仓平掉多单SK是卖出开仓BP是买入平仓平掉空单。文华模型公式会自动管理持仓方向但你要注意信号配对逻辑别出现持多单时还发SK信号、导致反向开仓的混乱情况。还有一点是避免重复发信号。趋势模型在单边行情里表现好但在震荡市里金叉死叉会反复出现。我常用的过滤手段是加入持仓周期限制或方向过滤MA10:MA(CLOSE,10); MA30:MA(CLOSE,30); LONG:CROSS(MA10,MA30) AND BARSLAST(CROSS(MA30,MA10))3; SHORT:CROSS(MA30,MA10) AND BARSLAST(CROSS(MA10,MA30))3;BARSLAST函数返回上一次条件成立到现在的周期数3表示距离上一次反向信号至少隔了3根K线能在一定程度上过滤震荡市里的连续假信号。4.2 一套基于分型的趋势跟踪模型源码把前面缠论分型的思路改造成模型就是一套偏趋势跟踪的策略。TOPP:REF(HIGH,1)HIGH AND REF(HIGH,1)REF(HIGH,2); BOTTOMP:REF(LOW,1)LOW AND REF(LOW,1)REF(LOW,2); HIGHEST1:VALUEWHEN(TOPP,REF(HIGH,1)); LOWEST1:VALUEWHEN(BOTTOMP,REF(LOW,1)); LONG:CLOSEREF(HIGHEST1,1); SHORT:CLOSEREF(LOWEST1,1); LONG,BK; SHORT,SP; SHORT,SK; LONG,BP;这段代码的意思是当价格向上突破最近一个已经确认的顶分型高点时认定为多头信号当价格向下跌破最近一个已经确认的底分型低点时认定为空头信号。这里要注意两个细节。第一我用REF(HIGHEST1,1)而不是直接用HIGHEST1是为了避免信号在K线未收盘时反复变化等分型完全确认后下一根K线再进场。第二这依然是简化版分型突破不是完整缠论中枢但作为趋势跟踪模型已经足够跑通逻辑。我自己在螺纹钢和铁矿的15分钟级别上测过胜率不算高但盈亏比不错单边行情里能拿住利润震荡行情里会被反复打止损所以仓位一定要控制好。4.3 回测报告怎么看参数怎么调文华WH8、WH9加载模型后可以直接运行“模型回测”生成资金曲线、胜率、盈亏比、最大回撤这些指标。很多人只看总收益觉得赚了多少就行其实更该关注的是最大回撤和连续亏损次数。我习惯按这个顺序检查回测报告先看交易次数样本太少的结果没参考价值再看胜率与盈亏比的乘积乘积大于1基本能赚钱最后看最大回撤超过自己心理承受范围再高的收益也拿不住。参数优化要警惕过拟合。一个模型如果参数从10改到11结果就从年化80%变成年化-20%说明这个参数处于“参数孤岛”大概率是拟合了历史噪音如果参数在10到50之间变化收益都维持在一个稳定区间说明这组参数值得信赖。我自己的做法是先固定最大周期和最小周期只对中间一两个关键参数做敏感性测试宁可接受平庸但稳定的结果也不要追求惊艳但脆弱的曲线。5. 源码调试、编译报错与盘中信号问题排查5.1 指标源码最常见的五类报错报错类型常见原因解决办法缺少分号某行语句末尾没写;从错误提示行往上找补上分号函数名拼写错误MA写成MaSTD写成Std大小写不敏感但函数名必须准确括号不匹配多写或少写右括号用编辑器括号高亮逐层检查变量名冲突变量名和系统函数重名比如不要用MA、HHV这类名字做变量名除零错误分母可能为0时没保护加0.0001或用IF判断这些报错信息文华都会提示行号和大致原因新手容易慌其实大部分都能通过“从下往上逐行排除”解决。5.2 为什么信号会在盘中消失未来函数的坑未来函数是实盘中最严重的坑。它的特点是在历史K线上看信号非常标准、非常完美但因为引用了未来数据等这根K线真正结束时信号就变了甚至消失。最常见的罪魁祸首是REFX、XMA这类函数它们会向前引用数据。判断指标有没有未来函数除了看文华检测结果还有一个笨办法把K线切到最后一根然后手动往前翻K线观察指标信号会不会随着新K线出现而改变。如果信号会变说明历史信号是“事后画出来的”实盘里你根本等不到那个完美入场点。注意我见过有人专门用未来函数做“完美指标源码”去卖钱你拿历史图一看买卖点标得神乎其神实盘一用就废。判断办法很简单信号永远发生在K线收盘之后确认任何盘中提前出现的信号都要打问号。5.3 复盘时信号正确、实盘老错过问题出在哪复盘时信号对实盘却跟不上最常见的原因是下单速度。文华的信号是在K线收盘时计算但你要在下一根K线开盘后才挂单这个延迟在秒级行情里就是十几个点。解决办法是把模型改成下一根K线开盘触发或者在分时级别用小周期模型降低延迟。还有一个原因是手续费和滑点。回测时不扣手续费和滑点模型看起来稳定盈利实盘一算成本全是亏损。我在回测设置里一般按成交金额的万分之三扣手续费再加上一跳滑点这样跑出来的结果才贴近真实。5.4 指标代码优化技巧从跑得慢到跑得快写复杂指标时如果回测速度特别慢通常是因为用了大量循环或重复计算。麦语言是解释执行代码效率很重要。比如需要多次用到的中间变量用:先算好缓存起来避免在每根K线上重复计算。再比如VALUEWHEN和BARSLAST这类函数本身就比较消耗资源能用REF和COUNT替代的场景尽量替代。我一般先把指标做成副图画出来肉眼确认图形正确再放进模型里回测。如果副图阶段就很卡先优化代码结构不要急着跑模型。6. 我的经验三个让指标真正“变准”的习惯第一先固定品种和周期再谈指标选择。螺纹钢的波动节奏和豆粕完全不同用同一套参数跑所有品种结果一定平庸。我自己的习惯是做螺纹主力就用15分钟级别定参数做豆粕就只用豆粕的历史数据样本品种和周期锁死之后指标才有讨论意义。第二指标越少越好一主一副一模型足够。主图用均线和布林带看位置副图用MACD和量能看动能模型只负责按既定规则产生交易信号。信号太多等于没有信号这是老生常谈但真能做到的人很少。第三每天坚持记“信号日志”。我用了很长时间才意识到指标不是拿来预测的是拿来确认的。每天收盘后手动记录当天指标出了什么信号、当时盘面结构是什么样子、第二天实际走势如何。坚持几个月你会发现自己对指标的理解完全不一样也能慢慢找出哪些信号在实战中真正值得执行哪些只是统计噪音。最后再分享一个我踩过很多次坑之后养成的习惯任何指标写完先加载到历史数据上用“复盘模式”逐根K线往前走一遍别直接实盘。指标这种东西最终赚不赚钱其实一半在设计一半在执行纪律。代码给不了你“最准”的圣杯但它能帮你把交易规则固化下来少受盘中情绪左右。希望这篇文章里的源码和思路能让你在写自己第一套指标时少走点弯路。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →