Помоги пожалуйста написать ф-цию, которая не давала бы выставлять в одном месте больше одного отложенного ордера.

 
Перед установкой ордера пробеги в цикле по всем ордерам и если цена открытия совпадает с той на которую планируется поставить ордер то false иначе true.
[Удален]  

Пробовал. Постоянно выполняется условие истина или ложь. Сравнивание ведется по первой попавшийся сделке. Как сделать, чтобы оно сначала проверило все существующие ордера, а потом только принимало решеныя.

[Удален]  

Может выбирал не правильный оператор?

 

Сравнивать надо разность цен с некоторой дельтой иначе например при 5-знаке никогда не попадёшь на эту цену, но в районе 1-го 5-значного пункта будет 10 ордеров.

[Удален]  

Как это реализовать?

[Удален]  

Находил готовые ф-ции, но они никуда не годные. Например:
void SchOrders()
{
// для начала работы счётчиков мы их обнуляем
SchBuyStop=0; SMB=Symbol();
for(x=OrdersTotal()-1;x>=0;x--)
{//Начало цикла
if (OrderSelect(x, SELECT_BY_POS, MODE_TRADES))
{//начало работы с выбранным ордером
if(OrderType()==OP_BUYSTOP)
SchBuyStop++;
}//конец работы с выбранным ордером
}//Конец цикла

 
Melko писал(а) >>

Как это реализовать?

// Функция возвращает истину - есть ордер около текущей цены, ложь - нет ордера. 
// Без проверок на магик и символ и корректности выбора ордера, т.е. для тестера
bool DoesOrderExist(double delta) {
   for(int i=OrdersTotal()-1; i>=0; i--)
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if (OrderType() == OP_SELLSTOP && MathAbs(OrderOpenPrice()-Bid) < delta*Point)  // Этот ордер в пределах 5 пунктов от текущей цены
         return(true);
      if (OrderType() == OP_BUYSTOP  && MathAbs(OrderOpenPrice()-Ask) < delta*Point)  // Этот ордер в пределах 5 пунктов от текущей цены
         return(true);
   }
   return(false);
}