как выбрать позицию, ближайшую к текущей цене

 
Нужно найти и выбрать позицию, ближайшую к текущей цене. Поделитесь заготовкой у кого есть. Или, может, ссылочкой. Спасибо.
 
Не понял вопроса, откуда выбрать?
            Или вопрос как узнать минимальный отступ от рыночной цены для установки отлож ордера?
 
vimac писал (а):
Нужно найти и выбрать позицию, ближайшую к текущей цене.
По какому критерию искать позиции? На выбор предлагаю три:
1. Цена открытия позиции
2. Уровень стопа
3. Уровень тейка
Вам какой критерий нужен?
 
KimIV:По какому критерию искать позиции? На выбор предлагаю три:
1. Цена открытия позиции
2. Уровень стопа
3. Уровень тейка
Вам какой критерий нужен?

автор понял, просто отошел поужинать :)

Хорошо, подробнее:

1. имеем несколько открытых позиций и отложенных ордеров

2. нужно найти (узнать номер тикета OrderTicket) именно той открытой позиции, OrderOpenPrice которой находится ближе всех к текущей цене Bid или Ask, соответственно.

 
vimac писал (а):

нужно найти (узнать номер тикета OrderTicket) именно той открытой позиции, OrderOpenPrice которой находится ближе всех к текущей цене Bid или Ask, соответственно.

угу... ясно. Вот, держите...
//+----------------------------------------------------------------------------+
//|  Возвращает тикет ближайшей к рынку позиции по цене открытия или 0         |
//|  Параметры:                                                                |
//|    sym - наименование инструмента  ("" - текущий символ)                   |
//|    op  - операция                  (-1 - любая позиция)                    |
//|    mn  - MagicNumber               (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
int TicketNearPosOnOpen(string sym="", int op=-1, int mn=-1) {
  double di=10000, pp;
  int    i, k=OrdersTotal(), t=0;
 
  if (sym=="") sym=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sym && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderType()==OP_BUY) pp=MarketInfo(sym, MODE_BID);
            if (OrderType()==OP_SELL) pp=MarketInfo(sym, MODE_ASK);
            if (di>MathAbs(OrderOpenPrice()-pp)) {
              di=MathAbs(OrderOpenPrice()-pp);
              t=OrderTicket();
            }
          }
        }
      }
    }
  }
  return(t);
}
 
vimac писал (а):

1. имеем несколько открытых позиций и отложенных ордеров
2. нужно найти (узнать номер тикета OrderTicket) именно той открытой позиции, OrderOpenPrice которой находится ближе всех к текущей цене Bid или Ask, соответственно.

int NearestOrder()
{
    int i, iCnt = OrdersTotal(), iType, iTicket = -1;
    double dif = 0.0, dCurrPrice;
    for(i = 0; i < iCnt; i++)
    {
        if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            Print("Error! MQL Function OrderSelect(", i, ") fail. - ", ErrorDescription(GetLastError()), ".");
            return(-1);// not all orders scanned
        }
        iType = OrderType();
        if(iType == ORDER_BUY)
            dCurrPrice = Bid;
        else if(iType == ORDER_SELL)
            dCurrPrice = Ask;
        else
            continue;
        if(!dif || MathAbs(dCurrPrice - OrderOpenPrice()) < dif)
        {
            dif = MathAbs(dCurrPrice - OrderOpenPrice());
            iTicket = OrderTicket();
        }
        if(!dif)
            break;
    }
    return(iTicket);
}
 
Всем огромное спасибо, пока разбираюсь.
KimIV , интересный у Вас стиль записи. Строки экономятся, получается компактно. Надо взять на вооружение :).
 
KimIV помоему вообще задал стилистику писания кодов.
В его кодах всегда все понятно и чётко. Респект.
 
Еще раз всем спасибо. Проверил оба кода - работают. Все Ok, правда, компилятор задал пару простых вопросов. А я сидел, голову ломал. .. оказывается, все так просто :).
Причина обращения: