//| MACross_ea.mq4 |
//| shawnyau |
//| |
//+------------------------------------------------------------------+
#property copyright "Shawn Yau"
extern double Lots = 0.1; //默认交易单位
extern int StopLoss = 30; //止损
extern int TakeProfit = 30; //止赢
extern int Magic_Number = 8899; //Magic_Number是用来标识这个EA的唯一性的,简单来说,就是这个EA的身份证
extern int FasterMA = 5; //均线1的周期
extern int SlowerMA = 25; //均线2的周期
extern int Trade_Bar = 1; //下单的时机,如果为1,表示等待当前的K线完成,下一根K 线刚出现的时候才下单;如果为0表示只要当前的价格
//满足条件了就马上下单
int last_t = 0; //这个是用来避免重复下单
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init() //这个是初始化函数,只会在EA刚加载到图表上的时候运行一次,之后就不起作用了
{
//----
//----
return(0);
}
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit() //反初始化函数,用处是在删除EA的时候运行一次,做一些清理性的工作,例如把所画的线、箭头等从图表上删除掉
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
///////////////////////////////////////////////////////////////////
////////定义几个变量,从名字也可以很容易看出其代表的含义了:FasterMANow表示均线1当前的值、SlowerMANow表示均线2当前的值、
///////FasterMAPrevious表示均线1的前值、SlowerMAPrevious表示均线2的前值;均线金叉,其实就是表示当均线1的前值小于均线2的前值,
///////且均线1的当前值大于均线2的当前值。
这样描述我想应该能明白了吧:-)
double FasterMANow, SlowerMANow, FasterMAPrevious, SlowerMAPrevious;
////////////////////////////////////////////////////////////////////////////
//////////下面是给各个变量赋值,iMA就是均线函数,里面的各个参数可以在我在论坛发的中文文档上查到说明的
///////////////////////////////////////////////////////////////////////////
FasterMANow = iMA(NULL, 0, FasterMA, 0, MODE_SMA, PRICE_CLOSE, Trade_ Bar);
SlowerMANow = iMA(NULL, 0, SlowerMA, 0, MODE_SMA, PRICE_CLOSE, Trade
_Bar);
FasterMAPrevious = iMA(NULL, 0, FasterMA, 0, MODE_SMA, PRICE_CLOSE, Tr ade_Bar+1);
SlowerMAPrevious = iMA(NULL, 0, SlowerMA, 0, MODE_SMA, PRICE_CLOSE, T rade_Bar+1);
//////////////////////////////////////////////////////
///////////下面开始判断是否发生金叉了
///////////////////////////////////////////////////////
if ((FasterMANow > SlowerMANow) && (FasterMAPrevious <= SlowerMAPreviou s)) {
if ((TotalOrders(Magic_Number)==0) && (Time[0]>last_t)) ///如果当前的EA还没有下单
{
RefreshRates(); ///刷新市场报价
////////////////////////////////////////
///下单都是用OrderSend()函数来进行的,这是个系统函数,详细说明可以在文档里面查到
OrderSend(Symbol(), OP_BUY, Lots, NormalizeDouble(Ask,Digits), 3, Normal izeDouble(Ask-StopLoss*Point,Digits),
NormalizeDouble(Ask+TakeProfit*Point,Digits), "", Magic_Number, 0, Blu e);
last_t = Time[0];
return (0);
}
}
////////////////////////////////////////////////////////////
///如果没有发生金叉,则下面开始判断是否发生死叉
//////////////////////////////////////////////////////////////
else if ((FasterMANow < SlowerMANow) && (FasterMAPrevious >= SlowerMA Previous)) {
if ((TotalOrders(Magic_Number)==0) && (Time[0]>last_t))
{
RefreshRates();
OrderSend(Symbol(), OP_SELL, Lots, NormalizeDouble(Bid,Digits), 3, N ormalizeDouble(Bid+StopLoss*Point,Digits),
NormalizeDouble(Bid-TakeProfit*Point,Digits), "", Magic_Number, 0, Blu e);
last_t = Time[0];
return (0);
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
////////////////////////////////////////////////////////////////////
/////////TotalOrders()函数的作用是返回Magic_Number为magic的EA所下的单子的总数/////////////////////////////////////////////////////////////////////////////
int TotalOrders(int magic){
int rez=0;
for (int i=0;i<OrdersTotal();i++){ ///这里做一个循环,OrderTotal()是系统函数,作用是返回当前帐户下所有尚未平仓的单子总数
OrderSelect(i,SELECT_BY_POS); ///OrderSelect()是系统函数,具体说明可以在文档里面查到
if (OrderMagicNumber()==magic){ ///如果这个订单是当前EA所下的单
rez++;
}
}
return(rez); ///返回循环计算后得到的当前EA所下的单子的总数
}。