MQL4 代码示例:基于魔术码的自动交易策略

本篇博客文章提供了一个完整的 MQL4 代码示例,该示例展示了如何使用魔术码来管理您的交易策略。该策略包括自动开仓、加仓和平仓功能。

代码功能

  • 使用魔术码区分不同的交易策略。* 当没有持仓时,自动以当前价格上下一定点数挂单开仓。* 当价格突破第一个持仓订单的价格一定点数时,自动加仓。* 当总盈利达到预设目标时,自动平仓所有订单。

代码示例cpp// 检查给定魔术码下的持仓数量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;}

// 检查给定魔术码下的特定订单类型的持仓数量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 GetFirstPositionPrice(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 OrderOpenPrice(); } } return 0.0;}

// 获取给定魔术码下的最后一个特定订单类型的持仓手数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;}

// 删除给定魔术码下的所有指定订单类型的挂单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); } } }}

// 在OnTick()函数中使用以上函数

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

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

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

// 如果最新价低于第一个多单持仓价100点,开始做空0.5手    double firstBuyPrice = GetFirstPositionPrice(MagicNumber, OP_BUY);    if (latestPrice < firstBuyPrice - Gap)    {        double sellVolume = OrderVolume;        if (OrderSend(Symbol(), OP_SELL, sellVolume, latestPrice, Slippage, 0, 0, 'Short Order', MagicNumber))        {            return;        }    }

// 如果最新价高于第一个空单持仓价100点,开始做多0.5手    double firstSellPrice = GetFirstPositionPrice(MagicNumber, OP_SELL);    if (latestPrice > firstSellPrice + Gap)    {        double buyVolume = OrderVolume;        if (OrderSend(Symbol(), OP_BUY, buyVolume, latestPrice, Slippage, 0, 0, 'Long Order', MagicNumber))        {            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 > firstBuyPrice + Gap * (i + 1) && currentProfit < ProfitTarget)            {                double buyVolume = lastBuyVolume * AddVolumeMultiplier;                if (OrderSend(Symbol(), OP_BUY, buyVolume, latestPrice, Slippage, 0, 0, 'Additional Buy Order', MagicNumber))                {                    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 < firstSellPrice - Gap * (i + 1) && currentProfit < ProfitTarget)            {                double sellVolume = lastSellVolume * AddVolumeMultiplier;                if (OrderSend(Symbol(), OP_SELL, sellVolume, latestPrice, Slippage, 0, 0, 'Additional Sell Order', MagicNumber))                {                    return;                }            }        }    }

// 判断当前魔术码下的所有持仓订单,若总盈利达到40美金,触发全部平仓    double totalProfit = GetTotalProfit(MagicNumber);    if (totalProfit >= ProfitTarget)    {        CloseAllPositions(MagicNumber);        Sleep(60000);  // 平仓后等待1分钟    }}

代码说明

  • MagicNumber, Gap, OrderVolume, MaxAdditions, AddVolumeMultiplier, ProfitTarget, Slippage 这些变量需要在代码中预先定义。* 代码中的注释解释了每一部分的功能。

注意事项

  • 这只是一个简单的交易策略示例,实际应用中需要根据市场情况进行调整。* 在使用该代码之前,请确保您了解其工作原理并进行充分的测试。

希望这篇博客文章对您有所帮助!

MQL4 代码示例:基于魔术码的自动交易策略

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

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