文华财经使用的是自己的公式语言,通常称为 麦语言,它是一种专为金融市场分析设计的类 BASIC 语言,相对容易上手,功能强大,是国内期货交易者使用最广泛的公式系统之一。

下面我将从基础语法、常用函数、实战公式示例和进阶技巧四个方面,为你提供一个全面的指南。
基础语法
学习任何编程语言,都要从基础开始。
公式结构
一个完整的公式通常包含以下几个部分:
// [1] 公式名称 // [2] 公式描述 // [3] 参数定义 // [4] 输出变量定义 // [5] 主计算逻辑 // [1] 公式名称:在软件中显示的名字 MA5:MA(CLOSE,5); // [2] 公式描述:在公式管理器中显示的说明 // 这是一个简单的5日均线 // [3] 参数定义:可以调整的变量,方便优化 // 格式: 参数名, 最小值, 最大值, 默认值 N1(5,1,100,5); // 定义一个名为N1的参数,最小1,最大100,默认5 // [4] 输出变量定义:在图表上要显示的线条 // 格式: 输出线名称, 线型, 颜色 MA_LINE:MA(CLOSE,N1),LINETHICK2,COLORWHITE; // [5] 主计算逻辑:可以是一些临时计算,不需要显示 // 例如计算一个辅助值 TMP_VALUE := CLOSE - OPEN;
常量与变量
- 常量:固定的数值,如
5,10,14。 - 变量:
- 系统变量:由软件内部提供,代表K线数据,是公式的核心。
OPEN: 开盘价HIGH: 最高价LOW: 最低价CLOSE: 收盘价VOL: 成交量OPENINT: 持仓量O,H,L,C,V,OI是上述变量的简写,更常用。
- 用户变量:由我们自己定义,用于存储中间计算结果。
- 使用 赋值,
MA5 := MA(C, 5);。 - 变量名不能与系统函数或保留字冲突。
- 使用 赋值,
- 系统变量:由软件内部提供,代表K线数据,是公式的核心。
运算符
- 算术运算符: (加), (减), (乘), (除),
^(幂) - 关系运算符:
>(大于),<(小于), (等于),>=(大于等于),<=(小于等于),<>(不等于) - 逻辑运算符:
AND(与),OR(或),NOT(非)
控制语句
- IF...ELSE...END: 条件判断
IF CLOSE > OPEN THEN DRAWICON(CLOSE, 1); // 如果收盘价大于开盘价,在K线上方画一个图标 ELSE DRAWICON(LOW, 0); // 否则在K线下方画一个图标 END; - FOR...NEXT: 循环(较少用,因为计算量大)
- REPEAT...UNTIL: 循环(较少用)
核心常用函数
这是编写公式的“武器库”,必须熟悉。

