以下是修复后的MQL4代码,确保多单和空单的挂单只触发一次,并且在平仓后重新挂单。

extern int MagicNumber = 92133;
extern double InitialLots = 0.5;
extern double TakeProfitAmount = 80.0;

bool isBuyOrderTriggered = false;
bool isSellOrderTriggered = false;
double buyOrderOpenPrice = 0.0;
double sellOrderOpenPrice = 0.0;

void OnTick()
{
    double currentPrice = MarketInfo(Symbol(), MODE_BID);
    
    if (!IsOpenOrders())
    {
        if (!isBuyOrderTriggered)
        {
            // 挂单条件
            double buyPrice = currentPrice + 200 * Point;
            
            // 挂单
            OrderSend(Symbol(), OP_BUYSTOP, InitialLots, buyPrice, 10, 0, 0, 'Buy Stop', MagicNumber, 0, Green);
            isBuyOrderTriggered = true;
        }
        
        if (!isSellOrderTriggered)
        {
            // 挂单条件
            double sellPrice = currentPrice - 200 * Point;
            
            // 挂单
            OrderSend(Symbol(), OP_SELLSTOP, InitialLots, sellPrice, 10, 0, 0, 'Sell Stop', MagicNumber, 0, Red);
            isSellOrderTriggered = true;
        }
    }
    
    // 获取持仓订单
    int buyOrder = GetFirstBuyOrder();
    int sellOrder = GetFirstSellOrder();
    
    if (buyOrder != -1 && !isBuyOrderTriggered)
    {
        buyOrderOpenPrice = OrderOpenPrice(buyOrder);
        
        // 多单信号
        double buyOrderTakeProfit1 = buyOrderOpenPrice + 100 * Point;
        double buyOrderTakeProfit2 = buyOrderOpenPrice + 200 * Point;
        double buyOrderTakeProfit3 = buyOrderOpenPrice + 300 * Point;
        double buyOrderTakeProfit4 = buyOrderOpenPrice + 400 * Point;
        
        // 下单
        OrderSend(Symbol(), OP_BUY, 0.3, currentPrice, 10, buyOrderTakeProfit1, 0, 'Buy Signal 1', MagicNumber, 0, Blue);
        OrderSend(Symbol(), OP_BUY, 0.18, currentPrice, 10, buyOrderTakeProfit2, 0, 'Buy Signal 2', MagicNumber, 0, Blue);
        OrderSend(Symbol(), OP_BUY, 0.1, currentPrice, 10, buyOrderTakeProfit3, 0, 'Buy Signal 3', MagicNumber, 0, Blue);
        OrderSend(Symbol(), OP_BUY, 0.06, currentPrice, 10, buyOrderTakeProfit4, 0, 'Buy Signal 4', MagicNumber, 0, Blue);
    }
    
    if (sellOrder != -1 && !isSellOrderTriggered)
    {
        sellOrderOpenPrice = OrderOpenPrice(sellOrder);
        
        // 空单信号
        double sellOrderTakeProfit1 = sellOrderOpenPrice - 100 * Point;
        double sellOrderTakeProfit2 = sellOrderOpenPrice - 200 * Point;
        double sellOrderTakeProfit3 = sellOrderOpenPrice - 300 * Point;
        double sellOrderTakeProfit4 = sellOrderOpenPrice - 400 * Point;
        
        // 下单
        OrderSend(Symbol(), OP_SELL, 0.3, currentPrice, 10, sellOrderTakeProfit1, 0, 'Sell Signal 1', MagicNumber, 0, Red);
        OrderSend(Symbol(), OP_SELL, 0.18, currentPrice, 10, sellOrderTakeProfit2, 0, 'Sell Signal 2', MagicNumber, 0, Red);
        OrderSend(Symbol(), OP_SELL, 0.1, currentPrice, 10, sellOrderTakeProfit3, 0, 'Sell Signal 3', MagicNumber, 0, Red);
        OrderSend(Symbol(), OP_SELL, 0.06, currentPrice, 10, sellOrderTakeProfit4, 0, 'Sell Signal 4', MagicNumber, 0, Red);
    }
    
    double totalProfit = CalculateTotalProfit();
    
    if (totalProfit >= TakeProfitAmount)
    {
        CloseAllOrders();
        DeleteAllPendingOrders();
        Sleep(60000); // 1分钟延迟
        
        isBuyOrderTriggered = false;
        isSellOrderTriggered = false;
    }
}

bool IsOpenOrders()
{
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == MagicNumber)
        {
            if (OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
                return true;
            }
        }
    }
    
    return false;
}

int GetFirstBuyOrder()
{
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == MagicNumber)
        {
            if (OrderType() == OP_BUY)
            {
                return i;
            }
        }
    }
    
    return -1;
}

int GetFirstSellOrder()
{
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == MagicNumber)
        {
            if (OrderType() == OP_SELL)
            {
                return i;
            }
        }
    }
    
    return -1;
}

double OrderOpenPrice(int ticket)
{
    if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
    {
        return OrderOpenPrice();
    }
    
    return 0.0;
}

double CalculateTotalProfit()
{
    double totalProfit = 0.0;
    
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == MagicNumber)
        {
            totalProfit += OrderProfit();
        }
    }
    
    return totalProfit;
}

void CloseAllOrders()
{
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == MagicNumber)
        {
            OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 10, Red);
        }
    }
}

void DeleteAllPendingOrders()
{
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == MagicNumber)
        {
            if (OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)
            {
                OrderDelete(OrderTicket());
            }
        }
    }
}

注意:

  • 这只是一个示例代码,可能需要根据您的具体需求和平台要求进行调整。
  • 在实际交易之前,请务必进行充分的测试和验证。
  • 交易存在风险,请谨慎操作。
修复并优化MQL4代码:多空挂单仅触发一次,平仓后重启挂单

原文地址: https://www.cveoy.top/t/topic/cFKW 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录