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

 
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:

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

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

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


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

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

мне не нужно его преверять, я вижу: он возвращает, то что нужно

говорил о первом варианте использования функции

 
Alexandr Bryzgalov:

мне не нужно его преверять, я вижу что он возвращает, то что нужно

говорил о первом варианте использования функции


Ну ладно, тогда так. Пойдём от хвоста. 

1. PositionGetInteger:

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

То есть, перед использованием PositionGetInteger нужно сначала выбрать позицию.


2. Выбираем позицию при помощи PositionGetTicket. PositionGetTicket:

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

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


А где у Вас проверка (после цикла), что там было возвращено от PositionGetTicket? Проверки нет, а там, между прочим возвращается "ноль" - то есть PositionGetTicket сработала с ошибкой - что равнозначно выбору позиции, которой нет. Затем Вы, не проверим результат PositionGetTicket, пытаетесь получить от несуществующей позиции её свойство. А там, в свойствах нусуществующей позиции, или мусор или просто данные обнулённых структур.


Подытожу: не проверив PositionGetTicket на возврат "нуля" дальше двигаться нельзя.

 
Vladimir Karputov:


Ну ладно, тогда так. Пойдём от хвоста. 

1. PositionGetInteger:

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

То есть, перед использованием PositionGetInteger нужно сначала выбрать позицию.


2. Выбираем позицию при помощи PositionGetTicket. PositionGetTicket:

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

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


А где у Вас проверка (после цикла), что там было возвращено от PositionGetTicket? Проверки нет, а там, между прочим возвращается "ноль" - то есть PositionGetTicket сработала с ошибкой - что равнозначно выбору позиции, которой нет. Затем Вы, не проверим результат PositionGetTicket, пытаетесь получить от несуществующей позиции её свойство. А там, в свойствах нусуществующей позиции, или мусор или просто данные обнулённых структур.


Подытожу: не проверив PositionGetTicket на возврат "нуля" дальше двигаться нельзя.

Спасибо, очень детально и полезно.
 
Vladimir Karputov:


Ну ладно, тогда так. Пойдём от хвоста. 

1. PositionGetInteger:

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

То есть, перед использованием PositionGetInteger нужно сначала выбрать позицию.


2. Выбираем позицию при помощи PositionGetTicket. PositionGetTicket:

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

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


А где у Вас проверка (после цикла), что там было возвращено от PositionGetTicket? Проверки нет, а там, между прочим возвращается "ноль" - то есть PositionGetTicket сработала с ошибкой - что равнозначно выбору позиции, которой нет. Затем Вы, не проверим результат PositionGetTicket, пытаетесь получить от несуществующей позиции её свойство. А там, в свойствах нусуществующей позиции, или мусор или просто данные обнулённых структур.


Подытожу: не проверив PositionGetTicket на возврат "нуля" дальше двигаться нельзя.

можно не распинаться )

не в этом вопрос

читайте правильно: нормально ли то, что функция на разные ситуации возвращает одно значение?

это правильно, что функция так поступает?