Баг приводит к закрытию Quik - код индикатора прилагается

Страницы: 1
RSS
Баг приводит к закрытию Quik - код индикатора прилагается, Баг-репорт
 
Здравствуйте, уважаемые разработчики!

Я использую простой самописный индикатор "A" для отрисовки линии на графике. Значения для отрисовки этой линии индикатор берет из другого индикатора "Б" по его идентификатору. Оба индикатора расположены на разных графиках. Эти графики имеют разный таймфрейм и расположены в разных окнах одной вкладки.

Первый индикатор "A" копирует значения второго индикатора. Для отрисовки текущей свечки индикатор "A" берёт значение предыдущей свечки индикатора "Б".

В торговое время после запуска индикатора "A" может пройти от 20 минут до 4 часов и Quik стабильно зависает (в заголовке Quik появляется "программа не отвечает"). Приходится завершать процесс info.exe (не отвечает более 30 минут), размер потребляемой опер. памяти не увеличивается от нормы. Зависание происходит только когда включен индикатор "A". Баг проявляется, если в качестве индикатора "Б" использовать любой индикатор (например, встроенный индикатор простой скользящей средней).

Код индикатора "А" с комментариями:
Код
local t={}
local n=0
local l=0
local value=0

function OnCalculate(index)
   if index==1 then return end            --проверяем если первая свечка, расcчёт не ведется
   if getNumCandles(Settings.ID)==0 then         --Settings.ID содержит название идентификатора, которое задаёт пользователь
      return                  --проверяем если индикатор "Б" не содержит свечек, рассчёт не ведется
   else
      t,n,l=getCandlesByIndex(Settings.ID,0,index-1,1)
      if t[0].doesExist==1 then         --проверяем если свечки нет, рассчет не ведется
         if t[0].close~=1e10 then      --проверяем если новое значение свечки не получено, рассчет не ведется
            if t[0].close~=value then value=t[0].close end
            t[0].close=1e10
            return value
         end
      end
   end
end
Помогите определить почему после запуска индикатор "A" может работать от 20 минут до 4 часов в торговую сессию, а потом Quik зависает. Никаких ошибок в окне сообщений нет. Торгуемый инструмент USDRUB_TOM.

Версия Quik: 7.0.4.10 (англ. интерфейс)
Версия OS: Windows 7 SP1 (англ. интерфейс)
 
Цитата
Максим написал:
Здравствуйте, уважаемые разработчики!

Я использую простой самописный индикатор "A" для отрисовки линии на графике. Значения для отрисовки этой линии индикатор берет из другого индикатора "Б" по его идентификатору. Оба индикатора расположены на разных графиках. Эти графики имеют разный таймфрейм и расположены  в разных окнах  одной вкладки.

Первый индикатор "A" копирует значения второго индикатора. Для отрисовки текущей свечки индикатор "A" берёт значение  предыдущей  свечки индикатора "Б".

В торговое время после запуска индикатора "A" может пройти от 20 минут до 4 часов и Quik стабильно зависает (в заголовке Quik появляется "программа не отвечает"). Приходится завершать процесс info.exe (не отвечает более 30 минут), размер потребляемой опер. памяти не увеличивается от нормы. Зависание происходит только когда включен индикатор "A". Баг проявляется, если в качестве индикатора "Б" использовать любой индикатор (например, встроенный индикатор простой скользящей средней).

Код индикатора "А" с комментариями:
Код
   local  t = {}
 local  n =  0 
 local  l =  0 
 local  value =  0 

 function   OnCalculate (index)
    if  index =  =  1   then   return   end              --проверяем если первая свечка, расcчёт не ведется 
    if   getNumCandles (Settings.ID) =  =  0   then           --Settings.ID содержит название идентификатора, которое задаёт пользователь 
       return                    --проверяем если индикатор "Б" не содержит свечек, рассчёт не ведется 
    else 
      t,n,l =  getCandlesByIndex (Settings.ID, 0 ,index -  1 , 1 )
       if  t[ 0 ].doesExist =  =  1   then           --проверяем если свечки нет, рассчет не ведется 
          if  t[ 0 ].close~ =  1e10   then        --проверяем если новое значение свечки не получено, рассчет не ведется 
             if  t[ 0 ].close~ = value  then  value = t[ 0 ].close  end 
            t[ 0 ].close =  1e10 
             return  value
          end 
       end 
    end 
 end 
  
