Help! как сделать блокировку от повторных входов?

 
Подскажите как можно реализовать такое действие програмно:
график 4H
if (Close[1]>Open[1] && OrdersTotal()==0 && K=1) {OrderSend(BUY);K=0;}
-ордер открывается необязательно с началом новой свечи;
-сработал стоп или тейк, а условие ещё активно;
-Надо чтоб прошло ровно 4 (N) свечи для разрешения открывать новую
сделку (K=1) на новый сигнал с появлением новой свечи.
может существуют какие-нибудь простые решения.
 
Выбирайте любое решение по своему вкусу

//+----------------------------------------------------------------------------+
//|  Возвращает номер бара закрытия последней позиции или -1.                  |
//|  Параметры:                                                                |
//|    sym - наименование инструмента ("" - текущий символ)                    |
//|    tf  - таймфрейм                ( 0 - текущий таймфрейм)                 |
//|    op  - операция                 (-1 - любая позиция)                     |
//|    mn  - MagicNumber              (-1 - любой магик)                       |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos(string sym="", int tf=0, int op=-1, int mn=-1) {
  datetime oct;
  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 (oct<OrderCloseTime()) oct=OrderCloseTime();
            }
          }
        }
      }
    }
  }
  return(iBarShift(sym, tf, oct, True));
}

//+----------------------------------------------------------------------------+
//|  Возвращает номер бара открытия последней позиции или -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));
}

//+----------------------------------------------------------------------------+
//|  Возвращает время открытия последней позиций.                              |
//|  Параметры:                                                                |
//|    sym - наименование инструмента ("" - текущий символ)                    |
//|    op  - операция                 (-1 - любая позиция)                     |
//|    mn  - MagicNumber              (-1 - любой магик)                       |
//+----------------------------------------------------------------------------+
datetime TimeOpenLastPos(string sym="", 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(oot);
}

//+----------------------------------------------------------------------------+
//|  Возвращает количество секунд после закрытия последней позиций.            |
//|  Параметры:                                                                |
//|    sym - наименование инструмента ("" - текущий символ)                    |
//|    op  - операция                 (-1 - любая позиция)                     |
//|    mn  - MagicNumber              (-1 - любой магик)                       |
//+----------------------------------------------------------------------------+
datetime SecondsAfterCloseLastPos(string sym="", int op=-1, int mn=-1) {
  datetime oct;
  int      i, k=HistoryTotal();

  if (sym=="") sym=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sym) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (oct<OrderCloseTime()) oct=OrderCloseTime();
            }
          }
        }
      }
    }
  }
  return(CurTime()-oct);
}

//+----------------------------------------------------------------------------+
//|  Возвращает количество секунд после открытия последней позиций.            |
//|  Параметры:                                                                |
//|    sym - наименование инструмента ("" - текущий символ)                    |
//|    op  - операция                 (-1 - любая позиция)                     |
//|    mn  - MagicNumber              (-1 - любой магик)                       |
//+----------------------------------------------------------------------------+
datetime SecondsAfterOpenLastPos(string sym="", 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(CurTime()-oot);
}
 
В програмировании не силён. Интересен этот вариант:
"Возвращает номер бара открытия последней позиции или -1. "
Но не понятно, ведь при появлении новой свечи, номерация смещаетя?
Функция возвращает смещение бара, которому принадлежит указанное время.
А можно пример как это использовать?

if (Close[1]>Open[1] && OrdersTotal()==0 && K=1) {OrderSend(BUY);K=0;}

if ( iBarShift (NULL, PERIOD_H4, oot) ==4 ) { K=1;} - непонятно как применить?????
 
Для создания возможности одного открытия на одном баре я использую такое условие
if (NumberOfBarOpenLastPos()>0)


Это означает, что следующее открытие станет возможным, когда предыдущее открытие уйдёт за пределы текущего бара. Не знаю, в курсе Вы или нет, на всякий случай скажу, что нумерация баров выполняется справа налево. Текущий бар является нулевым, предыдущий бар является первым, предпредыдущий - вторым и т.д.

Как я понял из первого поста, Вам нужно сделать одно открытие на 4 (четыре) бара. Применительно к предлагаемой мной функции используйте такое условие

if (NumberOfBarOpenLastPos()>3)
 
Это более оптимально для меня, спасибо.
Причина обращения: