//+------------------------------------------------------------------+ //| 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

基于多重均线的双向自动化交易EA代码

原文地址: http://www.cveoy.top/t/topic/fUJc 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录