// 定义可更改参数
extern int MagicNumber = 92133;            // 魔术码
extern double OrderVolume = 0.5;           // 挂单手数
extern int Gap = 100;                      // 间距
extern double AddVolumeMultiplier = 0.6;   // 补仓倍数
extern int MaxAdditions = 5;               // 补仓次数
extern double ProfitTarget = 40.0;         // 盈利目标(美金)
extern int Slippage = 3;                   // 允许的滑点

// 定义全局变量
bool firstTradeExecuted = false;  // 是否已执行第一单交易
double markPrice = 0.0;           // 蓝色标记线价格

color clrNone = clrNONE;

// 检查给定魔术码下的特定订单类型的持仓数量
int CheckPositionsType(int magicNumber, int orderType)
{
    int totalPositions = 0;
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol() && OrderType() == orderType)
        {
            totalPositions += OrderLots();
        }
    }
    return totalPositions;
}

// 获取给定魔术码下的最后一个特定订单类型的持仓手数
double GetLastPositionVolume(int magicNumber, int orderType)
{
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol() && OrderType() == orderType)
        {
            return OrderLots();
        }
    }
    return 0.0;
}

// 计算给定魔术码下的总盈利
double GetTotalProfit(int magicNumber)
{
    double totalProfit = 0.0;
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol())
        {
            totalProfit += OrderProfit();
        }
    }
    return totalProfit;
}

// 检查给定魔术码下的持仓数量
int CheckPositions(int magicNumber)
{
    int totalPositions = 0;
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol())
        {
            if (OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
                totalPositions += OrderLots();
            }
        }
    }
    return totalPositions;
}

// 删除给定魔术码下的所有指定订单类型的挂单
void DeletePendingOrders(int magicNumber, int orderType)
{
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol() && OrderType() == orderType)
        {
            OrderDelete(OrderTicket());
        }
    }
}

// 平掉给定魔术码下的所有持仓订单
void CloseAllPositions(int magicNumber)
{
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol())
        {
            if (OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
                OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), Slippage, clrNone);
            }
        }
    }
}

void OnTick()
{
    // 检查当前魔术码下是否持仓
    if (CheckPositions(MagicNumber) == 0)
    {
        double currentPrice = MarketInfo(Symbol(), MODE_BID);  // 获取当前价格

        // 以当前价格加100点挂单0.5手多单
        double buyPrice = currentPrice + Gap;
        double buyVolume = OrderVolume;
        int buyTicket = OrderSend(Symbol(), OP_BUYLIMIT, buyVolume, buyPrice, Slippage, 0, 0, 'Buy Order', MagicNumber);
        if (buyTicket > 0)
        {
            // 以当前价格减100点挂单0.5手空单
            double sellPrice = currentPrice - Gap;
            double sellVolume = OrderVolume;
            int sellTicket = OrderSend(Symbol(), OP_SELLLIMIT, sellVolume, sellPrice, Slippage, 0, 0, 'Sell Order', MagicNumber);
            if (sellTicket > 0)
            {
                DeletePendingOrders(MagicNumber, OP_BUY);
                DeletePendingOrders(MagicNumber, OP_SELL);
            }
        }
    }

    // 获取最新价
    double latestPrice = MarketInfo(Symbol(), MODE_BID);

    // 如果没有执行第一单交易,并且持仓数量不为0,则设置第一单交易标记,并记录蓝色标记线价格
    if (!firstTradeExecuted && CheckPositions(MagicNumber) > 0)
    {
        firstTradeExecuted = true;
        markPrice = latestPrice;
    }

    // 如果第一单交易已执行并且最新价在蓝色标记线以下100点,做空0.5手
    if (firstTradeExecuted && latestPrice < markPrice - Gap)
    {
        if (!CheckPositionsType(MagicNumber, OP_SELL))
        {
            double sellVolume = OrderVolume;
            double sellPrice = latestPrice;
            int sellTicket = OrderSend(Symbol(), OP_SELL, sellVolume, sellPrice, Slippage, 0, 0, 'Short Order', MagicNumber);
            if (sellTicket > 0)
            {
                return;
            }
        }
    }

    // 如果第一单交易已执行并且最新价在蓝色标记线以上100点,做多0.5手
    if (firstTradeExecuted && latestPrice > markPrice + Gap)
    {
        if (!CheckPositionsType(MagicNumber, OP_BUY))
        {
            double buyVolume = OrderVolume;
            double buyPrice = latestPrice;
            int buyTicket = OrderSend(Symbol(), OP_BUY, buyVolume, buyPrice, Slippage, 0, 0, 'Long Order', MagicNumber);
            if (buyTicket > 0)
            {
                return;
            }
        }
    }

    // 检查当前魔术码是否持仓多单
    if (CheckPositionsType(MagicNumber, OP_BUY))
    {
        double lastBuyVolume = GetLastPositionVolume(MagicNumber, OP_BUY);
        double currentProfit = GetTotalProfit(MagicNumber);

        // 每上涨100点补仓一次,最多补仓5次
        for (int i = 0; i < MaxAdditions; i++)
        {
            if (latestPrice > markPrice + Gap * (i + 1) && currentProfit < ProfitTarget)
            {
                double buyVolume = lastBuyVolume * AddVolumeMultiplier;
                double buyPrice = latestPrice;
                int buyTicket = OrderSend(Symbol(), OP_BUY, buyVolume, buyPrice, Slippage, 0, 0, 'Additional Buy Order', MagicNumber);
                if (buyTicket > 0)
                {
                    return;
                }
            }
        }
    }

    // 检查当前魔术码是否持仓空单
    if (CheckPositionsType(MagicNumber, OP_SELL))
    {
        double lastSellVolume = GetLastPositionVolume(MagicNumber, OP_SELL);
        double currentProfit = GetTotalProfit(MagicNumber);

        // 每下跌100点补仓一次,最多补仓5次
        for (int i = 0; i < MaxAdditions; i++)
        {
            if (latestPrice < markPrice - Gap * (i + 1) && currentProfit < ProfitTarget)
            {
                double sellVolume = lastSellVolume * AddVolumeMultiplier;
                double sellPrice = latestPrice;
                int sellTicket = OrderSend(Symbol(), OP_SELL, sellVolume, sellPrice, Slippage, 0, 0, 'Additional Sell Order', MagicNumber);
                if (sellTicket > 0)
                {
                    return;
                }
            }
        }
    }
}
MT4 交易策略代码:基于魔术码的自动交易系统

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

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