Как сделать чтобы в один час открывался только один ордер?

 

Как можно сделать так, чтобы в один час открывался только один ордер?
А то "советник" работает по предыдущим барам, и если условия удовлетворяют то он на следущем баре
может открыть не одну позицию...

 
total=OrdersTotal();
   if(total<1) 
     {
       Условия установки ордеров
     }
Можно так - (одновременно будет открыт только один ордер)
 
Но это не то... Бывает такое что ордер может закрыться в этот же баое, и он сразу еще раз откроется...

А что значит функция sleep?
 


Использовать

datetime OrderOpenTime( )
Возвращает время открытия выбранного ордера.

как вариант
и если ордер открыт и час совпадает с текущим не открываться



и если это значение рано текущему часу не открывать следующий

 
xeon:
total=OrdersTotal();
   if(total<1) 
     {
       Условия установки ордеров
     }
Можно так - (одновременно будет открыт только один ордер)

да ! но если МТС подразумевает открыие не одного ордера а нескольких такой вариант не подходит
 
YuraZ а можешь примерно код написать?
 
   static int OrderOpenTime = 24;
   
   if(OrderOpenTime != Hour())
   {
   ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss,TakeProfit,NULL,myMagic,0,Green);
   if(ticket > 0) OrderOpenTime = Hour();
   }
Например вот так. Каждый раз открывая сделку запоминаешь в каком часу это было, а перед открытием проверяешь текущее время и запомненное. Будут проблемы если последняя сделка была открыта 24 часа назад, т.е. час будет совпадать и условие не выполнится, но думаю для тебя это не проблема. Возможны и другие варианты. При желании можно перебрать все текущие и закрытые сделки и проверить их время, как это уже было сказано выше, но мне кажется, что ни к чему эти сложности в данном случае.
 
timbo:
   static datetime OrderOpenTime;
   
   if(OrderOpenTime != Hour())
   {
   ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss,TakeProfit,NULL,myMagic,0,Green);
   if(ticket > 0) OrderOpenTime = Hour();
   }
Например вот так. Каждый раз открывая сделку запоминаешь в каком часу это было, а перед открытием проверяешь текущее время и запомненное. Будут проблемы если последняя сделка была открыта 24 часа назад, т.е. час будет совпадать и условие не выполнится, но думаю для тебя это не проблема. Возможны и другие варианты. При желании можно перебрать все текущие и закрытые сделки и проверить их время, как это уже было сказано выше, но мне кажется, что ни к чему эти сложности в данном случае.

можно добавить в конструкцию
проверку дня
тогда переход 24 часа не страшен
 
можно добавить в конструкцию
проверку дня
тогда переход 24 часа не страшен
Да конечно же можно, но, как мне кажется, для данного случая - возможное многократное открытие в течении одного часа, т.е. сделок ожидается много - это не важно.

И более правильным было бы всё-таки проверка времени открытия последнего открытого и последнего закрытого ордеров, ибо это защитило бы эксперт от открытия сделки при старте/ре-старте, если уже есть сделки, но в самом эксперте OrderOpenTime пока ничему хорошему не равен. Но для тестирования идеи все эти сложности ненужны - KISS технология (keep it simple stupid).
 

Предлагаю две простые функции. Как их использовать, сообразите сами.

 
//+----------------------------------------------------------------------------+
//|  Возвращает время открытия последней позиций.                              |
//|  Параметры:                                                                |
//|    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 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);
}
 
Если будет перезагрузка системы, то советник даст сбой?
Причина обращения: