MACD金叉死叉交易策略EA - 支持锁仓和自动补仓
基于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死叉的条件需要根据您的策略逻辑进行具体的代码实现。*第一个多单订单价格和第一个空单订单价格需要根据实际情况获取。
原文地址: https://www.cveoy.top/t/topic/b5UM 著作权归作者所有。请勿转载和采集!