参照MT5中的EA的量化交易逻辑对以下可以在MT5交易软件中进行量化交易的EA交易代码进行完善:本EA的交易逻辑:一、在以下条件下做多:当趋势线也就是EMAMACD341变为红色区域STICKLINEREFMACD1MACDMACDREFMACD170colorred也为红色的时候开始做多当趋势线也就是EMAMACD341变为红色区域STICKLINEMACD=AHAHK80LINETHICK1c
#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 ulong m_magic=42828093; // 魔术数字 ulong m_slippage=10; // 滑点
// 定义指标变量 double DIFF, DEA, MACD, AH, AL, trendline, K, D, J;
//+------------------------------------------------------------------+ //| 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);
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;
// 计算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);
// 计算趋势线
trendline = iCustom(NULL, 0, "Trendline", 0, 0);
// 计算KDJ指标
K = iCustom(NULL, 0, "KDJ", 0, 0, 9, 3, 3, MODE_MAIN, 0);
D = iCustom(NULL, 0, "KDJ", 0, 1, 9, 3, 3, MODE_MAIN, 0);
J = iCustom(NULL, 0, "KDJ", 0, 2, 9, 3, 3, MODE_MAIN, 0);
// 判断交易条件
if (MACD > 0 && AH > AL && trendline > 0 && K > D && D > J) {
// 检查是否有已开仓的交易
if (m_position.Select(Symbol(), SELECT_BY_POS, MODE_TRADES)) {
// 检查已开仓交易的类型和数量
if (m_position.PositionType() == POSITION_TYPE_BUY && m_position.PositionLots() < Lots) {
// 如果已开仓交易为买入且数量小于目标数量,则增加买入交易数量
double buyLots = Lots - m_position.PositionLots();
m_trade.Buy(Symbol(), buyLots, 0, 0, 0, 0, "Buy", m_magic);
Print("增加买入交易数量:", buyLots);
} else if (m_position.PositionType() == POSITION_TYPE_SELL && m_position.PositionLots() > 0) {
// 如果已开仓交易为卖出且数量大于0,则平仓卖出交易
m_trade.Close(m_position.PositionTicket(), m_position.PositionLots(), 0, 0, m_magic);
Print("平仓卖出交易");
}
} else {
// 如果没有已开仓的交易,则进行买入交易
m_trade.Buy(Symbol(), Lots, 0, 0, 0, 0, "Buy", m_magic);
Print("执行买入交易");
}
} else if (MACD < 0 && AH < AL && trendline < 0 && K < D && D < J) {
// 检查是否有已开仓的交易
if (m_position.Select(Symbol(), SELECT_BY_POS, MODE_TRADES)) {
// 检查已开仓交易的类型和数量
if (m_position.PositionType() == POSITION_TYPE_BUY && m_position.PositionLots() > 0) {
// 如果已开仓交易为买入且数量大于0,则平仓买入交易
m_trade.Close(m_position.PositionTicket(), m_position.PositionLots(), 0, 0, m_magic);
Print("平仓买入交易");
} else if (m_position.PositionType() == POSITION_TYPE_SELL && m_position.PositionLots() < Lots) {
// 如果已开仓交易为卖出且数量小于目标数量,则增加卖出交易数量
double sellLots = Lots - m_position.PositionLots();
m_trade.Sell(Symbol(), sellLots, 0, 0, 0, 0, "Sell", m_magic);
Print("增加卖出交易数量:", sellLots);
}
} else {
// 如果没有已开仓的交易,则进行卖出交易
m_trade.Sell(Symbol(), Lots, 0, 0, 0, 0, "Sell", m_magic);
Print("执行卖出交易");
}
}
}
原文地址: https://www.cveoy.top/t/topic/iqgI 著作权归作者所有。请勿转载和采集!