MQL4 马丁格尔策略EA交易代码及修复
MQL4 马丁格尔策略EA交易代码及修复
之前的回答中,EA交易代码的平仓逻辑存在问题,现已修复并给出完整的代码。cppextern int MagicNumber = 92133; // 魔术码extern double InitialLotSize = 0.5; // 初始手数extern double TakeProfitAmount = 80; // 止盈金额extern double MartingaleMultiplier = 2; // 补仓倍数extern int MaxMartingaleAttempts = 4; // 补仓次数extern int MartingaleDistance = 100; // 补仓间距
int totalOrders = 0; // 总订单数bool hasPendingOrders = false; // 是否有挂单
void OnTick(){ double currentPrice = MarketInfo(Symbol(), MODE_BID); double openPrice = 0;
// 平仓逻辑 for (int i = totalOrders - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == MagicNumber) { OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 0, White); totalOrders--; } } }
// 检查挂单是否存在 if (!hasPendingOrders) { // 挂单做多 double buyStopPrice = NormalizeDouble(currentPrice + 200 * Point, Digits); int buyStopOrder = OrderSend(Symbol(), OP_BUYSTOP, InitialLotSize, buyStopPrice, 0, 0, 0, 'Buy Stop Order', MagicNumber, 0, Green); if (buyStopOrder > 0) totalOrders++;
// 挂单做空 double sellStopPrice = NormalizeDouble(currentPrice - 200 * Point, Digits); int sellStopOrder = OrderSend(Symbol(), OP_SELLSTOP, InitialLotSize, sellStopPrice, 0, 0, 0, 'Sell Stop Order', MagicNumber, 0, Red); if (sellStopOrder > 0) totalOrders++;
hasPendingOrders = true; }
// 补仓逻辑 for (int i = totalOrders - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == MagicNumber) { if (OrderType() == OP_BUY) { // 顺势补仓 - 多单 if (currentPrice - OrderOpenPrice() >= MartingaleDistance * Point && OrderLots() < InitialLotSize * pow(MartingaleMultiplier, MaxMartingaleAttempts)) { double lotSize = OrderLots() * MartingaleMultiplier; double buyPrice = NormalizeDouble(currentPrice, Digits); int buyOrder = OrderSend(Symbol(), OP_BUY, lotSize, buyPrice, 0, 0, 0, 'Martingale Buy Order', MagicNumber, 0, Green); if (buyOrder > 0) totalOrders++; } } else if (OrderType() == OP_SELL) { // 顺势补仓 - 空单 if (OrderOpenPrice() - currentPrice >= MartingaleDistance * Point && OrderLots() < InitialLotSize * pow(MartingaleMultiplier, MaxMartingaleAttempts)) { double lotSize = OrderLots() * MartingaleMultiplier; double sellPrice = NormalizeDouble(currentPrice, Digits); int sellOrder = OrderSend(Symbol(), OP_SELL, lotSize, sellPrice, 0, 0, 0, 'Martingale Sell Order', MagicNumber, 0, Red); if (sellOrder > 0) totalOrders++; } } } } }
// 检查总盈利达到止盈金额 double totalProfit = 0; for (int i = totalOrders - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == MagicNumber) { totalProfit += OrderProfit(); } } }
if (totalProfit >= TakeProfitAmount) { // 平仓所有订单 for (int i = totalOrders - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == MagicNumber) { OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 0, White); totalOrders--; } } }
// 撤销所有挂单 for (int i = totalOrders - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_PENDING)) { if (OrderMagicNumber() == MagicNumber) { OrderDelete(OrderTicket()); totalOrders--; } } }
// 重置挂单状态 hasPendingOrders = false;
Sleep(60000); // 1分钟延迟后重新开始运行
原文地址: https://www.cveoy.top/t/topic/dhff 著作权归作者所有。请勿转载和采集!