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

 
Vladimir Karputov:
Это не "... функция чего там не видит... ", а Вы неверно составляете алгоритм. Почитайте Все, что Вам советовали все выше. Поработайте с кодом. Разберитесь, что возвращается при выборе позиции по номеру тикета и при выборе позиции по названию символа.
В вашем коде проверка и моем коде проверка на POSITION_TYPE_SELL и POSITION_TYPE_BAY. Что можно проверить еще? Как выбрать позицию, если функция из двух позиции не может интерпретировать конкретно указанный тип POSITION_TYPE_SELL. Здесь явные проблемы в алгоритме функции. Как предлагаете выбрать позицию, если предназначенная для этого функция не выполняет возложенные на нее обязанности? Она обязана видеть эту позицию, я начинающий, но немного изучал PHP, не настолько дремуч. У MQL5 и PHP схожий синтаксис, мне даже кажется, что MQL5, это PHP перенесенный на десктоп.
 
ovak77:
В вашем коде проверка и моем коде проверка на POSITION_TYPE_SELL и POSITION_TYPE_BAY. Что можно проверить еще? Как выбрать позицию, если функция из двух позиции не может интерпретировать конкретно указанный тип POSITION_TYPE_SELL. Здесь явные проблемы в алгоритме функции. Как предлагаете выбрать позицию, если предназначенная для этого функция не выполняет возложенные на нее обязанности? Она обязана видеть эту позицию, я начинающий, но немного изучал PHP, не настолько дремуч. У MQL5 и PHP схожий синтаксис, мне даже кажется, что MQL5, это PHP перенесенный на десктоп.

Давайте по порядку. Итак шаг первый: какой тип счёта - неттинг или хеджинг?
 
Vladimir Karputov:

Давайте по порядку. Итак шаг первый: какой тип счёта - неттинг или хеджинг?

На неттинге, это работает - хеджинг, но это вообще не при делах. Образно: я привел функцию в логи позиций и сказал, выбери мне из двух позиций, позицию POSITION_TYPE_SELL, а функция "зависла", чешет репу и из двух типов не может интерпретировать конкретно указанный тип. Это тот же PHP, да и любой другой, нормальный язык в данной ситуации интерпретирует позицию, их всего две, а платформа не работает с миллионными объемами данных, тики, типы позиции, ордера и иная мелочь, это не космолет, а велосипед, но даже из этого велосипеда, из мизера данных не получается получить необходимую инфу.

И при том, на следующем баре открывается позиция sell (тикет №4), следом за sell (тикет №3) и №4 интерпретируется, его функция видит. 

 
ovak77:
На неттинге, это работает - хеджинг, но это вообще не при делах. Образно: я привел функцию в логи позиций и сказал, выбери мне из двух позиций, позицию POSITION_TYPE_SELL, а позиция "зависла", чешет репу и двух типов не может интерпретировать конкретно указанный тип. Это тот же PHP, да и любой другой, нормальный язык в данной ситуации интерпретирует позицию, их всего две, а платформа не работает с миллионными объемами данных, тики, типы позиции, ордера и иная мелочь, это не космолет, а велосипед, но даже из этого велосипеда из мизера данных не получается получить необходимую инфу.


Я не зря сказал:

Не спешите и ответьте чётко на поставленный вопрос (а вообще я спать - аватарку видели?)

 
И все же в MT5 что-то не так, раз столько вопросов. В MT4 распечатка всех позиций не может быть не понятной даже новичку
for (int i = OrdersTotal() - 1; i >= 0; i--)
  if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL))
    OrderPrint();
 
Vladimir Karputov:

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

