外汇智能EA交易示例

阅读 :
欢迎访问 外 汇 邦 WWW.WaiHuiBang.com

  交易原理:

Long (BUY) entry – MACD指标在零以下, 从下至上并且穿过低端的信号线。

 

Short (SELL) entry – MACD 指标在零以上,从上至下并且穿过顶端的信号线

赢利上限的执行,追踪止损的执行或当穿过 MACD 的信号线 (MACD 指标在零以上,从上至下并且穿过顶端的信号线)。

 赢利上限的执行,追踪止损的执行或当穿过 MACD 的信号线 (MACD指标在零以下, 从下至上并且穿过低端的信号线)。

重要提示:从我们的分析上排除一些 MACD 指标微不足道的变化 (图表上的小 ‘山丘’),

我们介绍一种补充检测‘山丘’大小的办法如下:指标的大小应该在最低价的最后5个单元

(5*Point,对于 USD/CHF = 0.0005 和 USD/JPY = 0.05).

步骤 1 – 编写智能交易的描述

步骤 2 –创建程序的基本结构

测试智能交易的源代码将只占据一点位置,但是还是有些量经常很难抓住,特别是我们不是专业的编成工作者 – 另外,我们不需要这些描述,不是吗? 

一个标准智能交易的结构构想,让我们看看以下部分的描述:

1、初始变量
所有使用在智能交易程序中的变量必须按照 MetaQuotes Language 4 要求的指定。这就是为什么我们在程序的开始插入初始变量的原因

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;

MetaQuotes语言4 是需要“外部变量”辅助的。外部变量可以从外部设定,在智能交易程序源代码设定之后不可以修改。

提供一个额外的灵活性。在我们的程序中,MATrendPeriod 变量作为外部变量指定。 在程序开始我们插入这个变量。

extern double MATrendPeriod=26;

 

2、初始数据检测

 

检测图表,图表中的柱数

检测外部变量值:标准手, S/L, T/P, T/S

 

3、对于快速数据通道设置内部变量

 

4、检测交易终端 – 是无效的吗?如果是:

 

检测: 账户上的可用保证金…

可能是看涨仓位 (BUY)?

开设看涨仓位并退出

可能是卖空仓位 (SELL)?

开设卖空仓位并退出

退出智能交易····

 

5、周期循环检验先前开仓

 

如果是看涨仓位

应该平仓?

应该重新设定追踪止损?

如果是卖空仓位

应该平仓?

应该重新设定追踪止损?

 

返回的结果很简单,只有4种。

现在让我们尝试一步一步地区完成列出的计划:

这样一步一步地编写我们的智能交易…

 

 

