MT4 EA代码修复:解决每100点加仓和挂单空单无法成交问题
MT4 EA代码修复:解决每100点加仓和挂单空单无法成交问题
本文旨在解决一段MT4 EA代码中存在的两个问题:
- **代码没有执行每100点加仓一次的操作。**2. 挂单的空单无法成交。
以下是经过修正的完整代码:mq4extern int magicNumber = 92133;extern double initialLots = 0.5;extern int gapPoints = 100;extern double addPositionMultiplier = 0.6;extern int maxAddPositions = 5;extern double takeProfitAmount = 80.0;
int totalPositions = 0;
void OnTick(){ // 检查是否存在持仓 bool hasOpenPositions = CheckOpenPositions();
if (!hasOpenPositions) { // 获取最新价格 double currentPrice = MarketInfo(Symbol(), MODE_BID);
// 挂单挂多单和空单 double buyStopPrice = currentPrice + 200 * Point; double sellStopPrice = currentPrice - 200 * Point;
bool buyOrderPlaced = OrderSend(Symbol(), OP_BUYSTOP, initialLots, buyStopPrice, 0, 0, 0, 'Buy Stop', magicNumber, 0, Green); bool sellOrderPlaced = OrderSend(Symbol(), OP_SELLSTOP, initialLots, sellStopPrice, 0, 0, 0, 'Sell Stop', magicNumber, 0, Red);
if (buyOrderPlaced && sellOrderPlaced) { totalPositions = 2; } else { Print('Failed to place buy and sell stop orders'); return; } } else { // 如果已经存在持仓,则恢复到初始状态 totalPositions = TotalPositions(magicNumber); }
// 获取当前持仓数量 totalPositions = TotalPositions(magicNumber);
// 检查挂单是否成交 bool buyOrderFilled = CheckOrderFilled(OP_BUYSTOP, magicNumber); bool sellOrderFilled = CheckOrderFilled(OP_SELLSTOP, magicNumber);
if (buyOrderFilled) { // 删除挂单的空单 DeletePendingOrders(OP_SELLSTOP, magicNumber);
// 获取持仓价格 double openPrice = GetOpenPrice(magicNumber);
int addPositionCount = 0; double positionLots = initialLots;
while (addPositionCount < maxAddPositions) { // 每上涨100点补仓一次 if (Ask >= openPrice + (addPositionCount + 1) * gapPoints * Point) { positionLots *= addPositionMultiplier;
// 在这里执行补仓操作 OrderSend(Symbol(), OP_BUY, positionLots, Ask, 0, 0, 0, 'Buy Add', magicNumber, 0, Green); addPositionCount++; totalPositions++; } else { break; } } } else if (sellOrderFilled) { // 删除挂单的多单 DeletePendingOrders(OP_BUYSTOP, magicNumber);
// 获取持仓价格 double openPrice = GetOpenPrice(magicNumber);
int addPositionCount = 0; double positionLots = initialLots;
while (addPositionCount < maxAddPositions) { // 每下跌100点补仓一次 if (Bid <= openPrice - (addPositionCount + 1) * gapPoints * Point) { positionLots *= addPositionMultiplier;
// 在这里执行补仓操作 OrderSend(Symbol(), OP_SELL, positionLots, Bid, 0, 0, 0, 'Sell Add', magicNumber, 0, Red);
addPositionCount++; totalPositions++; } else { break; } } }
// 判断总盈利是否达到止盈金额 if (totalPositions > 0 && CalculateTotalProfit() >= takeProfitAmount) { // 触发全部平仓 CloseAllPositions(); }}
bool CheckOpenPositions(){ int total = 0;
for (int i = 0; i < OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == magicNumber && OrderCloseTime() == 0) { total++; } } }
return total > 0;}
bool CheckOrderFilled(int orderType, int magic){ for (int i = 0; i < OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == magic && OrderType() == orderType && OrderSymbol() == Symbol() && OrderCloseTime() == 0) { return true; } } }
return false;}
void DeletePendingOrders(int orderType, int magic){ for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == magic && OrderType() == orderType && OrderSymbol() == Symbol()) { OrderDelete(OrderTicket()); } } }}
double GetOpenPrice(int magic){ for (int i = 0; i < OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == magic && OrderCloseTime() == 0) { return OrderOpenPrice(); } } }
return 0.0;}
int TotalPositions(int magic){ int count = 0;
for (int i = 0; i < OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == magic && OrderCloseTime() == 0) { count++; } } }
return count;}
double CalculateTotalProfit(){ double totalProfit = 0.0;
for (int i = 0; i < OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { totalProfit += OrderProfit(); } }
return totalProfit;}
void CloseAllPositions(){ for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0, Red); } }}
代码说明:
- 每100点加仓: 在
buyOrderFilled和sellOrderFilled的判断语句中,增加了OrderSend函数用于执行加仓操作。2. 挂单空单无法成交: 问题在于原代码在多单和空单的挂单都成交后才会去判断是否需要加仓, 导致如果只有一个方向的订单成交,加仓逻辑就无法执行。 修改后的代码分别在buyOrderFilled和sellOrderFilled中独立判断是否需要加仓, 解决了这个问题。
请注意:
- 以上代码仅供参考,实际使用时需根据您的交易策略和风险承受能力进行调整。* 在实盘交易前,请务必先在模拟账户中进行测试。
希望本文能帮助您解决MT4 EA代码问题。
原文地址: https://www.cveoy.top/t/topic/cpEf 著作权归作者所有。请勿转载和采集!