Я использую простой самописный индикатор "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 - Функции в качестве параметра принимают индекс свечи и возвращают соответствующее значение. Время свечи возвращается с точностью до миллисекунд в виде таблицы с полями: ----------------------------------------- .
Желательно еще второй индикатор выложить. Еще уточните, случайно 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 перестанет отвечать на любые действия пользователя.
Желательно еще второй индикатор выложить. Еще уточните, случайно 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.
Возможно проблема возникает в операторе t,n,l = getCandlesByIndex (Settings.ID, 0 ,index - 1 , 1 ) если index-1 ,больше, чем число свечей на первом графике?
function OnCalculate (index) if index == 1 then --здесь делаем инициализацию переменных при изменении масштаба этого графика elseif getNumCandles (Settings.ID) >=index then 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
и еще Вы на каждый тик читаете весь массив свечей с другого графика а это 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
Максим, вчера скрипты отработали весь день, падений замечено не было. Можете прислать нам в таком случае Ваш архив рабочего места QUIK без ключей доступа и файла chm.
Большое спасибо за помощь - решение найдено! Как выяснилось это был конфликт двух lua-скриптов. Первый - это индикатор "A", код которого выше, и второй - скрипт автоторговли, который у меня был запущен. Удалил второй и теперь всё работает как надо.
Цитата
Николай Камынин написал: Вы на каждый тик читаете весь массив свечей с другого графика а это 3000 штук. в результате большой тормоз. Вот примерный код, как надо сделать (не отлаживал ошибки исправьте сами)
Максим написал: Большое спасибо за помощь - решение найдено! Как выяснилось это был конфликт двух lua-скриптов. Первый - это индикатор "A", код которого выше, и второй - скрипт автоторговли, который у меня был запущен. Удалил второй и теперь всё работает как надо.
В чём конфликт был? Скрипт авторговли зависал или вызывал зацикливание, а может быть рекурсия функции была бесконечная?
Фёдор Сухов написал: В чём конфликт был? Скрипт авторговли зависал или вызывал зацикливание, а может быть рекурсия функции была бесконечная?
Похоже на ошибку в работе функции getCandlesByIndex. Чтобы проверить надо: 1. Передать разработчикам код скрипта автоторговли, т.к. без него баг у них не воспроизведётся - у меня нет исходника и нет прав на передачу. или 2. Попробовать воспроизвести баг написав упрощенный код автоторговли по имеющейся информации и, если будет воспроизводится, передать его им - не знаю пока что с этим делать...
Имеющаяся информация такая:
Скрытый текст
1. У меня есть lua-скрипт автоторговли, использующий функцию getCandlesByIndex (управляет торговлей, выводит таблицы и мониторит графики и индикаторы) - за последние 500 часов работы ни одного бага. 2. Когда я добавляю индикатор "А" (код которого выше), баг воспроизводится как описано выше. 3. Если lua-скрипт автоторговли выключить, а индикатор "А" оставить, баг не воспроизводится (разработчики выше подтвердили, т.к. у них нет этого скрипта автоторговли, и у меня вчера пять часов отработал). О чем это говорит? В изолированной среде эти скрипты не должны пересекаться: индикатор "А" использует только локальные переменные и там кроме функции getCandlesByIndex больше ничего нет. И именно эта функция имеется и активно используется в обоих скриптах, обращаясь к данным с "чужих" графиков.
Добрый день! Похожая проблема: Самописный индикатор работает в диаграмме бумаги и получает данные извне этой диаграммы (с индикаторов-графиков другой диаграммы, позицию по счету и т.п.), может что-то рисовать или нет. И все ОК. Но если с той же диаграммы, где работает этот индикатор получает данные 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 минут терминал перестал получать данные с сервера брокера и потом вовсе завис.