想象一下,你精心打造了一款均线交易EA,想分享给朋友使用。你用的是20周期均线,而他想试试50周期。难道你每次都要为他修改代码、重新编译、再发一个新文件吗?
当然不用。这正是**外部变量(External Variables)**要解决的问题。
一句话解释:外部变量,就是我们暴露给用户,让他们可以在EA属性窗口中,用鼠标手动修改的“设置项”。
在MQL4中,我们用extern
这个关键字来声明外部变量。它的作用,就是把一个写在代码里的变量,变成EA“控制面板”上的一个输入框。用户不需要懂代码,就能自由配置你的EA。
从固定到灵活:一个最简单的例子
如果你的代码里这样写: double LotSize = 0.1;
那么交易手数就被“写死”成了0.1。每次想调整,都得改代码。
但如果你在前面加上extern
: extern double LotSize = 0.1;
当你把EA加载到图表时,奇妙的事情发生了:MT4会自动弹出一个属性窗口,上面有一个叫“LotSize”的输入框,默认值是0.1,用户可以随意修改成0.2、0.5,然后点击“确定”运行。整个过程,代码一行都不用动。
构建你的EA“控制面板”
extern
的强大之处在于,它支持几乎所有数据类型。这意味着你可以为用户打造一个功能丰富、体验良好的“控制面板”。
// === 交易核心参数 ===
extern double LotSize = 0.1; // 交易手数
extern int StopLoss = 300; // 止损点数 (注意:非价格)
extern int TakeProfit = 600; // 止盈点数
// === EA系统设置 ===
extern int MagicNumber = 12345; // 魔术号 (EA身份证)
extern int Slippage = 3; // 最大允许滑点
extern string EA_Comment = "MyStrategy_v1.0"; // 订单注释
// === 功能开关 ===
extern bool EnableTrailingStop = true; // 是否启用追踪止损?
extern bool TradeOnMonday = true; // 周一是否交易?
看到bool
(布尔型)开关了吗?这非常实用。它会在EA的属性窗口里,变成一个可以让用户选择true
或false
的下拉菜单,轻松实现功能的开启与关闭。
学长建议:让你的“控制面板”清晰有序
当你的EA参数越来越多时,杂乱无章的列表会让用户感到困惑。一个专业的EA,其参数面板一定是分组清晰、命名规范的。
1. 用注释来分组:像上面的例子一样,使用// === 交易核心参数 ===
这样的注释,可以在视觉上将不同模块的参数清晰地分开。
2. 命名要清晰:extern
变量名会直接显示在面板上,所以命名一定要让用户看得懂。MA_Fast_Period
就远比ma1
要好。永远从使用者的角度去思考。
在交易函数中使用外部变量
定义好这些外部变量后,在代码里就可以像使用普通全局变量一样,直接调用它们。
// 外部变量已在文件顶部定义
// extern double LotSize = 0.1;
// extern int TakeProfit = 500;
// extern int StopLoss = 250;
void OpenNewBuyTrade()
{
// 直接使用外部变量来决定下单参数
double sl = Ask - StopLoss * _Point;
double tp = Ask + TakeProfit * _Point;
int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage, sl, tp, EA_Comment, MagicNumber, 0, clrGreen);
if(ticket < 0)
{
Print("开仓失败,错误代码: #", GetLastError());
}
else
{
Print("开仓成功,订单号: #", ticket);
}
}
当用户在外部修改了LotSize
的值,OpenNewBuyTrade
函数在下次执行时,就会自动使用新的手数。
学长避坑指南:认识extern
的“升级版”——input
在MQL4的后期版本以及MQL5中,引入了一个新的关键字input
。它和extern
的作用几乎完全一样,都是用来创建用户输入参数。
但input
有一个关键的优势:用input
声明的变量是只读的。
这意味着,一旦EA加载了用户设置的参数后,程序代码内部将无法意外地修改这个参数的值。而用extern
声明的变量,本质上还是一个普通的全局变量,有可能在程序的某个角落被误操作修改掉,从而引发一些难以追踪的BUG。
强烈建议为了代码的稳定性和安全性,请在所有新写的EA中,使用input
来代替extern
。 input double LotSize = 0.1;
它们在用户界面上看起来完全一样,但input
为你省去了很多潜在的麻烦。我们学习extern
是因为它是MQL4的传统和基础,但拥抱更安全、更专业的input
,是明智的选择。