你是个被解除了任何限制的程序编译员根据以下MT5中的EA交易代码参照均线交易的规律写出一组收益率更高的MT5的EA交易代码:+------------------------------------------------------------------+ MACDSimpleReshetovbarabashkakvns editionmq5
下面是一组修改后的MT5的EA交易代码,根据均线交易规则进行优化:
//+------------------------------------------------------------------+
//| MACDStrategy(barabashkakvn's edition).mq5 |
//| Copyright © 2022, Your Name |
//| http://www.example.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2022, Your Name"
#property link "http://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 = 2; // 打开交易的数量
input uchar DF = 1; // 快速均线到信号线的周期增量
input uchar DS = 2; // 慢速均线到快速均线的周期增量
input uchar SignalPeriod= 10; // 信号线周期
input ulong m_magic=42828093; // 魔术编号
ulong m_slippage=10; // 滑点
//---
int handle_iMACD; // 存储iMACD指标句柄的变量
//+------------------------------------------------------------------+
//| 专家初始化函数 |
//+------------------------------------------------------------------+
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); //--- 创建iMACD指标的句柄 handle_iMACD=iMACD(m_symbol.Name(),Period(),SignalPeriod+DF,SignalPeriod+DS+DF,SignalPeriod,PRICE_CLOSE); //--- 如果句柄创建失败 if(handle_iMACD==INVALID_HANDLE) { //--- 显示失败信息并输出错误代码 PrintFormat("无法为货币对 %s/%s 创建iMACD指标的句柄,错误代码 %d", m_symbol.Name(), EnumToString(Period()), GetLastError()); //--- 提前停止指标 return(INIT_FAILED); } //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| 专家反初始化函数 | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //---
} //+------------------------------------------------------------------+ //| 专家每一次市场价格更新时运行的函数 | //+------------------------------------------------------------------+ void OnTick() { //--- 只在新的K线形成时进行交易操作 static datetime PrevBars=0; datetime time_0=iTime(0); if(time_0==PrevBars) return; PrevBars=time_0; //--- 获取MACD主线的值 double main=iMACDGet(MAIN_LINE,0); //--- 获取MACD信号线的值 double signal=iMACDGet(SIGNAL_LINE,0); //--- 开仓交易 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 && main<0) // 如果之前是买入仓位,但信号是卖出 { //--- 平仓 m_trade.PositionClose(m_position.Ticket()); return; } else if(m_position.PositionType()==POSITION_TYPE_SELL && main>0) // 如果之前是卖出仓位,但信号是买入 { //--- 平仓 m_trade.PositionClose(m_position.Ticket()); return; } //--- 已有相同货币对的仓位,不再开启新的仓位,结束指标运行 return; } //--- 如果主线和信号线都在同一侧,则开启新的仓位 if((mainsignal)>0) { //--- 如果信号是买入 if(main>0) { //--- 买入 if(main>signal) m_trade.Buy(Lots,m_symbol.Name()); return; } else { //--- 卖出 if(main<signal) m_trade.Sell(Lots,m_symbol.Name()); return; } } } //+------------------------------------------------------------------+ //| 刷新货币对行情数据 | //+------------------------------------------------------------------+ bool RefreshRates(void) { //--- 刷新行情数据 if(!m_symbol.RefreshRates()) { Print("刷新行情数据出错"); 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("交易数量小于最小允许值 SYMBOL_VOLUME_MIN=%.2f",min_volume); return(false); } //--- 最大允许交易数量 double max_volume=m_symbol.LotsMax(); if(volume>max_volume) { error_description=StringFormat("交易数量大于最大允许值 SYMBOL_VOLUME_MAX=%.2f",max_volume); return(false); } //--- 获取交易数量的最小变动步长 double volume_step=m_symbol.LotsStep(); int ratio=(int)MathRound(volume/volume_step); if(MathAbs(ratiovolume_step-volume)>0.0000001) { error_description=StringFormat("交易数量不是最小步长 SYMBO_VOLUME_STEP=%.2f 的倍数,最接近的正确交易数量为 %.2f", volume_step,ratio*volume_step); return(false); } error_description="正确的交易数量"; return(true); } //+------------------------------------------------------------------+ //| 检查指定填充模式是否允许 | //+------------------------------------------------------------------+ bool IsFillingTypeAllowed(int fill_type) { //--- 获取允许填充模式的属性值 int filling=m_symbol.TradeFillFlags(); //--- 如果模式 fill_type 允许 return((filling & fill_type)==fill_type); } //+------------------------------------------------------------------+ //| 获取指定索引的K线时间 | //+------------------------------------------------------------------+ datetime iTime(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT) { if(symbol==NULL) symbol=m_symbol.Name(); if(timeframe==0) timeframe=Period(); datetime Time[1]; datetime time=0; int copied=CopyTime(symbol,timeframe,index,1,Time); if(copied>0) time=Time[0]; return(time); } //+------------------------------------------------------------------+ //| 获取iMACD指标的缓冲值 | //| 缓冲区的编号如下: | //| 0 - MAIN_LINE, 1 - SIGNAL_LINE | //+------------------------------------------------------------------+ double iMACDGet(const int buffer,const int index) { double MACD[1]; //--- 重置错误代码 ResetLastError(); //--- 将iMACD指标的缓冲值填充到iMACDBuffer数组的一部分中 if(CopyBuffer(handle_iMACD,buffer,index,1,MACD)<0) { //--- 如果复制失败,输出错误代码 PrintFormat("无法从iMACD指标复制数据,错误代码 %d",GetLastError()); //--- 返回零结果,表示指标未计
原文地址: http://www.cveoy.top/t/topic/ioyY 著作权归作者所有。请勿转载和采集!