App下载

手机扫描下载App客户端

返回顶部
分享到

MT4系统EA注释讲解学习

财经新闻 2022-8-10 19:36 1129人浏览 0人回复
摘要

//+------------------------------------------------------------------+//| MACD Sample.mq4 |//| Copyright ?2005, MetaQuotes Software Corp. |//| http://www.metaquotes.net/ |//+-------------------------- ...


// ------------------------------------------------------------------

//| MACD Sample.mq4 |

//| Copyright ?2005, MetaQuotes Software Corp. |

//| http://www.metaquotes.net/ |

// ------------------------------------------------------------------

////////////////////////////////////下面的为启动参数设置,在启动前这些参数允许使用者修改//////////////////////////////////////////

extern double TakeProfit = 50;

//定义一个双精度浮点数数据类型的参数,TakeProfit ,并且赋值为50,下面的几个参照这条来解释

extern double Lots = 0.1;

extern double TrailingStop = 30;

extern double MACDOpenLevel=3;

extern double MACDCloseLevel=2;

extern double MATrendPeriod=26;

////////////////////////////////////下面是主函数,每次价格波动,这个函数内的语句都会执行////////////////////////////////////////

int start()

{

double MacdCurrent, MacdPrevious, SignalCurrent;////////定义了三个双精度浮点数类型的变量

double SignalPrevious, MaCurrent, MaPrevious;//////////定义了三个双精度浮点数类型的变量

int cnt, ticket, total;////定义了三个整数类型的变量

// initial data checks

// it is important to make sure that the expert works with a normal

// chart and the user did not make any mistakes setting external

//首先我们必须认识到,让ea工作在一个正常的图表上是非常重要的,并且使用者不能有任何的设置错误

// variables (Lots, StopLoss, TakeProfit,

// TrailingStop) in our case, we check TakeProfit

// on a chart of less than 100 bars

//在我们这个ea中,有这样几个变量Lots, StopLoss, TakeProfit, TrailingStop

//我们检查TakeProfit需要最少100个bar的数据,int Bars为mt4预定义的变量,用来表示当前图表的柱数

//通俗的说,就是表示当前图表有几个蜡烛

if(Bars<100)

//如果k线柱数少于100,则执行括号内的操作,如果k线数大于或者等于100,就跳过大括号内的语句继续执行

{

Print("bars less than 100");

//在日志里面显示如下内容bars less than 100

return(0);

}

//上面的if判断执行完成以后,开始执行下面的if判断

//简单的说一下,下面的判断,首先if,然后一对小圆括号里面的是判断条件

//如果判断结果为真,则执行下面的一对大括号里面的语句

//如果判断结果为假,则跳过这个判断继续执行下面的内容,大括号的内容就不会被执行

if(TakeProfit<10)

{

Print("TakeProfit less than 10");

return(0); // check TakeProfit

}

//如果TakeProfit小于10,输出日志TakeProfit less than 10,并且返回错误代码0,表示没有出错

// to simplify the coding and speed up access

// data are put into internal variables

//为了促使程序简化,加速数据的存取速度,我们把 iMACD后面的这一长串定义赋值给一个内部变量

//这样程序可以更加简洁明了,程序也可以执行的比较快

//这里简单的说一下iMACD函数的后面几个参数的意义

MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);

MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);

SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);

SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);

MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);

MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);

total=OrdersTotal();

if(total<1)

{

// no opened orders identified

if(AccountFreeMargin()<(1000*Lots))

{

Print("We have no money. Free Margin = ", AccountFreeMargin());

return(0);

}

// check for long position (BUY) possibility

if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&

MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask TakeProfit*Point,"macd sample",16384,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Error opening BUY order : ",GetLastError());

return(0);

}

// check for short position (SELL) possibility

if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&

MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());

}

else Print("Error opening SELL order : ",GetLastError());

return(0);

}

return(0);

}

// it is important to enter the market correctly,

// but it is more important to exit it correctly...

for(cnt=0;cnt<total;cnt )

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()<=OP_SELL && // check for opened position

OrderSymbol()==Symbol()) // check for symbol

{

if(OrderType()==OP_BUY) // long position is opened

{

// should it be closed?

if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&

MacdCurrent>(MACDCloseLevel*Point))

{

OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position

return(0); // exit

}

// check for trailing stop

if(TrailingStop>0)

{

if(Bid-OrderOpenPrice()>Point*TrailingStop)

{

if(OrderStopLoss()<Bid-Point*TrailingStop)

{

OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);

return(0);

}

}

}

}

else // go to short position

{

// should it be closed?

if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&

MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))

{

OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position

return(0); // exit

}

// check for trailing stop

if(TrailingStop>0)

{

if((OrderOpenPrice()-Ask)>(Point*TrailingStop))

{

if((OrderStopLoss()>(Ask Point*TrailingStop)) || (OrderStopLoss()==0))

{

OrderModify(OrderTicket(),OrderOpenPrice(),Ask Point*TrailingStop,OrderTakeProfit(),0,Red);

return(0);

}

}

}

}

}

}

return(0);

}

// the end.

本文暂无评论,快来抢沙发!

  • Powered by 安危情报站 X3.4 | Copyright © 2001-2021, 安危情报站. | 安危情报站
  • |