Периодические паузы в получении данных

Страницы: 1
RSS
Периодические паузы в получении данных
 
Иногда терминал перестает получать данные - то есть "паровозик ездит", серверное время меняется, соединение "установлено", но значения времени/номера последней полученной записи остаются прежними - соответственно, в интерфейсе никакие изменения не отражаются.
Как-то это можно полечить?
 
Я про это писал и выкладывал скрипт, который это обнаруживает и пишет в лог файлы
 
лекарство только одно - стучать брокеру по ...
 
Брокер сбер, на других норм, у меня каждые 10 секунд залипает 2-3 секунды, у  тебя такое происходит, можешь посмотреть?  
 
Да уже столько писал про это. В последних версиях явно что-то изменили в работе поток данных. В итоге они идут неспешно, при длительном отключении терминала от брокера, вызовется очистка данных терминала и вы получите все что было от начала дня снова. Также потоки данных игнорируют умный заказ данных...
Но все как задумано. Правда, судя по всему, разработчики забыли или даже не пробовали 7-ую версию, которая работала стабильно столько лет. А теперь мажорные версии каждый квартал, но до сих пор древняя кодировка в текстах, нет поддержки HDPI мониторов, нет изменения размеров базовых окно терминала...
 
Последнее время или потому, что версия КВИК 12 , но у Сбербанка вообще полный писец.
Когда ему вздумается останавливает передачу данных на минуты и связь не разрывает.
Теперь может принимать данные ,но не отображать в строке время сервера и принятые данные,
а прыгать через несколько или даже десятки секунд.
-------------------------------------
Я уже  перестал эти приколы записывать в лог файлы. Смысла нет.
----------------------------------
Советую тем ,
кто начинает -  не связывайтесь с этим брокером ,
чтобы потом не удивляться почему такое Г..но получается,
 
Цитата
nikolz написал:
Последнее время или потому, что версия КВИК 12 , но у Сбербанка вообще полный писец.
Когда ему вздумается останавливает передачу данных на минуты и связь не разрывает.
Теперь может принимать данные ,но не отображать в строке время сервера и принятые данные,
а прыгать через несколько или даже десятки секунд.
-------------------------------------
Я уже  перестал эти приколы записывать в лог файлы. Смысла нет.
----------------------------------
Советую тем ,
кто начинает -  не связывайтесь с этим брокером ,
чтобы потом не удивляться почему такое Г..но получается,
Удивительным образом, у меня Сбер один из лучших. ВТБ - полный кошмар. Альфа - лучше всех.
Финам - такое... Очень часто рвет связь.

Но самое печальное на последних версиях - это если обрыв связи был продолжительное время, минут 10, то после восстановления будет вызван колбек OnCleanUp. По крайней мере я это вижу на двух брокерах.

До 10-ой версии я этот колбек видел может раз в год.
 
Цитата
Nikolay написал:
Цитата
nikolz написал:
Последнее время или потому, что версия КВИК 12 , но у Сбербанка вообще полный писец.
Когда ему вздумается останавливает передачу данных на минуты и связь не разрывает.
Теперь может принимать данные ,но не отображать в строке время сервера и принятые данные,
а прыгать через несколько или даже десятки секунд.
-------------------------------------
Я уже  перестал эти приколы записывать в лог файлы. Смысла нет.
----------------------------------
Советую тем ,
кто начинает -  не связывайтесь с этим брокером ,
чтобы потом не удивляться почему такое Г..но получается,
Удивительным образом, у меня Сбер один из лучших. ВТБ - полный кошмар. Альфа - лучше всех.
Финам - такое... Очень часто рвет связь.

Но самое печальное на последних версиях - это если обрыв связи был продолжительное время, минут 10, то после восстановления будет вызван колбек OnCleanUp. По крайней мере я это вижу на двух брокерах.

До 10-ой версии я этот колбек видел может раз в год.
Это интересный момент.
Давайте разбираться. Чудес не бывает.
-----------------------------
Возможно Вы не видите эти остановы.
Я выкладывал скрипт записи лог файла
Можете его запустить и выложить результат.
-----------------------------
Либо это  связано с сервером
Какой у вас IP сбербанка
У меня 194.54.14.224 порт 15100
 
Скрипт, который измеряет задержку
---------------------------------
1) сервера брокера от времени прихода последних данных
2) сервера брокера от локального времени компьютера с учетом часового  пояса
3) времени компьютера от сервера точного  времени
-------------------------
разность времени сервера точного времени (атомных часов) и моего ПК

ПК синхронизирован Поэтому смещение не более 1 секунды
-----------------
Скрипт:
Код
function T2S(T) local x={} for s in T:gmatch("[^:]+") do x[#x+1]=tonumber(s) end return x; end

function get_ntp_time(server)
    server = server or "pool.ntp.org"
    local cmd = string.format(
        'w32tm /stripchart /computer:%s /samples:1 /packetinfo', server)

    local p = io.popen(cmd)
    if not p then return nil, "io.popen не удался" end
    local out = p:read("*a")
    p:close()

    local last_hex
    for h in out:gmatch("0x(%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x)") do
        last_hex = h
    end
    if last_hex then
        local hi = tonumber(last_hex:sub(1, 8), 16)
        local lo = tonumber(last_hex:sub(9, 16), 16)
        if hi then
            return hi - 2208988800, lo / 4294967296, "hex"
        end
    end
    local last_txt
    for s in out:gmatch("(%d+%.%d+%.%d+%s+%d+:%d+:%d+)") do
        last_txt = s
    end
    if last_txt then
        local d, mo, y, H, M, S =
            last_txt:match("(%d+)%.(%d+)%.(%d+)%s+(%d+):(%d+):(%d+)")
        local ts = os.time({
            year = tonumber(y), month = tonumber(mo), day = tonumber(d),
            hour = tonumber(H), min = tonumber(M), sec = tonumber(S),
        })
        return ts, 0, "text"
    end
    return nil
end

MaxTime=30
loc_time=0;
Dt=0;
sts=""
function main()
   while run do
      local tim=os.time()
      if tim-loc_time>60 then
         local ts, frac, src = get_ntp_time("pool.ntp.org")
         if ts then
            Dt=ts -tim
            sts="ПК-ntp="..tostring(Dt)
            loc_time=tim
         else sts=""
         end
      end
      local t = os.date("*t")
      local os_HMS=100*(100*(t.hour-1)+t.min)+t.sec;
      local os_S=60*(60*(t.hour-1)+t.min)+t.sec;
      TS=getInfoParam("SERVERTIME")
      TW=getInfoParam("LASTRECORDTIME")
      if TS and TW  then
         TL=getInfoParam("LASTPINGTIME")
         if TS_OLD and TS~=TS_OLD then
            if D>MaxTime then
               if temp==0 then str=TS_HMS; temp=D else temp=temp+D  end
            else
               if temp>MaxTime then str=str..",задержка="..temp;  Log:write(str.."\n"); Log:flush();   begin=Log:seek(); end
               temp=0;
               Log:seek("set",begin);
               local D1=math.abs((os_S-X)//1)
               Log:write(TS..", ".."данные-сервер="..D..",ПК-сервер="..D1..","..sts.."\n"); Log:flush();
               if D>Dt+1.1 and D1<MaxTime then begin=Log:seek();end
            end
         end
         t1=T2S(TW); t2=T2S(TS); X=60*(60*t1[1]+t1[2])+t1[3]  X1=60*(60*t2[1]+t2[2])+t2[3] D=math.abs(X-X1)
      end
         TL_OLD=TL; TS_OLD=TS;
      sleep(200);
   end
end

function OnInit(ph)
ph=ph:sub(1,ph:len()-3).."log";
Log = io.open(ph, "w"); Log:seek("end");
begin=Log:seek(); X=0; X1=0;
D=0; temp=0; run=true
end

Скрипт записывает в файл,
если запаздывание данных от сервера брокера больше 1 секунды
----------------------
текущий результат
Сбербанк  
Код
9:26:39, данные-сервер=2,ПК-сервер=3,ПК-ntp=0
9:26:48, данные-сервер=2,ПК-сервер=3,ПК-ntp=0
9:26:57, данные-сервер=2,ПК-сервер=3,ПК-ntp=0
9:27:05, данные-сервер=2,ПК-сервер=3,ПК-ntp=0
9:27:06, данные-сервер=3,ПК-сервер=4,ПК-ntp=0
9:27:14, данные-сервер=2,ПК-сервер=3,ПК-ntp=0
...
9:39:54, данные-сервер=2,ПК-сервер=3,ПК-ntp=0
9:40:05, данные-сервер=2,ПК-сервер=2,ПК-ntp=0
9:40:19, данные-сервер=2,ПК-сервер=3,ПК-ntp=0
9:40:28, данные-сервер=2,ПК-сервер=3,ПК-ntp=0
9:40:36, данные-сервер=2,ПК-сервер=3,ПК-ntp=0
9:40:37, данные-сервер=3,ПК-сервер=4,ПК-ntp=0
9:40:45, данные-сервер=2,ПК-сервер=3,ПК-ntp=0
9:41:02, данные-сервер=2,ПК-сервер=3,ПК-ntp=0
9:41:19, данные-сервер=2,ПК-сервер=3,ПК-ntp=0
9:41:34, данные-сервер=0,ПК-сервер=1,ПК-ntp=0
Содержание строки результата:
9:26:39,  -время сервера
данные-сервер=2, время сервера отличается от времени поступления последних данных на 2 секунды
ПК-сервер=3, -время сервера отличается от локального времени компьютера с учетом часового пояса на 3 секунды
ПК-ntp=0  -- локальное время компьютера отличается от атомных часов сервера точного времени  на 0 секунд
 
проверить свой компьютер можете здесь:
https://www.ntp-servers.net/servers.html
 
Цитата
ОлегК написал:
Брокер сбер, на других норм, у меня каждые 10 секунд залипает 2-3 секунды, у  тебя такое происходит, можешь посмотреть?  
У меня 1в1 проблема у Сбера, удалось как-нибудь решить? Я даже винду переустановил, ничего не помогает..  
 
Цитата
Это интересный момент.
Давайте разбираться. Чудес не бывает.
-----------------------------
Возможно Вы не видите эти остановы.
Я выкладывал скрипт записи лог файла
Можете его запустить и выложить результат.
-----------------------------
Либо это  связано с сервером
Какой у вас IP сбербанка
У меня 194.54.14.224 порт 15100
У Сбера теперь один адрес сервера, точнее шлюза.
Скрипты у меня уже очень давно проверяют расхождения времен сервера, пакета и локального времени. И если разница больше порога (у меня 3 сек.), то переходят в режим ожидания.

Ваш скрипт запустил, данные-сервер=0 стабильно, разница с локальным временем 1 сек. Хотя явно есть смещение на час, т.к. пишет 3599.

Я советую посмотреть на записи в информационном окне:
Очередь сетевых сообщений
Очередь сервисных задач

Например, ВТБ стабильно там показывает большие цифры. У Сбера там 0.
При этом ВТБ, по моим проверкам, игнорирует настройки заказа данных терминала и отправляет вам все, даже по классам CROSSRATE , валютным парам, SPBOPT и т.д.
В итоге вы получаете достаточно плотный поток данных. Хотя подписаны на одни ОФЗ, как у меня, например.
 
поправил функцию main
Код
function main()
      X=0; X1=0; X1_OLD=0;
   while run do
      local tim=os.time()
      if tim-loc_time>60 then
         local ts, frac, src = get_ntp_time("pool.ntp.org")
         if ts then
            Dt=ts -tim
            sts="ПК-ntp="..tostring(Dt)
            loc_time=tim
         else sts=""
         end
      end
      local t = os.date("*t")
      local os_HMS=100*(100*(t.hour-1)+t.min)+t.sec;
      local os_S=60*(60*(t.hour-1)+t.min)+t.sec;
      TS=getInfoParam("SERVERTIME")
      TW=getInfoParam("LASTRECORDTIME")
      if TS and TW  then
         if TS_OLD and TS~=TS_OLD then
            t1=T2S(TW); t2=T2S(TS); X=60*(60*t1[1]+t1[2])+t1[3]  X1=60*(60*t2[1]+t2[2])+t2[3]
            if X1-X1_OLD~=60 then  Log:seek("set",begin); end
            local D1=math.abs((os_S-X)//1)
            Log:write(TS..", ".."данные-сервер="..D..",ПК-сервер="..D1..","..sts.."\n"); Log:flush();
            if D>Dt+1.1 and D1<MaxTime then begin=Log:seek();end
         end
         D=math.abs(X-X1)
      end
         TL_OLD=TL; X1_OLD=X1; TS_OLD=TS;
      sleep(200);
   end
end
текущий результат:
Код
10:24:12, данные-сервер=2,ПК-сервер=3,ПК-ntp=0
10:24:21, данные-сервер=2,ПК-сервер=3,ПК-ntp=0
10:24:29, данные-сервер=2,ПК-сервер=3,ПК-ntp=0
...
10:54:45, данные-сервер=2,ПК-сервер=4,ПК-ntp=0
10:54:54, данные-сервер=2,ПК-сервер=3,ПК-ntp=0
10:55:03, данные-сервер=2,ПК-сервер=3,ПК-ntp=0
10:55:11, данные-сервер=2,ПК-сервер=3,ПК-ntp=0
10:55:20, данные-сервер=2,ПК-сервер=3,ПК-ntp=0
...
10:55:54, данные-сервер=2,ПК-сервер=3,ПК-ntp=0
10:55:55, данные-сервер=3,ПК-сервер=4,ПК-ntp=0
10:56:03, данные-сервер=2,ПК-сервер=3,ПК-ntp=0
...
11:00:51, данные-сервер=2,ПК-сервер=3,ПК-ntp=0
...
11:01:19, данные-сервер=30,ПК-сервер=31,ПК-ntp=0
...
12:29:11, данные-сервер=2,ПК-сервер=0,ПК-ntp=0
12:29:20, данные-сервер=2,ПК-сервер=0,ПК-ntp=0
12:29:29, данные-сервер=2,ПК-сервер=0,ПК-ntp=0
12:29:33, данные-сервер=0,ПК-сервер=0,ПК-ntp=0

звдержка:
11:01:19, данные-сервер=30,ПК-сервер=31,ПК-ntp=0
 
вторая версия скрипта
Код
function T2S(T) local x={} for s in T:gmatch("[^:]+") do x[#x+1]=tonumber(s) end return x; end

function get_ntp_time(server)
    server = server or "pool.ntp.org"
    local cmd = string.format(
        'w32tm /stripchart /computer:%s /samples:1 /packetinfo', server)
    local p = io.popen(cmd)
    if not p then return nil, "io.popen не удался" end
    local out = p:read("*a")
    p:close()
    local last_hex
    for h in out:gmatch("0x(%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x)") do
        last_hex = h
    end
    if last_hex then
        local hi = tonumber(last_hex:sub(1, 8), 16)
        local lo = tonumber(last_hex:sub(9, 16), 16)
        if hi then
            return hi - 2208988800, lo / 4294967296, "hex"
        end
    end
    local last_txt
    for s in out:gmatch("(%d+%.%d+%.%d+%s+%d+:%d+:%d+)") do
        last_txt = s
    end
    if last_txt then
        local d, mo, y, H, M, S =
            last_txt:match("(%d+)%.(%d+)%.(%d+)%s+(%d+):(%d+):(%d+)")
        local ts = os.time({
            year = tonumber(y), month = tonumber(mo), day = tonumber(d),
            hour = tonumber(H), min = tonumber(M), sec = tonumber(S),
        })
        return ts, 0, "text"
    end
    return nil, "Не удалось разобрать вывод w32tm:\n" .. out
end

function main()
   local X,X1,X1_OLD,TS_OLD,loc_time,Dt,sts=0,0,0,0,0,0,"";
   while run do
      local tim=os.time()
      if tim-loc_time>60 or loc_time==0 then
         local ts, frac, src = get_ntp_time("pool.ntp.org")
         if ts then
            Dt=ts -tim
            sts="ПК-ntp="..tostring(Dt)
            loc_time=tim
         else sts=""
         end
      end
      local t = os.date("*t")
      local os_S=60*(60*(t.hour-1)+t.min)+t.sec;
      TS=getInfoParam("SERVERTIME")     TW=getInfoParam("LASTRECORDTIME")
      if TS and TW  then
         if TS~=TS_OLD then
            t1=T2S(TW);  X=60*(60*t1[1]+t1[2])+t1[3]
            t2=T2S(TS); X1=60*(60*t2[1]+t2[2])+t2[3]
            Log:seek("set",begin);
            D1=math.abs((os_S-X1)//1)  D=math.abs(X-X1)
            Log:write(TS..", ".."дан-серв="..D..",ПК-серв="..D1..","..sts.."\n"); Log:flush();
            if D>Dt+1 then begin=Log:seek();end
         end
      end
      TL_OLD=TL; X1_OLD=X1; TS_OLD=TS;
      sleep(20);
   end
end

function OnInit(ph)
ph=ph:sub(1,ph:len()-3).."log";
Log = io.open(ph, "w"); Log:seek("end");
begin=Log:seek(); run=true
end

Результат:
Код
13:05:30, дан-серв=2,ПК-серв=0,ПК-ntp=0
13:05:31, дан-серв=3,ПК-серв=0,ПК-ntp=0
13:05:39, дан-серв=2,ПК-серв=0,ПК-ntp=0
13:05:47, дан-серв=2,ПК-серв=0,ПК-ntp=0
13:05:48, дан-серв=3,ПК-серв=0,ПК-ntp=0
...
13:15:56, дан-серв=3,ПК-серв=0,ПК-ntp=0
13:16:04, дан-серв=2,ПК-серв=0,ПК-ntp=0
13:16:05, дан-серв=3,ПК-серв=0,ПК-ntp=0
13:16:06, дан-серв=0,ПК-серв=1,ПК-ntp=0

 
вот этот оператор содержит смещение 1 для моего часового пояса относительно московского времени
local os_S=60*(60*(t.hour-1)+t.min)+t.sec;
если Вы в Москве то замените 1 на 0
Страницы: 1
Читают тему
Наверх