手机版

带注释的完整的外汇EA基础构架【源码】

阅读 :
外_汇_邦 WaiHuiBang.com

希望学习EA编程的朋友,可以参考如下我们提供的源码【带注释】

这个EA例子的交易逻辑是:

N日高点 N日低点,超过高点做空,低过低点做多。

带止损 止盈 及移动止损的处理部分。

如果你能细心研究掌握此EA的设计逻辑,基本可以入门MQL的实战编程了。

还是那句老话:自己多动脑,多做实验!

源码如下:

#property copyright "Copyright ?2012, FXunion.com." //指标版权信息
#property link. "http://www.FXunion.com" //指标联系的网站链接
//=====可调参数部分==============
#define Magic 20090101 //预定义的常量 Magic用于后面程序里的开仓动作时标记在订单里面的一个符号,用于区别其他EA程序下的单 防止混乱
extern int N=50; //参数 后面程序里用它作为N根K线的数量
extern int SL=100;//参数 后面程序里下单的时候用这个设置的点数作为入场时订单的止损价格。
extern int TrailingStop=30;//参数 后面程序里用这个作为移动止损的点数设置
extern double 每单手数=0.1;//参数 表示后面下单的仓位的大小
extern int 滑点偏移点数=3;//参数 表示下单时 服务器端的价格与当前看到的价格相差的范围,如果在此范围内,则允许以服务器端的价格成交
//----全局变量===================
int Tick;//用于记录订单的唯一编号
double StopLost;//用于记录止损

//========主函数部分开始============
int start()//主函数 没来一个价格这个函数就运行一次
{
int Ticket; //局部变量 用于记录每次下单后的状态,用于判断下单动作是否成功,如果不成功则做相应处理和提示
int rderTypeNow=GetOrderTypeHolding();//通过自定义函数得到当前持仓单的交易类型 买 卖
//自定义函数中做了处理,如果没有发现当前有持仓 则返回-1
if (OrderTypeNow==-1)//空仓阶段 -1表示没有持仓的状态
{
if (TradeOrNo(1))//多单入场条件 自定义函数TradeOrNo(1)参数1 表示针对多单的方向进行判断是否满足入场条件
{
Ticket=OrderSend(Symbol(),OP_BUY,每单手数,Ask,滑点偏移点数,Ask-SL*Point,0,"",Magic,0,0);//多单入场
//Ticket表示入场动作的执行结果,如果小于0表示入场动作失败
if(Ticket<0)
{
Print("多单入场失败"+GetLastError());
return(0); //推出本次start函数的执行
}
}else
if (TradeOrNo(2))//空单入场条件
{
Ticket=OrderSend(Symbol(),OP_SELL,每单手数,Bid,滑点偏移点数,Bid+SL*Point,0,"",Magic,0,0);
if(Ticket<0)
{
Print("空单入场失败"+GetLastError());
return(0);
}
}
return;
}else//===============持仓阶段===========================
{
switch(OrderTypeNow)
{
case OP_BUY://多单持仓情况下,满足空单入场条件
if (TradeOrNo(2))
{
if(OrderClose(Tick,OrderLots(),Bid,滑点偏移点数)==false)//平掉多单持仓单
{
Print("翻转发生 多头平仓失败"+GetLastError());
return;
}else//平仓后,反手建立空单
{
Ticket=OrderSend(Symbol(),OP_SELL,每单手数,Bid,滑点偏移点数,Bid+SL*Point,0,"",Magic,0,0);
if(Ticket<0)
{
Print("空单反手建仓失败"+GetLastError());
return(0);
}
}
}else //判断移动止损
{
if (Ask>StopLost+2*TrailingStop*Point)
{
OrderModify(Tick,OrderOpenPrice(),StopLost+TrailingStop*Point,0,0,CLR_NONE);
return;
}
}
break;
case OP_SELL:
if (TradeOrNo(1))
{
if(OrderClose(Tick,OrderLots(),Ask,滑点偏移点数)==false)//平掉空单持仓单
{
Print("翻转发生 空头平仓失败"+GetLastError());
return;
}else//平仓后,反手建立多单
{
Ticket=OrderSend(Symbol(),OP_BUY,每单手数,Ask,滑点偏移点数,Ask-SL*Point,0,"",Magic,0,0);
if(Ticket<0)
{
Print("多单反手建仓失败"+GetLastError());
return(0);
}
}
}else //判断移动止损
{
if (Bid<StopLost-2*TrailingStop*Point)
{
OrderModify(Tick,OrderOpenPrice(),StopLost-TrailingStop*Point,0,0,CLR_NONE);
return;
}
}
break;
}
return;
}

return(-1);
}
//=================自定义函数部分======================================
int GetOrderTypeHolding()//从最近持仓单提取订单类型,如果没有持仓单,则认为是止赢出场或程序刚开始运行返回-1
{int Type=-1;
//int temptime=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic )
{
Type=OrderType();
Tick=OrderTicket();
StopLost=OrderStopLoss();
}
}
return(Type);
}
//======================================================
bool TradeOrNo(int Type)//判断当前指定方向的入场条件是否成立
{
double NHigh=High[iHighest(Symbol(),0,MODE_HIGH,N,2)];
double NLow=Low[iLowest(Symbol(),0,MODE_LOW,N,2)];
switch(Type)
{
case 1://判断多单入场条件是否成立
if (Close[1]>NHigh)//做多条件成立
{
return(true);
}
break;
case 2:
if (Close[1]<NLow)//做空条件成立
{
return(true);
}
break;
}
return(false);
}

