Выбор последней открытой позиции

 

Добрый день, нужно выбрать последнюю открытую позицию - пишу код:

ulong ner = PositionGetTicket(PositionsTotal() - 1)

временами выбирает, временами нет. через

CPositionInfo pos;
pos.SelectByIndex(PositionsTotal() - 1);

та же ерунда. открытые позиции есть, т.к. перед этим идет проверка

if (PositionsTotal() == 0) return 0;

почему так? как сделать, чтоб выбор был не изберательным, запоминать позицию в динамический  массив не могу, т.к. у меня происходит PositionCloseBy  с разными объемами

 
Перебор позиций и смотрите время открытия.
 
cheater.wot:

Добрый день, нужно выбрать последнюю открытую позицию - пишу код:

временами выбирает, временами нет. через

та же ерунда. открытые позиции есть, т.к. перед этим идет проверка

почему так? как сделать, чтоб выбор был не изберательным, запоминать позицию в динамический  массив не могу, т.к. у меня происходит PositionCloseBy  с разными объемами

Номер тикета или положение в списке не есть гарантия очередности. Нужно проверять время открытия позиции:

//+------------------------------------------------------------------+
//| Calculate all positions                                          |
//+------------------------------------------------------------------+
void CalculateAllPositions(datetime &time_last_buy,datetime &time_last_sell)
  {
   time_last_buy=0;
   time_last_sell=0;

   for(int i=PositionsTotal()-1; i>=0; i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               if(m_position.Time()>time_last_buy) // the last position of "BUY" is found
                 {
                  time_last_buy=m_position.Time();
                 }
               continue;
              }
            else
               if(m_position.PositionType()==POSITION_TYPE_SELL)
                 {
                  if(m_position.Time()>time_last_sell) // the last position of "SELL" is found
                    {
                     time_last_sell=m_position.Time();
                    }
                  continue;
                 }
           }
  }

В переменные time_last_buy и time_last_sell запишутся последняя позиция BUY и SELL соответственно. Поиск производится по символу заданному в  m_symbol и только с уникальным идентификатором InpMagic.


Добавлено: m_symbol   - объект класса CSymbolInfo

 
Vladimir Karputov:

Номер тикета или положение в списке не есть гарантия очередности. Нужно проверять время открытия позиции:

В переменные time_last_buy и time_last_sell запишутся последняя позиция BUY и SELL соответственно. Поиск производится по символу заданному в  m_symbol и только с уникальным идентификатором InpMagic.


Добавлено: m_symbol   - объект класса CSymbolInfo

Спасибо, но что по поводу изберательности выбора позиции для работы с ней?

  ulong getLastTicket()
  {
      datetime time = 0;
      ulong ticket = 0;
      for (int i = 0; i < (PositionsTotal() - 1); i++)
      {
         if (time < pos.Time())
         {
            time = pos.Time();
            ticket = pos.Ticket();
         }
      }Print(ticket);
      return ticket;
  }

открытая позиция есть всегда, но иногда возвращает 0

 
cheater.wot:

Спасибо, но что по поводу изберательности выбора позиции для работы с ней?

открытая позиция есть всегда, но иногда возвращает 0

Нет выбора позиции по индексу. Отсюда и избирательность. Дали же выше пример.

 
cheater.wot:

Спасибо, но что по поводу изберательности выбора позиции для работы с ней?

открытая позиция есть всегда, но иногда возвращает 0

Никогда не обходите список позиций ОТ нуля. Обходите ВСЕГДА К нулю.

   for(int i=PositionsTotal()-1; i>=0; i--)


Также алгоритм работы со списком ОБЯЗАТЕЛЬНО включает в себя ВЫБОР позиции по индексу в списке.

      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties



 
Vladimir Karputov:

Никогда не обходите список позиций ОТ нуля. Обходите ВСЕГДА К нулю.


Также алгоритм работы со списком ОБЯЗАТЕЛЬНО включает в себя ВЫБОР позиции по индексу в с

Vladimir Karputov:

Никогда не обходите список позиций ОТ нуля. Обходите ВСЕГДА К нулю.


Также алгоритм работы со списком ОБЯЗАТЕЛЬНО включает в себя ВЫБОР позиции по индексу в списке.


Спасибо, перебор к нулю - это "правило хорошего тона" или обусловлено чем-то?

 
cheater.wot:


Спасибо, перебор к нулю - это "правило хорошего тона" или обусловлено чем-то?

ОТкройте пять позиций (чтобы их различить лотами 0.01, 0.02, 0.03, 0.04 и 0.05).

Затем испытайте в цикле закрытие: если закрывать ОТ нуля и если закрывать К нулю. Только практика позволит запомнить принципы работы, советы, как правило, не откладываются на подкорке.