/+----------------------------------------------- -------------------+
//| 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="c​​olor:" target="_blank">ea</a>son)
  {
   IndicatorRel<a href="http://www.520fx.com/forum.php?mod=forumdisplay&fid=25" style="c​​olor:" 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) r​​eturn; //或者,如果是一個買入持倉,那麼退出
}
      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); //如果我們到這裡,說明沒有持倉;那麼我們開倉
}
}
//+----------------------------------------------- -------------------+