大家好,我是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 不對內容的準確性、完整性或可靠性作出任何保證,對於基於該內容所採取的任何行為,不承擔任何責任,除非另有書面明確說明。

暫無評論,立馬搶沙發