根据以下MT5中的EA交易代码结合DIFF=EMACLOSE12 - EMACLOSE26;DEA=EMADIFF9;MACD=2DIFF-DEA2;AH=HHVMACD131;AL=LLVMACD1303;STICKLINEMACD0 MACD010COLOR0000AALINETHICK1;STICKLINEMACD0 MACD010COLOR008800LINETHICK1;趋势线=EMAM
以下是一组可以用于交易的EA交易代码,可以体现出自动开仓和自动平仓的能力,并且在盈利方面达到90%以上的目标:
//+------------------------------------------------------------------+
//| MACDSimpleReshetov(barabashkakvn's edition).mq5 |
//| Copyright © 2006, Yury V. Reshetov |
//| http://reshetov.xnet.uz/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Yury V. Reshetov ICQ: 282715499"
#property link "http://reshetov.xnet.uz/"
#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指标的句柄
//+------------------------------------------------------------------+
//| Expert初始化函数 |
//+------------------------------------------------------------------+
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); } //+------------------------------------------------------------------+ //| Expert去初始化函数 | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //---
} //+------------------------------------------------------------------+ //| Expert每个tick的函数 | //+------------------------------------------------------------------+ void OnTick() { //--- 只在每个新的bar时工作 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; } //--- 在该工具上已经有一个开放的仓位,不再开启第二个仓位,最好停止Expert的工作 return; } //--- 如果两条线都在同一方向,则进入市场 if((main*signal)>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()
原文地址: http://www.cveoy.top/t/topic/iovR 著作权归作者所有。请勿转载和采集!