趋势指标函数
- MA(X, N): 简单移动平均
MA(C, 5)表示5日收盘价均线。
- EMA(X, N): 指数移动平均 (更常用,对近期价格更敏感)
EMA(C, 12)表示12日指数均线。
- SMA(X, N, M): 平滑移动平均
SMA(C, 10, 2)等同于EMA(C, 10)。
- TRIMA(X, N): 三角移动平均
- WMA(X, N): 加权移动平均
成交量指标函数
- **VOL`: 成交量
- **VOLUME`: 成交量(同VOL)
- **AMOUNT`: 成交额
- **VMA(X, N)`: 成交量的均线
超买超卖/摆动指标函数
- **MACD(DIF, DEA, MACD)`: MACD指标
DIF := EMA(CLOSE, 12) - EMA(CLOSE, 26);DEA := EMA(DIF, 9);MACD := 2*(DIF-DEA), COLORSTICK;
- **KDJ(K, D, J)`: KDJ指标
RSV := (CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100;K := SMA(RSV,3,1);D := SMA(K,3,1);J := 3*K-2*D;
- **RSI(RSI1, RSI2, RSI3)`: RSI相对强弱指标
LC := REF(CLOSE,1);RSI1 := SMA(MAX(CLOSE-LC,0),N1,1)/SMA(ABS(CLOSE-LC),N1,1)*100;
- **CCI(CCI)`: 顺势指标
TP := (HIGH+LOW+CLOSE)/3;CCI := (TP-MA(TP,N))/(0.015*AVEDEV(TP,N));
极值/统计函数
- **HHV(X, N)`: N周期内X的最高值
- **LLV(X, N)`: N周期内X的最低值
- **REF(X, N)`: 引用N周期前的X值
REF(C, 1)表示昨天的收盘价。
- **COUNT(X, N)`: N周期内满足条件X的次数
- **SUM(X, N)`: N周期内X的总和
- **AVEDEV(X, N)`: N周期内X的平均绝对偏差
- **STD(X, N)`: N周期内X的标准差
绘图函数
- **DRAWKLINE(O, H, L, C)`: 自定义绘制K线
可以用来绘制特殊的K线形态。
- **DRAWICON(CONDITION, PRICE, TYPE)`: 在指定位置画图标
CONDITION是条件,PRICE是Y轴位置,TYPE是图标编号(1-18)。
- **DRAWLINE(CONDITION1, PRICE1, CONDITION2, PRICE2, COLOR)`: 画线
当CONDITION1成立时,在PRICE1位置开始画线,当CONDITION2成立时,在PRICE2位置结束画线。
- **DRAWTEXT(CONDITION, PRICE, TEXT)`: 在指定位置画文字
TEXT是要显示的文字内容,用引号括起来。
- **STICKLINE(CONDITION, PRICE1, PRICE2, WIDTH, COLOR)`: 画柱状线
CONDITION是条件,PRICE1和PRICE2是柱状线的上下沿,WIDTH是宽度。
特殊函数
- **CROSS(A, B)`: A上穿B,返回1或0
CROSS(MA(C,5), MA(C,10))表示5日均线上穿10日均线(金叉)。
- **LONGCROSS(A, B, N)`: A在N周期内持续上穿B
- **FILTER(X, N)`: 过滤信号,连续N个周期内只有第一个信号有效
实战公式示例
通过例子来理解公式的威力。
示例1:经典双均线交易系统
这个公式会在5日均线上穿20日均线时买入,下穿时卖出。

// [公式名称] // 双均线交易系统 // [参数定义] N1(5,1,100,5); // 快线周期 N2(20,1,200,20); // 慢线周期 // [核心计算逻辑] MA_FAST := MA(C, N1); // 快速均线 MA_SLOW := MA(C, N2); // 慢速均线 // [信号判断与绘图] // 买入信号:快线上穿慢线 BUY_SIGNAL: CROSS(MA_FAST, MA_SLOW); DRAWICON(BUY_SIGNAL, L * 0.98, 1); // 在K线下方画一个买入图标 // 卖出信号:快线下穿慢线 SELL_SIGNAL: CROSS(MA_SLOW, MA_FAST); DRAWICON(SELL_SIGNAL, H * 1.02, 2); // 在K线上方画一个卖出图标 // [输出线条] MA_FAST_LINE: MA_FAST, COLORRED, LINETHICK2; // 快线用红色,加粗 MA_SLOW_LINE: MA_SLOW, COLORGREEN, LINETHICK1; // 慢线用绿色
示例2:MACD金叉死叉信号
这个公式会直接在MACD金叉和死叉的位置画上文字标记。
// [公式名称] // MACD信号 // [参数定义] SHORT(12,1,50,12); // 快线周期 LONG(26,1,100,26); // 慢线周期 MID(9,1,50,9); // 信号线周期 // [核心计算逻辑] DIF: EMA(CLOSE, SHORT) - EMA(CLOSE, LONG); DEA: EMA(DIF, MID); MACD: 2*(DIF-DEA), COLORSTICK; // [信号判断与绘图] // 金叉信号 GOLDEN_CROSS: CROSS(DIF, DEA); DRAWTEXT(GOLDEN_CROSS, L, '金叉'), COLORRED; // 死叉信号 DEATH_CROSS: CROSS(DEA, DIF); DRAWTEXT(DEATH_CROSS, H, '死叉'), COLORGREEN;
示例3:布林带通道
布林带由中轨(N日均线)、上轨(中轨+N倍标准差)和下轨(中轨-N倍标准差)组成。
// [公式名称] // 布林带 // [参数定义] N(20,1,100,20); // 周期 P(2,0.5,5,2); // 标准差倍数 // [核心计算逻辑] MID := MA(C, N); // 中轨 TMP := STD(C, N); // 标准差 UPPER := MID + P * TMP; // 上轨 LOWER := MID - P * TMP; // 下轨 // [输出线条] MID_LINE: MID, COLORBLUE, LINETHICK1; // 中轨 UPPER_LINE: UPPER, COLORRED; // 上轨 LOWER_LINE: LOWER, COLORGREEN; // 下轨
进阶技巧与注意事项
多周期引用
如果你想引用日线图上的MA20来判断小时图的走势,可以使用 REFDATE 函数。
REFDATE(MA(C, 20), D)表示引用日线图的20日均线值到当前小时周期。
公式管理器
- 新建公式: 在文华软件中,按
Ctrl+N或通过菜单进入公式管理器,新建一个公式文件,然后粘贴代码。 - 导入/导出: 可以将写好的公式导出为
.nc文件,方便备份和分享。 - 公式密码: 可以设置密码保护你的原创公式。
重要注意事项
- 未来函数: 这是编写公式时绝对要避免的陷阱,未来函数是指引用了未来数据的函数,会导致回测结果完美无比,但在实盘中完全失效。
- 常见未来函数:
BACKSET,FILTERX,FORCAST,PEAK,PEAKBARS,TROUGH,TROUGHBARS等。 - 如何避免: 尽量使用
REF,HHV,LLV等基于历史数据的函数,信号判断必须基于当前K线及之前的数据。
- 常见未来函数:
- 计算效率: 避免在公式中使用过多的嵌套循环或复杂的计算,尤其是在图表周期很小(如1分钟)或K线数量很多时,可能会导致软件卡顿。
- 测试与优化: 写好公式后,一定要使用历史行情数据进行严格的回测,并根据测试结果调整参数,找到最适合当前品种和周期的参数组合。
文华期货的麦语言是一个功能强大且灵活的工具,掌握它,你就可以将自己的交易思想转化为实实在在的交易信号。
学习路径建议:
- 模仿: 从简单的均线、MACD开始,尝试修改官方公式。
- 组合: 将不同指标的信号结合起来,形成自己的交易系统雏形。
- 创造: 在充分理解市场逻辑和公式原理后,尝试编写完全属于自己的独特指标。
希望这份详细的指南能帮助你开启文华公式编程的大门!
标签: 文华期货指标编写教程 文华期货自定义指标公式 文华期货指标公式代码示例