ARMANI-MT4EA自动交易制作 第八课 基本EA制作

avatar
· Views 1,182

大家好,我是ARMANI。为了帮助投资者,一有时间将EA编程的一些知识和精华尽可能的通过笔记让大家分段来学习。

因为文章是ARMANI自己编写,所以如恶意转发或抄袭,将追究到底。


延续第七课[条件整合配列]之后,接下来我们就要正式开始简单的基本EA制作了。截止到第七课,所有的目的都是让大家了解制作EA编程时的基本知识,在掌握或了解了基本知识之后,进入正式的编程,相信大家在理解或者认识上都会更加得心应手。


进入主题

Step 1

打开一个MT4自带的ea模板,Moving Average mql中就是系统自带的模板,可供大家使用。

Step 2

制作几个可设置参数的函数

#写在#property 下方,

extern double lots= 0.1;  //extern记忆 double实数  lots手数用0.1代入,未来0.1就是可以在载入ea时进行修改的值

Step 3 制作交易信号  //什么情况下触发什么交易

#交易信号需要在start()内宣言信号: int sign;

之后在让代码将其条件反馈给sign; 通常编写代码,会将买入sign = 1代入卖出sign = -1代入

举实际例子来学习:

当移动平均线方向朝上,并且MACD的结束值突破MACD移动线的情况下,做多。反之做空

 

首先添加MACD的可设置函数

extern intMAperiod = 21;  //ma的周期

extern intMACDfast = 12;  //MACDfast的周期

extern intMACDslow = 26;  //MACDslow的周期

extern intMACDsignal = 9;  //signal的周期

 

用来判断发生信号的条件:

1.   当前的移动平均线的值-前一根的值 = 判断朝上/朝下

2.   当前的MACD和MACD结束的值

3.   2的前一根各值

如何取得移动平均线的值:

double ma0, ma1;

Ma0 = iMA(null, 0,MAperiod, 0, MODE_SMA, PRICE_CLOSE, 0); //最后一个0是当前的值

Ma1 = iMA(null, 0,MAperiod, 0, MODE_SMA, PRICE_CLOSE, 1); //最后一个1是前一根ma均线的值

#以上当Ma0 > Ma1, 当前的值大于前一根的值那也就意味着平均线是向上的

如何取得MACD的值

MACD要取得值和MACDsignal的值

//先取得MACD当前和一根前的值

double macd0,macd1;

macd0 =imacd(null, 0, MACDfast, MACDslow, MACDsignal, PRICE_CLOSE, MODE_MAIN, 0)

macd1 =imacd(null, 0, MACDfast, MACDslow, MACDsignal, PRICE_CLOSE, MODE_MAIN, 1)

//再取得MACDsignal当前和一根前的值

double sig0, sig1;

Sig0=iMACD(null,0, MACDfast, MACDslow, MACDsignal, PRICE_CLOSE, MODE_SIGNAL,0)

Sig1=iMACD(null,0, MACDfast, MACDslow, MACDsignal, PRICE_CLOSE, MODE_SIGNAL,1)

//以上就已将触发交易信号所需要的条件都已准备,接下来用if来创作条件

if(ma1 <ma0);  //如果前一根值小于当前值(则代表上升)

{

 if(macd1 <= sign1&& macd0 > sig0) //如前一个mad值在下方,同时当前的macd值大于当前的轴值

 {

  sign =1;

 }

相反的话:

if(ma1 > ma0)

{

 if(macd1 >= sig1 && macd0 < sig0);

 {

  sign=-1;

 }

}

以上是做空的函授,将条件命名为sign,之后在下单的时候用sign即可以代入所对应的条件。

 

如何确认在手订单的情况:

需要用到Magic number

extern int magicnumber = 123456; //使用过ea的投资者都知道,这个magicnumber是让电脑来区分哪些订单是这个ea下的,哪些不是。以免执行时区分出自己的持仓。

确认在手订单的代码:

int pos = -1;

for(int i =OrdersTotal() – 1; i >= 0; i--); //pos是确认有无持仓的函数;用总数-1 如i大于0 则有

{

OrderSelect(i, SELECT_BY_POS); //首先选择i函数订单,

if(OrderSymbol() == Symbol() && OrderMagicNumber() ==MagicNumber); 

//如果选择的订单是当前图表货币,同时magicnumber也是一致的情况

{

Pos = i;  //pos就用i代入

Break;  //for文结束

}

}

#首先int pos = -1 <- 这里要用-1 而不是0,理由是当条件一致时,pos会到默认值-1,则代表没有持仓,而默认0则系统读写为拥有0持仓。

#在使用Order()~ 函数之前,必须要选择selectOrder(宣言,SELECT_BY_POS);

下订单的代码:

在下订单之前,必须要明确lots sl tp slippage

 

添加国际变数bar

使用bar的好处是,之后可以创造出在同一根K棒上不重复交易的指令;

int bar;

 

接下来创建订单编号 sl tp的参数

int ticket=0;

double sl,tp;

//以上将ticket用0代入,将sl tp宣言为实数

之后就是整个ea最核心的部分:

添加交易指令

假设:不在同一根k棒交易,仅在没有持仓的情况下交易

if(bar ! = Bars&& pos < 0)

{  

 if(sign == 1)

 {

  sl = Ask – Stoploss * Point;

tp = Ask + TakeProfit * Point;

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask,Slippage, sl, tp, NULL, MagicNumber, 0, Blue);

}

//sl tp 在ticket之内用以上的宣言代入,这里的NULL是备注留言

当约定成功后,OrderSend就会代入成为ticket,同样如果是做空订单:

if(sign == -1)

{

sl = Bid + StopLoss * point;

tp = Bid – TakeProfit * point;

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid,Slippage, sl, tp, NULL, MagicNumber, 0, Red);

}

 

当约定了之后,为了避免在同一根K棒上不重复交易,录入以下代码:

if(ticket >0)  //当订单成约后,sendorder返回值到代入ticket 则会变为1 相反-1则没有成交

{

 bar = Bars;

}

订单的结单代码:  //这里先讲根据指标条件的反转,ea结束在手订单

举例:当有订单时,iMA反转,添加结单close代码

if(pos > 0)  //如果有持仓

{

//如果在手多单,同时平均线朝下

//如果在手空单,同时平均线朝上

if((OrderType() == OP_BUY && ma1 > ma2) || (OrderType() == OP_SELL && ma1 < ma2))

OrderClose(OrderTicket(), OrderLots(),OrderClosePrice(), Slippage, Yellow);

  }

}

综上,以上就是基本的ea制作流程,和一款简单的根据iMa和MACD来作为信号,并执行下单的代码。可供大家参考。未来我们将再根据不同的指标来学习做模型ea代码。


下一节课:编写EA实战-随机指标策略

See u!

#EA交易#

إخلاء المسؤولية: الآراء الواردة هنا تعبر فقط عن رأي الكاتب، ولا تمثل الموقف الرسمي لـ Followme. لا تتحمل Followme مسؤولية دقة أو اكتمال أو موثوقية المعلومات المُقدمة، ولا تتحمل مسؤولية أي إجراءات تُتخذ بناءً على المحتوى، ما لم يُنص على ذلك صراحةً كتابيًا.

هل أعجبك هذا المقال؟ عبّر عن امتنانك بإرسال نصيحة للكاتب.
الرد 1

اترك رسالتك الآن

  • tradingContest