MT4-裸K交易系统EA
简介: MACD背驰外汇交易策略:简单高效的外汇
关键词:MACD背驰、外汇交易策略、MACD指标、趋势反转、回调交易
MACD背驰外汇交易策略是一种基于标准MACD指标(平滑异同移动平均线)的可靠交易系统。
该策略的核心在于识别MACD线与货币对价格之间的背离信号,适用于捕捉市场回调和趋势反转。
尽管其进场和出场点位定义较为模糊,但信号识别简单且易于掌握,交易者通过此策略可获得可观的潜在收益
。本文将详细介绍该策略的特点、设置方法、交易条件及示例,帮助您快速上手。
1. 信号识别简单:无需复杂分析,交易者只需关注MACD与价格的背离即可。
2. 单一标准指标:仅依赖MACD,无需额外工具,适合初学者。
3. 潜在收益丰厚:有效捕捉趋势反转和回调,盈利空间较大。
4. 止盈止损模糊:进出场点位不够明确,需结合支撑阻力水平判断。
5. 长期图表信号稀少:在较长周期图表中,背离信号出现频率较低。
· 货币对:适用于任意外汇货币对(如EUR/USD、GBP/USD等)。
· 时间框架:可用于任何时间周期,但推荐短时间框架(如5分钟、15分钟),以增加交易机会。
1. 在交易图表上添加MACD指标。
2. 参数设置:
o 快线EMA:12周期
o 慢线EMA:26周期
o MACDSMA:9周期
3. 数据来源:使用收盘价。
· 做多信号:当价格处于下跌趋势(看跌),而MACD指标显示上涨趋势(看涨背离)时,进场做多。
· 做空信号:当价格处于上涨趋势(看涨),而MACD指标显示下跌趋势(看跌背离)时,进场做空。
· 止损设置:
§ 做多:将止损设在附近的支撑位。
§ 做空:将止损设在附近的阻力位。
· 止盈设置:
§ 做多:将止盈设在下一个阻力水平。
§ 做空:将止盈设在下一个支撑水平。
· 反转平仓:当系统发出相反的背离信号时,平掉现有头寸。
以下以EUR/USD货币对在15分钟时间框架为例,展示策略应用:
· 情景:价格处于下跌趋势,持续创出新低,但MACD指标却逐步走高,形成看涨背离。
· 进场点:在下跌趋势明显结束时(例如双重底形态确认),进场做多。
· 止损点:设置在双重底形成的支撑水平下方。
· 止盈点:设置在前期下跌趋势短期回调形成的阻力水平。
· 结果:此交易的止盈/止损比例约为1.5以上,风险收益比表现出色。
· 易于上手:仅需掌握MACD背离的基本概念即可操作。
· 高效性:短时间框架下信号频发,适合活跃交易者。
· 灵活性:适用于多种货币对和市场条件。
· 信号模糊性:进出场点需结合支撑阻力或其他技术分析确认。
· 风险管理:由于止损和止盈水平不固定,建议严格控制仓位。
· 时间选择:避免在重大经济数据发布时交易,以降低假信号风险。
//+------------------------------------------------------------------+
//| MACD_Divergence_EA.mq4 |
//| Created for Naked K Trading System |
//| Date: March 14, 2025 |
//+------------------------------------------------------------------+
#property copyright "eawalk.com/"
#property link "https://www.eawalk.com/"
#property version "1.00"
#property strict
// 输入参数
input int FastEMA = 12; // 快线 EMA 周期
input int SlowEMA = 26; // 慢线 EMA 周期
input int SignalSMA = 9; // MACD SMA 周期
input double LotSize = 0.1; // 交易手数
input int StopLossPoints = 50; // 止损点数
input int TakeProfitPoints = 75;// 止盈点数
input int LookbackBars = 10; // 回看周期(检测背离的柱数)
// 全局变量
int ticket = 0; // 订单编号
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// 检查是否已有订单
if (OrdersTotal() > 0) {
CheckForClose();
return;
}
// 获取 MACD 值
double macdCurrent = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, MODE_MAIN, 0);
double macdPrevious = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, MODE_MAIN, 1);
double priceCurrent = Close[0];
double pricePrevious = Close[1];
// 检测看涨背离(价格下跌,MACD 上升)
if (CheckBullishDivergence()) {
OpenBuyOrder();
}
// 检测看跌背离(价格上升,MACD 下跌)
if (CheckBearishDivergence()) {
OpenSellOrder();
}
}
//+------------------------------------------------------------------+
//| 检查看涨背离 |
//+------------------------------------------------------------------+
bool CheckBullishDivergence()
{
double lowestPrice = Low[iLowest(NULL, 0, MODE_LOW, LookbackBars, 0)];
double macdCurrent = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, MODE_MAIN, 0);
double macdLowest = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, MODE_MAIN, iLowest(NULL, 0, MODE_LOW, LookbackBars, 0));
// 价格创近期新低,MACD 未创新低
if (Close[0] < Close[1] && lowestPrice == Low[0] && macdCurrent > macdLowest) {
return true;
}
return false;
}
//+------------------------------------------------------------------+
//| 检查看跌背离 |
//+------------------------------------------------------------------+
bool CheckBearishDivergence()
{
double highestPrice = High[iHighest(NULL, 0, MODE_HIGH, LookbackBars, 0)];
double macdCurrent = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, MODE_MAIN, 0);
double macdHighest = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, MODE_MAIN, iHighest(NULL, 0, MODE_HIGH, LookbackBars, 0));
// 价格创近期新高,MACD 未创新高
if (Close[0] > Close[1] && highestPrice == High[0] && macdCurrent < macdHighest) {
return true;
}
return false;
}
//+------------------------------------------------------------------+
//| 开多单 |
//+------------------------------------------------------------------+
void OpenBuyOrder()
{
double stopLoss = Ask - StopLossPoints * Point;
double takeProfit = Ask + TakeProfitPoints * Point;
ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, stopLoss, takeProfit, "MACD Bullish Divergence", 0, 0, clrGreen);
if (ticket < 0) {
Print("OrderSend failed with error #", GetLastError());
} else {
Print("Buy order opened successfully: Ticket #", ticket);
}
}
//+------------------------------------------------------------------+
//| 开空单 |
//+------------------------------------------------------------------+
void OpenSellOrder()
{
double stopLoss = Bid + StopLossPoints * Point;
double takeProfit = Bid - TakeProfitPoints * Point;
ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, stopLoss, takeProfit, "MACD Bearish Divergence", 0, 0, clrRed);
if (ticket < 0) {
Print("OrderSend failed with error #", GetLastError());
} else {
Print("Sell order opened successfully: Ticket #", ticket);
}
}
//+------------------------------------------------------------------+
//| 检查平仓条件(反向背离信号) |
//+------------------------------------------------------------------+
void CheckForClose()
{
for (int i = 0; i < OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol() == Symbol()) {
if (OrderType() == OP_BUY && CheckBearishDivergence()) {
if (OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrYellow)) {
Print("Buy order closed due to bearish divergence");
}
}
if (OrderType() == OP_SELL && CheckBullishDivergence()) {
if (OrderClose(OrderTicket(), OrderLots(), Ask, 3, clrYellow)) {
Print("Sell order closed due to bullish divergence");
}
}
}
}
}
}
//+------------------------------------------------------------------+