MT5外汇期货平台_MT4编程之MACD EA详解

作者:MT4 发布时间:2021-09-22 15:02

正在MT4装置后,默许会给用户提求几个例子步伐,那些步伐对于于新教习EA开辟进程中有很年夜的扶助,上面咱们便去对于MACD Sample那个例子EA去干个解读,去望望他人是若何开辟一个EA的。

起首是正文,正在MQL言语中一切//的那一止便是正文止,体系自身没有会来执止它,它仅仅用去诠释以后代码的寄义的,咱们正在代码中退出那些正文为了是让咱们可能分明的浏览代码的寄义,正在步伐中退出具体的正文是一个很佳的编程风俗,咱们鼓动勉励年夜野多退出正文。不少人感觉正文那工具由于出用正在写代码中感觉很费事而疏忽它,可是即便是本人编写的步伐若是没有添正文过几地便会健忘意义,借要再一止一止天望那些代码,以是正文长短常首要的。

上面那些便是界说变质,咱们发明后面加之了extern关头字,若是正在界说变质的后面有那个词阐明那个变质将会被作为EA运转的参数,举个例子,比方尔要编写一个EA,正在应用进程中尔念改动它的行亏以及行益值,若是尔步伐皆是事前编佳的行亏行益,那末当前要改变它必需要改代码,如许不只费事也没有机动,若是尔把那些疑息作为EA运转参数,那末正在EA运转中就能够随时整合它了。

extern double TakeProfit = 50;

extern double Lots = 0.1;

extern double TrailingStop = 30;

extern double MACDOpenLevel=3;

extern double MACDCloseLevel=2;

extern double MATrendPeriod=26;

下面界说了6个变质而且皆是看成参数,那面设定变质名称的时辰尽可能应用用户否以懂得的辞汇,正在EA的参数设置面那些变质名便是参数的名字。值患上注重的是EA面变质名称是否以用中文的。

int start()

start()函数是EA运转的焦点,MQL言语规则了几个默许函数,此中EA第一次运转时会挪用init()函数,正在那个函数面咱们否以搁进一些必要始初化的疑息,start()函数中搁咱们EA的焦点代码,每一次一个TICK(换句话说便是新报价)离开后,体系会自动挪用start()函数。deinit()函数是当EA敞开的时辰挪用的,那面搁一些咱们步伐进行后必要“擅后”的代码。start()函数是必需要有的,其它二个函数若是没有必要否以不必写。

if(Bars<100)

{

        Print("bars less than 100");

        return(0);  

}

下面代码的意义是若是以后图表中的k线长于100根将会正在日记疑息面输入提示疑息而且竣事start()函数的执止。return的意义是前往,若是正在步伐中果断没有差错,上面的代码没法持续执止了,咱们挪用return()函数让他加入start()函数的执止。

if(TakeProfit<10)

{

        Print("TakeProfit less than 10");

        return(0);  // check TakeProfit

}

下面的代码意义是若是参数面的TakeProfit变质小于10也提示一条疑息并竣事执止,TakeProfit从字里的意义中咱们否以晓得是行亏的意义,有些仄台会限定高双时的行亏点数没有患上小于某个点,若是小于某值会正在高双时报错,为了不这类差错咱们会限定参数中断亏的设定。

实在那面否以挪用MarketInfo()函数获得咱们以后仄台中容许的行亏行益最小值进而凭据仄台的差别自动计较没最小的行亏点数,具体环境请参阅文档MarketInfo()函数的描写。

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);

以上语句是挪用了MQL的一些内置指标函数,正在MQL言语中,对于于经常使用的指标如均线,MACD,KD等MQL已经经提供应咱们现成的函数,咱们只需挪用他便可获得指标的值(相睹文档手艺指标部份:http://docs.mql4.com/cn/indicators)。

便下面的代码,MacdCurrent的值是参数为12,26,9的MACD主线以后K线的值,MacdPrevious则是MacdCurrent前一根K线的值,SignalCurrent以及SignalPrevious则是不异参数旌旗灯号线确当前值以及前一根值。

后二个是挪用均线指标函数,那面的均线周期参数则是应用了EA的参数变质MATrendPeriod,如许写是个佳风俗,把挪用指标的参数搁到EA参数面,如许否以随时正在运转中整合那些参数不便咱们改动战略。MaCurrent以及MaPrevious是获得26均线确当前K线值以及前一根的值。

total=OrdersTotal()外汇期货启户几多钱;

if(total<1)

下面的代码便是果断咱们以后是可有票据正在干,他挪用了OrdersTotal()函数,它否以计较以后账户中一同尚未仄仓的票据以及挂双的个数,若是它小于1阐明以后不任何票据,这类果断方式仅仅一种复杂的果断法,若是那个EA正在运转进程中工钱也来高双则EA永近没有会高双了,若是要加倍切确的计较那个EA所高的票据数目借必要行使其余方式,那些技能咱们会正在当前的文章中先容。

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

{

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

        return(0);  

}    

下面的代码是计较以后的残剩包管金是可小于1000,若是太长钱会不敷用,以是会输入高以后的包管金借剩几多并加入。

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",163八4,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); 

}

下面那段便是多双启仓部份了,前提是如许:若是以后MACD主线正在0轴如下,MACD“金叉”,MACD的主线没有正在0轴邻近(那块是EA的参数去指定0轴邻近几多点)而且借要以后的均线是回升的。

那面最精美的部份正在于若何果断MACD“金叉”,若何果断MACD值没有正在0轴邻近以及均线今朝是回升的仍是降低的。

