нужна помощь!

 

Добрый день! Нужно сделать такое условие:

Если ордер закрылся на текущем баре, то ордеров на данном баре больше не открывать.

Спасибо

 

Запоминайте в статическую переменную время открытия бара на котором произошло закрытие, и далее при открытии новой сделки проверяйте

static datetime time_prev;

if(time_prev!=Time[0])
{
   //Открываем новую сделку.
}
if(Проверяем что сделка закрылась)
{
   //Запоминаем время открытия бара на котором произошло закрытие
   time_prev=Time[0];
}
 
Alexey Valeev:

Запоминайте в статическую переменную время открытия бара на котором произошло закрытие, и далее при открытии новой сделки проверяйте

Неправильно.
При перезагрузке будет бяка.
Находить время закрытия последнего (ордера*) надо прямо перед открытием нового (ордера*).

*отредактировано.
 
Andrei Fandeev:

Неправильно.
При перезагрузке будет бяка.
Находить время закрытия последнего надо прямо перед открытием нового.

а мне нужен именно текущий бар, который в данный момент происходит

 
labvic:

Добрый день! Нужно сделать такое условие:

Если ордер закрылся на текущем баре, то ордеров на данном баре больше не открывать.

Спасибо

Нужно в истории найти последнюю закрытую позицию и сравнить её время закрытия с временем открытия самого свежего бара. Проще всё это оформить функцией.

//+------------------------------------------------------------------+
//|   false  -  на данном баре ещё не было закрытых позиций          |
//|   true -  на данном баре есть закрытые позиции                   |
//+------------------------------------------------------------------+
bool NewBar_CloseTrade()
{
   for(int i = OrdersHistoryTotal()-1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderSymbol() == Symbol() && (OrderType() == OP_BUY || OrderType() == OP_SELL))
      {
         if(OrderCloseTime() < Time[0])return(false); else return(true);
      }
   }
   return(false);
}
 
labvic:

а мне нужен именно текущий бар, который в данный момент происходит

Бары разные бывают на свете )))
Встречаются и дневные, и недельные.
Вы же спрашиваете про бар? Так бар может закрыться и через 24 часа после открытия.
А за 20 часов много что может произойти с домашним компьютером.

Моё замечание было что Нельзя запоминать время в переменную. Это чревато.

П.С. Вот функцию, что дал Сергей, вызывайте перед открытием ордера - это будет надёжно.

 
Andrei Fandeev:

Бары разные бывают на свете )))
Встречаются и дневные, и недельные.
Вы же спрашиваете про бар? Так бар может закрыться и через 24 часа после открытия.
А за 20 часов много что может произойти с домашним компьютером.

Моё замечание было что Нельзя запоминать время в переменную. Это чревато.

П.С. Вот функцию, что дал Сергей, вызывайте перед открытием ордера - это будет надёжно.

Не будет - цикл не правильный. 
 
Artyom Trishkin:
Не будет - цикл не правильный. 

Это? -

i >= 0
да и лишнее 
 + _Period * 60
 
Andrei Fandeev:

Неправильно.
При перезагрузке будет бяка.
Находить время закрытия последнего (ордера*) надо прямо перед открытием нового (ордера*).

*отредактировано.
Что там не правильного то, каждый тик историю что-ли перерывать после закрытия позиции, если time_prev==0 то смотрим историю при инициализации допустим и заполняем её. А далее просто время сравнивается как я предложил. Это просто пример, причём рабочий.
 
Sergey Kolemanov:

Нужно в истории найти последнюю закрытую позицию и сравнить её время закрытия с временем открытия самого свежего бара + Period() * 60. Проще всё это оформить функцией.

Если ордер закрылся на текущем баре то, вернёт false. Вы же прибавили ещё бар к текущему

if(OrderCloseTime() <= Time[0] + _Period * 60)return(false);
 
Andrei Fandeev:

Если ордер закрылся на текущем баре то, вернёт false. Вы же прибавили ещё бар к текущему

Запомнили бар на котором произошло закрытие, то есть запомнили текущий бар) всё на нём не открываем, пока новый бар не откроется. То что вы скинули, так там сперва нужно историю перерыть. У меня точно такое же условие по сути, но быстрее работает)

Причина обращения: