Нужна помощь!!!!

 

Неожиданно столкнулся сос ледующей проблемой:

Написал советник, одна из функций которого открывать отложенные ордера. Но прежде чем открыть очередной отложенный ордер, программа опрашивает уже выставленные ордера (цену) и открывает новый только если нет уже выставленного с такой ценой. Работаю по паре EURUSD.

for (Price=Max_Price-Step*Point; Price>Ask+10*Point; Price=Price-Step*Point) // идем от максимума к текущей цене
{
int N=0; //счетчик ордеров
for (int i=1; i<=OrdersTotal(); i++) // цикл перебора ордеров
{
if(OrderSelect(i-1,SELECT_BY_POS)==true) //выбор ордера
{ //анализ открытого ордера
if (Price==OrderOpenPrice()) //если цена совпадает
{
N=N+1;
}
} //выбираем следующий открытый ордер
}
if(N==0) //если ордеров с такой ценой не нашлось
{ //открываем ордер
Alert("Новый BUYSTOP ", Price);
int Ticket=OrderSend(Symb, OP_BUYSTOP, Lot, Price, 0, 0, Price+TP*Point);
if (GetLastError()>0)
Alert("Ошибка ", GetLastError());
}
} //Пришли к рынку

пока максимум находится до 1,3980 все идет нормально, но стоит поставить 1,4000 - программа перестает видеть ордера с одинаковой ценой (счетчик N остается нулевым) и штампует одинаковые ордера.

интересно, что если максимум поставить 1,5000, то до 1,4000 все нормально, а начиная с 1,3980 начинается дублирование ордеров с одинакой ценой

ЧТО БЫ ЭТО МОГЛО БЫТЬ????????

 
jurist70:

ЧТО БЫ ЭТО МОГЛО БЫТЬ????????

Неужели трудно распринтовать данные и проследить их в журнале?

На мой взгляд неверно устроено сравнение дробных чисел.

 
jurist70:

Неожиданно столкнулся сос ледующей проблемой:

Написал советник, одна из функций которого открывать отложенные ордера. Но прежде чем открыть очередной отложенный ордер, программа опрашивает уже выставленные ордера (цену) и открывает новый только если нет уже выставленного с такой ценой. Работаю по паре EURUSD.

for (Price=Max_Price-Step*Point; Price>Ask+10*Point; Price=Price-Step*Point) // идем от максимума к текущей цене

{





Здесь первое сравнение начинается не с максимальной цены, а на Step*Point меньшей. Наверное, надо for (Price=Max_Price;............)
 
hhohholl:
jurist70:

Неожиданно столкнулся сос ледующей проблемой:

Написал советник, одна из функций которого открывать отложенные ордера. Но прежде чем открыть очередной отложенный ордер, программа опрашивает уже выставленные ордера (цену) и открывает новый только если нет уже выставленного с такой ценой. Работаю по паре EURUSD.

for (Price=Max_Price-Step*Point; Price>Ask+10*Point; Price=Price-Step*Point) // идем от максимума к текущей цене
{

Здесь первое сравнение начинается не с максимальной цены, а на Step*Point меньшей. Наверное, надо for (Price=Max_Price;............)

Используйте функцию KimIV:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.07.2008                                                     |
//|  Описание : Возвращает флаг существования ордеров по цене установки        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    pp - цена                       (-1   - любая цена)                     |
//+----------------------------------------------------------------------------+
bool ExistOrdersByPrice(string sy="", int op=-1, int mn=-1, double pp=-1) {
  int d, i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()>1 && OrderType()<6) {
          d=MarketInfo(OrderSymbol(), MODE_DIGITS);
          pp=NormalizeDouble(pp, d);
          if (pp<0 || pp==NormalizeDouble(OrderOpenPrice(), d)) {
            if (mn<0 || OrderMagicNumber()==mn) return(True);
          }
        }
      }
    }
  }
  return(False);
}
Причина обращения: