or и цикл while

Страницы: 1
RSS
or и цикл while
 
господа, слегка запутался с циклом типа while
Код
    while tonumber(getParamEx(class,"GAZP","tradingstatus").param_value)~=4 or tonumber(getParamEx(class,"GAZP","tradingstatus").param_value)~=3 do 
        sleep (1000) 
    end   
"Спать 1 секунду, пока не наступил пре-маркет или пост-маркет".
Но в первой строчке - ошибка. Это условие не выполняется никогда. Подскажите пожалуйста как написать правильно.
 
например так:
  while tonumber(getParamEx(class,"GAZP","tradingstatus").param_value)<3 do  sleep (1000)      end  
 
а где Вы взяли коды состояний?
вроде бы должно быть так:
 Возможные состояния торгов по финансовому инструменту.  
  Константа     Описание  
  N     Недоступно для торгов  
  O     Период открытия  
  C     Торги закрыты  
  F     Период закрытия  
  B     Перерыв  
  T     Торговая сессия  
 
Возможные состояния торгов по финансовому инструменту.
Константа                    Описание
N                                    Недоступно для торгов
O                                    Период открытия
C                                    Торги закрыты
F                                    Период закрытия
B                                    Перерыв
T                                    Торговая сессия
------------------------------------  
Если так то Ваш оператор надо записать так:
  while getParamEx(class,"GAZP","tradingstatus").param_value)~='O' and getParamEx(class,"GAZP","tradingstatus").param_value)~='F' do          sleep (1000)      end  

------------------------  
В любом случае замените or на and
 
Николай,
циферка 3 - аукцион открытия,
4 - аукцион закрытия (перед ней и после неё есть ещё периоды со своими цифрами, не помню их названий)
0 - сессия закрыта.

Я понял вашу мысль про оператор and, но не могу понять как это работает. Мне ведь нужно срабатывание либо одного условия (премаркет), либо второго (постмаркет), а не одновременно обоих (and)
 
Код
while not (tradingstatus == 4 or tradingstatus == 3) do
то же, что и
Код
while tradingstatus ~= 4 and tradingstatus ~= 3 do
Надо делать так, как надо. А как не надо - делать не надо.
 
а понял
можете не объяснять
 
Цитата
Космонавт написал:
Николай,
циферка 3 - аукцион открытия,
4 - аукцион закрытия (перед ней и после неё есть ещё периоды со своими цифрами, не помню их названий)
0 - сессия закрыта.

Я понял вашу мысль про оператор and, но не могу понять как это работает. Мне ведь нужно срабатывание либо одного условия (премаркет), либо второго (постмаркет), а не одновременно обоих (and)
Согласен, должно быть or.
Тогда, в чем вопрос?
 
Цитата
Николай Камынин написал:
Цитата
Космонавт   написал:
Николай,
циферка 3 - аукцион открытия,
4 - аукцион закрытия (перед ней и после неё есть ещё периоды со своими цифрами, не помню их названий)
0 - сессия закрыта.

Я понял вашу мысль про оператор and, но не могу понять как это работает. Мне ведь нужно срабатывание либо одного условия (премаркет), либо второго (постмаркет), а не одновременно обоих (and)
Согласен, должно быть or.
Тогда, в чем вопрос?
нет or не будет работать.
 
В итоге три варианта:
while tradingstatus <3
while tradingstatus ~= 4 and tradingstatus ~= 3
while not (tradingstatus == 4 or tradingstatus == 3)


 
Цитата
Николай Камынин написал:
while tradingstatus <3
этот не подойдёт, потому что он будет срабатывать и на 0. А ведь 0 - это признак закрытой сессии. В это время робот должен спать.
 
Код
while true do
 if status == 4 then break end
 if status == 3 then break end
 sleep (1000)
end
как вариант
 
Такой подход к организации ожидания события не дает права на ошибку и при любом некорректном входном параметре или ошибки выполнения getParamEx навсегда "повесит" скрипт
 
Цитата
Станислав написал:
Такой подход к организации ожидания события не дает права на ошибку и при любом некорректном входном параметре или ошибки выполнения getParamEx навсегда "повесит" скрипт
согласен с замечаниями, сократил код, да так, что стал непонятен. под "status" имел ввиду результат функции getParamEx
варианты с изменениями и дополнениями.
Код
while true do 
 tradingStatus = getParamEx(class,"GAZP","tradingstatus") 
 status = tonumber(tradingStatus.param_value)
 if status == 4 then break end
 if status == 3 then break end
 if tradingStatus.result == 0 then break end
 sleep (1000)
end
или

Код
while true do 
 tradingStatus = getParamEx(class,"GAZP","tradingstatus")
  if tonumber(tradingStatus.result) == 1 then
   status = tonumber(tradingStatus.param_value)
   if status == 4 then break end
   if status == 3 then break end
  else break end
 sleep (1000)
end 
 
Цитата
funjpg написал:
if tonumber(tradingStatus.result) == 1 then
Такая проверка не гарантирует корректного получения данных. Вы легко можете получить
Код
tradingstatus = {param_type="2", param_value="0.000000", result="1", param_image=""}
Надо делать так, как надо. А как не надо - делать не надо.
 
в то время, как на самом деле param_value = 4
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель написал:

Такая проверка не гарантирует корректного получения данных. Вы легко можете получить
Код
tradingstatus  =  {param_type =  "2" , param_value =  "0.000000" , result =  "1" , param_image =  "" } 
в то время, как на самом деле param_value = 4

В такой ситуации, вопрос в сторону биржи, почему она присылает 0, когда ожидаемое значение 4. А пока, будем ждать пока не придет 4 или 3 или ошибка getParamEx() для выхода из цикла.

кстати, 1-й вариант, там к tradingStatus.result нужно применить tonumber(), для корректной работы или 0 взять в " " типа == "0"
 
Цитата
funjpg написал:
В такой ситуации, вопрос в сторону биржи, почему она присылает 0
Биржа тут не при чём. Это QUIK косячит: когда не может получить значение параметра (например, параметр не задан в списках) он подставляет туды 0 и говорит, что result="1"
Надо делать так, как надо. А как не надо - делать не надо.
Страницы: 1
Читают тему
Наверх