基于MACD金叉死叉的EA交易策略

本策略利用MACD指标的交叉信号进行交易,并在盈利和亏损时分别采取不同的策略,实现自动交易和风险控制。

策略逻辑:

1. 多单开仓:

  • 当前魔术码下没有多单持仓。* MACD指标出现金叉信号。* 初始下单手数为initialLots

2. 多单补仓:

  • 持有多单。* 最新价格上涨超过第一个多单开仓价100个点。* 以第一个多单订单手数的addLotsMultiplier倍进行补仓,最多补仓addLotsTimes次。

3. 多单锁仓:

  • 持有多单。* 当前魔术码下没有空单持仓。* 最新价格下跌超过第一个多单开仓价100个点。* 使用lockLots手数进行锁仓。

4. 锁仓后空单补仓:

  • 持有锁仓单。* 最新价格下跌超过第一个锁仓空单开仓价100个点。* 以第一个锁仓空单订单手数的addLotsMultiplier倍进行补仓,最多补仓addLotsTimes次。

5. 空单开仓:

  • 当前魔术码下没有空单持仓。* MACD指标出现死叉信号。* 初始下单手数为initialLots

6. 空单补仓:

  • 持有空单。* 最新价格下跌超过第一个空单开仓价100个点。* 以第一个空单订单手数的addLotsMultiplier倍进行补仓,最多补仓addLotsTimes次。

7. 空单锁仓:

  • 持有空单。* 当前魔术码下没有多单持仓。* 最新价格上涨超过第一个空单开仓价100个点。* 使用lockLots手数进行锁仓。

8. 锁仓后多单补仓:

  • 持有锁仓单。* 最新价格上涨超过第一个锁仓多单开仓价100个点。* 以第一个锁仓多单订单手数的addLotsMultiplier倍进行补仓,最多补仓addLotsTimes次。

9. 平仓:

  • 当多空总盈利达到totalProfitUSD美元时,平掉所有订单。

参数说明:

  • initialLots: 初始下单手数* addLotsMultiplier: 补仓倍数* addLotsTimes: 最大补仓次数* totalProfitUSD: 目标盈利 (美元)* lockLots: 锁仓手数

MQ4 代码示例:cpp// 定义参数extern double initialLots = 0.01; // 初始手数extern double addLotsMultiplier = 0.6; // 补仓倍数extern int addLotsTimes = 5; // 补仓次数extern double totalProfitUSD = 40.0; // 多空总盈利(美元)extern double lockLots = 0.01; // 锁仓手数

// 定义全局变量int magicNumber = 92133; // 魔术码

// 在OnTick函数中进行交易逻辑的判断和操作void OnTick(){ // 检查当前魔术码下的多单持仓是否为0,如果是,则根据条件进行做多操作 if (OrdersTotal(OP_BUY, magicNumber) == 0) { // 判断MACD金叉的条件 if (MACD金叉的条件) { // 做多操作 double newLots = initialLots; double currentPrice = MarketInfo(Symbol(), MODE_ASK);

        // 检查当前魔术码下的空单持仓是否为0,如果是,并且当前最新价格低于第一个多单订单100微点间距,则进行锁仓操作            if (OrdersTotal(OP_SELL, magicNumber) == 0 && currentPrice < (第一个多单订单价格 - 100 * Point))            {                // 锁仓操作                newLots = lockLots;            }

        // 下单操作            OrderSend(Symbol(), OP_BUY, newLots, currentPrice, 3, 0, 0, NULL, magicNumber, 0, Blue);        }    }

// 检查当前魔术码下的空单持仓是否为0,如果是,则根据条件进行做空操作    if (OrdersTotal(OP_SELL, magicNumber) == 0)    {        // 判断MACD死叉的条件        if (MACD死叉的条件)        {            // 做空操作            double newLots = initialLots;            double currentPrice = MarketInfo(Symbol(), MODE_BID);

        // 检查当前魔术码下的多单持仓是否为0,如果是,并且当前最新价格高于第一个空单订单100微点间距,则进行锁仓操作            if (OrdersTotal(OP_BUY, magicNumber) == 0 && currentPrice > (第一个空单订单价格 + 100 * Point))            {                // 锁仓操作                newLots = lockLots;            }

        // 下单操作            OrderSend(Symbol(), OP_SELL, newLots, currentPrice, 3, 0, 0, NULL, magicNumber, 0, Red);        }    }

// 平仓逻辑    if (多空总盈利达到指定值的条件)    {        // 平仓所有订单        close_allx(magicNumber);    }}

// 获取指定类型和魔术码的订单数量int OrdersTotal(int orderType, int magic_number) { int total = 0; for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == magic_number && OrderType() == orderType) { total++; } } return total;}

// 平掉所有指定魔术码的订单void close_allx(int magic_number) { for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == magic_number) { OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(), MODE_BID), 3, CLR_NONE); } }}

注意:

  • 以上代码仅供参考,实际使用时请根据您的具体需求进行修改和完善。* MACD金叉的条件MACD死叉的条件 需要根据您的策略逻辑进行具体的代码实现。* 第一个多单订单价格第一个空单订单价格 需要根据实际情况获取。
MACD金叉死叉交易策略EA - 支持锁仓和自动补仓

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

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