基于多重均线的双向自动化交易EA代码
//+------------------------------------------------------------------+
//| 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 object
CTrade m_trade; // trading object
CSymbolInfo m_symbol; // symbol info object
//--- input parameters
input double Lots = 0.05; // 交易手数
input int FastMA = 10; // 快速均线周期
input int SlowMA = 45; // 慢速均线周期
input ulong m_magic=42828093; // 魔术数字
ulong m_slippage=10; // 滑点
//---
int handle_fastMA; // 快速均线指标句柄
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(), FastMA, 0, MODE_SMA, PRICE_CLOSE);
//--- 创建慢速均线指标句柄
handle_slowMA = iMA(m_symbol.Name(), Period(), SlowMA, 0, MODE_SMA, PRICE_CLOSE);
//--- 检查指标句柄是否创建成功
if(handle_fastMA == 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 = iMA(m_symbol.Name(), PERIOD_M15, FastMA, 0, MODE_SMA, PRICE_CLOSE);
double ma6 = iMA(m_symbol.Name(), PERIOD_M15, 6, 0, MODE_SMA, PRICE_CLOSE);
double ma15 = iMA(m_symbol.Name(), PERIOD_M15, 15, 0, MODE_SMA, PRICE_CLOSE);
double ma30 = iMA(m_symbol.Name(), PERIOD_M15, 30, 0, MODE_SMA, PRICE_CLOSE);
double ma8 = iMA(m_symbol.Name(), PERIOD_M15, 8, 0, MODE_SMA, PRICE_CLOSE);
double ma28 = iMA(m_symbol.Name(), PERIOD_M15, 28, 0, MODE_SMA, PRICE_CLOSE);
//--- 检查当前是否有持仓
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 < ma8)
{
//--- 平仓
m_trade.PositionClose(m_position.Ticket());
break;
}
else if(m_position.PositionType()==POSITION_TYPE_SELL && fastMA > ma28)
{
//--- 平仓
m_trade.PositionClose(m_position.Ticket());
break;
}
}
}
}
//--- 如果15分钟周期K线收盘价处于6日均线、15日均线和30日均线之上,并且开始上穿6日均线开始做多
if (fastMA > ma6 && fastMA > ma15 && fastMA > ma30 && iMAGet(0, 1) < ma6 && iMAGet(0, 0) >= ma6)
{
if (m_position.PositionType() != POSITION_TYPE_BUY) {
m_trade.Buy(Lots, m_symbol.Name());
}
}
//--- 当15分钟周期K线收盘价下穿8日均线,指令平仓
else if (fastMA < ma8)
{
if (m_position.PositionType() == POSITION_TYPE_BUY) {
m_trade.PositionClose(m_position.Ticket());
}
}
//--- 如果15分钟周期K线收盘价开始处于6日均线、15日均线和30日均线之下并且下穿30日均线的时候开始做空
if (fastMA < ma6 && fastMA < ma15 && fastMA < ma30 && iMAGet(0, 1) > ma30 && iMAGet(0, 0) <= ma30)
{
if (m_position.PositionType() != POSITION_TYPE_SELL) {
m_trade.Sell(Lots, m_symbol.Name());
}
}
//--- 当收盘价上穿28日均线,指令平仓
else if (fastMA > ma28)
{
if (m_position.PositionType() == POSITION_TYPE_SELL) {
m_trade.PositionClose(m_position.Ticket());
}
}
} //+------------------------------------------------------------------+ //| 刷新交易品种行情数据 | //+------------------------------------------------------------------+ boo
原文地址: http://www.cveoy.top/t/topic/fUJc 著作权归作者所有。请勿转载和采集!