【宽客EA】Disaster - MetaTrader 4EA

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

121

主题

5

回帖

503

积分

实习版主

积分
503
来源: 2019-8-10 21:36:10 显示全部楼层 |阅读模式
它是基于观察,发现在图表上价格与移动平均经常交叉并会移动更远一段距离,它在价格等于MA(590-M1)的地方设置挂单(限价买入或者限价卖出),当价格改变时,MA的值改变,订单也会被修改,直到订单被触发。

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



军事-战争-演习.jpg


  1. //+------------------------------------------------------------------+
  2. //|                                                     disaster.mq4 |
  3. //|                                                         jay|
  4. //|                                                          http://www.geekquant.com |
  5. //+------------------------------------------------------------------+
  6. #property copyright "jay"
  7. #property link      "http://www.geekquant.com"
  8. extern double StopLoss = 30;
  9. extern double TakeProfit = 70;
  10. extern int MAPER = 590;
  11. int Magic = 54321;

  12. datetime TradeTimeOut;

  13. int init()
  14.   {
  15.    return(0);
  16.   }
  17. int deinit()
  18.   {
  19.    return(0);
  20.   }
  21. int start()
  22.   {
  23. // информация по предыдущему ордеру
  24. int preOrderType=-1,preTicket=0;
  25. double prePriceOpen=0,prePriceClose=0,preTP=0,preSL=0;
  26. bool STOPLEVELCHECK;
  27. int i,j,k,l,ticket,err,nBars=0,numOrdersCount=0,numSLCount=0;
  28. int total=OrdersTotal();
  29. double Lot=0.0,PriceStop=0.0,PriceLimit=0.0,Price=0.0;
  30.    if (TradeTimeOut==0) TradeTimeOut=CurTime();
  31.    if ( TradeTimeOut > CurTime() ) return(0);
  32.    if ( Bars < 1000) return(0);
  33.    // обработка истории - поиск ордеров
  34.    total=OrdersHistoryTotal();
  35.    // начинаем выборку с конца, после найденного последнего ордера прерываем дальнейший поиск
  36.    for (i=total;i>=0;i--)
  37.       {
  38.       if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) continue;
  39.       if (OrderMagicNumber() == Magic)
  40.          {
  41.          preOrderType=OrderType();
  42.          preTicket=OrderTicket();
  43.          prePriceOpen=OrderOpenPrice();
  44.          preTP=OrderTakeProfit();
  45.          preSL=OrderStopLoss();
  46.          prePriceClose=OrderClosePrice();
  47.          // последний ордер нашли, больше нам ничего не нужно
  48.          break;
  49.          }
  50.       }
  51.    // выборка текущих позиций
  52.       total=OrdersTotal();
  53.       for (i=0;i<total;i++)
  54.          {
  55.          if (OrderSelect(i,SELECT_BY_POS)==false) continue;
  56.          if (OrderMagicNumber() == Magic)
  57.             {
  58.             numOrdersCount++;
  59.             // если цена отложенного ордера отличается от необходимого - модифицируем
  60.             STOPLEVELCHECK = true;
  61.             if (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
  62.                {
  63.                Price=NormalizeDouble(iMA(NULL,PERIOD_M1,MAPER,0,MODE_SMA,PRICE_CLOSE,0),Digits);
  64.                if (OrderType()==OP_BUYSTOP)
  65.                   {
  66.                   PriceStop=Price - MarketInfo(Symbol(),MODE_SPREAD)*Point - StopLoss * Point;
  67.                   PriceLimit=Price + TakeProfit * Point;
  68.                   STOPLEVELCHECK = (Price-Ask) > MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
  69.                   if (preOrderType==OP_BUY && (prePriceOpen-prePriceClose)>0)
  70.                      {
  71.                      PriceLimit=Price + 0.5 * TakeProfit * Point;
  72.                      }
  73.                   }
  74.                if (OrderType()==OP_SELLSTOP)
  75.                   {
  76.                   PriceStop=Price + StopLoss * Point;
  77.                   PriceLimit=Price - MarketInfo(Symbol(),MODE_SPREAD)*Point - TakeProfit * Point;
  78.                   STOPLEVELCHECK = (Bid-Price) > MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
  79.                   if (preOrderType==OP_SELL && (prePriceOpen-prePriceClose)<0)
  80.                      {
  81.                      PriceLimit=Price - MarketInfo(Symbol(),MODE_SPREAD)*Point - 0.5*TakeProfit * Point;
  82.                      }
  83.                   }
  84.                if (NormalizeDouble(OrderOpenPrice()-Price,Digits)!=0
  85.                      && NormalizeDouble(OrderStopLoss()-PriceStop,Digits)!=0
  86.                      && NormalizeDouble(OrderTakeProfit()-PriceLimit,Digits)!=0 && STOPLEVELCHECK)
  87.                   {
  88.                   OrderModify(OrderTicket(),Price, PriceStop, PriceLimit ,0,CLR_NONE);
  89.                   }
  90.                }
  91.             Price=NormalizeDouble(iMA(NULL,PERIOD_M1,MAPER,0,MODE_SMA,PRICE_CLOSE,0),Digits);
  92.             if (OrderType()==OP_BUY && Minute()/5==NormalizeDouble(Minute()/5,0) )
  93.                {
  94.                if (NormalizeDouble(Bid-OrderStopLoss()-70*Point,Digits)>0)
  95.                   {
  96.                   //OrderModify(OrderTicket(),OrderOpenPrice(),,0,0,CLR_NONE);
  97.                   }
  98.                }
  99.             if (OrderType()==OP_SELL && Minute()/5==NormalizeDouble(Minute()/5,0) )
  100.                {
  101.                if (NormalizeDouble(OrderStopLoss()-Ask-70*Point,Digits)>0)
  102.                   {
  103.                   //OrderModify(OrderTicket(),OrderOpenPrice(),, 0,0,CLR_NONE);
  104.                   }
  105.                }
  106.             }
  107.          }
  108.    Lot=NormalizeDouble(0.4*AccountFreeMargin()/1000,1);
  109.    if (Lot>MarketInfo(Symbol(),MODE_MAXLOT)) Lot=MarketInfo(Symbol(),MODE_MAXLOT);
  110.    //if (Lot>5) Lot=5.0;
  111.    if (Lot<MarketInfo(Symbol(),MODE_MINLOT)) return(0);
  112.    if (numOrdersCount==0) // если открытых ордеров нет - ставим отложенные ордера
  113.    {
  114.       Price=NormalizeDouble(iMA(NULL,PERIOD_M1,MAPER,0,MODE_SMA,PRICE_CLOSE,0),Digits);
  115.       if (Bid-Price > 20 * Point)
  116.          {
  117.          ticket=OrderSend(Symbol(), OP_SELLSTOP, Lot ,
  118.             Price, 1, Price + StopLoss * Point, Price - TakeProfit * Point, "MACROS2", Magic, 0, Red);
  119.             //TradeTimeOut=TimeCurrent()+60*60*10;
  120.          }
  121.       if (Price-Ask > 20 * Point)
  122.          {
  123.          ticket=OrderSend(Symbol(), OP_BUYSTOP, Lot ,
  124.             Price+MarketInfo(Symbol(),MODE_SPREAD)*Point, 1,
  125.             Price + MarketInfo(Symbol(),MODE_SPREAD)*Point - StopLoss * Point,
  126.             Price + MarketInfo(Symbol(),MODE_SPREAD)*Point + TakeProfit * Point, "MACROS2", Magic, 0, Red);
  127.             //TradeTimeOut=TimeCurrent()+60*60*10;
  128.          }
  129.    }
  130.    return(0);
  131.   }
复制代码


回复

使用道具 举报

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