Как отследить событие - перерыв в торгах на фортс

Страницы: 1
RSS
Как отследить событие - перерыв в торгах на фортс
 
Нужно условно говоря создать триггер, который подает сигнал, когда рынок прерывается. Пробовал такой код:
Код
status =  tonumber(getParamEx(CLASS_CODE,  SEC_CODE, "STATUS").param_value)
но он выдает 1 и во время торгов и после 18:45
 
Цитата
Дмитрий написал:
и после 18:45
Так фортс до 23-50
 
Для этого используют TRADINGSTATUS
 
Ах да, для клиринга есть параметр CLSTATE. Посмотрите в описание параметров таблицы "Текущие торги"
 
Код
local c1 = getParamEx2(CLASS_CODE, SEC_CODE, "TRADINGSTATUS");
               if (c1.result == "1") then
                  if c1.param_image ~= "открыта" then
                     message("Сессия "..c1.param_image);
                     flag_Session = false;
                  end;
               end;
 
Цитата
Игорь Б написал:
Код
   local  c1  =   getParamEx 2(CLASS_CODE, SEC_CODE,  "TRADINGSTATUS" );
                if  (c1.result  =  =   "1" )  then 
                   if  c1.param_image ~ =   "открыта"   then 
                      message ( "Сессия "  .. c1.param_image);
                     flag_Session  =   false ;
                   end ;
                end ;  
Рассмотрел этот и другие предложенные варианты. Они работают, но не так как хотелось бы, поскольку видимо нечетко сформулировал задачу. При запуске скрипта этот и другие коды выдают значение однократно. В описании к функции getParamEx 2 говорилось что-то про подписку на события, но и этот код срабатывает однократно. Например запустил его до промклиринга, он выдал текущее значение, но в момент начала клира на выходе сигналов не дал.
Только сейчас понял, что наверно необходимо как-то стробировать код
Код
status =  tonumber(getParamEx(CLASS_CODE,  SEC_CODE, "TRADINGSTATUS").param_value)
раз в минуту при помощи функции os.time.
Пробовал сделать так
Код
function Get_Time(Seconds)
      Seconds = os.time()
      if (Seconds%60 == 0) then
             message("NEW Minute", 3)
      end
end
но месседж не приходит каждую минуту, что не так?
Или может есть какой-то вариант с такой строчкой
Код
local Last_Time = tostring(GetInfoParam( "SERVERTIME" ))
 
Код
 Status = Round(getParamEx("SPBFUT", Fut, "status").param_value) -- Торговля разрешена/не разрешена
Постоянно проверяется. Такой вариант не подходит?
 
Цитата
Константин Рейм написал:
Status = Round(getParamEx("SPBFUT", Fut, "status").param_value) -- Торговля разрешена/не разрешенаПостоянно проверяется. Такой вариант не подходит?
Не знаю, может что делаю не правильно, но код выдает ошибку
Код
CLASS_CODE     = "SPBFUT"     -- Класс бумаги
SEC_CODE       = "RIM0"       -- Код бумаги

IsRun = true

function main()
      CreateTable()
      Status = Round(getParamEx(CLASS_CODE, SEC_CODE , "status").param_value)  
      -- Error: attempt to call global 'Round' (a nil value)
      while IsRun do
           sleep(1)
      end
end
 
Цитата
Дмитрий написал:
Не знаю, может что делаю не правильно, но код выдает ошибку
Код
function Round(num, n) -- Функция округляет до указанного количества знаков
   local n = (n or 0)
   return tonumber(string_format("%."..n.."f", num))
end
Эту функцию еще добавить надо.
В принципе то можно без нее. Но тогда вот так
Код
Status = tonumber(getParamEx(CLASS_CODE, SEC_CODE , "status").param_value)
но опять результат будет = 1.0 например (8.5 квик). А функция Round - .0 уберет, это у меня бзик - по "феншую" должно быть и все))). А так эта функция в основном то нужна сейчас для объема и цены - приходит объем 3.0, цена по РТС например 100 000.0 - не порядок.
 
Цитата
Константин Рейм написал:
у меня бзик - по "феншую" должно быть и все))).
чтобы было по фэншую можно сделать так
Код
CLASS_CODE     = "SPBFUT"     -- Класс бумаги
SEC_CODE       = "RIM0"       -- Код бумаги

IsRun = true

function main()
   -- Округление по Фэншую
   -- status =  tostring(math.modf(getParamEx(CLASS_CODE,  SEC_CODE, "TRADINGSTATUS").param_value)) -- Вариант 1
   status = tostring(math.modf(getParamEx(CLASS_CODE, SEC_CODE , "STATUS").param_value))            -- Вариант 2
   message(status)  
    
    while IsRun do
      sleep(1)
    end
end

function OnStop()   -- Функция вызывается когда пользователь останавливает скрипт
   IsRun = false
end
Но сейчас наверное уже все забыли чего я добивался. Этой функции нужно давать пинка под зад, чтобы каждую минуту мониторился статус. У меня скрипт завязан на минутные бары и получается, что без статуса не грузятся некоторые значения в таблицу в 13:59, 18:44 и 23:49. Пытался сделать кикстартер на основе os.time, но ничего не получилось.
 
Цитата
Дмитрий написал:
Цитата
Константин Рейм написал:
у меня бзик - по "феншую" должно быть и все))).
чтобы было по фэншую можно сделать так
Код
  CLASS_CODE      =   "SPBFUT"       -- Класс бумаги 
SEC_CODE        =   "RIM0"         -- Код бумаги 

IsRun  =   true 

 function   main ()
    -- Округление по Фэншую 
    -- status =  tostring(math.modf(getParamEx(CLASS_CODE,  SEC_CODE, "TRADINGSTATUS").param_value)) -- Вариант 1 
   status  =  tostring( math.modf ( getParamEx (CLASS_CODE, SEC_CODE ,  "STATUS" ).param_value))             -- Вариант 2 
    message (status)  
    
     while  IsRun  do 
       sleep ( 1 )
     end 
 end 

 function   OnStop ()    -- Функция вызывается когда пользователь останавливает скрипт 
   IsRun  =   false 
 end   
Но сейчас наверное уже все забыли чего я добивался. Этой функции нужно давать пинка под зад, чтобы каждую минуту мониторился статус. У меня скрипт завязан на минутные бары и получается, что без статуса не грузятся некоторые значения в таблицу в 13:59, 18:44 и 23:49. Пытался сделать кикстартер на основе os.time, но ничего не получилось.
А в чем проблема? Переменную переместите в цикл while do, только задержку слип сделайте побольше, например 100 миллисекунд, - соответственно 10 раз в секунду будете получать данные по текущему статусу
 
Простейший вариант:
Получаем точное время.
три варианта:
1) синхронизируем компьютер по серверу точного времени
2) читаем время сервера брокера из параметров соединения квик
3) читаем в скрипте время с сервера точного времени
-------------
сравниваем текущее точное время с ожидаемым (временем перерыва)
==================
достижимая погрешность 0.01 сек
точнее лишь в дата центре
Страницы: 1
Читают тему (гостей: 1)
Наверх