//+------------------------------------------------------------------+
//|                                          start-example.mq5 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                                                                    |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.00"
//+------------------------------------------------------------------+
//| EA初始化函数                                                  |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>             //包含执行交易的库
#include <Trade\PositionInfo.mqh>    //包含获取持仓信息的库
 
int               iMA_handle;      //存储指标句柄的变量
double            iMA_buf[];      //存储指标值的动态数组
double            Close_buf[];     //存储每个柱形收盘价格的动态数组
 
string            my_symbol;        //存储交易品种的变量
ENUM_TIMEFRAMES   my_timeframe;       //存储时间框架的变量
 
CTrade            m_Trade;      //执行交易的结构体
CPositionInfo     m_Position;   //获取持仓信息的结构体
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   my_symbol=Symbol();       //保存当前图表的交易品种,用于此EA对其进一步的操作。
   my_timeframe=PERIOD_CURRENT;       //保存图表的当前时间框架,用于此EA对其的进一步操作。
   iMA_handle=iMA(my_symbol,my_timeframe,40,0,MODE_SMA,PRICE_CLOSE);  //应用此指标并获取指标句柄
   if(iMA_handle==INVALID_HANDLE)    //检查指标句柄是否可用
   {
      Print("Failed to get the indicator handle");   //如果句柄没有获取到,打印相关报错信息到日志文件中
      return(-1);                //完成报错处理   
}
   ChartIndicatorAdd(ChartID(),0,iMA_handle);   //将指标添加到价格图表中
   ArraySetAsSeries(iMA_buf,true);     //将iMA_buf数组的索引设置为时间序列
   ArraySetAsSeries(Close_buf,true);   //将Close_buf数组的索引设置为时间序列
   return(0);                   //返回0,初始化结束  
}
//+------------------------------------------------------------------+
//| EA去初始化函数                                                |
//+------------------------------------------------------------------+
void OnDeinit (const int r<a href="http://www.520fx.com/forum.php?mod=forumdisplay&fid=25" style="color:" target="_blank">ea</a>son)
  {
   IndicatorRel<a href="http://www.520fx.com/forum.php?mod=forumdisplay&fid=25" style="color:" target="_blank">ea</a>se(iMA_handle);    //删除指标句柄并释放分配给它的存储空间
   ArrayFree(iMA_buf);     //释放动态数组iMA_buf的数据
   ArrayFree(Close_buf);    //释放动态数组Close_buf的数据  
}
//+------------------------------------------------------------------+
//| EA的tick函数                                                      |
//+------------------------------------------------------------------+
void OnTick()
  {
   int err1=0;      //用于存储指标缓存处理结果的变量
   int err2=0;     //用于存储价格图表处理结果的变量
    
   err1=CopyBuffer(iMA_handle,0,1,2,iMA_buf);  //将数据从指标数组中拷贝到动态数组iMA_buf中,用于进一步处理
   err2=CopyClose(my_symbol,my_timeframe,1,2,Close_buf);    //将价格图表数据拷贝到动态数Close_buf中,用于进一步处理
   if(err1<0 || err2<0)           //如果出错
   {
      Print("Failed to copy data from the indicator buffer or price chart buffer");  //打印相关错误信息到日志文件
      return;                  //并退出函数   
}
 
   if(iMA_buf[1]>Close_buf[1] && iMA_buf[0]<Close_buf[0])   //如果指标值大于收盘价并且开始变小
     {
      if(m_Position.Select(my_symbol))     //如果该交易品种的持仓已经存在
        {
         if(m_Position.PositionType()==POSITION_TYPE_SELL) m_Trade.PositionClose(my_symbol);  //并且这是一个卖出持仓,那么平仓
         if(m_Position.PositionType()==POSITION_TYPE_BUY) return;   //或者,如果是一个买入持仓,那么退出        
}
      m_Trade.Buy(0.1,my_symbol);     //如果到这里,说明没有持仓;那么我们开仓     
}
   if(iMA_buf[1]<Close_buf[1] && iMA_buf[0]>Close_buf[0])  //如果指标值小于收盘价并且在变大
     {
      if(m_Position.Select(my_symbol))   //如果该交易品种的持仓已经存在
        {
         if(m_Position.PositionType()==POSITION_TYPE_BUY) m_Trade.PositionClose(my_symbol);   //并且这是一个买入持仓,那么平仓
         if(m_Position.PositionType()==POSITION_TYPE_SELL) return;     //或者,如果这是一个卖出持仓,那么退出        
}
      m_Trade.Sell(0.1,my_symbol);     //如果我们到这里,说明没有持仓;那么我们开仓     
}  
}
//+------------------------------------------------------------------+