PositionSelect(symbol) PositionGetInteger(POSITION_TYPE) - страница 3

 
Vladimir Karputov:

Обратите внимание на справку:

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

Теперь снова вопрос: где видно тикеты открытых позиций, время их открытия и тип позиций?


Даже больше, сейчас покажу на примере, что именно Вы делаете, выбирая позицию по СИМВОЛУ...

В этом коде сначала идёт выбор позиции через PositionSelect - выбор позиции по символу. В итоге, так как счёт у вас hadge - Вы выбираете позицию с НАИМЕНЬШИМ тикетом. Дальше идёт обход по всему списку позиций, чтобы Вы просто видели, какие позиции и какие тикеты у них.

Порядок работы с кодом:

  1. Скомпилируйте и прикрепите на график.
  2. Дальше поочерёдно открывайте позиции и внимательно смотрите на вывод на экран - сразу увидите, КАКУЮ именно позицию ВЫ выбираете, работая через PositionSelect.
  3. Не забывайте смотреть на тикеты позиций.

А вот пример:


Открыта позиция BUY 0.02 лота


Открыта позиция BUY 0.04 лота


Открыта позиция SELL 0.06 лота

Не надо приплетать хеджинг и неттинг, я прописал код, когда перед открытием новой позиции старая закрывается также как в неттинге, в любой момент времени открыта только одна позиция и все равно при данных условиях функция(и)  Position... не могут выбрать нужную сделку по типу из двух предложенных: buy и sell. В функциях Position... ошибка, баг. Вы посмотрите внимательно скрины, зачем вы доказываете недоказуемое? 

Выбирает позицию с наименьшим тикетом: где вы на скрине видите что Position... выбрали наименьший тикет, если наименьший тикет №2 у позиции buy, которая еще открыта, но высвечивается как false? Это баг функции или в справке написано то, что не соответствует истине?

 
ovak77:
Не надо гнать за хеджинг и неттинг, я прописал код, когда перед открытием новой позиции старая закрывается также как в неттинге, в любой момент времени открыта только одна позиция и все равно при данных условиях функция(и)  Position... не могут выбрать нужную сделку по типу из двух предложенных: buy и sell. В функциях Position... ошибка, баг. Вы посмотрите внимательно скрины, зачем вы доказываете недоказуемое? 
Но на первом скрине чётко видны две позиции.
 
ovak77:
Не надо гнать за хеджинг и неттинг, ***
  1. Следите за лексикой, пожалуйста.
  2. В PositionSelect найдено нестабильное поведение (не всегда выбирается позиция с НАИМЕНЬШИМ тикетом) - заявка в СервисДеск #1705661, кстати это видно и на моих скриншотах.

ovak77:
*** не могут выбрать нужную сделку по типу из двух предложенных: buy и sell. *** 

Вам уже несколько раз показали: хотите ВЫБРАТЬ, значит нужно обойти список позиций.

И Вы так и не сформулировали, что же Вам нужно:

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

 
Alexey Viktorov:
Но на первом скрине чётко видны две позиции.
Последние, обновленные скрины.
 
Alexey Viktorov:
Но на первом скрине чётко видны две позиции.

Там на третий скрин нужно смотреть - PositionSelect выбрало позицию не с НАИМЕНЬШИМ тикетом, а просто с МЕНЬШИМ.
 
Vladimir Karputov:
  1. Следите за лексикой, пожалуйста.
  2. В PositionSelect найдено нестабильное поведение (не всегда выбирается позиция с НАИМЕНЬШИМ тикетом) - заявка в СервисДеск #1705661, кстати это видно и на моих скриншотах.

Вам уже несколько раз показали: хотите ВЫБРАТЬ, значит нужно обойти список позиций.

И Вы так и не сформулировали, что же Вам нужно:

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

Давно определились, надо выбрать позицию по условиям, коих всего две: тип buy и sell. О выборе какой то конкретной позиции уже речи быть не может, она по двум то простейшим условиям глючит, подключать ее к серьезной выборке было бы абсурдным, весь депозит сольет.
 
Vladimir Karputov:

Там на третий скрин нужно смотреть - PositionSelect выбрало позицию не с НАИМЕНЬШИМ тикетом, а просто с МЕНЬШИМ.

В чем разница между наименьшим и меньшим? Сами то поняли, что написали? Позиция buy  с тикетом №2 - это наименьший тикет, а какой у вас номер тикета интерпретируется как МЕНЬШИЙ?

Наименьший тикет №2, а функции Position... высвечивают ее как false, а позицию sell с тикетом №3, как true.

 
ovak77:
Давно определились, надо выбрать позицию по условиям, коих всего две: тип buy и sell. О выборе какой то конкретной позиции уже речи быть не может, она по двум то простейшим условиям глючит, подключать ее к серьезной выборке было бы абсурдным, весь депозит сольет.


Вот же, ещё на первой странице:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

PositionSelect(symbol) PositionGetInteger(POSITION_TYPE)

Vladimir Karputov, 2017.03.27 14:52

Вы выделяете всего ОДНУ позицию. Соответственно для неё будет или 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++;
           }

здесь "m_position" - объект торгового класса CPositionInfo - Класс CPositionInfo является классом для упрощенного доступа к свойствам открытой рыночной позиции.

Обращение к позиции идёт через выбор позицию по индексу - SelectByIndex. После выбора позиции получаем тип позиции - PositionType. Дальше сравниваем тип позиции: это POSITION_TYPE_BUY или POSITION_TYPE_SELL.


Дальше. В посте  приведён код, который наглядно показывает (если конечно запустить его), что самая молодая позиция имеет индекс "PositionsTotal()-1". Если хотите получить свойства этой самой молодой позиции - то просто трансформируем код:

   int i=PositionsTotal()-1;
   if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
     {
      if(m_position.PositionType()==POSITION_TYPE_BUY)
         count_buys++;

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

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

 
ovak77:
Давно определились, надо выбрать позицию по условиям, коих всего две: тип buy и sell. О выборе какой то конкретной позиции уже речи быть не может, она по двум то простейшим условиям глючит, подключать ее к серьезной выборке было бы абсурдным, весь депозит сольет.
Надо сначала просто выбрать позицию, потом проверить её свойство, сравнить с условием и только тогда эта позиция может считаться выбранной по условию.
 
ovak77:
В чем разница между наименьшим и меньшим? Сами то поняли, что написали? Позиция buy  с тикетом №2 - это наименьший тикет, а какой у вас номер тикета интерпретируется как МЕНЬШИЙ?


Числа 3, 6, 8. Здесь 3 - это НАИМЕНЬШЕЕ, а вот число 6 - это число МЕНЬШЕЕ - конечно всё это относительно самого последнего числа 8. 

Добавлено: Вы бы лучше не изворачивались, а прочли пост выше ( ).