MT5量化交易EA代码完善:基于MACD和趋势线策略
MT5量化交易EA代码完善:基于MACD和趋势线策略
本文将对一个基于MACD和趋势线指标的MT5量化交易EA代码进行完善,实现自动交易功能。
初始设定:
- 交易手数: input double Lots = 0.05;
- 魔术数字: input ulong m_magic = 42828093;
- 滑点: ulong m_slippage = 10;
交易逻辑:
-
做多条件:
- 趋势线(EMA(MACD,34,1))变为红色区域
- STICKLINE(REF(MACD,1)<MACD,MACD,REF(MACD,1),7,0),colorred) 为红色
- STICKLINE(MACD=AH,AH,K,8,0),LINETHICK1,colorred) 为红色
当满足以上条件时,开始做多并一直持有头寸,直到趋势线变为绿色区域,系统指令平仓交易结束。
-
做空条件:
- 趋势线(EMA(MACD,34,1))区域和STICKLINE(REF(MACD,2)>MACD,MACD,REF(MACD,1),8,1),colorgreen) 都为绿色
当满足以上条件时,开始做空并一直持有头寸,直到趋势线变为红色区域,系统指令平仓交易结束。
完善后的EA交易代码:
// 定义指标变量
double DIFF, DEA, MACD, AH, AL, trendline, K, D, J;
// 计算DIFF、DEA、MACD指标
DIFF = iMA(NULL, 0, 12, 0, MODE_EMA, PRICE_CLOSE) - iMA(NULL, 0, 26, 0, MODE_EMA, PRICE_CLOSE);
DEA = iMA(NULL, 0, 9, 0, MODE_EMA, DIFF);
MACD = 2 * (DIFF - DEA / 2);
// 计算AH、AL指标
AH = iHighest(NULL, 0, MODE_MAIN, 13, 1);
AL = iLowest(NULL, 0, MODE_MAIN, 13, 0.3);
// 绘制MACD指标柱状图
for (int i = 0; i < Bars; i++) {
if (MACD[i] > 0) {
PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, i);
break;
}
}
PlotIndexSetInteger(0, PLOT_ARROW, 233);
PlotIndexSetInteger(0, PLOT_ARROW_SHIFT, 0);
// 绘制趋势线
trendline = iMA(NULL, 0, 34, 1, MODE_EMA, MACD);
for (int i = 0; i < Bars; i++) {
if (trendline[i] > trendline[i - 1]) {
PlotIndexSetDouble(1, PLOT_LINE_VALUE, trendline[i]);
PlotIndexSetInteger(1, PLOT_LINE_BEGIN, i);
break;
}
}
PlotIndexSetInteger(1, PLOT_ARROW, 233);
PlotIndexSetInteger(1, PLOT_ARROW_SHIFT, 0);
PlotIndexSetString(1, PLOT_LABEL, 'Trend Line');
// 计算K、D、J指标
K = iMA(NULL, 0, 2, 1, MODE_SMA, MACD);
D = iMA(NULL, 0, 2, 1, MODE_SMA, K);
J = iMA(NULL, 0, 2, 1, MODE_SMA, D);
// 绘制K、D、J指标柱状图
for (int i = 0; i < Bars; i++) {
if (K[i] > REF(K, 1)[i]) {
PlotIndexSetDouble(2, PLOT_LINE_VALUE, K[i]);
PlotIndexSetInteger(2, PLOT_LINE_BEGIN, i);
break;
}
}
PlotIndexSetInteger(2, PLOT_ARROW, 233);
PlotIndexSetInteger(2, PLOT_ARROW_SHIFT, 0);
PlotIndexSetString(2, PLOT_LABEL, 'K');
for (int i = 0; i < Bars; i++) {
if (D[i] > REF(D, 1)[i]) {
PlotIndexSetDouble(3, PLOT_LINE_VALUE, D[i]);
PlotIndexSetInteger(3, PLOT_LINE_BEGIN, i);
break;
}
}
PlotIndexSetInteger(3, PLOT_ARROW, 233);
PlotIndexSetInteger(3, PLOT_ARROW_SHIFT, 0);
PlotIndexSetString(3, PLOT_LABEL, 'D');
for (int i = 0; i < Bars; i++) {
if (J[i] > REF(J, 1)[i]) {
PlotIndexSetDouble(4, PLOT_LINE_VALUE, J[i]);
PlotIndexSetInteger(4, PLOT_LINE_BEGIN, i);
break;
}
}
PlotIndexSetInteger(4, PLOT_ARROW, 233);
PlotIndexSetInteger(4, PLOT_ARROW_SHIFT, 0);
PlotIndexSetString(4, PLOT_LABEL, 'J');
// 绘制MACD指标柱状图
for (int i = 1; i < Bars; i++) {
if (REF(MACD, 1)[i] < MACD[i]) {
PlotIndexSetDouble(5, PLOT_LINE_BEGIN_VALUE, MACD[i]);
PlotIndexSetDouble(5, PLOT_LINE_END_VALUE, REF(MACD, 1)[i]);
PlotIndexSetInteger(5, PLOT_LINE_BEGIN, i);
break;
}
}
PlotIndexSetInteger(5, PLOT_ARROW, 233);
PlotIndexSetInteger(5, PLOT_ARROW_SHIFT, 0);
PlotIndexSetString(5, PLOT_LABEL, 'MACD');
// 绘制AH指标线
for (int i = 0; i < Bars; i++) {
if (MACD[i] == AH) {
PlotIndexSetDouble(6, PLOT_LINE_VALUE, AH);
PlotIndexSetDouble(6, PLOT_LINE_BEGIN_VALUE, K[i]);
PlotIndexSetInteger(6, PLOT_LINE_BEGIN, i);
break;
}
}
PlotIndexSetInteger(6, PLOT_ARROW, 233);
PlotIndexSetInteger(6, PLOT_ARROW_SHIFT, 0);
PlotIndexSetString(6, PLOT_LABEL, 'AH');
// 绘制MACD指标柱状图
for (int i = 2; i < Bars; i++) {
if (REF(MACD, 2)[i] > MACD[i]) {
PlotIndexSetDouble(7, PLOT_LINE_BEGIN_VALUE, MACD[i]);
PlotIndexSetDouble(7, PLOT_LINE_END_VALUE, REF(MACD, 1)[i]);
PlotIndexSetInteger(7, PLOT_LINE_BEGIN, i);
break;
}
}
PlotIndexSetInteger(7, PLOT_ARROW, 233);
PlotIndexSetInteger(7, PLOT_ARROW_SHIFT, 0);
PlotIndexSetString(7, PLOT_LABEL, 'MACD');
// 设置EA交易参数和逻辑
bool isLong = false;
bool isShort = false;
if (trendline > 0 && REF(MACD, 1) < MACD && MACD == AH) {
isLong = true;
isShort = false;
} else if (trendline < 0 && REF(MACD, 2) > MACD) {
isLong = false;
isShort = true;
}
if (isLong && OrderSend(Symbol(), OP_BUY, Lots, Ask, m_slippage, 0, 0, 'Buy Order', m_magic)) {
// 开多头寸成功
} else if (isShort && OrderSend(Symbol(), OP_SELL, Lots, Bid, m_slippage, 0, 0, 'Sell Order', m_magic)) {
// 开空头寸成功
}
if (trendline < 0 && OrderClose(OrderTicket(), OrderLots(), Bid, m_slippage, 0, clrRed)) {
// 平仓成功
}
注意:
- 以上代码仅供参考,实际使用前需要根据自己的交易策略和风险承受能力进行调整和优化。
- 建议在测试环境中对代码进行充分的测试,确保代码的稳定性和可靠性。
- 交易存在风险,投资需谨慎。
原文地址: https://www.cveoy.top/t/topic/p7St 著作权归作者所有。请勿转载和采集!