PositionSelect(symbol) PositionGetInteger(POSITION_TYPE)

 

Я только учусь и попал в засаду. Примитивнейшее действие: получить тип позиции. Пробовал так:


Открыл buy - total и PositionGetInteger ее видят. Листаю, открывается позиция sell, total ее видит - 2 позиции, а PositionGetInteger - false.


Пробовал так, total и PositionSelect по нолям, а PositionGetInteger видит buy:


Есть ли способ получить банальную информацию о типе последней позиции, без необходимости писать сотни строк кода?

 

Вы выделяете всего ОДНУ позицию. Соответственно для неё будет или BUY или SELL. Если нужно сделать обход по всем позициям, то нужен цикл - от "PositionsTotal()-1", до ">=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()==m_magic)
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)
               count_buys++;

            if(m_position.PositionType()==POSITION_TYPE_SELL)
               count_sells++;
           }
 
Vladimir Karputov:

Вы выделяете всего ОДНУ позицию. Соответственно для неё будет или BUY или SELL. Если нужно сделать обход по всем позициям, то нужен цикл - от "PositionsTotal()-1", до ">=0":

Мне не нужен обход, мне пока просто нужен тип последней позиции. В будущем, когда буду изучать более сложный кодинг, буду с этим разбираться, а сейчас надо банально получить тип последней позиции. На втором скрине видно, что PositionGetInteger не видит тип уже открытой позиции, хотя она уже записана в торгах, истории и сделках. А так как функция не видит, что sell уже есть, она открывает на следующем баре еще одну позицию sell. И по третьему скрину я не могу понять, откуда появился тип buy, если позиций ноль? Я так понимаю, вы используете CTrade? Я учусь, как говорится: чтобы узнать, надо понять. Если я из CTrade вятяну код, то получу в итоге сотни строк кода для простейшего запроса: тип последней позиции, который по логике берется из последней записи в логах.
 

А где Вы ищите последнюю позицию? Вы её нигде не ищите :). Хотите последнюю позицию:

  • ловите в OnTradeTransaction() 
  • или делайте обход ВСЕХ позиций и удостоверьтесь, что нашли именно ПОСЛЕДНЮЮ (то есть ту, у которой время открытия самое "молодое").

 
Vladimir Karputov:
А где Вы ищите последнюю позицию? Вы её нигде не ищите :)
Зачем искать последнюю позицию, если это последняя позиции, у нее четко регламентированное место в записях? Она последняя, у нее самый новый time. При любом раскладе: позиция есть, PositionGetInteger ее не видит, затем открывается еще одна позиция sell и только тогда PositionGetInteger ее высвечивает, не говоря уже о том, что функция видит POSITION_TYPE_BUY там, где его нет.
 

Вот советник, который выводит ВСЕ позиции:

//+------------------------------------------------------------------+
//|                                                ListPositions.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property description "Показ списка позиций"
#include <Trade\PositionInfo.mqh>
CPositionInfo  m_position;                   // trade position object
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(6);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   string text="";
   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
        {
         text+=IntegerToString(i)+
               " | "+m_position.Symbol()+
               " | "+IntegerToString(m_position.Ticket())+
               " | "+TimeToString(m_position.Time(),TIME_DATE|TIME_MINUTES|TIME_SECONDS)+
               " | "+EnumToString(m_position.PositionType())+
               " | "+DoubleToString(m_position.Volume(),2)+
               " | "+DoubleToString(m_position.PriceOpen(),8)+"\n";
        }
   Comment(text);
  }
//+------------------------------------------------------------------+
Файлы:
 
ovak77:
Зачем искать последнюю позицию, если это последняя позиции, у нее четко регламентированное место в записях?

Это кто сказал? Это Мы все так надеемся, но никто не гарантировал порядок позиций.

Запустите пример из поста выше и посмотрите какой номер в списке у самой последней позиции...

 

Ясно. Т.е. чтобы получить тип позиции надо использовать что подобное:

   MqlTradeRequest request;
   MqlTradeResult  result;
   int total=PositionsTotal(); // количество открытых позиций   
//--- перебор всех открытых позиций
   for(int i=total-1; i>=0; i--)
     {
      //--- параметры ордера
      ulong  position_ticket=PositionGetTicket(i);                                      // тикет позиции
      string position_symbol=PositionGetString(POSITION_SYMBOL);                        // символ 
      int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS);              // количество знаков после запятой
      ulong  magic=PositionGetInteger(POSITION_MAGIC);                                  // MagicNumber позиции
      double volume=PositionGetDouble(POSITION_VOLUME);                                 // объем позиции
      ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);    // тип позиции
Ладно. Так или иначе, все это придется изучать. Хотя вопросы, почему он не видит позицию и видит то, чего нет, пока остаются на повестке, возможно когда поднаторею, смогу понять. Спс за просвещение.
 
ovak77:

Ясно. Т.е. чтобы получить тип позиции надо использовать что подобное:

Ладно. Так или иначе, все это придется изучать. Хотя вопросы, почему он не видит позицию и видит то, чего нет, пока остаются на повестке, возможно когда поднаторею, смогу понять. Спс за просвещение.

конструкция выбора позиции по символу
PositionSelect(symbol)

 работает только на неттинговых счетах. На хеджевых счетах нужно искать нужную позицию путем перебора позиций в списке позиций как написал выше Владимир.

вот нашел в документации для 

При независимом представлении позиций (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) по каждому символу одновременно может быть открыто несколько позиций. В этом случае, PositionSelect выберет позицию с наименьшим тикетом.

 
Sergey Gritsay:

конструкция выбора позиции по символу

 работает только на неттинговых счетах. На хеджевых счетах нужно искать нужную позицию путем перебора позиций в списке позиций как написал выше Владимир.

вот нашел в документации для 

При независимом представлении позиций (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) по каждому символу одновременно может быть открыто несколько позиций. В этом случае, PositionSelect выберет позицию с наименьшим тикетом.

Buy тикет №2, sell соответственно №3. Только проснулся, сейчас попробую "разобрать" блоки кода Владимира. ... Возможно имеет смысл попробовать получить список позиции в буфер и с помощью ArraySetAsSeries изменить индексацию, возможно будет хуже, возможно лучше ... если получится. Даже если не получится, то хуже точно не будет.

И опять же. На первом скрине проверка, две позиции bay и sell, но после формирования бара и открытия позиции sell (тикет №3), sell_opened высвечивает false. Т.е., фукция PositionGetInteger позицию не видит, а она есть. Я про то, смысл в иных проверках, поиске, переборе и наращивании кода, если функция не видит конкретно указанный тип POSITION_TYPE_SELL? Я пока мало знаю, возможно чего-то не понимаю, но PositionGetInteger, как мне кажется, обязана эту сделку видеть независимо от иных факторов.

 
Это не "... функция чего там не видит... ", а Вы неверно составляете алгоритм. Почитайте Все, что Вам советовали все выше. Поработайте с кодом. Разберитесь, что возвращается при выборе позиции по номеру тикета и при выборе позиции по названию символа.
Причина обращения: