初学者的问题 MQL4 MT4 MetaTrader 4 - 页 176

 

伙计们,帮我修复这个EA。它不检查订单,而是一有信号就不停地买入,直到花光全部存款。提前感谢大家

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
extern double Lots            = 1;
extern int    TakeProfit      = 300;
extern int    StopLoss        = 50;
extern int    Magic           = 111;
extern int    Slippage        = 3;
//+------------------------------------------------------------------+
extern string TMA             = "Параметры индикатора TMA";
extern string TimeFrame       = "current time frame";
extern int    HalfLength      = 56;
extern int    Price           = PRICE_CLOSE;
extern double ATRMultiplier   = 2.0;
extern int    ATRPeriod       = 100;
extern bool   Interpolate     = true;
//+------------------------------------------------------------------+
double PriceHigh,PriceLow,SL,TP,OrderMagicNumber;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits==3 || Digits==5)
     {
      TakeProfit *= 10;
      StopLoss   *= 10;
      Slippage   *= 10;
     }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   PriceHigh= iCustom(NULL,0,"TMA_Fair",TimeFrame,HalfLength,Price,ATRMultiplier,ATRPeriod,Interpolate,1,0);
   PriceLow = iCustom(NULL,0,"TMA_Fair",TimeFrame,HalfLength,Price,ATRMultiplier,ATRPeriod,Interpolate,2,0);

   if(CountSell()==0 && Bid>=PriceHigh)
     {
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"ТМА",Magic,0,Red);
      if(ticket>0)
        {
         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
         if(OrderSelect(ticket,SELECT_BY_TICKET))
            if(!OrderModify(ticket,OrderOpenPrice(),SL,TP,0))
               Print("Ошибка модификации ордера на продажу");
        }
      else Print("Ошибка открытия ордера на продажу");
     }
   if(CountBuy()==0 && Ask<=PriceLow)
     {
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"ТМА",Magic,0,Blue);
      if(ticket>0)
        {
         TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
         SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
         if(OrderSelect(ticket,SELECT_BY_TICKET))
            if(!OrderModify(ticket,OrderOpenPrice(),SL,TP,0))
               Print("Ошибка модификации ордера на покупку");
        }
      else Print("Ошибка открытия ордера на покупку");
     }
   if(Ask<=PriceLow && CountSell()>0)
     {
      for(int i=OrdersTotal() -1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderMagicNumber()==Magic && OrderType()==OP_SELL)
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Black))
                  Print("Ошибка закрытия ордера на продажу");
           }
        }
     }
   if(Bid>=PriceHigh && CountBuy()>0)
     {
      for(i=OrdersTotal() -1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderMagicNumber()==Magic && OrderType()==OP_BUY)
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Black))
                  Print("Ошибка закрытия ордера на покупку");
           }
        }
     }
  }
//+------------------------------------------------------------------+
int CountSell()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber && Magic && OrderType()==OP_SELL)
            count++;
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
int CountBuy()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber && Magic && OrderType()==OP_BUY)
            count++;
        }
     }
//+------------------------------------------------------------------+
 
Zelimhannahal00:

伙计们,帮我修复这个EA。它不检查订单,而是一有信号就不停地买入,直到花光全部存款。提前感谢大家。

可以在代码编辑器中使用代码样式器 对代码进行正常格式化。Ctrl + <

我为你调整了格式--现在正常可读了。

 
Zelimhannahal00:

伙计们,帮我修复这个EA。它不检查订单,而是一有信号就不停地买入,直到花光全部存款。提前感谢大家。

你已经正确地识别了它,错误在检查位置的功能中。

//+------------------------------------------------------------------+
int CountSell()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic && OrderType()==OP_SELL)
            count++;
        }
     }

   return(count);
  }
//+------------------------------------------------------------------+
int CountBuy()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic && OrderType()==OP_BUY)
            count++;
        }
     }
//+----------------------

我已经用红色标出,固定了。

我已经纠正了它。

 
Alekseu Fedotov:

你已经正确识别了位置检查功能中的错误

红色强调,已纠正。

就这些了。

修正了,还是一样。问题仍然存在。
 
Zelimhannahal00:
修正了,还是一样。问题仍然存在。
//+------------------------------------------------------------------+
int CountSell()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic && OrderType()==OP_SELL)
            count++;
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
int CountBuy()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic && OrderType()==OP_BUY)
            count++;
        }
     }
return(count);


你把所有的代码都复制到那里了吗?

 
Vladislav Andruschenko:


你复制了里面的所有代码吗?

我并没有错误地复制所有的代码。在那里可以返回(count)。

}

代码就是这样结束的,应该如此。在编译代码时,根本没有任何错误和警告。我一定是在函数中犯了一个错误,我搞不清楚在哪里。我按照上面的说法把它修好了。我也没有错误,但顾问本身的工作方式是一样的(第一个信号,它为整个存款买入,给定的手数,如1手套,他买1手交易200或更多,只要存款足够。但信号是正确的,买的也是正确的,只是很多)

 
Zelimhannahal00:

我并没有错误地复制整个代码。这很好 return(count)。

}

代码就是这样结束的,应该如此。编译时完全没有错误和警告。我一定是在函数中犯了一个错误,我搞不清楚在哪里。我按照上面的说法把它修好了。我也没有错误,但顾问本身的工作方式是一样的(第一个信号,它为整个存款买入,给定的手数,如1手套,他买1手交易200或更多,只要存款足够。但信号是正确的,买的也是正确的,但很多)

我已经检查并纠正了它。

附加的文件:
ProjectName.mq4  11 kb
 
你如何找到日期之间的蜡烛数?
 
Alexander Fedosov:
如何找到日期之间的蜡烛数?

如果TF是同步的,那么任何CopyXXXX()函数:

参考所需时间间隔的开始和结束日期

intCopyTime(
stringsymbol_name,// 符号名称
ENUM_TIMEFRAMEStimeframe,// period
datetimestart_time,// from which date
datetimestop_time,// 直到什么日期
datetimetime_array[]//用于复制开幕时间 的数组
);

返回的值

复制的数组元素 的数量,如果出错则为-1。


你可以使用iBarShift()按时间找到2个柱子


 
Igor Makanu:

如果TF是同步的,那么任何CopyXXXX()函数:

参考所需时间间隔的开始和结束日期

intCopyTime(
stringsymbol_name,// 符号名称
ENUM_TIMEFRAMEStimeframe,// period
datetimestart_time,//from what date
datetimestop_time,// 直到什么日期
datetimetime_array[]//用于复制开幕时间 的数组
);

返回的值

复制的数组元素 的数量,如果出错则为-1。


这很奇怪...我不记得以前mt4有这些功能。他们也被加到了五岁吗?
原因: