MQL5均线交叉EA交易策略:完整代码及SEO优化
MQL5均线交叉EA交易策略:完整代码及SEO优化
这篇文章提供了一个完整的MQL5均线交叉EA交易策略代码,该策略基于快速、中间和慢速三条均线的交叉信号进行交易决策。 为了方便您理解和使用该策略,代码中包含了详细的注释。
代码MQL5//+------------------------------------------------------------------+//| MovingAverageCrossoverEA.mq5 |//| Created by ChatGPT |//+------------------------------------------------------------------+#property copyright 'Created by ChatGPT'#property link 'https://www.example.com'#property version '1.000'//---#include <Trade\PositionInfo.mqh>#include <Trade\Trade.mqh>#include <Trade\SymbolInfo.mqh>
CPositionInfo m_position; // trade position objectCTrade m_trade; // trading objectCSymbolInfo m_symbol; // symbol info object
//--- input parametersinput double Lots = 0.05; // 交易手数input int FastMA = 6; // 快速均线周期input int MedianMA = 16; // 中间均线周期input int SlowMA = 30; // 慢速均线周期input ulong m_magic=42828093; // 魔术数字ulong m_slippage=10; // 滑点
//---int handle_fastMA; // 快速均线指标句柄int handle_medianMA; // 中间均线指标句柄int handle_slowMA; // 慢速均线指标句柄
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int OnInit(){ //--- if(!m_symbol.Name(Symbol())) // 设置交易品种名称 return(INIT_FAILED);
RefreshRates();
string err_text=''; if(!CheckVolumeValue(Lots,err_text)) { Print(err_text); return(INIT_PARAMETERS_INCORRECT); }
//--- m_trade.SetExpertMagicNumber(m_magic);
if(IsFillingTypeAllowed(SYMBOL_FILLING_FOK)) m_trade.SetTypeFilling(ORDER_FILLING_FOK); else if(IsFillingTypeAllowed(SYMBOL_FILLING_IOC)) m_trade.SetTypeFilling(ORDER_FILLING_IOC); else m_trade.SetTypeFilling(ORDER_FILLING_RETURN);
m_trade.SetDeviationInPoints(m_slippage);
//--- 创建快速均线指标句柄 handle_fastMA = iMA(m_symbol.Name(), PERIOD_M15, FastMA, 0, MODE_SMA, PRICE_CLOSE); //--- 创建中间均线指标句柄 handle_medianMA = iMA(m_symbol.Name(), PERIOD_M15, MedianMA, 0, MODE_SMA, PRICE_CLOSE); //--- 创建慢速均线指标句柄 handle_slowMA = iMA(m_symbol.Name(), PERIOD_M15, SlowMA, 0, MODE_SMA, PRICE_CLOSE);
//--- 检查指标句柄是否创建成功 if(handle_fastMA == INVALID_HANDLE || handle_medianMA == INVALID_HANDLE || handle_slowMA == INVALID_HANDLE) { Print('Failed to create moving average indicators for the symbol ', m_symbol.Name()); return(INIT_FAILED); }
return(INIT_SUCCEEDED);}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+void OnDeinit(const int reason){ //---}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+void OnTick(){ //--- 仅在新K线生成时进行交易 static datetime PrevBars=0; datetime time_0=iTime(0); if(time_0==PrevBars) return; PrevBars=time_0;
//--- 获取均线值 double fastMA = iMAGet(0, handle_fastMA); double medianMA = iMAGet(0, handle_medianMA); double slowMA = iMAGet(0, handle_slowMA);
//--- 检查当前是否有持仓 for(int i=PositionsTotal()-1;i>=0;i--) { if(m_position.SelectByIndex(i)) { if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic) { if(m_position.PositionType()==POSITION_TYPE_BUY && fastMA < medianMA && fastMA < slowMA) { //--- 卖出持仓 m_trade.PositionClose(m_position.Ticket()); break; } else if(m_position.PositionType()==POSITION_TYPE_SELL && fastMA > medianMA && fastMA > slowMA) { //--- 买入持仓 m_trade.PositionClose(m_position.Ticket()); break; } } } }
//--- 添加交易逻辑 double diff = iMAGet(0, handle_fastMA) - iMAGet(0, handle_slowMA); double dea = iMAGet(0, handle_medianMA); double macd = 2 * (diff - dea / 2); double trendLine = iMAGet(0, handle_slowMA); double prevTrendLine = iMAGet(1, handle_slowMA);
//--- 如果MACD>0且趋势线变为红色区域,进行买入交易 if(macd > 0 && trendLine > prevTrendLine && m_position.PositionType() != POSITION_TYPE_BUY) { m_trade.Buy(Lots, m_symbol.Name()); } //--- 如果MACD<0且趋势线变为绿色区域,进行卖出交易 else if(macd < 0 && trendLine < prevTrendLine && m_position.PositionType() != POSITION_TYPE_SELL) { m_trade.Sell(Lots, m_symbol.Name()); }}
//+------------------------------------------------------------------+//| 刷新交易品种行情数据 |//+------------------------------------------------------------------+bool RefreshRates(void){ //--- 刷新行情数据 if(!m_symbol.RefreshRates()) { Print('RefreshRates error'); return(false); }
//--- 保护返回值不为'零' if(m_symbol.Ask()==0 || m_symbol.Bid()==0) return(false);
return(true);}
//+------------------------------------------------------------------+//| 检查交易手数的正确性 |//+------------------------------------------------------------------+bool CheckVolumeValue(double volume, string &error_description){ //--- 最小允许交易手数 double min_volume = m_symbol.LotsMin(); if(volume < min_volume) { error_description = StringFormat('Volume is less than the minimal allowed SYMBOL_VOLUME_MIN=%.2f', min_volume); return(false); }
//--- 最大允许交易手数 double max_volume = m_symbol.LotsMax(); if(volume > max_volume) { error_description = StringFormat('Volume is greater than the maximal allowed SYMBOL_VOLUME_MAX=%.2f', max_volume); return(false); }
//--- 获取交易手内容:数的步长 double volume_step = m_symbol.LotsStep(); //--- 检查交易手数是否为步长的整数倍 double remainder = fmod(volume, volume_step); if(remainder != 0) { error_description = StringFormat('Volume is not a multiple of SYMBOL_VOLUME_STEP=%.2f', volume_step); return(false); }
return(true);}
代码说明
该EA交易策略主要基于以下逻辑:
- 三均线交叉: 使用快速、中间和慢速三条均线判断趋势。* MACD指标: 使用MACD指标辅助判断买入和卖出信号。* 趋势线: 使用慢速均线作为趋势线,判断趋势方向变化。
SEO优化
- 标题: 使用关键词丰富的标题,例如“MQL5均线交叉EA交易策略:完整代码及SEO优化”。* 描述: 编写简洁明了的描述,突出文章内容,例如“这篇博客提供了一个完整的MQL5均线交叉EA交易策略代码,包含详细的代码注释和SEO优化,帮助您理解和使用该策略进行自动化交易”。* 关键词: 使用相关关键词,例如“MQL5, EA, 交易策略, 均线交叉, 自动化交易, SEO优化”。
免责声明
这只是一个示例代码,不构成任何投资建议。在使用该EA交易策略之前,请您充分了解其风险,并谨慎使用。
原文地址: http://www.cveoy.top/t/topic/fwnp 著作权归作者所有。请勿转载和采集!