外汇平台广告
外汇平台广告

镇店之宝:神手刷单外汇EA下载(无限制版本)很稳哦

赚钱的外汇EA是这样编写出来的

2021-03-02 14:59   来源: 外汇网    本篇文章有415字,看完大约需要1分钟的时间   
赚钱的外汇EA是这样编写出来的
  在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已经提供给我们现成的函数,我们只要调用他即可得到指标的值。
  就上面的代码,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",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);
  }
  上面这段就是多单开仓部分了,条件是这样:如果当前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",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);
  这段代码就是空单的进场条件,和上面的正相反。值得说明是这两个下单代码中会遇到下单失败的情况,因为当用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()函数来得到所选定的订单是多单还是空单,但是我们查下这个函数的定义发现多单的值是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、1、2,如果第二个单子平仓后第三个单子序号就会提前,这样当下一轮循环执行到OrderSelect()函数后会因为没有这个编号而出现错误。
  if(TrailingStop>0)
  {
  if(Bid-OrderOpenPrice()>Soint*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语言中叫做预定义变量,Point告诉我们当前货币对的价格最小点值是多少,举个例子:欧元对美元的价格总是X.XXXX这种形式,它的Point值就是0.0001,当我们想设定当价格大于30点这种情况时,我们只要用30乘以Point就可以计算这个货币对的实际30点值。不过Point常量在很多平台中不能正确的来实现它本身的功能了,原因是很多平台已经改为小数点后5位,这样Point值变成了0.00001,我们直接用他来乘以点位得到是却是实际点位的十分之一,这样会在EA的运行中出现致命的逻辑错误。因此如果是5位的平台,需要在那些点位的值上乘以10来修正这个问题。关于Point的完美解决方法我们将在后续的文章中继续讨论。
  以上就是MT4例子EA的解读,这个程序虽然比较复杂但是它却是一个很好的例子,里面涉及到了我们在写EA程序过程中常用到的一些功能,对于初学EA程序的人来说帮助很大,我们也可以修改这个程序的开仓、平仓部分直接变成我们自己的逻辑。
 


外汇小贴士:

非农数据对外汇市场有何影响?
从宏观层次上来看,美国非农业人口数量的变化,体现本国经济的涨衰。职位的增加,可以看到本国公司企业盈利良好,业务大增,从而是需要增加职位以满足公司业务。如果作为国家经济组成的个体单位(公司企业),不断的增加职位,说明国家经济处于上行,进而支持本国货币上涨。所以说,非农数据可以极大地影响货币市场的美元价值。
另外从微观层面来看,美国是一个以消费为主导的国家,国内GDP有2/3来自与消费领域。消费是否旺盛是关于美国经济的根本性问题。以普通民众的消费作为主体,那么就需要考虑到美国国民是否有消费的能力,那么是否有工作和薪水水平就是至关重要的问题。
所以说,从微观层面,又会把非农数据作为衡量美国消费水平的重要数据,如果非农数据好,说明民众消费有了更好的基础,利好美国经济,从而支持美元上涨。反之,则利空美元。
关键词: 外汇EA
责任编辑:外汇网站
  
来源:外汇网
   

相关文章

炒外汇开户
炒外汇ea大师
炒外汇富拓开户

外汇指标一区

镇店之宝 | 最新MT4指标 | 支撑阻力 | 通道指标 | 震荡指标 | 强弱指标 | 波段指标 | 均线指标 | 箭头指标 | 背离指标 | 分形指标 | 成交量指标 | 抛物线指标 | MT4脚本 | 跟单 | 统计 | 面板 | 风控 | 环境/历史 | 没有未来函数 | 指标源码库 |

外汇指标二区

热门MT4指标 | 布林带 | MA指标 | KDJ指标 | RSI指标 | MACD指标 | CCI指标 | zigzag指标 | ADX指标 | ATR指标 | HMA均线 | 斐波那契 | 最新交易系统 | VIP交易系统 | 热门交易系统 | 外汇1/5分钟系统 | 外汇15/30分钟系统 | 外汇1/4小时系统 | 外汇全时段系统 | 外汇日线图系统 | 外汇MT5指标 | MT5指标模版 | 外汇MT5脚本 |

MQL5市场区

剥头皮EA | 趋势型EA | 网格型EA | 马丁型EA | 多货币EA |

推荐EA精品区

精品外汇EA | 最新EA | 热卖EA | 趋势型EA | 对冲型EA | 剥头皮EA | 马丁型EA | 网格型EA | 多货币EA | 黄金原油EA |

外汇EA普通区

趋势型EA | 马丁型EA | 剥头皮EA | 网格型EA | 对冲型EA | 震荡型EA | MT5外汇EA |

热门关键词区

黄金 原油 外汇市场 外汇加仓技巧 汇率 货币 外汇交易者 外汇交易系统 黄金行情分析 金价 移动平均线 外汇交易系统下载 外汇仓位管理 外汇投资

热门栏目导航

外汇行情分析 | 外盘期货开户 | 外汇 入门 | 外汇入门基础知识 | 炒外汇心得 | 外汇图表走势图 | 外汇工具 | 黄金走势预测 | 外汇交易新闻 | 外汇技巧 | 外汇技术分析 | 黄金投资 | 白银价格 | 期货经验 | 期权基础知识 | 股票投资 | 炒原油开户 | 基金投资策略 | 外汇交易策略 | 贵金属开户 | 金融期货 | 炒黄金开户 | 炒外汇开户 | 炒期货开户 | 炒贵金属开户 | 黄金期货 | 炒外汇 | 基金投资策略 | 黄金行情数据 | 外汇行情数据 | 贵金属行情 | 黄金动态 | 外汇分析 | 原油动态 | 贵金属分析 | 外汇交易入门 | 黄金交易平台 | 伦敦贵金属 | 炒黄金期货 | 外汇投资入门 | 贵金属开户平台 |
分享本站到

618财经网_提供 买卖外汇 | 黄金期货开户 | mt4交易系统 | 外汇网上开户 | 外汇ea交易 | 外汇平台 | 外汇ea | 外汇mt4指标 | 外汇ea交易系统 | 外汇EA系统 | 外汇开户 | 外汇EA | 外汇EA系统

外汇指标 | 贵金属交易 | 外汇ea | 怎么炒外汇 | 外汇mt4指标 | 外汇开户网 | 外汇交易 | 炒外汇开户 | 炒外汇网站 | 外汇黄金网 | 外汇ea | 外汇ea系统 | 贵金属平台 | 外汇ea下载 | 外汇EA软件

外汇投资者应根据自身资产状况,风险承受能力选择适合的外汇开户产品.本站提供的外汇EA,外汇MT4指标仅供投资者参考,不构成任何推荐或投资建议.外汇开户交易前,投资者应审慎决策,承担风险.

免费热线:189-1837-8029