外汇MT4_EA智能系统MQ4编写详细举例.doc_第1页
外汇MT4_EA智能系统MQ4编写详细举例.doc_第2页
外汇MT4_EA智能系统MQ4编写详细举例.doc_第3页
外汇MT4_EA智能系统MQ4编写详细举例.doc_第4页
外汇MT4_EA智能系统MQ4编写详细举例.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

创建一简易的人工智能系统举例说明让我们将MACD指标同获利能力、支撑移动止损位以及操作安全等因素结合起来考虑以创建人工智能系统。下面的例子是开立和控制一个单独的头寸。 交易原则: .做多(买入)信号即当MACD 指针是在0轴在以下,为向上的趋势并与向下的信号线相交(金叉) .做空(卖出) 信号即当MACD 指针是在0轴以上,为向下趋势并与向上的信号线相交(死叉) .多头平仓信号即执行限价平仓指令或移动止损指令以获得利润或者在MACD指针与信号线相交(MACD指针在0轴以上且为向下趋势并与向上趋势的信号线相交)时平仓 .空头平仓信号即执行限价平仓指令或移动止损指令以获得利润或者在MACD指针与信号线相交(MACD指针在0轴以下且为向上趋势并与向下趋势的信号线相交)时平仓 重要提示: 在我们分析MACD指标时,为了排除MACD指示中一些并不重要的变化情况(即图表中的细微“小丘”),下面我们另外引荐一种控制“小丘”大小的方法: 指示范围至少为5个最小单位(5点,即USD/CHF=0.0005,USD/JPY=0.05) 第一步:撰写人工智能系统说明 将鼠标指在导航窗口的人工智能系统,点击鼠标右键在弹出的菜单中CREATE A NEW EXPERT(创建一个智能系统)命令. 正在初始化的WISARD OF EXPERT ADVISOR 会问你是否要输入数据.在弹出的窗口中你得写下NAME名字(人工智能系统的名字) 、AUTHOR作者、与你的网址链接、须知人工智能系统的测试样本.你也可以设定你想要的Lots(交易单位), Stop Loss(止损点), Take Profit(平仓) 和 Trailing Stop(移动止损)的默认值. 第二步:创立程序的初步结构 测试系统的代码仅仅为几页纸,即使是这几页纸仍然是难以理解的,特别是在我们这些不是专业的程序员的眼里是非常难的.不然,我们也不必写下这段说明,不是吗? 为了了解标准的人工智能系统的结构,我们来看一下下面的解释: 1.初始资料检查 .检查图表,图表上棍的数量 .检查外部变数值:LOTS,S/L,T/P,T/S 2.设置为快速数据存取的内部变量 3检查交易终端是否有空间?如果有,然后 .检查账户中的可用资金 .是否可以做多(买入) .建仓买入和平仓 .是否可以做空(卖出) .建仓卖出和平仓 4. 定期控制已开立的头寸 .若是多头合约 .是否要平仓 .是否要重新设定移动止损点 .若是空头合约 .是否要平仓 .是否要重新设定移动止损点 这是相对简单的样板,仅仅只有4个主要单元. 现在我们来试着逐渐将结构表中的每一部分的代码做出来: 1初始资料检查 这一块的数据通常是经过稍稍修改后从一个系统移至另一系统的这实际上是一单元检查. If Bars<200 Then Exit; / the chart has less than 200 bars - exit If TakeProfit<10 Then Exit; / wrong takeprofit parameters 收益小于10点退出2设置为快速数据存取的内部变量 在程序代码中,有的是经常需要存取的指示值和操做的计算值.为了简化译码和加速存取,数据最初便在内部变数中嵌套进去 .MacdCurrent=iMACD(12,26,9,MODE_MAIN,0); / MACD value on the current bar MacdPrevious=iMACD(12,26,9,MODE_MAIN,1); / MACD value on the previous bar SignalCurrent=iMACD(12,26,9,MODE_SIGNAL,0); / Signal Line value on the current bar SignalPrevious=iMACD(12,26,9,MODE_SIGNAL,1);/ Signal Line value on the previous bar MaCurrent=iMA(MATrendPeriod,MODE_EMA,0); / moving average value on the current bar MaPrevious=iMA(MATrendPeriod,MODE_EMA,1); / moving average value on the previous bar 现在,我们以在程序中简单的写入字符 MacdCurrent代替晦涩难懂的iMACD(12,26,9,MODE_MAIN,0).所有的人工智能系统中的变量都依据MQL II语言进行基本的解释. var: MacdCurrent(0), MacdPrevious(0), SignalCurrent(0), SignalPrevious(0); var: MaCurrent(0), MaPrevious(0); MQL II语言还另外推出一种的用户自定义变量,它可以在程序外设定而无须任何系统程序下的源程序正文的参考.这个特点使程序更具灵活性MATrendPeriod变量就是一个这种类型的用户自定义变量,因此,我们在程序的开头加入这段说明. defines: MATrendPeriod(56); 3. 检查交易终端是否有空间?如果有,然后 在我们的人工智能系统中,我们只能使用现时头寸而不能操作延迟的买卖盘.为了安全起见,我们介绍一种核对过去交易终端已下买卖盘的程序. If TotalTrades<1 then / no opened orders identified 3.检查: 账户的可用资金. 在分析市场状况之前最好先检查一下你的账户的资金情况, 以确保账户中有开立头寸的资金. If FreeMargin<1000 then Exit;/ no funds exit . 是否可以做多(买入) 买入的条件信号:MACD指标在0轴以下,为向上趋势且与向下趋势的信号线相交。这就是我们在MQL II语言中如何描述它的(说明我们如何操作过去在变量中存入的指示值) If MacdCurrent<0 and MacdCurrent>SignalCurrent and MacdPreviousAbs(MacdCurrent)>(MACDOpenLevel*Point) and / the indicator plotted a decent hillock MaCurrent>MaPrevious then / bull trend SetOrder(OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,RED); / executing Exit; / exiting, since after the execution of a trade / there is a 10-second trading timeout ; 前面我们提到了一种监控图表中所要显示“小丘”的大小的一种方法。MACDOpenLevel 变量是自定义变量,它可以不影响程序正本而改变同时,还确保了更多的灵活性。在程序的初始,我们加入一段这个变量的描述. defines: MACDOpenLevel(3), MACDCloseLevel(2); 是否可以做空(卖出)? 卖出的条件信号: MACD指标在0轴以上,为向下趋势且与向上趋势的信号线相交.符号如下: If MacdCurrent>0 and MacdCurrentMacdPrevious>SignalPrevious and MacdCurrent>(MACDOpenLevel*Point) and MaCurrent SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED); / executing Exit; / exiting ; Exit; / no new positions opened - just exit ; 4.定期控制已开立的头寸 for cnt=1 to TotalTrades if Ordervalue(cnt,VAL_TYPE)<=OP_SELL and / is it an open position? Ordervalue(cnt,VAL_SYMBOL)=Symbol then/ position from our chart? CNT是周期变量,是在程序之开端进行描述的,方式如下: var: Cnt(0); . 若是买入合约 If Ordervalue(cnt,VAL_TYPE)=OP_BUY then / long position opened . 是否需平仓? 平仓的条件信号: MACD指针与信号线相交,MACD指针在0轴以上,为向下趋势且与向上趋势的信号线相交. If MacdCurrent>0 and MacdCurrentMacdPrevious>SignalPrevious and MacdCurrent>(MACDCloseLevel*Point) then CloseOrder(Ordervalue(cnt,VAL_TICKET),Ordervalue(cnt,VAL_LOTS),Bid,3,Violet); Exit; / exit ; . 是否需要重新设定移动止损点? 我们仅在持仓并已超过移动止损点数点还获利的情况下设定移动止损点, 即新的移动止损点比以前的更精确时才重设. If TrailingStop>0 then / if trailing stops are used If (Bid-Ordervalue(cnt,VAL_OPENPRICE)>(Point*TrailingStop) then If Ordervalue(cnt,VAL_STOPLOSS)<(Bid-Point*TrailingStop) then ModifyOrder(Ordervalue(cnt,VAL_TICKET),Ordervalue(cnt,VAL_OPENPRICE), Bid-Point*TrailingStop,Ordervalue(cnt,VAL_TAKEPROFIT),Red); Exit; ; ; 若是空头合约 else / otherwise it is a short position . 是否需平仓? 平仓的条件信号: MACD指针与信号线相交,MACD指针在0轴以下,为向上趋势且与向下趋势的信号线相交. If MacdCurrent<0 and MacdCurrent>SignalCurrent and MacdPrevious(MACDCloseLevel*Point) then CloseOrder(Ordervalue(cnt,VAL_TICKET),Ordervalue(cnt,VAL_LOTS),Ask,3,Violet); Exit; / exit ; 是否需要重新设定移动止损点? 我们仅在持仓并已超过移动止损点数点还获利的情况下设定移动止损点, 即新的移动止损点比以前的更精确时才重设. If TrailingStop>0 then/ the user has put a trailing stop in his settings / so, we set out to check it If (Ordervalue(cnt,VAL_OPENPRICE)-Ask)>(Point*TrailingStop) then If Ordervalue(cnt,VAL_STOPLOSS)=0 or Ordervalue(cnt,VAL_STOPLOSS)>(Ask+Point*TrailingStop) then ModifyOrder(Ordervalue(cnt,VAL_TICKET),Ordervalue(cnt,VAL_OPENPRICE), Ask+Point*TrailingStop,Ordervalue(cnt,VAL_TAKEPROFIT),Red); Exit; ; ; ; / end. Closing all the curly bracket which remain open. ; ; ; 这样,跟着这套初学渐进程序,我们就学会了编写自己的人工智能系统. 第三步:将所有程序代码集合起来 我们将前面所有的代码集合过来 defines: MACDOpenLevel(3),MACDCloseLevel(2); defines: MATrendPeriod(56); var: MacdCurrent(0),MacdPrevious(0),SignalCurrent(0),SignalPrevious(0); var: MaCurrent(0),MaPrevious(0); var: cnt(0); / initial data checks / it is important to make sure that the Expert Advisor runs on a normal chart and that / the user has correctly set the external variables (Lots, StopLoss, / TakeProfit, TrailingStop) / in our case we only check the TakeProfit If Bars<200 or TakeProfit<10 then Exit;/ less than 200 bars on the chart / to simplify and speed up the procedure, we store the necessary / indicator data in temporary variables MacdCurrent=iMACD(12,26,9,0,MODE_MAIN); MacdPrevious=iMACD(12,26,9,1,MODE_MAIN); SignalCurrent=iMACD(12,26,9,0,MODE_SIGNAL); SignalPrevious=iMACD(12,26,9,1,MODE_SIGNAL); MaCurrent=iMA(MATrendPeriod,MODE_EMA,0); MaPrevious=iMA(MATrendPeriod,MODE_EMA,1); / now we have to check the status of the trading terminal. / we are going to see whether there are any previously opened positions or orders. If TotalTrades<1 then / there are no opened orders / just to be on the safe side, we make sure we have free funds on our account. / the 1000 value is taken just as an example, usually it is possible to open 1 lot If FreeMargin<1000 then Exit;/ no money - we exit / checking for the possibility to take a long position (BUY) If MacdCurrent<0 and MacdCurrent>SignalCurrent and MacdPrevious(MACDOpenLevel*Point) and MaCurrent>MaPrevious then SetOrder(OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,RED); / executing Exit; / exiting, since after the execution of a trade / there is a 10-second trading timeout ; / checking for the possibility of taking a short position (SELL) If MacdCurrent>0 and MacdCurrent MacdPrevious>SignalPrevious and MacdCurrent>(MACDOpenLevel*Point) and MaCurrent SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED); / executing Exit; / exiting ; / here we completed the check for the possibility of opening new positions. / no new positions were opened and we simply exit the programme using the Exit command, as / there is nothing to analyze Exit; ; / we come over to an important part of the Expert Advisor - the control of open positions / it is important to enter the market correctly, but it is even more important to exit it. for cnt=1 to TotalTrades if Ordervalue(cnt,VAL_TYPE)<=OP_SELL and / is this an open position? OP_BUY or OP_SELL Ordervalue(cnt,VAL_SYMBOL)=Symbol then/ does the instrument match? If Ordervalue(cnt,VAL_TYPE)=OP_BUY then / long position opened / we check - maybe, its already time to close it? If MacdCurrent>0 and MacdCurrent MacdPrevious>SignalPrevious and MacdCurrent>(MACDCloseLevel*Point) then CloseOrder(Ordervalue(cnt,VAL_TICKET),Ordervalue(cnt,VAL_LOTS),Bid,3,Violet); Exit; / exiting ; / we check - maybe, we already may or its already time to set a trailing stop? If TrailingStop>0 then/ the user has put a trailing stop in his settings / so, we set out to check it If (Bid-Ordervalue(cnt,VAL_OPENPRICE)>(Point*TrailingStop) then If Ordervalue(cnt,VAL_STOPLOSS)<(Bid-Point*TrailingStop) then ModifyOrder(Ordervalue(cnt,VAL_TICKET),Ordervalue(cnt,VAL_OPENPRICE), Bid-Point*TrailingStop,Ordervalue(cnt,VAL_TAKEPROFIT),Red); Exit; ; ; ; else / otherwise it is a long position / we check - maybe, its already time to close it? If MacdCurrent<0 and MacdCurrent>SignalCurrent and MacdPrevious(MACDCloseLevel*Point) then CloseOrder(Ordervalue(cnt,VAL_TICKET),Ordervalue(cnt,VAL_LOTS),Ask,3,Violet); Exit; / exiting ; / we check - maybe, we already may or its already time to set a trailing stop? If TrailingStop>0 then/ the user has put a trailing stop in his settings / so, we set out to check it If (Ordervalue(cnt,VAL_OPENPRICE)-Ask)>(Point*TrailingStop) then If Ordervalue(cnt,VAL_STOPLOSS)=0 or Ordervalue(cnt,VAL_STOPLOSS)>(Ask+Point*TrailingStop) then ModifyOrder(Ordervalue(cnt,VAL_TICKET),Ordervalue(cnt,VAL_OPENPRICE), Ask+Point*TrailingStop,Ordervalue(cnt,VAL_TAKEPROFIT),Red); Exit; ; ; ; ; ; ; / the end. 现在,我们只需给以下外部变量赋值就可以完成安装人工智能系统的全过程. LOTS=1,STOP LOSS(S/L)=0, TAKE PROFIT(T/P)=120(适用于一个小时的间 隔),TRAILING STOP(T/S)=30,当然你自己可以设定这些值. 按VERIFY按纽,若无别的错误就按SAVE按纽. 现在,我们来编辑人工智能系统.在MQL编辑器点击顶端的VERIFY图示(像一张有检查标记的纸.)。 第四步: 检测人工智能系统的历史资料 我们已将人工智能系统编写完毕,现在我们已迫不及待地想用历史数据来对系统进行测试。让我们以EUR/USD的15分钟的间隔(大约4000棍)。为例, 打开环球银行交易平台中的EUR/USD15分钟图,用ATTACH TO A CHART命令将人工智能系统的MACD指针样本图粘贴在图表上(在导航窗口用鼠标选择MACD样本线, 点击鼠标右键选择所弹出菜单的命令). 然后,到系统设置里,在这我们可以改变预设变量和用户自定义变量,如LOTS、STOPLOSS、PROFIT、TRAILINGSTOP等. 为了让人工智能系统不仅只起到建议的作用,还能在营业账户上自动进行实时操作, 你需要击活ALLOWLIVETRADING按纽.现在,我们来进行历史数据的测试了,我们不改变设置,转接到STRATEGY TESTER标签,击活ALLOWS ON THE CHART标记(要能在图表上看到箭头),然后,按START按纽开始测试. 人工智能系统所有代码在Ready Expert Advisors页都可找到。 当你对人工智能系统作出修改时必须紧记: 修改和测试环球银行交易平台的人工智能系统时必须注意以下细节: .在建立仓位之前,你必须检查你账户上可用保证金的有效性。假如可用保证金不足时,则开仓请求将会失败。必须注意的是,为了达到测试的目的,可用保证金最少应在1000元,另一张单的测试价格也是1000元。 If FreeMargin < 1000 Then Exit; / no funds - exit 当开仓、平仓或者修改已有部位或删除预先设定的部位(即是执行以下任何的操作:SetOrder, CloseOrder, ModifyOrder or DeleteOrder)时,建议使用人工智能系统的Exit语句来完成这部分的操作,这将有10秒钟的限定时间间隔来执行该项操作。注意,10秒钟的限定时间不适用于测试模式(你可以在一行中做几次交易),另外,假如不是用Exit语句来完成人工智能系统的上述交易操作,人工智能系统的测试结果将和真实交易不同。 SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED); / executing Exit; / exiting 为了防止在测试模式中用少于10秒的间隔来执行几项交易,你只需确保从上一次交易到下一次的交易已经超过10秒。 /making sure that the current

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论