geek005 发表于 2019-8-10 21:36:10

【宽客EA】Disaster - MetaTrader 4EA

它是基于观察,发现在图表上价格与移动平均经常交叉并会移动更远一段距离,它在价格等于MA(590-M1)的地方设置挂单(限价买入或者限价卖出),当价格改变时,MA的值改变,订单也会被修改,直到订单被触发。

当订单被触发后,就不会修改。退出 – 通过较紧的获利和止损。一旦EA发现没有订单了,它就会设置一个新的挂单。因为经常有价格只是接触了MA然后就不会进一步发展了,我选择了足够小的止损 - 30个点,获利水平=70.






//+------------------------------------------------------------------+
//|                                                   disaster.mq4 |
//|                                                         jay|
//|                                                          http://www.geekquant.com |
//+------------------------------------------------------------------+
#property copyright "jay"
#property link      "http://www.geekquant.com"
extern double StopLoss = 30;
extern double TakeProfit = 70;
extern int MAPER = 590;
int Magic = 54321;

datetime TradeTimeOut;

int init()
{
   return(0);
}
int deinit()
{
   return(0);
}
int start()
{
// информация по предыдущему ордеру
int preOrderType=-1,preTicket=0;
double prePriceOpen=0,prePriceClose=0,preTP=0,preSL=0;
bool STOPLEVELCHECK;
int i,j,k,l,ticket,err,nBars=0,numOrdersCount=0,numSLCount=0;
int total=OrdersTotal();
double Lot=0.0,PriceStop=0.0,PriceLimit=0.0,Price=0.0;
   if (TradeTimeOut==0) TradeTimeOut=CurTime();
   if ( TradeTimeOut > CurTime() ) return(0);
   if ( Bars < 1000) return(0);
   // обработка истории - поиск ордеров
   total=OrdersHistoryTotal();
   // начинаем выборку с конца, после найденного последнего ордера прерываем дальнейший поиск
   for (i=total;i>=0;i--)
      {
      if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) continue;
      if (OrderMagicNumber() == Magic)
         {
         preOrderType=OrderType();
         preTicket=OrderTicket();
         prePriceOpen=OrderOpenPrice();
         preTP=OrderTakeProfit();
         preSL=OrderStopLoss();
         prePriceClose=OrderClosePrice();
         // последний ордер нашли, больше нам ничего не нужно
         break;
         }
      }
   // выборка текущих позиций
      total=OrdersTotal();
      for (i=0;i<total;i++)
         {
         if (OrderSelect(i,SELECT_BY_POS)==false) continue;
         if (OrderMagicNumber() == Magic)
            {
            numOrdersCount++;
            // если цена отложенного ордера отличается от необходимого - модифицируем
            STOPLEVELCHECK = true;
            if (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
               {
               Price=NormalizeDouble(iMA(NULL,PERIOD_M1,MAPER,0,MODE_SMA,PRICE_CLOSE,0),Digits);
               if (OrderType()==OP_BUYSTOP)
                  {
                  PriceStop=Price - MarketInfo(Symbol(),MODE_SPREAD)*Point - StopLoss * Point;
                  PriceLimit=Price + TakeProfit * Point;
                  STOPLEVELCHECK = (Price-Ask) > MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
                  if (preOrderType==OP_BUY && (prePriceOpen-prePriceClose)>0)
                     {
                     PriceLimit=Price + 0.5 * TakeProfit * Point;
                     }
                  }
               if (OrderType()==OP_SELLSTOP)
                  {
                  PriceStop=Price + StopLoss * Point;
                  PriceLimit=Price - MarketInfo(Symbol(),MODE_SPREAD)*Point - TakeProfit * Point;
                  STOPLEVELCHECK = (Bid-Price) > MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
                  if (preOrderType==OP_SELL && (prePriceOpen-prePriceClose)<0)
                     {
                     PriceLimit=Price - MarketInfo(Symbol(),MODE_SPREAD)*Point - 0.5*TakeProfit * Point;
                     }
                  }
               if (NormalizeDouble(OrderOpenPrice()-Price,Digits)!=0
                     && NormalizeDouble(OrderStopLoss()-PriceStop,Digits)!=0
                     && NormalizeDouble(OrderTakeProfit()-PriceLimit,Digits)!=0 && STOPLEVELCHECK)
                  {
                  OrderModify(OrderTicket(),Price, PriceStop, PriceLimit ,0,CLR_NONE);
                  }
               }
            Price=NormalizeDouble(iMA(NULL,PERIOD_M1,MAPER,0,MODE_SMA,PRICE_CLOSE,0),Digits);
            if (OrderType()==OP_BUY && Minute()/5==NormalizeDouble(Minute()/5,0) )
               {
               if (NormalizeDouble(Bid-OrderStopLoss()-70*Point,Digits)>0)
                  {
                  //OrderModify(OrderTicket(),OrderOpenPrice(),,0,0,CLR_NONE);
                  }
               }
            if (OrderType()==OP_SELL && Minute()/5==NormalizeDouble(Minute()/5,0) )
               {
               if (NormalizeDouble(OrderStopLoss()-Ask-70*Point,Digits)>0)
                  {
                  //OrderModify(OrderTicket(),OrderOpenPrice(),, 0,0,CLR_NONE);
                  }
               }
            }
         }
   Lot=NormalizeDouble(0.4*AccountFreeMargin()/1000,1);
   if (Lot>MarketInfo(Symbol(),MODE_MAXLOT)) Lot=MarketInfo(Symbol(),MODE_MAXLOT);
   //if (Lot>5) Lot=5.0;
   if (Lot<MarketInfo(Symbol(),MODE_MINLOT)) return(0);
   if (numOrdersCount==0) // если открытых ордеров нет - ставим отложенные ордера
   {
      Price=NormalizeDouble(iMA(NULL,PERIOD_M1,MAPER,0,MODE_SMA,PRICE_CLOSE,0),Digits);
      if (Bid-Price > 20 * Point)
         {
         ticket=OrderSend(Symbol(), OP_SELLSTOP, Lot ,
            Price, 1, Price + StopLoss * Point, Price - TakeProfit * Point, "MACROS2", Magic, 0, Red);
            //TradeTimeOut=TimeCurrent()+60*60*10;
         }
      if (Price-Ask > 20 * Point)
         {
         ticket=OrderSend(Symbol(), OP_BUYSTOP, Lot ,
            Price+MarketInfo(Symbol(),MODE_SPREAD)*Point, 1,
            Price + MarketInfo(Symbol(),MODE_SPREAD)*Point - StopLoss * Point,
            Price + MarketInfo(Symbol(),MODE_SPREAD)*Point + TakeProfit * Point, "MACROS2", Magic, 0, Red);
            //TradeTimeOut=TimeCurrent()+60*60*10;
         }
   }
   return(0);
}


页: [1]
查看完整版本: 【宽客EA】Disaster - MetaTrader 4EA