Ошибки, баги, вопросы - страница 1886

 
Vladimir Karputov:


И в чём вопрос?

Где видно, что под номером "i" находится позиция с тикетом таким-то, по символу такому-то? В общем кроме простого вывода порядкового номера выводите ещё и тикет и символ.


Нормално ли то, что бы на разные ситуации одна функция дает одинаковое значение?

ЗЫ: кстати в посте был вопрос.

суть в том, что если выбрать покупку, то функция(PositionGetInteger(POSITION_TYPE)) возвращает 0

и если выбрать не существующую позицию, функция так же вернет 0

 
Alexandr Bryzgalov:
Нормално ли то, что бы на разные ситуации одна функция дает одинаковое значение?


Что есть "разные ситуации"? И сделайте как я рекомендовал выше:

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

Ошибки, баги, вопросы

Vladimir Karputov, 2017.05.12 11:15

...

В общем кроме простого вывода порядкового номера выводите ещё и тикет и символ.


 
Alexandr Bryzgalov:

Понимаю, что нужно проверять, но всякое бывает...

PositionGetInteger

Функция возвращает запрошенное свойство открытой позиции, предварительно выбранной при помощи функцииPositionGetSymbolилиPositionSelect. Свойство позиции должно быть типа datetime, int. Существует 2 варианта функции.

1. Непосредственно возвращает значение свойства.

long  PositionGetInteger(
   ENUM_POSITION_PROPERTY_INTEGER  property_id      // идентификатор свойства
   );

2. Возвращает true или false в зависимости от успешности выполнения функции.  В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром.

bool  PositionGetInteger(
   ENUM_POSITION_PROPERTY_INTEGER  property_id,     // идентификатор свойства
   long&                           long_var         // сюда примем значение свойства
   );

Параметры

property_id

[in]  Идентификатор свойства позиции. Значение может быть одним из значений перечисленияENUM_POSITION_PROPERTY_INTEGER.

long_var

[out]  Переменная типа long, принимающая  значение запрашиваемого свойства.

Возвращаемое значение

Значение типаlong. В случае неудачного выполнения возвращает 0.

Тоньше ситуация с мэджиком. Поэтому логично делать проверку (PositionGetInteger(POSITION_TICKET) > 0).
Документация по MQL5: Торговые функции / PositionGetInteger
Документация по MQL5: Торговые функции / PositionGetInteger
  • www.mql5.com
Торговые функции / PositionGetInteger - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber:
Тоньше ситуация с мэджиком. Поэтому логично делать проверку (PositionGetInteger(POSITION_TICKET) > 0).

Да, вкусре что нужно делать проверку.

но при написании функции всегда стараешься, что бы при разных ситуациях возвращалось разное значение.

считаю неверным, что при разных ситуациях из функци выходит одно значение.
 
Alexandr Bryzgalov:

но при написании функции всегда стараешься, что бы при разных ситуациях возвращалось разное значение.

Так мэджик и упомянул по этой причине. Что возвращать в случае ошибки PositionGetInteger(POSITION_MAGIC) ?
 
fxsaber:
Так мэджик и упомянул по этой причине. Что возвращать в случае ошибки PositionGetInteger(POSITION_MAGIC) ?
0 - позиция открыта вручную. правильно?
 
Alexandr Bryzgalov:

Нормално ли то, что бы на разные ситуации одна функция дает одинаковое значение?

ЗЫ: кстати в посте был вопрос.

суть в том, что если выбрать покупку, то функция(PositionGetInteger(POSITION_TYPE)) возвращает 0

и если выбрать не существующую позицию, функция так же вернет 0


Так ведь первый вызов используется тогда, когда Вы ГАРАНТИРОВАННО выбрали позицию (например как у Вас в цикле). А вот вторая форма вызова

bool  PositionGetInteger( 
   ENUM_POSITION_PROPERTY_INTEGER  property_id,     // идентификатор свойства 
   long&                           long_var         // сюда примем значение свойства 
   );

для случаев, когда позиция выбирается с бухты барахты.


Сделайте так и поверьте, что получаете в переменную "result" - всё станет на свои места:

//+------------------------------------------------------------------+
//|                                                         posi.mq5 |
//|                                                      sanyooooook |
//|                                                 http://sn-bot.ru |
//+------------------------------------------------------------------+
#property copyright "sanyooooook"
#property link      "http://sn-bot.ru"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int tot=PositionsTotal();
   for(int i=0;i<tot;i++)
     {
      ulong OrderTicket_=PositionGetTicket(i);
      long cmd=PositionGetInteger(POSITION_TYPE);
      if(OrderTicket_>0 && cmd<=POSITION_TYPE_SELL)
         Print("N",i,"cmd=",cmd);

     }
   ulong OrderTicket_=PositionGetTicket(100);
   long cmd=-3;
   bool result=PositionGetInteger(POSITION_TYPE,cmd);
   if(result)
      Print("N100 cmd=",cmd);
  }
//+------------------------------------------------------------------+
 
Alexandr Bryzgalov:
0 - позиция открыта вручную. правильно?
Да. Но и любое другое значение будет вводить в заблуждение.
 
Vladimir Karputov:


Так ведь первый вызов используется тогда, когда Вы ГАРАНТИРОВАННО выбрали позицию (например как у Вас в цикле). А вот вторая форма вызова

для случаев, когда позиция выбирается с бухты барахты.


Сделайте так и поверьте, что получаете в переменную "result" - всё станет на свои места:

не об этом вопрос, а о том что функция на разные ситуации возвращает одно значение.

что как проверить знаю

изначально вопрос был о том нормально ли это вообще?

ЗЫ: ошибка может быть допущена не преднамерено и тогда в 100000 коде устанешь искать.

Что? Не нужно допускать ошибки? )

 
Alexandr Bryzgalov:

не об этом вопрос, а о том что функция на разные ситуации возвращает одно значение.

что как проверить знаю

изначально вопрос был о том нормально ли это вообще?


Вы, как я вижу, не проверили код, который я показал. ДАвайте так: Вы сначала проверяете, потом снова зададите вопрос.
Причина обращения: