MT5 交易策略:基于 MACD 指标的趋势交易策略
//+------------------------------------------------------------------+/n//| MovingAverageCrossoverEA.mq5 |/n//| Created by ChatGPT |/n//+------------------------------------------------------------------+/n#property copyright /'Created by ChatGPT/'/n#property link /'https://www.example.com/'/n#property version /'1.000/'/n//---/n#include <Trade//PositionInfo.mqh>/n#include <Trade//Trade.mqh>/n#include <Trade//SymbolInfo.mqh> /n/nCPositionInfo m_position; // trade position object/nCTrade m_trade; // trading object/nCSymbolInfo m_symbol; // symbol info object/n/n//--- input parameters/ninput double Lots = 0.05; // 交易手数/ninput int FastMA = 6; // 快速均线周期/ninput int MedianMA = 16; // 中间均线周期/ninput int SlowMA = 30; // 慢速均线周期/ninput ulong m_magic=42828093; // 魔术数字/nulong m_slippage=10; // 滑点/n/n//---/nint handle_fastMA; // 快速均线指标句柄/nint handle_medianMA; // 中间均线指标句柄/nint handle_slowMA; // 慢速均线指标句柄/n/n//+------------------------------------------------------------------+/n//| Expert initialization function |/n//+------------------------------------------------------------------+/nint OnInit()/n{/n //---/n if(!m_symbol.Name(Symbol())) // 设置交易品种名称/n return(INIT_FAILED);/n/n RefreshRates();/n/n string err_text=/'/';/n if(!CheckVolumeValue(Lots,err_text))/n {/n Print(err_text);/n return(INIT_PARAMETERS_INCORRECT);/n }/n/n //---/n m_trade.SetExpertMagicNumber(m_magic);/n/n if(IsFillingTypeAllowed(SYMBOL_FILLING_FOK))/n m_trade.SetTypeFilling(ORDER_FILLING_FOK);/n else if(IsFillingTypeAllowed(SYMBOL_FILLING_IOC))/n m_trade.SetTypeFilling(ORDER_FILLING_IOC);/n else/n m_trade.SetTypeFilling(ORDER_FILLING_RETURN);/n/n m_trade.SetDeviationInPoints(m_slippage);/n/n //--- 创建快速均线指标句柄/n handle_fastMA = iMA(m_symbol.Name(), PERIOD_M15, FastMA, 0, MODE_SMA, PRICE_CLOSE);/n //--- 创建中间均线指标句柄/n handle_medianMA = iMA(m_symbol.Name(), PERIOD_M15, MedianMA, 0, MODE_SMA, PRICE_CLOSE);/n //--- 创建慢速均线指标句柄/n handle_slowMA = iMA(m_symbol.Name(), PERIOD_M15, SlowMA, 0, MODE_SMA, PRICE_CLOSE);/n/n //--- 检查指标句柄是否创建成功/n if(handle_fastMA == INVALID_HANDLE || handle_medianMA == INVALID_HANDLE || handle_slowMA == INVALID_HANDLE)/n {/n Print(/'Failed to create moving average indicators for the symbol /', m_symbol.Name());/n return(INIT_FAILED);/n }/n/n return(INIT_SUCCEEDED);/n}/n/n//+------------------------------------------------------------------+/n//| Expert deinitialization function |/n//+------------------------------------------------------------------+/nvoid OnDeinit(const int reason)/n{/n //---/n}/n/n//+------------------------------------------------------------------+/n//| Expert tick function |/n//+------------------------------------------------------------------+/nvoid OnTick()/n{/n //--- 仅在新K线生成时进行交易/n static datetime PrevBars=0;/n datetime time_0=iTime(0);/n if(time_0==PrevBars)/n return;/n PrevBars=time_0;/n/n //--- 获取均线值/n double fastMA = iMAGet(0, handle_fastMA);/n double medianMA = iMAGet(0, handle_medianMA);/n double slowMA = iMAGet(0, handle_slowMA);/n/n //--- 检查当前是否有持仓/n for(int i=PositionsTotal()-1;i>=0;i--)/n {/n if(m_position.SelectByIndex(i))/n {/n if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)/n {/n if(m_position.PositionType()==POSITION_TYPE_BUY && fastMA < medianMA && fastMA < slowMA)/n {/n //--- 卖出持仓/n m_trade.PositionClose(m_position.Ticket());/n break;/n }/n else if(m_position.PositionType()==POSITION_TYPE_SELL && fastMA > medianMA && fastMA > slowMA)/n {/n //--- 买入持仓/n m_trade.PositionClose(m_position.Ticket());/n break;/n }/n }/n }/n }/n/n //--- 如果快速均线上穿中间均线和慢速均线,进行买入交易/n if(fastMA > medianMA && fastMA > slowMA && m_position.PositionType() != POSITION_TYPE_BUY)/n {/n m_trade.Buy(Lots, m_symbol.Name());/n }/n //--- 如果快速均线下穿中间均线和慢速均线,进行卖出交易/n else if(fastMA < medianMA && fastMA < slowMA && m_position.PositionType() != POSITION_TYPE_SELL)/n {/n m_trade.Sell(Lots, m_symbol.Name());/n }/n //--- 添加交易逻辑/n double DIFF = iMA(CLOSE, 12, 0, MODE_EMA, PRICE_CLOSE/
原文地址: https://www.cveoy.top/t/topic/fvXq 著作权归作者所有。请勿转载和采集!