Общие вопросы по разработке > Оператор "ИЛИ" (||)

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
Balalayka
Сообщения: 38
Зарегистрирован: 21 сен 2018, 10:57
Благодарил (а): 2 раза
Поблагодарили: 3 раза

Оператор "ИЛИ" (||)

Непрочитанное сообщение Balalayka » 28 сен 2018, 15:54

Добрый день уважаемые участники форума!

Код: Выделить всё

if ( (CurrentPosition() == P12 || P13 || P14 || P15) && (CurrentPL() >= P1) )
   {
      ClosePosition();
   }


Что не так в вышеуказанном коде? Ошибка при компиляции: Оператор не может применяться к операндам типа bool
В документации по C++ указано что:
Перед вычислением оба операнда неявно преобразуются в тип bool; результат также имеет тип bool. Логическое ИЛИ имеет ассоциативность в направлении слева направо.

Подскажите где ошибка?

P.S. моя задача задать условие при котором позиция будет закрываться при совпадении хотя бы с одним из параметров

HMV
Сообщения: 22
Зарегистрирован: 04 фев 2016, 13:46
Поблагодарили: 1 раз

Re: Оператор "ИЛИ" (||)

Непрочитанное сообщение HMV » 29 сен 2018, 12:39

Код: Выделить всё

function OnUpdate()
{
 if ( (CurrentPosition() == P12 || CurrentPosition() == P13 || CurrentPosition() == P14 || CurrentPosition() == P15) && (CurrentPL() >= P1) )
   {
      ClosePosition();
   }
}

Balalayka
Сообщения: 38
Зарегистрирован: 21 сен 2018, 10:57
Благодарил (а): 2 раза
Поблагодарили: 3 раза

Re: Оператор "ИЛИ" (||)

Непрочитанное сообщение Balalayka » 01 окт 2018, 10:03

Спасибо!
В целом так и думал, пока добрался то компьютера, вы подтвердили мои догадки)
Только заметил странность, в некоторых случаях в таком виде код не компилировался,
Требовал проставить закрывающую ")" после параметра:

Код: Выделить всё

if ( (CurrentPosition() == P16) || (CurrentPosition() == P17) || (CurrentPosition() == P18) ||(CurrentPosition() == P19) && (CurrentPL() >= P20) )
   {
      ClosePosition();
   }


При этом в других аналогичных местах кода, компилировалось в вашем варианте, без ")"

HMV
Сообщения: 22
Зарегистрирован: 04 фев 2016, 13:46
Поблагодарили: 1 раз

Re: Оператор "ИЛИ" (||)

Непрочитанное сообщение HMV » 01 окт 2018, 11:13

Наверное где-то была открытая скобка :) :) :)

Balalayka
Сообщения: 38
Зарегистрирован: 21 сен 2018, 10:57
Благодарил (а): 2 раза
Поблагодарили: 3 раза

Re: Оператор "ИЛИ" (||)

Непрочитанное сообщение Balalayka » 01 окт 2018, 11:22

Верно, так оно и есть :D
А существует ли другой способ выполнить условие, без использования оператора (||) ?
Мне почему-то код кажется громоздким чтоли

Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 363 раза
Контактная информация:

Re: Оператор "ИЛИ" (||)

Непрочитанное сообщение evge » 01 окт 2018, 13:40

Если надо в списке (массиве) каком-то проверить входимость, то можно так:

Код: Выделить всё

function Initialize()
{
IndicatorName = "AAA";
AddInput("Input", Inputs.Candle);
PriceStudy = true;
AddSeries("A", DrawAs.Custom, Color.Red);
}

function Evaluate()
{

   int[] Spisok = {10, 20, 30, 40, 50};
   
   if (Spisok.Contains(25))
   {
      ShowMessage("Есть 25");
   }
   
   if (Spisok.Contains(30))
   {
      ShowMessage("Есть 30");
   }   

}


Выдаст

"Есть 30"
никогда такого не было и вот опять

Balalayka
Сообщения: 38
Зарегистрирован: 21 сен 2018, 10:57
Благодарил (а): 2 раза
Поблагодарили: 3 раза

Re: Оператор "ИЛИ" (||)

Непрочитанное сообщение Balalayka » 06 окт 2018, 17:22

evge писал(а):Если надо в списке (массиве) каком-то проверить входимость, то можно так:

Код: Выделить всё

function Initialize()
{
IndicatorName = "AAA";
AddInput("Input", Inputs.Candle);
PriceStudy = true;
AddSeries("A", DrawAs.Custom, Color.Red);
}

function Evaluate()
{

   int[] Spisok = {10, 20, 30, 40, 50};
   
   if (Spisok.Contains(25))
   {
      ShowMessage("Есть 25");
   }
   
   if (Spisok.Contains(30))
   {
      ShowMessage("Есть 30");
   }   

}


Выдаст

"Есть 30"


Спасибо за дополнение!
Не могли бы привести какой-нибудь конкретный пример использование этого кода, т.е. в каком случае можно использовать проверку входимости в массиве?

Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 363 раза
Контактная информация:

Re: Оператор "ИЛИ" (||)

Непрочитанное сообщение evge » 08 окт 2018, 12:44

Если взять вот этот пример

Код: Выделить всё

function OnUpdate()
{
 if ( (CurrentPosition() == P12 || CurrentPosition() == P13 || CurrentPosition() == P14 || CurrentPosition() == P15) && (CurrentPL() >= P1) )
   {
      ClosePosition();
   }
}


то измененный будет таким

Код: Выделить всё

function OnUpdate()
{
   int[] Spisok = {P12, P13, P14, P15};
   
   if (Spisok.Contains(CurrentPosition()) && CurrentPL() >= P1)
   {
      ClosePosition();
   }
}


ещё короче вариант, без использования переменной Spisok:

Код: Выделить всё

function OnUpdate()
{
   if (new[]{P12, P13, P14, P15}.Contains(CurrentPosition()) && CurrentPL() >= P1)
   {
      ClosePosition();
   }
}
никогда такого не было и вот опять


Вернуться в «Общие вопросы по разработке»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 16 гостей