Помогите определить почему после запуска индикатор "A" может работать от 20 минут до 4 часов в торговую сессию, а потом Quik зависает. Никаких ошибок в окне сообщений нет. Торгуемый инструмент USDRUB_TOM.

Версия Quik: 7.0.4.10 (англ. интерфейс)
Версия OS: Windows 7 SP1 (англ. интерфейс)
Добрый день.

Желательно еще второй индикатор выложить.
Еще уточните, случайно dmp файл не формируется при закрытии QUIK?
 
Цитата
Максим написал:
Здравствуйте, уважаемые разработчики!

Я использую простой самописный индикатор "A" для отрисовки линии на графике. Значения для отрисовки этой линии индикатор берет из другого индикатора "Б" по его идентификатору. Оба индикатора расположены на разных графиках. Эти графики имеют разный таймфрейм и расположены  в разных окнах  одной вкладки.

Первый индикатор "A" копирует значения второго индикатора. Для отрисовки текущей свечки индикатор "A" берёт значение  предыдущей  свечки индикатора "Б".

В торговое время после запуска индикатора "A" может пройти от 20 минут до 4 часов и Quik стабильно зависает (в заголовке Quik появляется "программа не отвечает"). Приходится завершать процесс info.exe (не отвечает более 30 минут), размер потребляемой опер. памяти не увеличивается от нормы. Зависание происходит только когда включен индикатор "A". Баг проявляется, если в качестве индикатора "Б" использовать любой индикатор (например, встроенный индикатор простой скользящей средней).

Код индикатора "А" с комментариями:
Код
   local  t = {}
 local  n =  0 
 local  l =  0 
 local  value =  0 

 function   OnCalculate (index)
    if  index =  =  1   then   return   end              --проверяем если первая свечка, расcчёт не ведется 
    if   getNumCandles (Settings.ID) =  =  0   then           --Settings.ID содержит название идентификатора, которое задаёт пользователь 
       return                    --проверяем если индикатор "Б" не содержит свечек, рассчёт не ведется 
    else 
      t,n,l =  getCandlesByIndex (Settings.ID, 0 ,index -  1 , 1 )
       if  t[ 0 ].doesExist =  =  1   then           --проверяем если свечки нет, рассчет не ведется 
          if  t[ 0 ].close~ =  1e10   then        --проверяем если новое значение свечки не получено, рассчет не ведется 
             if  t[ 0 ].close~ = value  then  value = t[ 0 ].close  end 
            t[ 0 ].close =  1e10 
             return  value
          end 
       end 
    end 
 end 
  
Помогите определить почему после запуска индикатор "A" может работать от 20 минут до 4 часов в торговую сессию, а потом Quik зависает. Никаких ошибок в окне сообщений нет. Торгуемый инструмент USDRUB_TOM.

Версия Quik: 7.0.4.10 (англ. интерфейс)
Версия OS: Windows 7 SP1 (англ. интерфейс)
Ужасный пример индикатора!!!!
-------------------------
getNumCandles (Settings.ID) =  =  0   then           --Settings.ID содержит название идентификатора, которое задаёт пользователь
NUMBER getNumCandles (STRING tag) -Возвращает число – количество свечек по выбранному идентификатору
а Settings.ID содержит название идентификатора - что за ....?
----------------------------------------
t,n,l =  getCandlesByIndex (Settings.ID, 0 ,index -  1 , 1 ) - зачем читать набор свечей через ЭТО.
--------------------------------
почему бы просто не использовать
Функции O, H, L, C, V, T -
Функции в качестве параметра принимают индекс свечи и возвращают  соответствующее значение. Время свечи возвращается с точностью до миллисекунд в  виде таблицы с полями:
-----------------------------------------
.
 
почему бы просто не использовать
Функции O, H, L, C, V, T -


Потому что читается не родной график, а другой.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
Egor Zaytsev написал:
Добрый день.

Желательно еще второй индикатор выложить.
Еще уточните, случайно dmp файл не формируется при закрытии QUIK?
Здравствуйте, Егор!

Спасибо за ответ. Dmp-файлы не создаются. Quik перестаёт отвечать на запросы пользователя, процесс info.exe не крашится.
Ниже последовательность действий для воспроизведения в Quik 7.0.4.10:

1. Создать график с инструментом USDRUB_TOM и таймфреймом M60
2. Добавить индикатор "Б":
Код
Settings={
Name="Indicator B",
line={{
Name="Indicator B",
Color=0x0000ff,
Type=1,
Width=1
}}}

