本文介绍一种自动化的外汇交易策略,通过编写MQ4语言的EA程序来实现自动挂单、补仓和止盈功能。该策略主要基于以下逻辑:

  1. 初始挂单:

    • 检查当前魔术码(92133)下是否存在持仓。
    • 如果没有持仓,则根据最新价格加200点挂单一次多单,并根据最新价格减200点挂单一次空单。挂单手数为初始手数,即0.5手。
  2. 补仓逻辑:

    • 如果挂单的多单成交,则删除挂单的空单,并且在持仓价的基础上,每上涨100点,补仓一次。补仓手数为上一个多单手数的0.6倍,且多单最多补仓5次。
    • 如果挂单的空单成交,则删除挂单的多单,并且在持仓价的基础上,每下跌100点,补仓一次。补仓手数为上一个空单手数的0.6倍,且空单最多补仓5次。
  3. 多空共存:

    • 如果已经持仓多单,并且最新价小于第一单多单100点时(间距),则以初始手数0.5手做空,多空共存。
    • 如果已经持仓空单,并且最新价大于第一单空单100点时(间距),则以初始手数0.5手做多,多空共存。
  4. 止盈机制:

    • 最后,判断当前魔术码下所有订单的总盈利是否达到40美金(止盈金额),如果达到则触发全部平仓。

代码示例:

extern int magicNumber = 92133;
extern double initialLots = 0.5;
extern int gapPoints = 100;
extern double addPositionMultiplier = 0.6;
extern int maxAddPositions = 5;
extern double takeProfitAmount = 40.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)
        {
            Print('Buy and sell stop orders placed');
        }
        else
        {
            Print('Failed to place buy and sell stop orders');
            return;
        }
    }

    // 检查挂单是否成交
    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 (Bid >= openPrice + (addPositionCount + 1) * gapPoints * Point)
            {
                positionLots *= addPositionMultiplier;

                // 在这里执行补仓操作
                // ...
                
                addPositionCount++;
            }
            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;

                // 在这里执行补仓操作
                // ...

                addPositionCount++;
            }
            else
            {
                break;
            }
        }
    }
}

bool CheckOpenPositions()
{
    // 在这里检查是否存在持仓
    // ...

    return false; // 返回是否存在持仓
}

bool CheckOrderFilled(int orderType, int magic)
{
    // 在这里检查挂单是否成交
    // ...

    return false; // 返回挂单是否成交
}

void DeletePendingOrders(int orderType, int magic)
{
    // 在这里删除挂单
    // ...
}

double GetOpenPrice(int magic)
{
    // 在这里获取持仓价格
    // ...

    return 0.0; // 返回持仓价格
}

int start()
{
    // 在这里判断当前魔术码下所有订单的总盈利是否达到止盈金额
    // 如果达到则触发全部平仓
    // ...

    return 0;
}

注意:

  • 以上代码仅供参考,实际使用中需要根据您的交易策略和需求进行修改和完善。
  • 代码中使用了 extern 关键字定义一些可更改的参数,例如魔术码、初始手数、间距、补仓倍数、补仓次数和止盈金额。您可以根据自己的需求调整这些参数的值。
  • 代码中的 CheckOpenPositionsCheckOrderFilledDeletePendingOrdersGetOpenPrice 函数需要您根据实际情况进行实现。
  • 代码中未包含错误处理机制,在实际使用中需要添加适当的错误处理逻辑。
  • 该策略仅供参考,不保证盈利。风险自负。

总结:

该自动交易策略通过编写EA程序,实现了自动挂单、补仓和止盈功能,可以帮助用户提高交易效率和收益。但是,在实际使用中需要进行充分的测试和验证,并根据市场情况和个人风险承受能力进行调整。

外汇交易策略:自动交易系统(EA)设计与实现

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

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