10、20日均线交叉自动交易系统

 
这是我做的第一个均线交易,希望大家能使用、修改,大家一起共同打造一个完美的自动交易系统。系统可以支持自动追踪止损,相应代码被注释,需要时可以打开。
 
//+------------------------------------------------------------------+
//|                                               My MA System.mq4 |
//|                                     Copyright 2008.fangruifeng |
//|                http://fangruifeng.zhan.cn.yahoo.com/index.html
//+------------------------------------------------------------------+
//#define MAGICMA  
 
extern double    Lots           = 1;
extern double    TrailingStop   = 150;
extern double    TakeProfit     = 0;
extern double    StopLoss       = 80;
extern double    Short_MA_value = 10;
extern double    Long_MA_value  = 20;
 
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol()) //&& OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }
 
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen() 
  {
   int    ticket;
   double shortEma12,longEma22,shortEma11,longEma21;
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
  
   shortEma12=iMA(NULL,0,Short_MA_value,0,MODE_EMA,PRICE_CLOSE,2);
   longEma22=iMA(NULL,0,Long_MA_value ,0,MODE_EMA,PRICE_CLOSE,2);
   shortEma11=iMA(NULL,0,Short_MA_value,0,MODE_EMA,PRICE_CLOSE,1);
   longEma21=iMA(NULL,0,Long_MA_value ,0,MODE_EMA,PRICE_CLOSE,1);
   
           if(shortEma12<longEma22&&shortEma11>longEma21)
            {
               ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,0,"My EA",12345,0,Blue);
               if(ticket>0)
                 {
                  if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
                  {
                     Alert("BUY order ",Symbol()," opened : ",OrderOpenPrice());
                     PlaySound("alert.wav");
                  }
                 }
               else Print("Error opening BUY order : ",GetLastError()); 
               return;
            }
         
           if(shortEma12>longEma22&&shortEma11<longEma21)
            {
               ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,0,"My EA",12345,0,Red);
               if(ticket>0)
                 {
                  if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                  { 
                     Alert("SELL order ",Symbol()," opened : ",OrderOpenPrice());
                     PlaySound("alert.wav");
                  }
                 }
               else Print("Error opening SELL order : ",GetLastError()); 
               return;
            }
     }
     
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
  void CheckForClose()
    {
     double shortEma12,longEma22,shortEma11,longEma21;
   
   
   shortEma12=iMA(NULL,0,Short_MA_value,0,MODE_EMA,PRICE_CLOSE,2);
   longEma22=iMA(NULL,0,Long_MA_value ,0,MODE_EMA,PRICE_CLOSE,2);
   shortEma11=iMA(NULL,0,Short_MA_value,0,MODE_EMA,PRICE_CLOSE,1);
   longEma21=iMA(NULL,0,Long_MA_value ,0,MODE_EMA,PRICE_CLOSE,1);
   
   for(int i=0;i<OrdersTotal();i++)
     {
      //if(
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      //==false) break;
       if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
        {
      
      //---- check order type 
       if(OrderType()==OP_BUY)
        {
         if(shortEma12>longEma22 && shortEma11<longEma21)
          { 
           OrderClose(OrderTicket(),OrderLots(),Bid,3,White);   
         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(OrderType()==OP_SELL)
        {
         if(shortEma12<longEma22 && shortEma11>longEma21) 
          {
         OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
         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);
                     //}
                  //}
              //}
          }
        }
     }
   }
  } 
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
  void start()
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//----
  }
 
//+------------------------------------------------------------------+
 
写的好,谢谢,在初始变量中如果增加5日均线怎样写
 
fruif:
这是我做的第一个均线交易,希望大家能使用、修改,大家一起共同打造一个完美的自动交易系统。系统可以支持自动追踪止损,相应代码被注释,需要时可以打开。
具体performance怎样?
 
wucz:
写的好,谢谢,在初始变量中如果增加5日均线怎样写
在系统中设计的是两条移动平均线的交叉信号,默认的用10日和20日均线,如果你想用5日均线或其他均线,那么直接把初始变量中的10或20改成你要的就可以了,其他代码不用改。
 

我也覺得不錯,方才用來作測式,賺多,賠少。


抓得到方向。

 
可是,若一年的作得不錯,但要改成三年的成效就有問題了。
 
均线系统就是趋势系统,所以在有趋势的时候工作应该很好,但对于震荡市就不好说了。
 

如果再增加均线怎么写,如5日,10日,20日,这个地方怎样写,谢谢

double shortEma12,longEma22,shortEma11,longEma21;

 

谢谢分享,我有一个问题想请教一下。


代码:

   shortEma12=iMA(NULL,0,Short_MA_value,0,MODE_EMA,PRICE_CLOSE,2);
   longEma22=iMA(NULL,0,Long_MA_value ,0,MODE_EMA,PRICE_CLOSE,2);
   shortEma11=iMA(NULL,0,Short_MA_value,0,MODE_EMA,PRICE_CLOSE,1);
   longEma21=iMA(NULL,0,Long_MA_value ,0,MODE_EMA,PRICE_CLOSE,1);
   
           if(shortEma12<longEma22&&shortEma11>longEma21)

这里为什么要比较两次?我不明白是什么意思。谢谢
 
我编辑怎么显示错误麻烦看看
原因: