Скачать MetaTrader 5

Заставить функцию вернуть false если сделка в этом баре еще открыта

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Узнай самые обсуждаемые темы на форуме. Заходи в раздел Стена!
Андрей
492
Андрей 2010.10.21 23:00 

Добрый вечер!

Подскажите как доделать функцию ?

//ф-я возвращает true если в этом периоде/баре НЕ делалась сделка или она закрылась, иначе false 
bool NoTradeThisBar(string m_symbol,ENUM_TIMEFRAMES m_period,datetime start_time,datetime finish_time)
  {
//HistorySelect(0,TimeCurrent());
   HistorySelect(start_time,finish_time);
   string   name;
   uint     total=HistoryDealsTotal();
   ulong    ticket=0;
   double   price;
   double   profit;
   datetime time;
   string   symbol;
   long     type;
   long     entry;
   for(uint i=total;i>0;i--)
     {
      if(ticket=HistoryDealGetTicket(i))
        {
         price =HistoryDealGetDouble(ticket,DEAL_PRICE);
         time  =HistoryDealGetInteger(ticket,DEAL_TIME);
         symbol=HistoryDealGetString(ticket,DEAL_SYMBOL);
         type  =HistoryDealGetInteger(ticket,DEAL_TYPE);
         entry =HistoryDealGetInteger(ticket,DEAL_ENTRY);
         profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
         if(price && time && symbol==m_symbol)
           {
            datetime time_array[];
            if(CopyTime(m_symbol,m_period,start_time,1,time_array)==-1)
              {
               Print("Ошибка CopyTime! "+GetLastError());
               return(false);
              }
            Print("Время позы = "+TimeToString(time,TIME_DATE|TIME_SECONDS));
            Print("Время бара = "+TimeToString(time_array[0],TIME_DATE|TIME_SECONDS));
            if(time>=time_array[0])
              {
               Print("Сделка делалась в этом баре, ее время = "+TimeToString(time,TIME_DATE|TIME_SECONDS));
               return(false);
              }
            break;
           }
        }
     }
   
   return true;
  }
hasayama
610
hasayama 2010.10.22 01:08  
snik_666:

Добрый вечер!

Подскажите как доделать функцию ?

Дык, а в чем проблема?

Передали в функцию время, если после HistorySelect() при помощи HistoryDealsTotal() получен 0, значит в промежутке сделок не было.

Иначе смотрим какие сделки в этот период открывались, а какие закрывались: проверяем все атрибуты и DEAL_ENTRY обязательно.

Андрей
492
Андрей 2010.10.22 07:59  

согласен после

uint     total=HistoryDealsTotal();
   if(total==0)
     {
      return true;
     }

но как проверить открытая или закрытая сделка которая открывалась в этом баре не соображу ни как.....


hasayama
610
hasayama 2010.10.22 13:41  
snik_666:

согласен после

но как проверить открытая или закрытая сделка которая открывалась в этом баре не соображу ни как.....


Если открыта вообще (то есть именно сейчас), используйте PositionSelect().

Если позиции нет, но вам важно знать закрылась ли позиция именно в указанный промежуток, нужно из сделки типа "вход/in" (проверять DEAL_ENTRY) узнать ID позиции, затем выбрать позицию по ID - тут пригодится HistorySelectByPosition(), найти уже ее сделку "выход/out" и сравнить время выхода с параметром finish_time.

При этом, если цикл используете, не забывайте проверять правильность его работы, то есть проверять те ли сделки вы просматриваете в своем цикле и не сбилось ли чего при вызове других "выбирающих историю" функций. Может быть имеет смысл сначала скопировать некоторую инфу по сделкам в структуру, а только потом вызывать HistorySelectByPosition() для них.

В любом случае, желаю удачи. 

Андрей
492
Андрей 2010.10.22 15:53  
Спасибо , постараюсь!

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий