Запрет торговли в одном баре.

 
Если кто знает, подскажите.
Мне нужно сделать так, что-бы после открытия одной сделки советник больше не открывал сделки в этом баре.
 
int start()
{
    int total;
 
    if (OpenCondition)
    {
        total = OrdersTotal(); 
        if (total > 0)
        {
            OrderSelect(total - 1, SELECT_BY_POS, MODE_TRADES); // последний открытый или модифицированный ордер будет последним в списке
            if (OrderOpenTime() < Time[0]) // Открыт раньше текущего бара?
                OrderSend(...);
        }
}
Если есть модификация ордеров или работает несколько стратегий, нужно искать самый поздний подходящий ордер в списке. Последний в списке может оказаться не им.
 
//+----------------------------------------------------------------------------+
//|  Возвращает номер бара открытия последней позиции или -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) {
  // Можно открывать позиции
}
 

Всем спасибо, но я нашёл, как ещё проще сделать:

if (iBarShift("GBPUSD",0,OpenTime) != 0)
               {
               MyTicketBuy = OrderSend(Symbol(), OP_BUY, lot , Ask, 3,
               Bid - SL * Point, Ask+TP*Point, NULL, 0, 0, Green);
               OpenTime = iTime("GBPUSD",0,0);
               }
 
А я еще проще :)

if (Bars>BarS)
   {
     OrderS=OrderSend(Symbol(),......);
     BarS=Bars;
   }
если использовать iBar то тогда привязка к конкретному графику, а если просто Bars то не важно где работает эксперт.
 
Maxor:

Всем спасибо, но я нашёл, как ещё проще сделать:

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

Corwin_Volot:
А я еще проще :)
С Bars надо вообще осторожнее...

Самый правильный вариант предложил KimIV.
 
Мне всегда помогала такая строка в начале кода:
if(Volume[0]>1) return;
 
Implex:
Мне всегда помогала такая строка в начале кода:
if(Volume[0]>1) return;

Задача стояла не в полной остановке работы а в запрете на открытие нового ордера.
Это разные вещи.
 
Implex:
Мне всегда помогала такая строка в начале кода:
if(Volume[0]>1) return;


Я тоже долгое время пользовал этот оператор, пока опытным путем не установил, что иногда первое значение бара просто пропускается. Пришлось отказаться от этого оператора.:-(
 
komposter:

Corwin_Volot:
А я еще проще :)
С Bars надо вообще осторожнее...

Самый правильный вариант предложил KimIV.
и в чем опасность? последствия?
в чем преимущество варианта KimIV?

 

Рискну присоединить и свой вариант. Сильно не пинать....

 bool isNewBar=false;
if (ExpertBars !=Bars) {ExpertBars=Bars; isNewBar=true; } 
if (isNewBar)             //если появился новый бар :
//------------------------------------------------------------
{ 
 int _Order=ExpertOrder(MagicGBPJPY);
 if (_Order!=0) ZeroBarOrd=true;  //есть ордер паре GBPJPY 
 else  
 ZeroBarOrd=false; //нет ордера
}
 if (!ZeroBarOrd) {  ... ... ...

Это из моего мультивалютника. При этом подразумевается наличие функции ExpertOrder(Magic...);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Полезная страничка получилась. В отличие от многих "новых тем". ...

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