Проблема с повторным открытием ордеров

 

Советник работает на H4. При получении торгового сигнала от индикатора открывает ордер. Например, через час этот ордер закрывает, но т.к. торговый сигнал будет продолжать действовать до конца текущего таймфрейма, сразу же открывается новый ордер. Мне нужно, чтобы до конца этого таймфрейма больше ордеров не открывалось. Попробовал сделать через iBarShift(NULL,0,OrderOpenTime())!=0 (естественно, предварительно выбрав OrderSelect для выбора в истории закрытого ордера), но почему-то все равно в этом же таймфрейме открываются повторные ордера. Посоветуйте, как лучше решить эту проблему.

 
FxRoller >>:

Советник работает на H4. При получении торгового сигнала от индикатора открывает ордер. Например, через час этот ордер закрывает, но т.к. торговый сигнал будет продолжать действовать до конца текущего таймфрейма, сразу же открывается новый ордер. Мне нужно, чтобы до конца этого таймфрейма больше ордеров не открывалось. Попробовал сделать через iBarShift(NULL,0,OrderOpenTime())!=0 (естественно, предварительно выбрав OrderSelect для выбора в истории закрытого ордера), но почему-то все равно в этом же таймфрейме открываются повторные ордера. Посоветуйте, как лучше решить эту проблему.

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

 

Функция Кима должна помочь:

//+----------------------------------------------------------------------------+
//|  Возвращает номер бара открытия последней позиции или -1.                  |
//|  Параметры:                                                                |
//|    sym - наименование инструмента  ("" - текущий символ)                   |
//|    tf  - таймфрейм                 ( 0 - текущий таймфрейм)                |
//|    op  - операция                  (-1 - любая позиция)                    |
//|    mn  - MagicNumber               (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
int NumberOfBarOpenLastPos(string sym="", int tf=0, int op=-1, int mn=-1) {
  datetime oot;
  int      i, k=OrdersTotal();
 
  if (sym=="") sym=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sym) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (oot<OrderOpenTime()) oot=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(iBarShift(sym, tf, oot, True));
}

Пример использования:

if (NumberOfBarOpenLastPos()>0) {
  // Можно открывать позиции
}
 
goldtrader >>:

Функция Кима должна помочь:


Я так понял, что FxRoller спрашивал, чтобы на текущем баре не открывались сделки повторно.

Может неправильно понял. В любом случае, функция Кима более расширенный вариант.

 
Pegasmaster писал(а) >>

Я так понял, что FxRoller спрашивал, чтобы на текущем баре не открывались сделки повторно.

Может неправильно понял. В любом случае, функция Кима более расширенный вариант.

Всё верно, именно это он спрашивал. И именно эту задачу решает данная функция.

 
goldtrader >>:

Всё верно, именно это он спрашивал. И именно эту задачу решает данная функция.

Ну тогда ок. Просто функция Кима - более общий вариант. И если речь идет только о текущем баре, то она реально не нужна.

Достаточно проверить равенство переменной OrderBarM15 с количеством баров iBars

      if(OpenBuy==1 && OrderBarM15!=iBars("GBPUSD",PERIOD_M15))
      {
         SL=Bd-StopLoss*Point;
         TP=As+TakeProfit*Point;
         SL=NormalizeDouble(SL, Digits);
         TP=NormalizeDouble(TP, Digits);
         ticket=OpenPosition(OP_BUY,Lots,SL,TP,MagicBuy);
         if(ticket>0)
         {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            {
               OrderBarM15=iBars("GBPUSD",PERIOD_M15);
               Print("BUY GBPUSD M15 order opened : ",OrderOpenPrice());
            }
         }
      }
 
Pegasmaster писал(а) >>

Достаточно проверить равенство переменной OrderBarM15 с количеством баров iBars

Если пренебречь рисками внезапного изменения значения переменной iBars("GBPUSD",PERIOD_M15);
при возможной подкачке истории на текущем баре, то вполне рабочая конструкция.

Да и изначально не отвергал Ваш вариант, предложил функцию Кима в качестве надёжной проверенной альтернативы.

 
goldtrader >>:

Функция Кима должна помочь:

Пример использования:

Функция полезная, но она предназначена для определения номера бара последней открытой позиции. Меня же интересуют уже закрытые позиции. Простой заменой MODE_TRADES на MODE_HISTORY вопрос не решается, т.к. тут может быть вариант, когда по данному инструменту не открыто еще ни одной позиции, и следовательно ни один ордер в истории не будет выбран; а может быть другой вариант, когда в истории уже есть закрытые ордера. Какие изменения необходимо внести в эту функцию, чтобы она работала при всех вариантах?

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