首页学院交易策略EA智能交易文章详细

外汇EA智能交易运用方法

外汇网2021-06-17 09:42:02 107
汇外网 - 全球专业的黄金外汇门户导航行情资讯网站

交易原理:

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

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

  • Long exit– 赢利上限的实施,跟踪止损的实施或当穿过 MACD 的信号线 (MACD 指标在零以上,从上至下而且穿过顶端的信号线)。
  • Short exit– 赢利上限的实施,跟踪止损的实施或当穿过 MACD 的信号线 (MACD指标在零下方, 从下至上而且穿过低端的信号线)。

    重要提示:从我们的分析上消除一部分 MACD 指标微不足道的改变 (图表上的小 ‘山丘’),我们介绍一种补充检测‘山丘’大小的办法如下:指标的大小应当在最低价的最后5个单元(5*Point,对于 USD/CHF = 0.0005 和 USD/JPY = 0.05).

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

在智能交易的导航窗口处,点击鼠标右键而且选择在菜单中的“创建新智能交易”。创建智能交易的初始警示将令询问你进入报告中心。在表明窗口,填写智能交易的名称(名称) – MACD Sample,作者(作者) -表示你的名字, 链接 (连接) -你网页的链接,注解 (注解) – MACD-基本智能交易的试探范例。

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

    试探智能交易的源代码将只占领一点位置,但是依旧有些量经常很难抓住,尤其是我们不是专业的编成工作者 – 此外,我们不需要这些描述,不是吗?

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

    1. 初始变量
    2. 初始报告检测
      • 检测图表,图表中的柱数
      • 检测外部变量值:标准手, S/L, T/P, T/S
    3. 对于迅速报告通道设置内部变量
    4. 检测交易终端 – 是无效的吗?假使是:
      • 检测: 账户上的可用保证金…
      • 或许是看多仓位 (BUY)?
        • 开设看多仓位并退出
      • 或许是卖空仓位 (SELL)?
        • 开设卖空仓位并退出

    退出智能交易…

  • 周期循环检验先前开仓
    • 假使是看多仓位
      • 应当平仓?
      • 应当从新设定跟踪止损?
    • 假使是卖空仓位
      • 应当平仓?
      • 应当从新设定跟踪止损?

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

    当下让我们试图一步一步地区完成列出的计划:

    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. 检测初始报告

      该代码部分一般运用在所有的智能交易中。由于是一个标准的检测:
      // 初始报告检测// 证实智能交易运行正常非常重要//图表和用户设置不能显现任何错误// 变量(Lots, StopLoss, TakeProfit,// TrailingStop) 我们的情形需要检测TakeProfit// 图表中少于100 柱   if(Bars<100)     {      Print("少于 100柱");

      return(0);

      } if(TakeProfit<10) { Print("赢利少于10");

      return(0);

      // 检测TakeProfit }

    3. 对于报告的迅速通道设置内部变量

      在源代码中经常需要注意指标值或计算值。简化代码和报告放置以内部变量中。
      int start()  {   double MacdCurrent, MacdPrevious, SignalCurrent;   double SignalPrevious, MaCurrent, MaPrevious;   int cnt, ticket, total;// 简化代码//报告放置以内部变量中   MacdCurrent=iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_MAIN,0);

      MacdPrevious=iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_MAIN,1);

      SignalCurrent=iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_SIGNAL,0);

      SignalPrevious=iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_SIGNAL,1);

      MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PR洲际交易所_CLOSE,0);

      MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PR洲际交易所_CLOSE,1);

      当下,用iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_MAIN,0)代替,您可以在源代码中运用MacdCurrent。

    4. 检测交易终端 –是空的吗?假使是:

      在我们的智能交易中,我们仅运用开单和操作挂单。然而,使更安全,我们来认识一种 对于先前定单交易终端检测:
         total=OrdersTotal();

      if(total<1) {

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

        在分析市场情况以前,检测你的账户上可用的自由保证金可以开仓。
              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);

        }

        return(0);

      }

    5. 周期循环检验先前开仓
      //进入市场的正确性非常重要// 但是更重要的是安全退出...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 //卖空仓位  {
        • 应当平仓吗?

          退出卖空仓位的条件: 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);

          } } }

        关闭所有残留开仓。

                 }      }   } return(0);

        }

如此一步一步地编撰我们的智能交易…

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

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

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

//+------------------------------------------------------------------+//|                                                  MACD Sample.mq4 |//|                      Copyright © 2005, MetaQuotes Software Corp. |//|                                       http://www.metaquotes.net/ |//+------------------------------------------------------------------+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,PR洲际交易所_CLOSE,MODE_MAIN,0);

MacdPrevious=iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_MAIN,1);

SignalCurrent=iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_SIGNAL,0);

SignalPrevious=iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_SIGNAL,1);

MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PR洲际交易所_CLOSE,0);

MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PR洲际交易所_CLOSE,1);

total=OrdersTotal();

if(total<1) { // 没有指定开单 if(AccountFreeMargin()<(1000*Lots)) { Print("没有资金. 自由保证金 = ", AccountFreeMargin());

return(0);

} // 尽或许检测看多仓位 (BUY)if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious(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 && MacdCurrentSignalPrevious && MacdCurrent>(MACDOpenLevel*Point) && MaCurrent

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

if(OrderType()<=OP_SELL && // 检测开仓 OrderSymbol()==Symbol()) // 检测货币对 { if(OrderType()==OP_BUY) // 看多仓位开仓 { // 需要平仓吗? 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()

return(0);

} } } } else // 去卖空仓位 { // 需要平仓吗? if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);

// 平仓 return(0);

//退出 } // 检测跟踪止损 if(TrailingStop>0) { if((OrderOpenPrice()-Ask)

标签:

随机快审展示
加入快审,优先展示

加入VIP