MT4挂单策略代码修复及完整实现
非常抱歉给您带来困扰。以下是修复并完整适用于MT4的代码,包含了挂单部分的实现:
extern int magicNumber = 92133;
extern double initialLots = 0.5;
extern double takeProfitAmount = 80;
extern int maxReentries = 4;
extern int reentryPips = 100;
extern int slippage = 4;
int totalOrders = 0;
double totalProfit = 0;
bool hasOpenPosition = false;
double entryPrice = 0; // Initialize entryPrice variable
void OnTick()
{
double currentPrice = Ask;
// Check for open position
if (hasOpenPosition)
{
// Check if take profit is reached
if (totalProfit >= takeProfitAmount)
{
CloseAllOrders();
DeleteAllPendings();
Sleep(60000); // Wait for 1 minute before restart
ResetVariables();
return;
}
// Check for reentry conditions
if (OrdersTotal() < maxReentries)
{
if (OrderSelect(totalOrders - 1, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() && OrderMagicNumber() == magicNumber)
{
double stopLoss = OrderOpenPrice() - reentryPips * Point;
double takeProfit = OrderOpenPrice() + reentryPips * Point;
if (OrderType() == OP_BUY && currentPrice >= entryPrice + reentryPips * Point)
{
entryPrice = currentPrice;
double lots = OrderLots() * 2;
if (lots > MarketInfo(Symbol(), MODE_MINLOT))
{
int ticket = OrderSend(Symbol(), OP_BUYSTOP, lots, currentPrice, slippage, stopLoss, takeProfit, 'Reentry', magicNumber, 0, Blue);
if (ticket > 0)
totalOrders++;
}
}
else if (OrderType() == OP_SELL && currentPrice <= entryPrice - reentryPips * Point)
{
entryPrice = currentPrice;
double lots = OrderLots() * 2;
if (lots > MarketInfo(Symbol(), MODE_MINLOT))
{
int ticket = OrderSend(Symbol(), OP_SELLSTOP, lots, currentPrice, slippage, stopLoss, takeProfit, 'Reentry', magicNumber, 0, Red);
if (ticket > 0)
totalOrders++;
}
}
}
}
}
else
{
// Check for initial entry conditions
if (currentPrice >= currentPrice + 200 * Point)
{
entryPrice = currentPrice;
double stopLoss = currentPrice - 200 * Point;
double takeProfit = currentPrice + 200 * Point;
int ticket = OrderSend(Symbol(), OP_BUYSTOP, initialLots, currentPrice, slippage, stopLoss, takeProfit, 'Initial Entry', magicNumber, 0, Blue);
if (ticket > 0)
{
hasOpenPosition = true;
totalOrders++;
}
}
else if (currentPrice <= currentPrice - 200 * Point)
{
entryPrice = currentPrice;
double stopLoss = currentPrice + 200 * Point;
double takeProfit = currentPrice - 200 * Point;
int ticket = OrderSend(Symbol(), OP_SELLSTOP, initialLots, currentPrice, slippage, stopLoss, takeProfit, 'Initial Entry', magicNumber, 0, Red);
if (ticket > 0)
{
hasOpenPosition = true;
totalOrders++;
}
}
}
}
void OnTrade()
{
totalProfit = 0;
for (int i = 0; i < OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == magicNumber && (OrderType() == OP_BUY || OrderType() == OP_SELL))
{
totalProfit += OrderProfit();
}
}
}
}
void CloseAllOrders()
{
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == magicNumber)
{
bool result = OrderClose(OrderTicket(), OrderLots(), Bid, slippage, Red);
if (result)
totalOrders--;
}
}
}
}
void DeleteAllPendings()
{
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && (OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP) && OrderMagicNumber() == magicNumber)
{
bool result = OrderDelete(OrderTicket());
if (result)
totalOrders--;
}
}
}
}
void ResetVariables()
{
hasOpenPosition = false;
totalProfit = 0;
totalOrders = 0;
}
以上是修复后的完整代码,现在应该可以在MT4平台上正常运行,并包含了挂单部分的实现。如果您还有其他问题,请随时向我提问。再次对给您带来的困扰表示歉意,并感谢您的耐心等待。
原文地址: https://www.cveoy.top/t/topic/dpGB 著作权归作者所有。请勿转载和采集!