Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2722

 
Trader3000 #:
Попробовал, тогда получается не тестирование а оптимизация в терминале. А можно сделать чтоб именно в тестере открывались вкладки с другими парами на которых торгует? 

Это возможно, но это должен делать сам советник. Советник должен быть написан так, чтоб торговал на разных символах одновременно.

Если в советнике не предусмотрено это, то торговать одновременно на разных символах не получится.

 
Aleksandr Slavskii #:

Это возможно, но это должен делать сам советник. Советник должен быть написан так, чтоб торговал на разных символах одновременно.

Если в советнике не предусмотрено это, то торговать одновременно на разных символах не получится.

Советник включен и торгует на разных символах, но открывается только тот на котором включен (который указан в тестере).

Файлы:
 
Trader3000 #:

Советник включен и торгует на разных символах, но открывается только тот на котором включен (который указан в тестере).

Значит не включён и/или не торгует. Без кода это гадание на кофейной гуще. 

Хотя, давайте уточним, у вас в настройках советника есть строка в которой вы указываете торговые инструменты отличные от того на, котором запускаете советник?

Что нибудь типа такого:

Это скрин из настроек мультивалютного советника.

 
Aleksandr Slavskii #:

Значит не включён и/или не торгует. Без кода это гадание на кофейной гуще. 

Хотя, давайте уточним, у вас в настройках советника есть строка в которой вы указываете торговые инструменты отличные от того на, котором запускаете советник?

Что нибудь типа такого:

Это скрин из настроек мультивалютного советника.

Да, есть, и он по ним торгует.

 
Trader3000 #:

Да, есть, и он по ним торгует.

Вот так теперь открывает графики.

в OnInit() вызываем любую iXXX функцию с нужным символом и тестер добавит графики.

   if(Trade_symbol_1 == YES)
      Print(iTime(Symbol_1, PERIOD_CURRENT, 0));

   if(Trade_symbol_2 == YES)
      Print(iTime(Symbol_2, PERIOD_CURRENT, 0));

   if(Trade_symbol_3 == YES)
      Print(iTime(Symbol_3, PERIOD_CURRENT, 0));

   if(Trade_symbol_4 == YES)
      Print(iTime(Symbol_4, PERIOD_CURRENT, 0));

   if(Trade_symbol_5 == YES)
      Print(iTime(Symbol_5, PERIOD_CURRENT, 0));



Файлы:
 
Aleksandr Slavskii #:

Вот так теперь открывает графики.

в OnInit() вызываем любую iXXX функцию с нужным символом и тестер добавит графики.



Благодарю, это сработало. 
 
Alexey Viktorov #:
В реале по другим символам или с другим магиком были сделки?
да, только не было много открытых позиций одновременно, а однажды на одном инструменте закрыл все что было открыто, тоесть по одной позиции на каждом тике, тут то я это заметил и забеспокоился, хотелось бы понять ошибку  
 
VVT #:
да, только не было много открытых позиций одновременно, а однажды на одном инструменте закрыл все что было открыто, тоесть по одной позиции на каждом тике, тут то я это заметил и забеспокоился, хотелось бы понять ошибку  

Ошибка в том, что HistorySelect() выбирает ВСЕ ордера и сделки по всем символам и тем более не разбирая по магикам. 

И ещё одно замечание по коду:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам

VVT, 2026.03.16 18:37

Доброго времени

На текущем баре нет закрытия, возвращает true

Подскажите пожалуйста в чём ошибка

bool CheckForClose()
//Проверяет было ли закрытие позиции на текущей свече. Если было - возвращает true, если не было - возвращает false
{
   bool fRes=false;
   int kolHis, i;
   ulong deal_ticket;
   ENUM_DEAL_ENTRY deal_entry;
   datetime dt;

   if(!HistorySelect(iTime(NULL,PERIOD_D1,0), TimeCurrent()))
      return fRes;
   kolHis=HistoryDealsTotal();
   dt=iTime(NULL,PERIOD_D1,0);
   
//проверим даты закрытых сделок
   for(i=0;i<kolHis;i++)
   {deal_ticket=HistoryDealGetTicket(i);
    deal_entry=(ENUM_DEAL_ENTRY)HistoryDealGetInteger(deal_ticket,DEAL_ENTRY);
    if(deal_entry==DEAL_ENTRY_OUT)
      {if(dt<=(datetime)HistoryDealGetInteger(deal_ticket,DEAL_TIME))
         {fRes=true;
         break;
         }
      }
   }
   return fRes;
}

Дважды подряд вызывается функция iTime().

datetime dt = iTime(NULL,PERIOD_D1,0);
   
   if(!HistorySelect(dt, TimeCurrent()))
      return fRes;
   kolHis=HistoryDealsTotal();
   //dt=iTime(NULL,PERIOD_D1,0); эту строку удалить безжалостно.