初始变量
所有使用在智能交易程序中的变量必须按照 MetaQuotes Language 4 要求的指定。这就是为什么我们在程序的开始插入初始变量的原因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;
MetaQuotes语言4 是需要“外部变量”辅助的。外部变量可以从外部设定,在智能交易程序源代码设定之后不可以修改。提供一个额外的灵活性。在我们的程序中,MATrendPeriod 变量作为外部变量指定。 在程序开始我们插入这个变量。extern double MATrendPeriod=26;检测初始数据该代码部分通常使用在所有的智能交易中。因为是一个标准的检测:
// 初始数据检测 // 确认智能交易运行正常非常重要 //图表和用户设置不能出现任何错误 // 变量(Lots, StopLoss, TakeProfit, // TrailingStop) 我们的情况需要检测TakeProfit // 图表中少于100 柱 if(Bars<100) { Print("少于 100柱"); return(0); } if(TakeProfit<10) { Print("赢利少于10"); return(0); // 检测TakeProfit }对于数据的快速通道设置内部变量在源代码中经常需要注意指标值或计算值。简化代码和数据放置在内部变量中。int start() { double MacdCurrent, MacdPrevious, SignalCurrent; double SignalPrevious, MaCurrent, MaPrevious; int cnt, ticket, total; // 简化代码 //数据放置在内部变量中 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);
现在,用 iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0)代替,您可以在源代码中使用 MacdCurrent。 
检测交易终端 –是空的吗?如果是:在我们的智能交易中,我们仅使用开单和操作挂单。不过,使更安全,我们来认识一种 对于先前定单交易终端检测:total=OrdersTotal(); if(total<1) {
return(0); } 
检测: 账户上的可用保证金…在分析市场状况之前,检测你的账户上可用的自由保证金可以开仓。if(AccountFreeMargin()<(1000*Lots)) { Print("没有资金.自由保证金 = ", AccountFreeMargin()); return(0); }可能是看涨仓位 (BUY)?进入看涨仓位的条件: MACD 低于零, 向上并且穿过信号线向下。这就是我们在 MQL4中描述的 (注意我们在指标上的业务值保存在先前的变量中):
// 尽可能检测看涨仓位 (BUY) if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious 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 开单 : ",OrderOpenPrice()); } else Print("错误 opening BUY order : ",GetLastError()); return(0); }附加的检验‘山丘’的大小上面已经给出了描述。 MACDOpenLevel变量是一个用户指定变量它不可能改变程序文本,但是却有很大的灵活性。在程序开始我们插入这个变量的描述。可能是卖空仓位(SELL)?进入卖空仓位的条件: MACD高于零,向上并且穿过信号线向下。注解如下:
// 尽可能的检测卖空仓位(SELL) if(MacdCurrent>0 && MacdCurrentSignalPrevious && MacdCurrent>(MACDOpenLevel*Point)&& MaCurrent { 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 开单 : ",OrderOpenPrice()); } else Print("错误SELL定单开仓 : ",GetLastError()); return(0); } 
周期循环检验先前开仓//进入市场的正确性非常重要 // 但是更重要的是安全退出... for(cnt=0;cnt { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && // 检验开仓 OrderSymbol()==Symbol()) // 检验货币对 {
“cnt” – ” 是一个循环的变量必须在程序开始指定如下:int cnt = 0;如果是看涨仓位if(OrderType()==OP_BUY) // 打开看张仓位 {我们停止操作符。}
应该平仓吗?退出看涨仓位的条件: MACD 穿过信号线, MACD 高于零,向上并穿过信号线向下。if(MacdCurrent>0 && MacdCurrentSignalPrevious && MacdCurrent>(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); //平仓 return(0); //退出 }应该重设追踪止损马?我们设定追踪止损只有在仓位盈利已经超过追踪水平点,并且新的止损水平点好于先前的水平。// 检测追踪止损 if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss() { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop, OrderTakeProfit(),0,Green); return(0); } } }
如果是卖空仓位else //卖空仓位 {
关闭所有残留开仓。} } } return(0); }应该平仓吗?退出卖空仓位的条件: MACD穿过信号线,MACD低于零,向上并且穿过信号线向下。
if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); //平仓 return(0); // 退出 }应该重设追踪止损吗?我们设定追踪止损只有在仓位盈利已经超过追踪水平点,并且新的止损水平点好于先前的水平。// 检测追踪止损 if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop, OrderTakeProfit(),0,Red); return(0); } } }这样一步一步地编写我们的智能交易…

步骤3 – 集中程序的结果代码

让我们打开智能交易的设定:使用按钮打开”属性…”菜单。在窗口内指定运行参量的外部设定:

从先前部分集中全部代码:

//+------------------------------------------------------------------+ //| MACD Sample.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.funion.com | //+------------------------------------------------------------------+ 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; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { double MacdCurrent, MacdPrevious, SignalCurrent; double SignalPrevious, MaCurrent, MaPrevious; int cnt, ticket, total; // 检测初始化数据 // 确定智能交易在图表中运行正常非常重要 // 用户在外部变量交易中不会产生任何错误 // 外部变量 (标准手数, 止损,赢利, // 追踪止损) 在这种情况下,我们检测图表中赢利水平要小于100 柱 if(Bars<100) { Print("少于 100柱"); return(0); } if(TakeProfit<10) { Print("赢利少于10"); return(0); // 检测赢利水平 } // 简化代码和加速通道 // 数据被放置在内部变量中 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); total=OrdersTotal(); if(total<1) { // 没有指定开单 if(AccountFreeMargin()<(1000*Lots)) { Print("没有资金. 自由保证金 = ", AccountFreeMargin()); return(0); } // 尽可能检测看涨仓位 (BUY)  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 定单开仓 : ",OrderOpenPrice()); } else Print("错误BUY定单开仓 : ",GetLastError()); return(0); } // 尽可能检测卖空仓位(SELL) 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 定单开仓 : ",OrderOpenPrice()); } else Print("错误SELL定单开仓 : ",GetLastError()); return(0); } return(0); } // 正确进入市场很重要, // 但正确退出市场更重要... for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && // 检测开仓 OrderSymbol()==Symbol()) // 检测货币对 { if(OrderType()==OP_BUY) // 看涨仓位开仓 { // 需要平仓吗? if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && MacdCurrent>(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); //平仓 return(0); // 退出 } // 检测追踪止损 if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green); return(0); } } } } else // 去卖空仓位 { // 需要平仓吗? if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // 平仓 return(0); //退出 } // 检测追踪止损 if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red); return(0); } } } } } } return(0); } // 结束

对于最后智能交易的确认,只需要指定外部变量值 “Lots = 1″, “Stop Loss (S/L) = 0″ (not used), “Take Profit (T/P) = 120″ (appropriate for one-hour intervals), “Trailing Stop (T/S) = 30″. 当然,你可以使用自己的值。按 “编写”按钮,如果没有任何错误信息出现 (你可以从 MetaEditor的列表中复制), 按 “保存”键保存智能交易。

欢迎访问 外 汇 邦 WWW.WaiHuiBang.com
本文标题:外汇智能EA交易示例 - MT4平台MQL4编程学习
本文地址:http://www.ea666.cn/fxschool/autotrading/mql4/40628.html

相关文章

  • 建立交易系统(EA)的几个误区

    交易系统设计过程中的误区 误区一:交易系统就是指标的优化 很多交易系统的制作者认为,交易系统就是优化之后的指标,因此这些制作者热衷于使用分析家、SUPERCHAT等股票分析软件的指标优化功能,每天对每个指标...

    MQL4编程学习
  • MT4—IndicatorCounted函数解析

    指标刚加载到图上的时候IndicatorCounted()是0 然后程序会自动计算一遍所有K线对应的指标数值并画线。然后每来一个新价格的时候IndicatorCounted();就只是1或者2了(视指标的计算方式决定)。 这时候for循环只需要计算这些有变动的K线对应的指标数值就行了,不需要从头到尾重复计算了。 这就是这段程序的目的,找出for循环中仅需当前计算的K线的个数。...

    MQL4编程学习
  • 炒外汇怎样判断EA交易系统?

    选择判断一个ea是否可以实盘使用要看以下几点: 第一:看EA首先不是看ea如何盈利,先要看ea是什么类型。有没有爆仓可能,会不会短时间爆仓,加码网格ea估计是达不到要求...

    MQL4编程学习
  • EA编程教程大全之常用函数

    对于每个执行的MQL4程序,一定数量的变量设定可以轻松应对图表中的价格状态:智能交易,脚本或者是客户指标。. 资料应用到可变量的模型中来。 可以由预定义的变量分开处理。 这些数据会在开启后应用 RefreshRate...

    MQL4编程学习
  • MT4下如何正确安装与测试EA

      MT4软件安装EA其实非常简单,下面就是一系列步骤:  1.首先,你要有一个EA,必须要有以ex4为扩展名的,如果只有mq4文件的话,就要用MetaTrader自带的编辑器MetaEditor打开(主菜单命令“工具—MQ语言编辑器”或者是...

    MQL4编程学习
你可能感兴趣