Мысли вслух. Надо получить тикет, тип и иную инфу о позиции, по приведенному вами кодингу надо получать инфу о счете, аккаунте, хеджинг, неттинг, а зайти в логи и выбрать последнюю позицию например sell нельзя? Просто я не могу понять, при каких делах счета, если есть список позиций и из этого списка просто надо выбрать позиции(ю) подходящего типа по условиям. Потом пойдут ордера ... засада. Есть PositionSelect, PositionGetInteger, PositionGetTicket, по сути на них возложена работа с позициями, но проверка не тот тип интерпретирует, при отсутствии позиции, высвечивает тип позиции которой нет (скрин №3) или может я чего то не понимаю и функции Position.... для другого предназначены? Код должен работать с реальными деньгами, а тут черти че и сбоку бантик, за такие глюки и сливы разрабов подвесят за причинные места

	          
 
ovak77:

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


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


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


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


Вы не правильно определяете тип позиции,

нужно так

if(ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
{
}
 
prostotrader:


Вы не правильно определяете тип позиции,

нужно так

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

Затем открывает еще одну позицию sell и только тогда функция интерпретирует позицию sell.


MQL5, это десктопный PHP5 и функции PositionSelect, PositionGetInteger и иные, это PHPишные пользовательские функции. Похоже что кодинг этой(этих) функций не фонтан. Она работает, но с опозданием на бар и дальше такая же беда, открывается позиция, на следующем баре аналогичная и попарно до финиша, а так как в функции PositionsTotal достоверные данные, значит ошибка в функциях Position... Выше писали, мол функция PositionSelect выберет позицию с наименьшим тикетом, вот только тикеты позиций sell под номерами 3,4, а наименьший тикет №2 у позиции buy, которая уже false. Или под словом наименьший подразумевается нечто иное?

 

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

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

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


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

//+------------------------------------------------------------------+
//|                                                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()
  {
//---
   bool buy_opened=false;
   bool sell_opened=false;
   string symbol="";
   long ticket=-1;
   long time=-1;
   long type=-1;
   double volume=-1.0;
   double price=-1;
   if(PositionSelect(Symbol()))
     {
      if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
         buy_opened=true;
      else
         sell_opened=true;
     }
   else
     {
      Print("Error PositionSelect");
      return;
     }
   if(!PositionGetString(POSITION_SYMBOL,symbol))
     {
      Print("Error get POSITION_SYMBOL");
      return;
     }
   if(!PositionGetInteger(POSITION_TICKET,ticket))
     {
      Print("Error get POSITION_TICKET");
      return;
     }
   if(!PositionGetInteger(POSITION_TIME,time))
     {
      Print("Error get POSITION_TIME");
      return;
     }
   if(!PositionGetInteger(POSITION_TYPE,type))
     {
      Print("Error get POSITION_TYPE");
      return;
     }
   if(!PositionGetDouble(POSITION_VOLUME,volume))
     {
      Print("Error get POSITION_VOLUME");
      return;
     }
   if(!PositionGetDouble(POSITION_PRICE_OPEN,price))
     {
      Print("Error get POSITION_PRICE_OPEN");
      return;
     }
//---
   string text="buy_opened: "+buy_opened+", sell_opened: "+sell_opened+"\n"+
               "PositionSelect:  | "+symbol+
               " | "+IntegerToString(ticket)+
               " | "+TimeToString(time,TIME_DATE|TIME_MINUTES|TIME_SECONDS)+
               " | "+EnumToString((ENUM_POSITION_TYPE)type)+
               " | "+DoubleToString(volume,2)+
               " | "+DoubleToString(price,8)+"\n";

   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);
  }
//+------------------------------------------------------------------+

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

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

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

А вот пример:

MetaTrader 5 x64 build 1571 started (MetaQuotes Software Corp.)
Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120M  @ 2.50GHz, RAM: 4587 / 8077 Mb, HDD: 325270 / 476372 Mb, GMT+02:00
C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

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

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


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

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


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

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

Файлы:
 
ovak77:

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


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


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


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

PositionSelect(_Symbol) не может вернуть все позиции открытые на hadge счёте.

Первая открытая позиция PositionGetTicket(0)

Последняя открытая позиция PositionGetTicket(PositionsTotal()-1)

Все остальные можно достать только в цикле.