function Init()
   return #Settings.line
end

function OnCalculate()
   return 68
end
3. Присвоить индикатору "Б" любой идентификатор
4. Создать новый график с инструментом USDRUB_TOM и таймфреймом D
5. Добавить индикатор "А" на новый график:
Код
Settings={
Name="Indicator A",
ID="ID",
line={{
Name="Indicator A",
Color=0xff0000,
Type=1,
Width=1
}}}

function Init()
   return #Settings.line
end

local t={}
local n=0
local l=0
local value=0

function OnCalculate(index)
   if index==1 then return end            --проверяем если первая свечка, расcчёт не ведется
   if getNumCandles(Settings.ID)==0 then         --Settings.ID содержит название идентификатора, которое задаёт пользователь
      return                  --проверяем если индикатор "Б" не содержит свечек, рассчёт не ведется
   else
      t,n,l=getCandlesByIndex(Settings.ID,0,index-1,1)
      if t[0].doesExist==1 then         --проверяем если свечки нет, рассчет не ведется
         if t[0].close~=1e10 then      --проверяем если новое значение свечки не получено, рассчет не ведется
            if t[0].close~=value then value=t[0].close end
            t[0].close=1e10
            return value
         end
      end
   end
end
6. Заменить значение параметра ID в свойствах индикатора "A" на идентификатор из шага 3

В результате на первом графике будет красная линия на уровне 68, на втором - синяя на уровне 68. Через промежуток времени от 20 минут до 4 часов Quik 7.0.4.10 зависнет. Всё это время должна идти торговая сессия (в неторговое время не воспроизводится) и Quik должен быть раскрыт (на переднем плане или под другими окнами). Баг можно обнаружить если Quik перестанет отвечать на любые действия пользователя.
 
Цитата
Николай Камынин написал:
почему бы просто не использовать
Функции O, H, L, C, V, T -
s_mike@rambler.ru выше правильно ответил.
 
Цитата
Максим написал:
Цитата
Egor Zaytsev   написал:
Добрый день.

Желательно еще второй индикатор выложить.
Еще уточните, случайно dmp файл не формируется при закрытии QUIK?
Здравствуйте, Егор!

Спасибо за ответ. Dmp-файлы не создаются. Quik перестаёт отвечать на запросы пользователя, процесс info.exe не крашится.
Ниже последовательность действий для воспроизведения в Quik 7.0.4.10:

1. Создать график с инструментом USDRUB_TOM и таймфреймом  M60
2. Добавить индикатор "Б":
Код
  Settings = {
Name =  "Indicator B" ,
line = {{
Name =  "Indicator B" ,
Color =  0x0000ff ,
Type =  1 ,
Width =  1 
}}}

 function   Init ()
    return   # Settings.line
 end 

 function   OnCalculate ()
    return   68 
 end 
  
3. Присвоить индикатору "Б" любой идентификатор
4. Создать новый график с инструментом USDRUB_TOM и таймфреймом  D
5. Добавить индикатор "А" на новый график:
Код
  Settings = {
Name =  "Indicator A" ,
ID =  "ID" ,
line = {{
Name =  "Indicator A" ,
Color =  0xff0000 ,
Type =  1 ,
Width =  1 
}}}

 function   Init ()
    return   # Settings.line
 end 

 local  t = {}
 local  n =  0 
 local  l =  0 
 local  value =  0 

 function   OnCalculate (index)
    if  index =  =  1   then   return   end              --проверяем если первая свечка, расcчёт не ведется 
    if   getNumCandles (Settings.ID) =  =  0   then           --Settings.ID содержит название идентификатора, которое задаёт пользователь 
       return                    --проверяем если индикатор "Б" не содержит свечек, рассчёт не ведется 
    else 
      t,n,l =  getCandlesByIndex (Settings.ID, 0 ,index -  1 , 1 )
       if  t[ 0 ].doesExist =  =  1   then           --проверяем если свечки нет, рассчет не ведется 
          if  t[ 0 ].close~ =  1e10   then        --проверяем если новое значение свечки не получено, рассчет не ведется 
             if  t[ 0 ].close~ = value  then  value = t[ 0 ].close  end 
            t[ 0 ].close =  1e10 
             return  value
          end 
       end 
    end 
 end 
  
6. Заменить значение параметра ID в свойствах индикатора "A" на идентификатор из шага 3

