zoukankan      html  css  js  c++  java
  • MQL4创建一个智能交易平台

    以 MQL4语言程序为原理展示一个以标准MACD 指标为基础简单的智能交易系统的创建。 在这个智能交易中,我们将看到一些特性的示例,像赢利水平的设定,追踪止损的设置等等。在我们的范例中,通过开仓和管理仓位来完成交易。
    交易原理:

    • 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. 初始数据检测
    o 检测图表,图表中的柱数
    o 检测外部变量值:标准手, S/L, T/P, T/S
    3. 对于快速数据通道设置内部变量
    4. 检测交易终端 – 是无效的吗?如果是:
    o 检测: 账户上的可用保证金...
    o 可能是看涨仓位 (BUY)?
     开设看涨仓位并退出
    5. 可能是卖空仓位 (SELL)?
    o 开设卖空仓位并退出
    退出智能交易... 
    • 周期循环检验先前开仓
    o 如果是看涨仓位
     应该平仓?
     应该重新设定追踪止损?
    • 如果是卖空仓位
    o 应该平仓?
    o 应该重新设定追踪止损?
    返回的结果很简单,只有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. 对于数据的快速通道设置内部变量
    在源代码中经常需要注意指标值或计算值。简化代码和数据放置在内部变量中。
    4. int start()
    5.   {
    6.    double MacdCurrent, MacdPrevious, SignalCurrent;
    7.    double SignalPrevious, MaCurrent, MaPrevious;
    8.    int cnt, ticket, total;
    9.  
    10. // 简化代码
    11. //数据放置在内部变量中
    12.    MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
    13.    MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
    14.    SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
    15.    SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
    16.    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。
    17. 检测交易终端 –是空的吗?如果是:
    在我们的智能交易中,我们仅使用开单和操作挂单。不过,使更安全,我们来认识一种 对于先前定单交易终端检测:

    total=OrdersTotal();
       if(total<1) 
         {
    o 检测: 账户上的可用保证金...
    在分析市场状况之前,检测你的账户上可用的自由保证金可以开仓。
    if(AccountFreeMargin()<(1000*Lots))
            {
             Print("没有资金.自由保证金 = ", AccountFreeMargin());
             return(0);  
            }
    o 可能是看涨仓位 (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变量是一个用户指定变量,它不可能改变程序文本,但是却有很大的灵活性。在程序开始我们插入这个变量的描述。
    o




    能交易示范 2
    2010年02月18日 星期四 10:15
    •  可能是卖空仓位(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);
     }
    •  周期循环检验先前开仓
    //进入市场的正确性非常重要 
    // 但是更重要的是安全退出...   
    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)   // 打开看张仓位
      {
    o 应该平仓吗?
    退出看涨仓位的条件: MACD 穿过信号线, MACD 高于零,向上并穿过信号线向下。
    if(MacdCurrent>0 && MacdCurrentSignalPrevious &&
       MacdCurrent>(MACDCloseLevel*Point))
      {
       OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); //平仓
       return(0); //退出
      }
    o 应该重设追踪止损马?
    我们设定追踪止损只有在仓位盈利已经超过追踪水平点,并且新的止损水平点好于先前的水平。
    // 检测追踪止损
    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
    2010年02月18日 星期四 10:16
    步骤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,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的列表中复制), 按 "保存"键保存智能交易。
    附件: 
     MACD Sample.mq4 (3.8 Kb)
  • 相关阅读:
    做开发的童鞋应该都了解这几款软件
    给文件对比工具自定义快捷键的方法
    C/C++ 编程有哪些值得推荐的辅助工具
    如何用Beyond Compare修改对比文件颜色
    据说这些工具可以提高程序员的工作效率
    遇到Beyond Compare禁止编辑该怎么办
    BZOJ
    周三
    大总结
    周二上午
  • 原文地址:https://www.cnblogs.com/mingyongcheng/p/2460798.html
Copyright © 2011-2022 走看看