解决MetaTrader 4 (MT4) 中的'Slippage'未声明标识符错误
解决 MetaTrader 4 (MT4) 中的 'Slippage' 未声明标识符错误
在 MetaTrader 4 (MT4) 中编写智能交易系统 (EA) 时,您可能会遇到 'Slippage' - undeclared identifier 错误。这个错误意味着您的代码试图使用一个尚未定义的变量 'Slippage'。
什么是 'Slippage' 变量?
在 MT4 中,'Slippage' 是一个内置变量,用于设置您愿意为订单接受的最大滑点。滑点是指您期望的价格与实际成交价格之间的差额。
如何修复 'Slippage' 未声明标识符错误
要解决此错误,您需要在代码中声明 'Slippage' 变量。由于 'Slippage' 是一个预定义的变量,您无需声明其类型。
以下是修复错误的步骤:
- 找到使用 'Slippage' 变量的行。 通常,您会在
OrderSend()函数中找到它。 - 在使用 'Slippage' 变量的函数内,添加以下行代码:
int Slippage = 3; // 设置您想要的滑点值
这行代码将 'Slippage' 声明为一个整数变量,并将其值设置为 3。您可以根据您的需要调整滑点值。
代码示例:
以下是更新后的代码,其中包含 'Slippage' 变量的声明:
extern int MagicNumber = 92133; // 魔术码
extern double InitialLotSize = 0.5; // 初始手数
extern int Gap = 100; // 间距
extern double AddLotMultiplier = 0.6; // 补仓倍数
extern int MaxAddLotCount = 5; // 补仓次数
extern double ProfitTarget = 40; // 盈利目标(美金)
void OnTick()
{
double latestPrice = MarketInfo(Symbol(), MODE_BID); // 获取最新价格
int totalOrders = OrdersTotal(); // 获取订单总数
// 检查当前魔术码下是否持仓
bool hasPosition = false;
for (int i = 0; i < totalOrders; i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == MagicNumber)
{
hasPosition = true;
break;
}
}
// 如果没有持仓
if (!hasPosition)
{
double entryPrice = latestPrice;
double lotSize = InitialLotSize;
// 根据最新价格加100点挂单一次多单
double buyStopPrice = entryPrice + Gap;
int buyStopOrderTicket = OrderSend(Symbol(), OP_BUYSTOP, lotSize, buyStopPrice, 0, 0, 0, 'Buy Stop', MagicNumber, 0, Blue);
// 根据最新价格减100点挂单一次空单
double sellStopPrice = entryPrice - Gap;
int sellStopOrderTicket = OrderSend(Symbol(), OP_SELLSTOP, lotSize, sellStopPrice, 0, 0, 0, 'Sell Stop', MagicNumber, 0, Red);
// 设置挂单的止损和止盈
if (buyStopOrderTicket > 0)
{
OrderSelect(buyStopOrderTicket, SELECT_BY_TICKET);
OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(entryPrice - Gap * 2, Digits), OrderTakeProfit(), 0, Green);
}
if (sellStopOrderTicket > 0)
{
OrderSelect(sellStopOrderTicket, SELECT_BY_TICKET);
OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(entryPrice + Gap * 2, Digits), OrderTakeProfit(), 0, Green);
}
}
else // 如果持仓
{
double firstOrderProfitTarget = 0;
for (int j = 0; j < totalOrders; j++)
{
if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == MagicNumber)
{
double orderProfit = OrderProfit();
// 判断当前魔术码下的所有持仓订单
if (orderProfit >= ProfitTarget)
{
int Slippage = 3; // 在使用 'Slippage' 变量的函数内声明
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Red);
}
else
{
if (j == 0) // 第一单
{
firstOrderProfitTarget = orderProfit;
// 如果持仓多单,最新价小于第一单多单100点时,以初始手数0.5手做空
if (OrderType() == OP_BUY && latestPrice < OrderOpenPrice() - Gap)
{
int Slippage = 3; // 在使用 'Slippage' 变量的函数内声明
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Red);
OrderSend(Symbol(), OP_SELL, InitialLotSize, 0, 0, 0, 0, 'Initial Short', MagicNumber, 0, Red);
}
// 如果持仓空单,最新价大于第一单空单100点时,以初始手数0.5手做多
if (OrderType() == OP_SELL && latestPrice > OrderOpenPrice() + Gap)
{
int Slippage = 3; // 在使用 'Slippage' 变量的函数内声明
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Red);
OrderSend(Symbol(), OP_BUY, InitialLotSize, 0, 0, 0, 0, 'Initial Long', MagicNumber, 0, Blue);
}
}
else // 非第一单
{
int addLotCount = MathFloor(orderProfit / Gap); // 补仓次数计数
if (OrderType() == OP_BUY) // 多单
{
for (int k = 1; k <= addLotCount && k <= MaxAddLotCount; k++)
{
double addLotSize = InitialLotSize * MathPow(AddLotMultiplier, k);
double addLotEntryPrice = firstOrderProfitTarget + Gap * k;
OrderSend(Symbol(), OP_BUY, addLotSize, addLotEntryPrice, 0, 0, 0, 'Buy Add', MagicNumber, 0, Blue);
}
}
else if (OrderType() == OP_SELL) // 空单
{
for (int k = 1; k <= addLotCount && k <= MaxAddLotCount; k++)
{
double addLotSize = InitialLotSize * MathPow(AddLotMultiplier, k);
double addLotEntryPrice = firstOrderProfitTarget - Gap * k;
OrderSend(Symbol(), OP_SELL, addLotSize, addLotEntryPrice, 0, 0, 0, 'Sell Add', MagicNumber, 0, Red);
}
}
}
}
}
}
}
}
通过在代码中声明 'Slippage' 变量,您将解决 'Slippage' - undeclared identifier 错误,并使您的 EA 能够按预期工作。请记住根据您的风险承受能力和市场条件调整滑点值。
原文地址: https://www.cveoy.top/t/topic/cgMJ 著作权归作者所有。请勿转载和采集!