保持敬畏之心
交易是一场持久战

​MQL4(9):外部变量详解

什么是外部变量,一句话解释,就是在EA或指标属性设置窗口中可以手动修改的变量!

在MQL4中,我们用 extern 这个关键字来声明一个外部变量。它的初始值在程序里写好,但是当你把EA或者指标挂到图表上时,可以自己输入新值,不需要改代码,直接在EA加载时修改参数!这样可以让程序更灵活,比如:想让EA用 0.1手交易就设成 0.1,想改成 0.5手交易就设成 0.5,EA使用者可以直接改参数,不用重新编译代码!

举个例子:

比如你想做一个EA,开单时用不同的手数。

如果你直接这样写:

double LotSize = 0.1;

那么手数就是固定的 0.1,你每次想改手数就要重新打开代码,改代码编译,很麻烦。

但是如果你用外部变量:

extern double LotSize = 0.1;

当你把EA挂到图表上时,MT4会自动弹出一个输入参数窗口,你可以直接在里面输入想要交易的手数,非常方便!

示例2:
extern double TakeProfit = 50;   // 止盈50点
extern double StopLoss   = 30;   // 止损30点
extern double LotSize    = 0.1;  // 下单手数

在图表上挂EA时,这些都可以自己调,比如今天行情波动大,你想把止盈调到100点,不用改程序,只要在EA参数窗口直接改TakeProfit=100就可以了!

在EA源代码文件的结构中,通常在预处理器指令之后,会定义外部变量。这些变量实际上就是我们交易系统的可调节参数,允许用户在使用 EA 时进行配置。它们涵盖了交易策略的各项设置,如止损 (Stop Loss)、止盈 (Take Profit)、交易手数 (Lot Size),以及可能用到的技术指标参数等。要将一个变量定义为外部变量(即用户可配置的参数),只需在常规的变量声明前加上 extern 关键字即可。这样声明后,该变量就会出现在 EA 的“属性”窗口中,供用户查看和修改。

// 声明一个名为 StopLoss 的外部变量(double 类型),作为止损点数参数,默认值为 50
extern double StopLoss = 50;

为外部变量命名时,务必使其名称具有描述性,能清晰地反映该参数的实际用途(例如,StopLoss 明显优于含糊不清的 stopSL)。MQL4允许标识符最长为 31 个字符,应充分利用此长度使参数意义明确。此外,在声明外部变量时赋予的初始值,是加载EA时的默认值,因此应选择一个逻辑上合理、常用或推荐的值作为默认设置。

示例3:double、int、string等数据类型
extern double Lots = 0.1;
extern int MagicNumber = 12345;
extern int Slippage = 3;
extern string StrategyName = "MyExpert";
以上变量都会出现在 加载EA时的“输入参数面板”中,挂EA时用户可以直接修改。
示例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); 
}
用户可以在加载 EA 时输入不同的 LotSizeTakeProfit 和 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;
 }

在这个示例中,定义了外部变量 lotSizestopLoss 和 takeProfit,并在 OpenBuyOrder 函数中使用这些变量来下买单。用户可以在参数输入窗口中调整这些变量的值,从而影响下单行为。

Ps:在 MQL4中,extern 和 input 都是用于声明输入参数的关键字,它们的作用相似,MQL5中引入了 input 作为替代 extern 。由于使用input可以防止EA内部意外改变原始用户参数,保持交易逻辑稳定,现在越来越多的人使用input来声明外部变量。

赞(0)
未经允许不得转载:图道交易 » ​MQL4(9):外部变量详解