В результате на первом графике будет красная линия на уровне 68, на втором - синяя на уровне 68. Через промежуток времени от 20 минут до 4 часов Quik 7.0.4.10 зависнет. Всё это время должна идти торговая сессия (в неторговое время не воспроизводится) и Quik должен быть раскрыт (на переднем плане или под другими окнами). Баг можно обнаружить если Quik перестанет отвечать на любые действия пользователя.
Добрый день.

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

Максим, вчера скрипты отработали весь день, падений замечено не было.
Можете прислать нам в таком случае Ваш архив рабочего места QUIK без ключей доступа и файла chm.
 
Цитата
s_mike@rambler.ru написал:
почему бы просто не использовать
Функции O, H, L, C, V, T -


Потому что читается не родной график, а другой.
Понял, спасибо.
 
Возможно проблема возникает в операторе
t,n,l =  getCandlesByIndex (Settings.ID, 0 ,index -  1 , 1 )
если index-1 ,больше, чем число свечей на первом графике?
 
попробуйте так:
Скрытый текст
 
и еще
Вы на каждый тик  читаете весь массив свечей с другого графика а это 3000 штук.
в результате большой тормоз.
Вот примерный код, как надо сделать (не отлаживал ошибки исправьте сами)
Код
local t_ind2={}
local len2;
  function   OnCalculate (index)
    if  index ==  1   then
      t_ind2={};
      len2=0;
   elseif   getNumCandles (Settings.ID) >=index  then
        local t,n,l =  getCandlesByIndex (Settings.ID,len2 ,index -  1 , 1 )
      if  n>0   then   
         local i=0; while n>i do t_ind2[#t_ind2+1]=t[i] i=i+1; end
         return t_ind2[#t_ind2]
        end
    end
 end

:
 
Код
local t_ind2={}
local len2;
  function   OnCalculate (index)
    if  index ==  1   then
      t_ind2={};
      len2=0;
   elseif   getNumCandles (Settings.ID) >=index  then
        local t,n,l =  getCandlesByIndex (Settings.ID,len2 ,index -  1 , 1 )
      if  n>0   then
         local i=0; while n>i do t_ind2[#t_ind2+1]=t[i] i=i+1; end
         return t_ind2[#t_ind2].close
        end
    end
 end

 
Код
local t_ind2={}
local len2;
  function   OnCalculate (index)
    if  index ==  1   then
      t_ind2={};
      len2=0;
   elseif   getNumCandles (Settings.ID) >=index  then
        local t,n,l =  getCandlesByIndex (Settings.ID,len2 ,index -  1 , 1 )
      if  n>0   then
         local i=0; while n>i do len2=len2+1; t_ind2[len2]=t[i] i=i+1; end
            return t_ind2[len2].close
        end
    end
 end
 
прошу прощение,
перепутал параметры номер линии и число отсчетов в функции
getCandlesByIndex (давно не использовал)
поэтому замечание о приеме всех свечей в исходном примере ошибочно.
-----------------------------------
Но про последний индекс замечание остается
Поэтому я предлагаю сделать так:local t_ind2={}
Код
local t_ind2={}
local len2;
  function   OnCalculate (index)
    if  index ==  1   then
      t_ind2={};
      len2=0;
   else
   local len=getNumCandles (Settings.ID)-len2;
   if   len>0  then
        local t,n,l = getCandlesByIndex (Settings.ID,0,len2,len )
      if  n>0   then
         local i=0; while n>i do len2=len2+1; t_ind2[len2]=t[i] i=i+1; end
        end
   return t_ind2[len2].close
    end
   end
 end

 
Цитата
Egor Zaytsev написал:
Добрый день.

Максим, вчера скрипты отработали весь день, падений замечено не было.
Можете прислать нам в таком случае Ваш архив рабочего места QUIK без ключей доступа и файла chm.

Большое спасибо за помощь - решение найдено!
Как выяснилось это был конфликт двух lua-скриптов. Первый - это индикатор "A", код которого выше, и второй - скрипт автоторговли, который у меня был запущен. Удалил второй и теперь всё работает как надо.

Цитата
Николай Камынин написал:
Вы на каждый тик читаете весь массив свечей с другого графика а это 3000 штук.
в результате большой тормоз.
Вот примерный код, как надо сделать (не отлаживал ошибки исправьте сами)

Спасибо, за отличные идеи!
 
Цитата
Максим написал:
Большое спасибо за помощь - решение найдено!
Как выяснилось это был конфликт двух lua-скриптов. Первый - это индикатор "A", код которого выше, и второй - скрипт автоторговли, который у меня был запущен. Удалил второй и теперь всё работает как надо.
В чём конфликт был?
Скрипт авторговли зависал или вызывал зацикливание, а может быть рекурсия функции была бесконечная?
 
Цитата
Фёдор Сухов написал:
В чём конфликт был?
Скрипт авторговли зависал или вызывал зацикливание, а может быть рекурсия функции была бесконечная?
Похоже на ошибку в работе функции getCandlesByIndex. Чтобы проверить надо:
1. Передать разработчикам код скрипта автоторговли, т.к. без него баг у них не воспроизведётся - у меня нет исходника и нет прав на передачу.
или
2. Попробовать воспроизвести баг написав упрощенный код автоторговли по имеющейся информации и, если будет воспроизводится, передать его им - не знаю пока что с этим делать...  :what:

Имеющаяся информация такая:
Скрытый текст
 
Добрый день!
 Похожая проблема:
Самописный индикатор работает в диаграмме бумаги и получает данные извне этой диаграммы (с индикаторов-графиков другой диаграммы, позицию по счету и т.п.), может что-то рисовать или нет. И все ОК.
Но если с той же диаграммы, где работает этот индикатор получает данные LUA скрипт (с Price или любого индикатора с присвоенным идентификатором), через некоторое время падает терминал.
Смоделирую ситуацию:
  Вот для примера коды простенького индикатора и LUA скрипта которые конфликтуют между собой (как к сожалению и более интересные вещи...)
Если подключиться к серверу, открыть таблицу позиций по фьючерсам, добавить этот индикатор (можно и в отдельном окне диаграммы), ввести торговый счет,

Код
Settings={
Name = "текущая позиция",
client_code="SPBFUT*****",
line={
{
Name = "Лонг",
Type =TYPE_HISTOGRAM,
Width = 3,
Color = RGB(0,255, 0)
},
{
Name = "Шорт",
Type =TYPE_HISTOGRAM,
Width = 3,
Color = RGB(255,0,0)
},
{
Name = "0",
Type =TYPE_LINE,
Width = 1,
Color = RGB(255,0,0)
}
}}

idx_prosl=0


function Init()
   return 3
end

function get_balance(sec, client_code)
local n=getNumberOf("futures_client_holding")
for i=0,n-1 do
limit = getItem("futures_client_holding", i)
if limit~=nil and limit.seccode== sec and limit.trdaccid==client_code then
return limit.totalnet
end
end
return 0
end


function OnCalculate(idx)
if idx==1 then
sec=getDataSourceInfo().sec_code
message(" Код бумаги: "..sec,1)
end
if idx==idx_prosl then -- тек свеча
local balance=get_balance(sec, Settings.client_code)-- можно ограничиться и этим))
if balance>0 then
L,S,N=balance,nil,0
elseif balance<0 then
L,S,N=nil,balance,0
elseif balance==0 then
L,S,N=nil,nil,0
end
else
L,S,N=nil,nil,0
end
idx_prosl=idx
return L,S,N
end

в этой же диаграмме присвоить идентификатор "IDD" графику (Price например)  и запустить следующий скрипт получающий с него данные, то
Код
t={}
ID="IDD"

function OnStop()
do_main=false
end

function main ()
do_main = true
while do_main do
--nc=getNumCandles(ID)
t,_,_ = getCandlesByIndex(ID,0,1,1)

sleep(1000)
end
end


Пока в таблице позиций по фьючерсам нет позиции по бумаге или "нуля" от ранее закрытой - все может работать нормально. Но если появится позиция - терминал через какое-то время падает.
Версия терминала 6.17.3.6 подключен к реалу.
Просьба к разработчикам помочь разобраться...
 
Добрый день.

Павел, воспроизвести проблему не удалось. Просьба обновиться до актуальной версии и сообщите результат.
 
Цитата
Добрый день.

Павел, воспроизвести проблему не удалось. Просьба обновиться до актуальной версии и сообщите результат.
Добрый день Егор!
Обновил до 7.1.2.2, удалил все свои LUAскрипты и "лишние" dllки. Оставил только скрипт и индикатор, что выше. Подключил, запустил: через 20 минут терминал перестал получать данные с сервера брокера и потом вовсе завис.
Страницы: 1
Читают тему
Наверх