外_汇_邦 WaiHuiBang.com
本文标题:带注释的完整的外汇EA基础构架【源码】 - MT4平台MQL4编程学习
本文地址:https://www.waihuibang.com/fxschool/autotrading/mql4/40665.html

相关文章

  • MQL4字符串处理函数

    StringConcatenate() &#8211; 字符串连接 StringFind() &#8211; 字符串搜索 StringGetChar() &#8211; 获取字符串中指定字符ASCII值 StringLen() &#8211; 获取字符串长度 StringSetChar() &#8211; 替换字...

    MQL4编程学习
  • 外汇程序化交易的八个湿货

    投机就像山岳一般古老。毋庸费言,外汇零售市场的属性,必然会让国内的大多数外汇交易者,以中短期投机的方式居多,长期价值投资的偏少。而作为波动市场的王者,外汇货币给了手工交易和程序化交易最丰富的可能性,此种优势,其...

    MQL4编程学习
  • 如何在阿里云购买ECS云服务器作为挂MT4 EA 或MT5 EA的外汇VPS
    如何在阿里云购买ECS云服务器作为挂MT4 EA 或MT5 EA的外汇VPS

    挂外汇EA,如何在阿里云购买VPS云服务器?如果你想让你的EA在24小时都能正常的流畅的运行,那么我们一般的电脑就不能完成这项任务了,这时你就需要使用服务器这样的工具了。为什么需要用服务器来挂外汇EA...

    MQL4编程学习
  • Sidus v.2指标源码[MT4公式]
    Sidus v.2指标源码[MT4公式]

    有了这个指标,可以很容易的使用tick数据而不是HLOC数据来计算其它任何指标,如用 iMAOnArray(.....)来得到tick数据的MA。 注意:新加入本指标或在指标列表中修改参数,MT将会重新初始化指标,MT没提供tick数据数组记录,当然,本指标显示的tick是从初始化时刻开始收集获得的,初始化时历史数据缺省使用当前时间周期的close数据填充。所以从指标初始化开始,需要一段时间收集tick数据才有足够数据可观察显示。...

    MQL4编程学习
  • MQL4日期时间处理函数(一)

    本组函数用于处理日期时间型数据(从1970年1月1日00:00开始已经过的秒数)。Year() &#8211; 获取当前年份 Month() &#8211; 获取当前月份 Day() &#8211; 获取今日是本月第几天 DayOfWeek() &#8211; 获取今日...

    MQL4编程学习
你可能感兴趣