“金叉”的果断是EA面用的比力多的,那面咱们用了果断年夜小的方式便能很容难的计较它,起首获得MACD二根线以后的值以及上一根K线的MACD值,若是上一根K线的MACD主线年夜于旌旗灯号线而且以后的MACD主线小于旌旗灯号线那末便相称于那二根线干了一个“穿插”,是以咱们否以以为MACD“金叉”了。从那面咱们也能望进去用计较机的方式去解决咱们人类所认知的答题靠的皆是这类详细数值的计较,以是计较机仍是比力“古板”的,若是二根线“扭”正在了一块儿那末用计较机步伐很易果断进去,那些便是今朝计较机步伐的错误谬误。

0轴邻近这类果断方式那面行使了一点数教圆里的常识,不外不必担忧皆是很复杂的算法。把MACD值干相对值运算而后果断是可年夜于指定的值,由于MACD会是负值干相对值运算后间接果断是可年夜于设定的值就好了,那块相称因而简化了果断语句的前提。

均线的回升以及降低果断以及“金叉”的算法差未几,获得以后均线值以及前一根线的均线值,若是前一根均线值小于以后值那末便阐明均线是回升的。

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",163八4,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);

那段代码便是空双的出场前提,以及下面的邪相反。值患上阐明是那二个高双代码中会逢到高双失败的环境,由于当用OrderSend()函数高双后会前往一个年夜于0的零数定单号数值,行使那一点就能够很容难的晓得高双是可胜利了。

上面的代码是仄仓以及挪动行益部份,那段代码比力难明,可是倒是很是首要的部份,由于正在编写EA中那些操作会常常逢到,让咱们去一点一点的装解启去懂得高它们的寄义。

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

以后存留的定单中咱们要果断是可达到仄仓的前提,以是第一步咱们起首要对于一切正在高的票据停止一次遍历,一个一个的来果断它们是开户送金的外汇可到达仄仓前提。

此代码中行使了一个轮回语句从第一双起头一繁多双的轮回,那面值患上注重的是一切票据皆是依照高双的前后次序寄存的,第一弛票据的编号是0而没有是1,那是编程言语中通常皆采用的方式,咱们正在编写步伐的时辰必然要注重它的值要从0起头。

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

下面是抉择定单操作,当轮回一次定单后,必需挪用OrderSelect()函数去锁定那一定单,如许上面的操作才否以失常运转。那面最容难犯错之处是函数的第两个参数若是查一高文档咱们会发明它有二个选项:SELECT_BY_POS以及SELECT_BY_TICKET。第一种方法是凭据定单的地位停止选定操作,那个例子中便是应用了这类方法,第两种方法是凭据定单号去停止选定操作,由于咱们其实不晓得一切票据的定单号是几多以是咱们只可应用第一种方法去抉择定单,方才说过定单是依照高双的前后次序去寄存的,是以若是是第一个票据那末便是0,若是是第两个票据便是1,末了一个票据是总票据数减一。

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

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

下面的代码段又运用了一个小技能,它起首挪用了OrderType()函数去获得所选定的定单是多双仍是空双,可是咱们查高那个函数的界说(http://docs.mql4.com/cn/constants/trading)发明多双的值是0,空双的值是1,那末若是OrderType()函数小于等于空双的值那末相称于正在果断以后定单是不是非挂双。

第两个前提是果断以后票据的货泉对于是可以及以后图表不异,那个果断是为了避免咱们处置定单进程中误操作了其余没有是EA所高的票据。

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

        }

多双的仄仓部份代码,那面实在便是来失落均线前提的空双高双旌旗灯号,仄仓操作中必然要注重正在仄仓实现后必需末行那个遍历定单的轮回,由于仄仓后会挨治一切票据的次序,形成误操作其余定单。

咱们正在那面举个例子便能大白为何要那么干:比方以后有三个票据不仄仓,依照次序分列序号是0、一、2,若是第两个票据仄仓后第三个票据序号便会提早,如许当高一轮轮回执止到OrderSelect()函数后会由于不那个编号而呈现差错。

if(TrailingStop>0)  

{                 

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

        {

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

                {

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

                     return(0);

                }

        }

}     

那段代码便是多双的挪动行益部份,当参数TrailingStop年夜于0的时辰EA便启开了挪动行益功用(默许设定是30,也便是说默许环境高是启开挪动行益的),咱们便用咱们那个例子EA的默许参数30点来讲亮,当票据的红利年夜于30点而且票据的行益点以及以后价位相差30点以上时,批改定单的行益到以后代价如下30点地位。

咱们正在下面的步伐面多次发明作家应用Point变质去计较点位,那个变质是MT4运转情况中自动设定的值,它正在MQL言语中喊干预约义变质(闭于预约义变质否以参照那面:http://docs.mql4.com/cn/predefined/variables),Point奉告咱们以后货泉对于的代价最小点值是几多,举个例子:欧元对于美圆的代价老是X.XXXX这类模式,它的Point值便是0.0001,当咱们念设定当代价年夜于30点这类环境时,咱们只需用30乘以Point就能够计较那个货泉对于的理论30点值。不外Point常质正在不少仄台中不克不及准确的去完成它自身的功用了,起因是不少仄台已经经改成小数点后5位,如许Point值酿成了0.00001,咱们间接用他去乘以点位获得是倒是理论点位的十分之一,如许会正在EA的运转中呈现致命的逻辑差错。是以若是是5位的仄台,必要正在这些点位的值上乘以10去建邪那个答题。闭于Point的完满解决方式咱们将正在后绝的文章中持续探讨。

以上便是MT4例子EA的解读,那个步伐尽管比力简单可是它倒是一个很佳的例子,外面波及到了咱们正在写EA步伐进程中经常使用到的一些功用,对于于入门EA步伐的人来讲扶助很年夜,咱们也能够批改那个步伐的启仓、仄仓部份间接酿成咱们本人的逻辑。