если изменять инструмент через меню, то надо изменить инструмент и в индикаторе. тогда все работает. -------------------- Резюме: Изменение данных в индикаторе будет происходить: 1) при изменении тайма 2) при изменении инструмента якорем 3) при изменении инструмента через меню в окне и в индикаторе 4) Можно сделать изменение инструмента через меню лишь в окне, но тогда изменение в индикаторе можно сделать лишь на следующей обезличенной сделке. Konstantin777, Какой из этих 4 вариантов или иной Вам нужен?
Konstantin777,, Как Вы изменяете инструмент? ------------------ Дело в том, что если Вы изменяете интервал или инструмент с помощью якоря, то эти изменения приводят к пересчету индикатора -------------------- Но если инструмент заменяется через меню окна, то индикатор не пересчитывается.
Konstantin777, Я не понял, зачем Вам два окна с двумя инструментами. Напишите подробнее, что Вы хотите сделать. Возможно есть решение именно того, что хотите , но пока я не понимаю в чем смысл двух инструментов и наблюдение трех первых и трех последних, если это не арбитраж. ---------------------- Можно решить задачу многими способами. В первом приближении выбранный вами неудачный.
вариант при котором индикатор работает при смене инструмента, если включить якорь но при этом смена происходит и во всех окнах и название индикатора тоже изменяется
Тот факт что индикатор остается привязанный к первоначальному инструменту косвенно подтверждает название окна индикатора если его поместить в третье окно На картинке индикатор помещен первоначально со Сбербанком После смены инструмента название окна индикатора не меняется
Тут ничего особенного нет, у меня всё приблизительно так же. И даже если бы дело было в настройках, проблема была бы и раньше, а она в ВТБ появилась только недавно в сентябре. А советы ваши давно описаны в начальных постах по теме и все давно испробованы, не работает ничего
Вообще-то я Дмитрию помогаю, как я понял у него объем потребления памяти уменьшился с 1800 Мб до 350 т е в 5 раз. ----------- Вам я советов не давал, и тем более не спрашивал вашего мнения. Как я понял Вы из тех кому важно все обосрать.
Михаил Филимонов написал: Кто-нибудь торгует на Валютной секции на Едином брокерском счете в Открывашке через TRANS2QUIK API ?
Вы зря полезли в TRANS2QUIK API. это такое старье. появилось еще задолго до встраивания VMLua в QUIK. ------------------------ переходите на LUA - чем раньше сделаете, тем меньше будет проблем. --------------------------- "Ох, нелегкая это работа -Из болота тащить бегемота!"
Konstantin777, Объясняю вам, почему данные не изменяются при смене инструмента. ------------- Проблема в том, что индикатор использует данные инструмента, который отображен перед загрузкой индикатора на график, т е при начальной инициализации индикатора в нем сохраняется указатель на архив данных инструмента. ---------------- Когда Вы изменяете инструмент на графике, то в индикаторе остается указатель на прежний инструмент. Поэтому он продолжает отображать данные первоначального инструмента. -------------- Поэтому для смены инструмента в индикаторе при смене его на графике Вам надо обеспечить отслеживание этой замены в индикаторе и при обнаружении замены изменить источник данных для индикатора. --------------- Полагаю, что это можно сделать задействовав функции создания источника данных. Но помогать Вам я не буду, нет желания.
Konstantin777 написал: я не понимаю чем Ваш пример от моего отличается.
понял, у Вас getCandlesByIndex вызывается в OnCalculate, а моем примере в Init. Однако
Цитата
Konstantin777 написал: Я также тестировал пример с постоянными попытками забора значений свечей(как первых так и последних), и он также криво работает, тупо не видит цены, ни одной, однако если переставить индикатор все идет как по маслу.
я такой же пример сам писал, и все так же плохо работает
Странный Вы человек. Вместо того, чтобы задавать вопросы и высказывать недовольство, просто надо было бы привести результат теста, а не рассказывать мне что вы делали что-то не работающее. Я же не должен за вас все проверять, написал же вам выше , проверьте если что не так напишите поправлю. Но в любом случае Я делаю это если у меня есть желание Вам помогать.
еще заметил, что у ВТБ все файлы с расширением dat почему-то 65536 байт т е 2 в 16 степени, а у меня т е сбербанка есть и 1024 байта. ------------------ Если вы не удаляли эти файлы как я писал ранее, то удалите их тоже.
Konstantin777, Выкладываю пример, если что не так, напишите, поправлю.
Код
Settings={
sec ="ind2", --идентификатор инструмента 2-го графика
Name = 'nk_ind',
}
-------
function OnCalculate(i)
if i==Size() then
local N=getNumCandles (Settings.sec) ;
if N>3 then
local t=getCandlesByIndex(Settings.sec,0,N-3,3); --последние 3 свечи 2-го графика
local Hi2,Hi1,Hi0=t[0].high,t[1].high,t[2].high;
--------------------------
t=getCandlesByIndex(Settings.sec,0,0,3); --первые 3 свечи 2-го графика
local H1,H2,H3=t[0].high,t[1].high,t[2].high;
message("1="..H(1)..",2="..H(2)..",3="..H(3).."....,i-2="..H(i-2)..",i-1="..H(i-1)..",i="..H(i).."\n"..
"1="..H1..",2="..H2..",3="..H3..",i-2="..Hi2..",i-1="..Hi1..",i="..Hi0.."\n");
end
end
return
end
-----
function Init()
Settings.line={};
Settings.line[1] = {Name = "C",Color = RGB(0,255,0), Type =2,Width = 2 };
return 1;
end
s_mike@rambler.ru написал: Надо понимать, что при загрузке терминала варианты 1,2 и 3 имеют гораздо более высокую вероятность, чем вариант 4. А вот в устоявшемся варианте, когда все данные терминалом прогружены, вы скорее всего будете получать вариант 4
Цитата
Konstantin777 написал: Я также тестировал пример с постоянными попытками забора значений свечей(как первых так и последних), и он также криво работает, тупо не видит цены, ни одной, однако если переставить индикатор все идет как по маслу.
Цитата
nikolz написал: посмотрите скрипт который я выложил на этом форуме для арбитража
если это скрипт, то в скрипте у меня тоже все работает нормально, проблема именно в индикаторе, где то была тема что функция getCandlesByIndex плохо работает именно в инидикаторах
это индикатор. Там я даже картинку выложил. Но называется он скриптом, потому что написан языке Lua. https://habr.com/ru/post/196272/
У вас почти тысяча инструментов. Зачем? -------------------------- Вы физически не сможете за ними следить. --------------------- Рекомендую оставить лишь ликвидные -------------------- Потом если будет мало и будете круто торговать добавите неликвид. -------------------- Начните с не более 100 инструментов. Полагаю что память уменьшится раз в 10.
Да, мне столько не нужно интрументов. Оказалось они тоже не влияют на память. Запустил пустой квик без вкладок и без любых котировок, всё отключил. Изменений нет.
и последнее, для чистоты эксперимента надо удалить содержимое папки arxive и все файлы с расширением dat
Дмитрий Б. написал: " NoneB возможная причина - вкладки и окна, созданные в ранних версиях Quik."
Юрий в первом сообщении проверял в пустом квике без вкладок. Я тоже проверил. Получается вкладки не влияют.
nikolz инструменты оставил только российские акции МБ. Тоже не повлияло память.
У вас почти тысяча инструментов. Зачем? -------------------------- Вы физически не сможете за ними следить. --------------------- Рекомендую оставить лишь ликвидные -------------------- Потом если будет мало и будете круто торговать добавите неликвид. -------------------- Начните с не более 100 инструментов. Полагаю что память уменьшится раз в 10.
Судя по скриншоту ресурсов на Вашем ПК достаточно. В таком случае рекомендуем запустить Рабочее место QUIK без файла настроек (т.е. убрать использующийся *.wnd файл, по умолчанию это info.wnd), после чего откройте терминал QUIK и поработайте в нём. Обращаем внимание, что после запуска терминала QUIK в рабочей области не будет вкладок и таблиц, их необходимо будет создать заново или же загрузить конфигурацию окон из ранее сохранённого файла настроек (файлы настроек сохраняются в каталоге WNDSAV, который находится в корневой директории с QUIK). При этом в случае загрузки ранее сохранённого файла нужно выбрать гарантированно тот, на котором данной проблемы не было.
Чтобы диагностировать , желательно посмотреть: 1) число инструментов и их параметров в заказе данных 2) объем занятой памяти каждым квиком 3) наличие запущенных скриптов и самопальных индикаторов
e2e4 написал: Раньше не приходилось откатывать Quik. Так понимаю, копирования с заменой всех файлов из папки SBERBANK\QUIK_x64\backup\20220927 в SBERBANK\QUIK_x64 достаточно будет?
Вы что никогда не торговали на Ninja,ATAS И ТД - и не понимаете что такое работа с несколькими мониторами - и для чего нужна линковка окон ВСЕХ окон - как внешних так и не открепленных - банальный обзор рынка с удобством - а так приходится растягивать терминал на 2 монитора - чтобы линковались нужные окна
понял, что речь идет о якоре. ---------------------- Рассмешили Вопросом о зверинце торговых терминалов. Вы что считаете это каким-то достижением? Или просто собираете коллекцию?
Скорее всего я не такой профи ка вы - имхо мне удобнее (как и многим другим) - два открытых окна старшего и младшего тф , залинкованых с воч листом - пробегая по старшему тф проводим анализ (что куда торговать) - а на младшем точки входа - и во многих случаях нужна мобильность и удобство - а не каждый раз вбивать тикер заново на младшем тф - PS я рад за вас что вы не не бегаете по активам - имхо я бегаю и хорошо 10-12 активов отслеживать - каждому свое - и чем вам этот зверинец не нравится - чем плохи эти терминалы которые по уму сделаны ?
после кувыркания с версией 9 от сбербанка я вернул версию 8.7 и нет проблем. ----------------------- Рекомендую вернуть из архива старую версию и отключить в квике сообщение о новой версии. ---------------------- В следующем году смените версию на очередную новую, если старая не будет устраивать. ----------------- "Что важнее -"шашечки" на двери или ехать ?"
Вы что никогда не торговали на Ninja,ATAS И ТД - и не понимаете что такое работа с несколькими мониторами - и для чего нужна линковка окон ВСЕХ окон - как внешних так и не открепленных - банальный обзор рынка с удобством - а так приходится растягивать терминал на 2 монитора - чтобы линковались нужные окна
понял, что речь идет о якоре. ---------------------- Рассмешили Вопросом о зверинце торговых терминалов. Вы что считаете это каким-то достижением? Или просто собираете коллекцию?
green_X5 написал: Предложение навскидку - сервер видит попытку подключения "со второго места", проверяет - откликается ли "первое", если нет - закрывает "старую сессию", открывает новую. А не тупо отказывает в соединении, как сейчас.
это предложение плохое. Если сервер реализует такой алгоритм, то его легко положить DDS атакой.
Roman Koledin написал: Сделайте ПОЖАЛУЙСТА связь терминала с вынесенными окнами, что бы была возможность линковать вынесенные (открепленные окна) с программмой - без этой функции нет возможности работать с несколькими мониторами
не понял. У меня два монитора. проблем не возникает. Пример в студию.
Через примерно 100-200 вызовов Body(), QUIK либо закрывается, либо ошибка ACCESS VIOLATION Посмотрите плиз, дампы также могу выслать.
Ошибка возникает потому, что Вы создали таблицу с дырками Если у Вас максимальный номер 20, то надо создать все столбцы с номерами от 1 до 20. ------------------ Пример как надо, чтобы не было мучительно больно
Код
is_run = true
function OnInit()
KomCentrID = AllocTable()
for i=1,20 do AddColumn (KomCentrID,i, "столб."..tostring(i), true, QTABLE_STRING_TYPE,8) end --надо так
-- AddColumn (KomCentrID, 10, "столб.10", true, QTABLE_STRING_TYPE,8) AddColumn (KomCentrID, 20, "столб.20", true, QTABLE_STRING_TYPE,8) -- а не так
CreateWindow(KomCentrID)
SetWindowPos(KomCentrID,110,250,1100,500)
InsertRow(KomCentrID,-1)
end
function main()
while is_run do
Body()
sleep(100)
end
end
function OnStop()
is_run = false
end
function Body()
InsertRow(KomCentrID,1)
SetCell(KomCentrID, 1,10, "COMP")
SetCell(KomCentrID, 1,20, "COMP")
SetColor(KomCentrID,1,20,RGB(217,255,217),RGB(1,1,1),RGB(220,220,220),RGB(0,0,0))
SetColor(KomCentrID,1,10,RGB(255,255,0),RGB(1,1,1),RGB(220,220,220),RGB(0,0,0))
end
если вы закомментируете строку for i=1,20.. и удалите коммент в следующей, то получите ваш результат. Успехов
isRun=0; --флаг завершения функции main
fstop=true; -- флаг остановки скрипта при запуске по расписанию
local Ts={"12:53:00","12:54:00","12:55:00","12:56:00","12:57:00","12:58:00","12:59:00",} -- расписание
for i=1,#Ts do local x=Ts[i] Ts[i]=60*(60*string.sub(x,1,2)+string.sub(x,4,5))+string.sub(x,7,8); end
------------
function main()
local jT,x=0,0;
--------------------------
while isRun do
if #Ts>jT then local dt=-1;
if fstop then fstop=false; -- в колбеках первой строкой поставить if fstop then return end
x= getInfoParam("SERVERTIME");
local z=60*(60*string.sub(x,1,2)+string.sub(x,4,5))+string.sub(x,7,8);
while #Ts>jT and 0>dt do jT=jT+1; dt=Ts[jT]-z; end
end
if dt>=0 then message(x.." до старта "..dt.."сек"); sleep(1000*dt); else sleep(1); end
end
------------
if fstop==false then x= getInfoParam("SERVERTIME"); message("старт "..x.." fstop="..tostring(fstop) ); end
-- код скрпита
fstop=true; --- остановить скрипт
if fstop then x= getInfoParam("SERVERTIME"); message("стоп "..x.." fstop="..tostring(fstop) ); end
end
end
Поясняю: ------------------- Данный скрипт позволяет запускать исполняемый код в main и колбеки по расписанию Ts --------------------- Остановка исполнения кода скрипта и колбеков осуществляется путем установки флага fstop=true. --------------------- Чтобы не тратить время на колббеки когда скрипт не исполняется надо поставить в начале колбека if fstop then return end
Добрый день, Пример запуска скрипта по расписанию. Если есть вопросы - пишите
Код
local isRun=0; --флаг завершения функции main
local fstop=true; -- флаг остановки скрипта при запуске по расписанию
local Ts={"12:53:00","12:54:00","12:55:00","12:56:00","12:57:00","12:58:00","12:59:00",}
for i=1,#Ts do local x=Ts[i] Ts[i]=60*(60*string.sub(x,1,2)+string.sub(x,4,5))+string.sub(x,7,8); end
------------
function main()
local jT,x=0,0;
while isRun do
if #Ts>jT then local dt=-1;
if fstop then fstop=false; -- в колбеках первой строкой поставить if fstop then return end
x= getInfoParam("SERVERTIME"); -- local x=os.date("%X");
local z=60*(60*string.sub(x,1,2)+string.sub(x,4,5))+string.sub(x,7,8);
while #Ts>jT and 0>dt do jT=jT+1; dt=Ts[jT]-z; end
end
if dt>=0 then message(x.." до старта "..dt.."сек"); sleep(1000*dt); else sleep(1); end
end
if fstop==false then x= getInfoParam("SERVERTIME"); message("старт "..x.." fstop="..tostring(fstop) ); end
-- исполнение скрпита
fstop=true; --- остановить скрипт
if fstop then x= getInfoParam("SERVERTIME"); message("стоп "..x.." fstop="..tostring(fstop) ); end
end
end
BlaZed написал: Можно в основном цикле сравнивать локальное время компа с вашими требованиями к работе скрипта по времени. При соответствии выполнять функционал, при несоответствии крутить пустой цикл.
вместо пустого цикла используйте sleep(время ожидания до следующего запуска)
Естественно пустой цикл со слипом, я просто не стал очевидные вещи расписывать
естественно, если в цикле что-то исполняется то это уже не пустой. ------------------ более того, нет надобности еще в одном цикле в main.
BlaZed написал: Можно в основном цикле сравнивать локальное время компа с вашими требованиями к работе скрипта по времени. При соответствии выполнять функционал, при несоответствии крутить пустой цикл.
вместо пустого цикла используйте sleep(время ожидания до следующего запуска)
Подскажите есть ли возможность получить данные о выставленных заявках по инструменту из таблицы "Состояние счета". Столбцы "В покупке", "В продаже" При опросе таблицы "заявки" в конце дня из за большого количества строк скрипт начинает дико тормозить.
читайте из таблицы заявок лишь активные, тормозить никогда не будет например у меня в тесте за 4 часа было выставлено и снято 200 тысяч заявок никаких тормозов. ---------------------- ещ можно читать из таблицы Позиции по инструментам
Параметр
Тип
Описание
sec_code
STRING
Код инструмента
trdaccid
STRING
Счет депо
firmid
STRING
Идентификатор фирмы
client_code
STRING
Код клиента
openbal
NUMBER
Входящий остаток
openlimit
NUMBER
Входящий лимит
currentbal
NUMBER
Текущий остаток
currentlimit
NUMBER
Текущий лимит
locked_sell
NUMBER
В продаже. Количество инструментов, заблокированное под исполнение заявок клиента на продажу
locked_buy
NUMBER
В покупке. Количество инструментов в активных заявках клиента на покупку
locked_buy_value
NUMBER
Стоимость инструментов, заблокированных под покупку
locked_sell_value
NUMBER
Стоимость инструментов, заблокированных под продажу
wa_position_price
NUMBER
Цена приобретения
limit_kind
NUMBER
Срок расчётов. Возможные значения:
положительные целые числа, начиная с «0», соответствующие срокам расчётов из таблицы «Позиции по инструментам»: «0» – T0, «1» – T1, «2» – T2 и т.д.;
отрицательные целые числа – технологические лимиты (используются для внутренней работы системы QUIK)
вообще-то, ответ на ваш вопрос в начале темы: МОЖНО. -------------------- вопрос скорее всего в том, почему Вам бы самому не написать эту функцию, если она Вам нужна.
Дмитрий написал: Можно и так через скрипт получить код инструмента с графика, но лучше, конечно, чтобы была функция встроенная в quik, без всяких редактирований таблицы tool как в скрипте:
Код
is_run = true
chart_tag = "tag"
local tool = {
[ "Сбербанк [Price]" ] = "SBER" ,
[ "ГАЗПРОМ ао [Price]" ] = "GAZP" ,
[ "ЛУКОЙЛ [Price]" ] = "LKOH" ,
[ "Роснефть [Price]" ] = "ROSN"
}
function candle ()
allcandles = getNumCandles (chart_tag)
tab, count, leg = getCandlesByIndex (chart_tag, 0 , 0 , allcandles)
for key, val in pairs(tool) do
if key = = leg then
codeSec = val
end
end
return codeSec
end
function main ()
while is_run do
candle()
message (tostring(codeSec), 1 )
sleep ( 1000 )
end
end
Вы что-то путаете или невнимательно читали документацию qLua. Если вы хотите получить данные по инструментам в скрипте (как в вашем примере), а не в индикаторе, то для этого уже есть функции ----------------------- CreateDataSource и O, H, L, C, V, T - Функции в качестве параметра принимают индекс свечи и возвращают соответствующее значение. ----------------------------- и tag вообще не нужен для этого.
Нужно получить код инструмента графика в скрипт, а не через индикатор. В этой функции такого нет. И в других функциях тоже нет. Поэтому хорошо бы было, чтобы такая функция была. А в примере выше показан способ получения кода через имеющуюся функцию, но в нём есть недостаток - нужно вручную вписывать названия подписей инструментов.
Возможно, я не понял, но Ваш вопрос в тексте все время разный. ------------------- Я вообще-то говорю о получении значений параметров свеч, т е цены инструмента и это же Вы получаете в своем примере. --------------------- Но Вы хотите получить нечто иное, а именно: В начале темы это " получать данные переменных индикаторов". а теперь "получить код инструмента графика " Первое понятие "данные переменных индикаторов" - вообще ваше ноу-хау. -------------------- Если хотите получить в скрипт код инструмента на графике, например SBER то как Вы будете выбирать с какого графика, открытого в терминале вы хотите получить код инструмента?