Так будет работать чуток быстрей.

 
Trader3000 #:
Попробовал, тогда получается не тестирование а оптимизация в терминале. А можно сделать чтоб именно в тестере открывались вкладки с другими парами на которых торгует? 
А у тебя в графе оптимизации,, оптимизация выключена ??????????????????? !!!!!!!!!!!!!
 

Приветствую!

Что не так в этом коде и как можно оптимизировать?

Проблема в том, что если открыть позицию вчера и закрыть сегодня, то нет доступа к цене  открытия, поэтому разницу в пунктах за сегодня считает не корректно


Да в сама функция GetPriceIn(posID) тяжёлая

datetime GetHistoryInfoFromDate(datetime prevDay, datetime day, double &pips, double &profit, double &lots)
 {
  pips = 0;
  profit = 0;
  lots = 0;
  datetime res = day;
  if(!HistorySelect(prevDay, day))
    return 0;
  int total = HistoryDealsTotal();
  for(int i=0; i<total; i++)
   {
    if(!dealOut.SelectByIndex(i))
      continue;
    if(dealOut.Entry() != DEAL_ENTRY_OUT)
      continue;
    if(nSymb == "" || dealOut.Symbol() == _Symbol)
     {
      if(MagicNumber == -1 || dealOut.Magic() == MagicNumber)
       {
        if(CommentFilter == "" || StringFind(dealOut.Comment(), CommentFilter) != -1)
         {
          ulong posID = dealOut.PositionId();
          double PriceIn = GetPriceIn(posID); // OrderOpenPrice()
          if(dealOut.DealType() == DEAL_TYPE_SELL)
            pips += point2pip(dealOut.Price() - PriceIn, dealOut.Symbol());
          if(dealOut.DealType() == DEAL_TYPE_BUY)
            pips += point2pip(PriceIn - dealOut.Price(), dealOut.Symbol());
          lots += dealOut.Volume();
          profit += dealOut.Profit()+dealOut.Swap()+dealOut.Commission();
          datetime PCT = dealOut.Time();
          if(PCT < res)
            res = PCT;
         }
       }
     }
   }
  return(res);
 }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double GetPriceIn(ulong positionID)
 {
  double priceIn=0;
  int total = HistoryDealsTotal();
  for(int i=0; i<total; i++)
   {
    if(!dealIn.SelectByIndex(i))
      continue;
    if(dealIn.Entry() == DEAL_ENTRY_IN && dealIn.PositionId() == positionID)
     {
      priceIn = dealIn.Price();
      break;
     }
   }
  return(priceIn);
 }

--

--

Такой код считает корректно, но тяжёлый

datetime GetHistoryInfoFromDate(datetime prevDay, datetime day, double &pips, double &profit, double &lots)
 {
  pips = 0;
  profit = 0;
  lots = 0;
  datetime res = day;
  if(!HistorySelect(0, INT_MAX))
    return 0;
  int total = HistoryDealsTotal();
  for(int i=0; i<total; i++)
   {
    if(!dealOut.SelectByIndex(i))
      continue;
    if(dealOut.Entry() != DEAL_ENTRY_OUT)
      continue;
    if(nSymb == "" || dealOut.Symbol() == _Symbol)
     {
      if(MagicNumber == -1 || dealOut.Magic() == MagicNumber)
       {
        if(CommentFilter == "" || StringFind(dealOut.Comment(), CommentFilter) != -1)
         {
          datetime OrderCloseTime = dealOut.Time();
          if(day >= OrderCloseTime && OrderCloseTime >= prevDay)
           {
            ulong posID = dealOut.PositionId();
            double PriceIn = GetPriceIn(posID); // OrderOpenPrice()
            if(PriceIn<=0)
              continue;
            if(dealOut.DealType() == DEAL_TYPE_SELL)
              pips += point2pip(dealOut.Price() - PriceIn, dealOut.Symbol());
            if(dealOut.DealType() == DEAL_TYPE_BUY)
              pips += point2pip(PriceIn - dealOut.Price(), dealOut.Symbol());
            lots += dealOut.Volume();
            profit += dealOut.Profit()+dealOut.Swap()+dealOut.Commission();
            if(OrderCloseTime < res)
              res = OrderCloseTime;
           }
         }
       }
     }
   }
  return(res);
 }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double GetPriceIn(ulong positionID)
 {
  double priceIn=0;
  int total = HistoryDealsTotal();
  for(int i=0; i<total; i++)
   {
    if(!dealIn.SelectByIndex(i))
      continue;
    if(dealIn.Entry() == DEAL_ENTRY_IN && dealIn.PositionId() == positionID)
     {
      if(dealIn.Time()<StartDateFilter)
        return(0);
      priceIn = dealIn.Price();
      break;
     }
   }
  return(priceIn);
 }