【宽客EA】简单的均线EA - MetaTrader 4EA

0
回复
5545
查看
[复制链接]

121

主题

5

回帖

503

积分

实习版主

积分
503
来源: 2019-8-10 21:23:45 显示全部楼层 |阅读模式
运行原理:
  • 144EMA和169EMA交叉判断方向;
  • 15EMA和50SMA交叉进出场(顺方向做单);
  • 可以设置移动止损,默认为关闭;
  • 同时只能存在1个多单和1个空单;
  • 上一单亏损,下一单加倍策略,系数可调。
关闭了持仓单出现反向信号平仓的代码。
8olb__1.png

10W资金,测试15M GOLD最好的一组数据。回测时间段为2015.4--2017.8
回测发现不用亏损加倍策略跑出的结果都不理想,还有加上追踪止损测出的结果也不理想。

  1. //+------------------------------------------------------------------+
  2. //|                                                      MA Cross.mq4 |
  3. //|                                                          jay|
  4. //|                                                 2774209811@qq.com |
  5. //+------------------------------------------------------------------+
  6. #property copyright "jay"
  7. #property link      "2774209811@qq.com"
  8. #property version   "1.00"
  9. #property strict
  10. extern double  手数=0.1;
  11. extern double  止损=100;
  12. extern double  止盈=300;
  13. extern bool    移动止损=false;
  14. extern int     多单提损=400;
  15. extern int     空单提损=400;
  16. extern int     提损递增幅度=200;//比如多单提损设置40点,那么价格超过开仓价40点则止损上移20点。
  17. extern int     滑点=30;
  18. extern double  倍投系数=1.5;
  19. extern int     手数精度=1;//平台支持0.01的可以设置为2,这个会影响加倍后的手数大小。
  20. extern double  最大倍投手数=20;//根据倍投次数来设置以便控制好风险
  21. extern int     EMA1=15;//入场信号的快线
  22. extern int     SMA2=50;//入场信号的慢线
  23. extern int     EMA3=144;//判断方向的快线
  24. extern int     EMA4=169;//判断方向的慢线
  25. int buyfuwei=多单提损;
  26. int sellfuwei=空单提损;

  27. int start()
  28.   {
  29. //定义均线值-------------------------------------------------------------------
  30.    double ema15=iMA(Symbol(),0,EMA1,0,MODE_EMA,PRICE_CLOSE,0);
  31.    double ema50=iMA(Symbol(),0,SMA2,0,MODE_SMA,PRICE_CLOSE,0);
  32.    double ema144=iMA(Symbol(),0,EMA3,0,MODE_EMA,PRICE_CLOSE,0);
  33.    double ema169=iMA(Symbol(),0,EMA4,0,MODE_EMA,PRICE_CLOSE,0);

  34. //buy条件:没到止盈出现反向信号平仓-------------------------------------------------------------------  
  35.    if((ema144>ema169)&&(ema15>ema50))
  36.      {         
  37.        /* for(int i=0;i<OrdersTotal();i++) //扫描订单总数
  38.             {
  39.                 if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) //选定当前持单
  40.                   {
  41.                      if((OrderComment()==(Symbol()+"sell"))) //如果持有空单注释一样   
  42.                        {
  43.                            OrderClose(OrderTicket(),OrderLots(),Ask,滑点); //空仓平仓            
  44.                        }
  45.                   }
  46.             }  */  //这段代码是持仓单没止盈的情况下出现反向信号平仓
  47.          if((buy(getlots(),止损,止盈,Symbol()+"buy",0)>0)&&(移动止损==true)) //下多单
  48.            {
  49.               多单提损=buyfuwei;
  50.            }
  51.       }
  52.       
  53. //sell条件:没到止盈出现反向信号平仓-------------------------------------------------------------------
  54.    if((ema144<ema169)&&(ema15<ema50))
  55.      {
  56.        /* for(int i1=0;i1<OrdersTotal();i1++)
  57.             {
  58.                 if(OrderSelect(i1,SELECT_BY_POS,MODE_TRADES))
  59.                   {
  60.                      if((OrderComment()==(Symbol()+"buy")))   
  61.                        {
  62.                           OrderClose(OrderTicket(),OrderLots(),Bid,滑点);            
  63.                        }
  64.                   }
  65.             } */
  66.          if((sell(getlots(),止损,止盈,Symbol()+"sell",0)>0)&&(移动止损==true))
  67.            {
  68.               空单提损=sellfuwei;
  69.            }
  70.       }
  71.   
  72. //追踪止损设置-------------------------------------------------------------------
  73.   if(移动止损==true)
  74.       {
  75.           for(int i=0;i<OrdersTotal();i++) //扫描订单总数
  76.                {
  77.                    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) //选定当前持单
  78.                      {
  79.                        if((OrderComment()==(Symbol()+"buy"))) //如果持单编号一致
  80.                          {
  81.                               if(((Bid-OrderOpenPrice())/Point)>=多单提损) //如果买价-开仓价/点数>=移动止损
  82.                                 {
  83.                                    double buysl=OrderStopLoss(); //获取订单止损价格
  84.                                    if(OrderModify(OrderTicket(),OrderOpenPrice(),buysl+提损递增幅度*Point,OrderTakeProfit(),0)==true)
  85.                                    //修改止损:止损价+提损递增幅度
  86.                                      {
  87.                                         多单提损=多单提损+提损递增幅度; //从新赋值移动止损
  88.                                      }
  89.                                 }                 
  90.                          }
  91.                        if((OrderComment()==(Symbol()+"sell")))   
  92.                          {
  93.                               if(((OrderOpenPrice()-Ask)/Point)>=空单提损)
  94.                                 {
  95.                                    double sellsl=OrderStopLoss();
  96.                                    if(OrderModify(OrderTicket(),OrderOpenPrice(),sellsl-提损递增幅度*Point,OrderTakeProfit(),0)==true)
  97.                                      {
  98.                                         空单提损=空单提损+提损递增幅度;
  99.                                      }
  100.                                 }                 
  101.                          }
  102.                       }
  103.                  }
  104.            return(0);
  105.       }
  106.    return(0);
  107.    }

  108. //亏损加仓设置---------------------------------------------------------------------------  
  109.    double getlots()
  110.      {
  111.         double lotsok=手数;
  112.         if(OrdersHistoryTotal()>0)
  113.            {
  114.               for(int i=OrdersHistoryTotal()-1;i>0;i--)
  115.                 {
  116.                    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
  117.                      {
  118.                          if(OrderSymbol()==Symbol())
  119.                            {
  120.                               if(OrderMagicNumber()==0)
  121.                                 {
  122.                                    if(OrderProfit()>0)
  123.                                      {
  124.                                         lotsok=手数;
  125.                                      }
  126.                                    else
  127.                                      {
  128.                                        lotsok=DoubleToStr(NormalizeDouble(OrderLots()*倍投系数,手数精度),手数精度);
  129.                                        Print("lotsok: "+lotsok);
  130.                                        if(lotsok>最大倍投手数)
  131.                                           {
  132.                                              lotsok=最大倍投手数;
  133.                                           }
  134.                                         break;
  135.                                      }
  136.                                    break;
  137.                                 }
  138.                           }
  139.                     }
  140.                }
  141.            }
  142.     else
  143.       {
  144.         return(手数);
  145.       }
  146.     return(lotsok);
  147.       }
  148.   
  149.   
  150. //buy函数----------------------------------------------------------------
  151. int buy(double Lots,double sun,double ying,string comment,int magic)
  152.     {
  153.           int kaiguan=0; //初始化开关为打开
  154.             for(int i=0;i<OrdersTotal();i++) //扫描订单总数
  155.                {
  156.                    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) //选定当前持单
  157.                      {
  158.                        if((OrderComment()==comment)&&(OrderMagicNumber()==magic)) //如果当前持单注释和编号和设定的一致,则开关关闭不下单。   
  159.                          {
  160.                            kaiguan=1;                     
  161.                          }
  162.                       }
  163.                }
  164.             if(kaiguan==0) //如果开关打开
  165.               {
  166.                    int ticket=OrderSend(Symbol( ) ,OP_BUY,Lots,Ask,滑点,0,0,comment,magic,0,White); //开仓买入多单,不设止盈止损(下单成功返回编号,失败返回-1)
  167.                    if(ticket>0) //下单成功
  168.                    {
  169.                     if(OrderSelect(ticket, SELECT_BY_TICKET)==true) //选定订单如果编号一致
  170.                       {
  171.                        if((sun!=0)&&(ying!=0)) //不设止损止盈的情况
  172.                         {
  173.                           OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-sun*MarketInfo(Symbol(),MODE_POINT),OrderOpenPrice()+ying*MarketInfo(Symbol(),MODE_POINT),0,Red);
  174.                           //修改止盈止损
  175.                         }
  176.                        if((sun==0)&&(ying!=0)) //不设止损,设置止盈的情况
  177.                         {
  178.                           OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderOpenPrice()+ying*MarketInfo(Symbol(),MODE_POINT),0,Red);
  179.                           //修改止盈
  180.                         }
  181.                        if((sun!=0)&&(ying==0)) //设置止损,不设止盈的情况
  182.                         {
  183.                           OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-sun*MarketInfo(Symbol(),MODE_POINT),0,0,Red);
  184.                           //修改止损
  185.                         }
  186.                       }
  187.                    }
  188.               return(ticket);
  189.               }
  190.              else
  191.               {
  192.                return(0);
  193.               }
  194.      }
  195.   
  196. //sell函数----------------------------------------------------------------
  197. int sell(double Lots,double sun,double ying,string comment,int magic)
  198.     {
  199.                int kaiguan=0;
  200.                  for(int i=0;i<OrdersTotal();i++)
  201.                     {
  202.                         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
  203.                           {
  204.                             if((OrderComment()==comment)&&(OrderMagicNumber()==magic))   
  205.                               {
  206.                                 kaiguan=1;                     
  207.                               }
  208.                            }
  209.                     }
  210.                  if(kaiguan==0)
  211.                    {
  212.                         int ticket=OrderSend(Symbol( ) ,OP_SELL,Lots,Bid,滑点,0,0,comment,magic,0,Red);
  213.                         if(ticket>0)
  214.                         {
  215.                           if(OrderSelect(ticket, SELECT_BY_TICKET)==true)
  216.                            {
  217.                              if((sun!=0)&&(ying!=0))
  218.                               {
  219.                                OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+sun*MarketInfo(Symbol(),MODE_POINT),OrderOpenPrice()-ying*MarketInfo(Symbol(),MODE_POINT),0,Red);
  220.                               }
  221.                              if((sun==0)&&(ying!=0))
  222.                               {
  223.                                OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderOpenPrice()-ying*MarketInfo(Symbol(),MODE_POINT),0,Red);
  224.                               }
  225.                              if((sun!=0)&&(ying==0))
  226.                               {
  227.                                OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+sun*MarketInfo(Symbol(),MODE_POINT),0,0,Red);
  228.                               }
  229.                            }
  230.                         }
  231.                         return(ticket);
  232.                    }
  233.                   else
  234.                    {
  235.                     return(0);
  236.                    }
  237.     }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 免费注册
关注微信