//+------------------------------------------------------------------+
//| 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); //如果我们到这里,说明没有持仓;那么我们开仓
}
}
//+------------------------------------------------------------------+
- 5月 13 週五 201614:20
簡單mt5 程序
