123全职 发表于 2020-5-17 16:11:12

关于MT4自带的MACDea的问题

请问下大家,为什么这个EA中的移动止损无法触发,无论以这个EA为模板写的EA,还是这个EA本身,在回测的时候都没有触发移动止损。
这是我改后的EA,MACD源码每个MT4中都有
//+------------------------------------------------------------------+
//|                                                MACD Sample.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link      "http://www.mql4.com"

input double TakeProfit    =1000;
input double Lots          =0.1;
input double TrailingStop=500;
input double MACDOpenLevel =3;
input double MACDCloseLevel=2;
input int    MATrendPeriod =26;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick(void)
{
    double ma4,sar1,sar2,MACD,Macd1,Signal1,Macd2,Signal2;
    intcnt,ticket,total;
//---
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external
// variables (Lots, StopLoss, TakeProfit,
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
//---
   if(Bars<100)
   {
      Print("bars less than 100");
      return;
   }
   if(TakeProfit<10)
   {
      Print("TakeProfit less than 10");
      return;
   }
//--- to simplify the coding and speed up access data are put into internal variables
    Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);//主线 现值
   Signal1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);//信号线 现值
    Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2);//主线 现值
   Signal2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,2);//信号线 现值

   total=OrdersTotal();
   if(total<2)
   {
      //--- no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
      {
         Print("We have no money. Free Margin = ",AccountFreeMargin());
         return;
      }
      //--- check for long position (BUY) possibility
      if(Macd1>Signal1&&Macd2<Signal2)
      {
         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 order opened : ",OrderOpenPrice());
         }
         else
            Print("Error opening BUY order : ",GetLastError());
         return;
      }
      //--- check for short position (SELL) possibility
      if(Macd1<Signal1&& Macd2>Signal2)
      {
         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 order opened : ",OrderOpenPrice());
         }
         else
            Print("Error opening SELL order : ",GetLastError());
      }
      //--- exit from the "no opened orders" block
      return;
   }
//--- it is important to enter the market correctly, but it is more important to exit it correctly...   
   for(cnt=0;cnt<total;cnt++)
   {
      if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         continue;
      if(OrderType()<=OP_SELL &&   // check for opened position
         OrderSymbol()==Symbol())// check for symbol
      {
         //--- long position is opened
         if(OrderType()==OP_BUY)
         {
            //--- should it be closed?
            if( Macd1<Signal1)
            {
               //--- close order and exit
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
                  Print("OrderClose error ",GetLastError());
               return;
            }
            //--- check for trailing stop
            if(TrailingStop>0)
            {
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
               {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                  {
                     //--- modify order and exit
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
                        Print("OrderModify error ",GetLastError());
                     return;
                  }
               }
            }
         }
         else // go to short position
         {
            //--- should it be closed?
            if( Macd1>Signal1)
            {
               //--- close order and exit
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
                  Print("OrderClose error ",GetLastError());
               return;
            }
            //--- check for trailing stop
            if(TrailingStop>0)
            {
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
               {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                  {
                     //--- modify order and exit
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red))
                        Print("OrderModify error ",GetLastError());
                     return;
                  }
               }
            }
         }
      }
   }
//---
}
//+------------------------------------------------------------------+

页: [1]
查看完整版本: 关于MT4自带的MACDea的问题