什么是外部变量,一句话解释,就是在EA或指标属性设置窗口中可以手动修改的变量!
在MQL4中,我们用 extern
这个关键字来声明一个外部变量。它的初始值在程序里写好,但是当你把EA或者指标挂到图表上时,可以自己输入新值,不需要改代码,直接在EA加载时修改参数!这样可以让程序更灵活,比如:想让EA用 0.1手交易就设成 0.1,想改成 0.5手交易就设成 0.5,EA使用者可以直接改参数,不用重新编译代码!
举个例子:
比如你想做一个EA,开单时用不同的手数。
如果你直接这样写:
那么手数就是固定的 0.1,你每次想改手数就要重新打开代码,改代码编译,很麻烦。
但是如果你用外部变量:
当你把EA挂到图表上时,MT4会自动弹出一个输入参数窗口,你可以直接在里面输入想要交易的手数,非常方便!
示例2:
在图表上挂EA时,这些都可以自己调,比如今天行情波动大,你想把止盈调到100点,不用改程序,只要在EA参数窗口直接改TakeProfit=100
就可以了!
在EA源代码文件的结构中,通常在预处理器指令之后,会定义外部变量。这些变量实际上就是我们交易系统的可调节参数,允许用户在使用 EA 时进行配置。它们涵盖了交易策略的各项设置,如止损 (Stop Loss)、止盈 (Take Profit)、交易手数 (Lot Size),以及可能用到的技术指标参数等。要将一个变量定义为外部变量(即用户可配置的参数),只需在常规的变量声明前加上 extern
关键字即可。这样声明后,该变量就会出现在 EA 的“属性”窗口中,供用户查看和修改。
// 声明一个名为 StopLoss 的外部变量(double 类型),作为止损点数参数,默认值为 50
extern double StopLoss = 50;
为外部变量命名时,务必使其名称具有描述性,能清晰地反映该参数的实际用途(例如,StopLoss
明显优于含糊不清的 stop
或 SL
)。MQL4允许标识符最长为 31 个字符,应充分利用此长度使参数意义明确。此外,在声明外部变量时赋予的初始值,是加载EA时的默认值,因此应选择一个逻辑上合理、常用或推荐的值作为默认设置。
示例3:double、int、string等数据类型
extern double Lots = 0.1;
extern int MagicNumber = 12345;
extern int Slippage = 3;
extern string StrategyName = "MyExpert";
示例4:外部变量控制交易参数
extern double LotSize = 0.1; extern int TakeProfit = 50; extern int StopLoss = 30; void OpenTrade() { OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, Ask - StopLoss * Point, Ask + TakeProfit * Point, "AutoTrade", 1234, 0, clrGreen); }
LotSize
、TakeProfit
和 StopLoss
值,无须修改代码或重新编译。示例5:分类组织外部变量
// === 风控设置 === extern double MaxRisk = 0.02; extern double FixedLots = 0.1;// === 策略设置 === extern int MA_Period = 21; extern int RSI_Threshold = 30;// === 系统设置 === extern bool EnableLogging = true; extern string EA_Name = "MyStrategy_v1";
示例 6:在交易函数中使用外部变量
// 定义外部变量 extern double lotSize = 0.1; extern int stopLoss = 50; extern int takeProfit = 100;// 下单函数 void OpenBuyOrder() { double price = Ask; double sl = price - stopLoss * Point; double tp = price + takeProfit * Point; int ticket = OrderSend(Symbol(), OP_BUY, lotSize, price, 3, sl, tp, "Buy Order", 0, 0, Blue); if(ticket < 0) { Print("OrderSend failed with error #", GetLastError()); } else { Print("OrderSend succeeded with ticket #", ticket); } } void OnTick() { // 简单的下单条件 if(SignalConditionsMet()) { OpenBuyOrder(); } } // 示例信号条件函数 bool SignalConditionsMet() { // 这里是你自己的信号条件 return true; }
在这个示例中,定义了外部变量 lotSize
、stopLoss
和 takeProfit
,并在 OpenBuyOrder
函数中使用这些变量来下买单。用户可以在参数输入窗口中调整这些变量的值,从而影响下单行为。
Ps:在 MQL4中,extern
和 input
都是用于声明输入参数的关键字,它们的作用相似,MQL5中引入了 input
作为替代 extern
。由于使用input
可以防止EA内部意外改变原始用户参数,保持交易逻辑稳定,现在越来越多的人使用input
来声明外部变量。