function OnCalculate(index)
-- Получение свечей инструментов
c1=С(index);
c2=getCandleByTimeCode(Settings.tag2,timeCode).close
if c2 then
spr =C1-C2 -- Вычисление спреда
if index==1 then max=spr; min=spr - Settings.a;
-- Вычисление максимума минимума среднего для спреда
elseif spr>max_p then max = spr; min = spr - Settings.a;
elseif spr<min_p then min = spr; max = spr + Settings.a; end
med = (max+min)/2;
end
return spr,med,max,min
end
function OnCalculate(index)
-- Получение свечей инструментов
c1=С(indwx);
c2=getCandleByTimeCode(Settings.tag2,timeCode).close
if c2 then
spr =C1-C2 -- Вычисление спреда
if index==1 then max=spr; min=spr - Settings.a;
-- Вычисление максимума минимума среднего для спреда
elseif spr>max_p then max = spr; min = spr - Settings.a;
elseif spr<min_p then min = spr; max = spr + Settings.a; end
med = (max+min)/2;
end
return spr,med,max,min
end
Юрий написал: Я Вас понял. У меня получается три инструмента! Первый - по нему определяется нумерация свеч, и два других - по которым я считаю "spred ", в новом окне графика первого инструмента. В первом инструменте есть C(index). Там, получается, "искать" предыдущую свечу?
у Вас первый лишний если спред между двумя инструментами то третий лишний. Номер свечи надо брать из первого
Юрий написал: Спасибо! Обязательно попробую! Подскажите, а как мне max/low предыдущей свечи обозначить? Типа (i-1)...
вообще-то я не понял почему Вы два инструмента читаете. ---------------- Я делаю спред так. Один инструмент - это тот , который на графике А второй инструмент - читаем В этом случае данные по первому инструменту это C(index),O(index),L(index),H(index), а предыдущая свеча по этому инструменту будет ...(index-1) ---------------- При этом индикатор помещаем в новое окно под графиком первого инструмента
Вот вам вариант. проверьте, если что не так, то покажите картинки и напишите что не так.
Код
function OnCalculate(index)
-- Получение свечей дополнительных инструментов
c1=getCandleByTimeCode(Settings.tag1, timeCode).close
c2=getCandleByTimeCode(Settings.tag2, timeCode).close
if c1 and c2 then
p1 = c1; p2 = c2 -- Получение цен дополнительных инструментов
spr =p1-p2 -- Вычисление спреда
if index==1 then max=spr; min=spr - Settings.a;
-- Вычисление максимума минимума среднего для спреда
elseif spr>max_p then max = spr; min = spr - Settings.a;
elseif spr<min_p then min = spr; max = spr + Settings.a; end
med = (max+min)/2;
end
return spr,med,max,min
end
nikolz написал: правильные производители авто отзывают все свои авто с ляпом, а производители QUIK делают новые версии с новыми ляпами, а старые не отзывают.
да ладно Вам. У этих правильных производителей похлеще были ляпы несоразмерные в масштабах с ляпами Quik. Не всегда всё идеально получается, а точнее никогда. Стараются, делают что могут и как могут, мы их тут попинываем и это нормально. Я вот 2ой раз только на этом форуме пишу, хотя Quikом с 2015 постоянно(ежедневно) пользуюсь. Как я обычно говорю: "не надо требовать от человека быть тем, кем он не является", к софту это тоже относится.
Тоже пользуюсь квиком и ничего не требую. чел спросил, я объяснил, что если в новой версии ляпы и она меня с ними не устраивает, то ставлю старую. ------------------------ На самом деле наплевательское отношение к ляпам в софте связано с тем , что оно раздается клиентам брокера "бесплатно" Поэтому никаких претензий. ---------------------- Про бесплатный сыр напоминать не буду. А так халява она и в России халява.
NoneB написал: Иногда при создании метки появляется ошибка "Недопустимые данные". Перезагрузка вкладки может помочь, но не всегда. Также после редактировании метки, размер ее окна может разнести почти на весь график и после этого ее не удалить и не отредактировать. Проблема есть во всех девятых версиях
Вы хотя бы выложите то место, где вы метку создаете. А то телепаты все в отпуске.
для начала, я исправил ошибки в Вашей программе, но не проверял. проверьте, если ошибок нет, то напишите подробнее что не так.
Код
--- Вычислить спред.
-- @param index номер свечи на графике
-- @return значение спреда или nil, если оно неопределено
local function getSpread(index)
local timeCode = getTimeCode(T(index))
local securityPrice = C(index)
if securityPrice then
-- Получение свечей дополнительных инструментов
local candle1 = getCandleByTimeCode(Settings.tag1, timeCode)
local candle2 = getCandleByTimeCode(Settings.tag2, timeCode)
if candle1 and candle2 then
-- Получение цен дополнительных инструментов
local price1 = candle1.close
local price2 = candle2.close
if price1 and price2 then
-- Вычисление спреда
local spread = (50 - (100 / (1 + price1 / price2)))*Settings.k
-- Вычисление максимума минимума среднего для спреда
if index == 1 or (T(index).hour < T(index-1).hour) then
max_price = nil
med_price = nil
low_price = nil
end
if max_price == nil then max_price = spread
elseif spread > max_price then
max_price = spread
low_price = spread - Settings.a
med_price = (max_price+low_price)/2
end
if low_price == nil then low_price = spread
elseif spread < low_price then
low_price = spread
max_price = spread + Settings.a
med_price = (max_price+low_price)/2
end
if med_price == nil then med_price = (max_price+low_price)/2
elseif spread < low_price then med_price = (max_price+low_price)/2
elseif spread > max_price then med_price = (max_price+low_price)/2
end
return spread, (max_price+low_price)/2 , max_price, low_price
end
end
end
end
Исполненные заявки не появляются в таблице сделок, Сделал торгового робота для quik на языке lua. Исполнилось 6 заявок, 3 на покупку и 3 на продажу, но в таблице сделок они не появились
Молчанов Виктор написал: Сделал торгового робота для quik на языке lua. Исполнилось 6 заявок, 3 на покупку и 3 на продажу, остановил скрипт, но в таблице сделок ничего не появилось. Скрипта у меня 2: на покупку и на продажу. Не знаю что делать, раньше такого не было. В заранее благодарен.
поэтому я всегда делаю так. Если новая версия по каким-то причинам начинает сбоить, а старая работает без нареканий, то я просто возвращаюсь к старой и жду, когда новая отлежится.
т.е. всё что выше 8.7 ещё не отлежалось? что ж Вы там такого делаете на своём квике - заинтриговали)
тестирую роботов на истории. относительно версии. Пока нет проблем с 8.7, поэтому то что выше ставить не буду. прикольно то, что например сбер начал распространять 9.4, а разработчики уже много раз признали свои ляпы и в 9.4 и в 9.5 и уже сделали ляпы в 9.7 ---------------- Типа так , на версии 9.4 отказывают тормоза, но вы можете ездить. Если разбиться не хотите, то устанавливайте с нашего сервера новую версию. Но прикольно то, что если Вы установите не с сервера брокера и потом у вас все е....ся, то претензии брокер не примет и вы останетесь с ...
с учетом преобразования числа в строку получим следующее
Код
local x=123.456
nkarray.start()
local a,b=math.modf (x)
local u=0.1*nkarray.stop()
print(a,b,u)
nkarray.start()
local s=tostring(x);
local a,b=string.match(s,"(%d+)%.?(%d*)")
local u=0.1*nkarray.stop()
print(a,b,u)
nkarray.start()
local s=tostring(x);
x1,x2,a,b=string.find(s,"(%d+)%.?(%d*)")
--local a=string.sub(x,1,m-1);
--local b=string.sub(x,m+1);
local u=0.1*nkarray.stop()
print(a,b,u)
nkarray.start()
local s=tostring(x);
local m=string.find(s,".",1,true)
local a=string.sub(s,1,m-1);
local b=string.sub(s,m+1);
local u=0.1*nkarray.stop()
print(a,b,u)
Nikolay написал: Не заметил, что целое. Если известен scale, то умножить на 10 в степени.
Или можно воспользоваться магией динамической
tonumber(tostring(3.12459):match("%.(%d+)")) or 0
Почему не сделать просто? a,b=string.match(123.456,"(%d+)%.?(%d*)")
Впрочем, интересно, а в курсе ли уважаемый топикстартер, что 1.2 и 1.02 дадут одинаковый результат?
еще один вариант и в итоге все варианты : -----------
Код
local x=123.456
local s=tostring(x);
nkarray.start()
local a,b=math.modf (x)
local u=0.1*nkarray.stop()
print(a,b,u)
nkarray.start()
local a,b=string.match(s,"(%d+)%.?(%d*)")
local u=0.1*nkarray.stop()
print(a,b,u)
nkarray.start()
x1,x2,a,b=string.find(s,"(%d+)%.?(%d*)")
--local a=string.sub(x,1,m-1);
--local b=string.sub(x,m+1);
local u=0.1*nkarray.stop()
print(a,b,u)
nkarray.start()
local m=string.find(s,".",1,true)
local a=string.sub(s,1,m-1);
local b=string.sub(s,m+1);
local u=0.1*nkarray.stop()
print(a,b,u)
Евгений написал: Здравствуйте. При попытке расчёта стохастика квик выдаёт ошибку: SO.lua:311:attempt to call a number value (global 'C'). Подскажите, пожалуйста, что может быть.
Возможно неправильно указали параметр. покажите как вызываете.
если надо целую и дробную часть, то так: local x=123.456 local a,b=math.modf (x) local u=0.1*nkarray.stop() print(a,b,u) ------------------------- результат (мкс): 123 0.456 0.6 ================ в 12 раз быстрее, чем с match и в 3 раза быстрее чем с find
Nikolay написал: Не заметил, что целое. Если известен scale, то умножить на 10 в степени.
Или можно воспользоваться магией динамической
tonumber(tostring(3.12459):match("%.(%d+)")) or 0
Почему не сделать просто? a,b=string.match(123.456,"(%d+)%.?(%d*)")
Впрочем, интересно, а в курсе ли уважаемый топикстартер, что 1.2 и 1.02 дадут одинаковый результат?
если надо быстрее, то так: x1,x2,a,b=string.find(x,"(%d+)%.?(%d*)") ================== сравним: local x=123.456 nkarray.start() local a,b=string.match(x,"(%d+)%.?(%d*)") local u=0.1* nkarray.stop() print(a,b,u)
nkarray.start() x1,x2,a,b=string.find(x,"(%d+)%.?(%d*)") local u=0.1*nkarray.stop() print(a,b,u) =================== результат (мкс): 123 456 8.6 123 456 1.8 ================== вариант с find в 4 раза быстрее.
nikolz написал: На момент выставления заявки цена была -одна, а когда выставилась Ваша заявка рынок уже ушел покурить и цена фактическая другая.
Вы невнимательны.
1. Заявка выставлена по рыночной цене и поэтому удовлетворяется вне очереди, а при наличии ликвидности (это высоколиквидный GAZP) - мгновенно. 2. От начала редактирования заявки, до выставления не было такого большого перепада цен, я проверил по ТОС
Нулевой объем в ТЗ до момента, пока заявка не начнет удовлетвлряться, а по завершении сделки - реальный объем из таблицы сделок
Объем в заявке расчитывается по цене выставляемой заявки если заявка отправлена по планке то и объем в деньгах будет по планке
что такое -планка? Объем в рыночной заявке рассчитывается по лучшей цене в последнем полученном стакане перед расчетом, а объем в сделке рассчитывается по цене встречной заявки в которую ударилась ваша заявка.
nikolz написал: На момент выставления заявки цена была -одна, а когда выставилась Ваша заявка рынок уже ушел покурить и цена фактическая другая.
Вы невнимательны.
1. Заявка выставлена по рыночной цене и поэтому удовлетворяется вне очереди, а при наличии ликвидности (это высоколиквидный GAZP) - мгновенно. 2. От начала редактирования заявки, до выставления не было такого большого перепада цен, я проверил по ТОС
Нулевой объем в ТЗ до момента, пока заявка не начнет удовлетвлряться, а по завершении сделки - реальный объем из таблицы сделок
перед выставлением заявки брокер оценивает достаточность у вас средств , очевидно эту оценку Вы и видите. Подача Вами заявки никаких обязательств для брокера не создает. Вы можете просто не обращать на это внимание.
Евгений написал: Все равно не пойму как индикатор связан с этими метками. Надо копать в функции квика а не в индикаторе, так как индикатор работает прекрасно и нигде ничего не тормозит. Ну и не вижу смысла в привязке к индикаторам этих меток, она просто не нужна
Если выставление меток и работа индикатора производится в одном потоке, то эти действия будут выполняться последовательно. Т е пока индикатор не закончит свои вычисления, метки выставляться не будут. Один поток -одно ядро - все исполняется последовательно.
Евгений написал: на ваших индикаторах нет (все не проверял), на моем есть. Все равно это не должно быть связано с индикатором. Скорее всего в квике стоит цикл который сканирует таблицу сделок, и если например много графиков с одним и тем же индикатором, например 20 , то пока все эти 20 раз этот цикл не отсканирует таблицу сделок графики дальше не поедут. Это у вас как то по особенному эта функция запрограммирована. Так как мой индикатор, совершенно нормальный.
И вобще предлагаю удалить эту привязку к индикаторам, так как может быть включена случайно к двум и более.
Например и к цене и к индикатору. Или сделать блокировку на другие привязки если уже где то стоит. Вот реально не понятно зачем эта функция. Если бы была привязка к разным счетам еще можно понять, но к индикаторам то зачем ?
Предположу, что с индикатором это может быть связано с вызовом функции OnCalculate(i) Это примерно так же как вызов колбеков в скриптах. Вы тормозите в скрипте индикатора, а он тормозит основной поток терминала. ----------------- проверить это очень просто. Закомментируйте все в индикаторе от OnCalculate(i) до оператора return и будет Вам счастье.
Сергей написал: Похоже, что от того активны окна или нет объем памяти не зависит. Кроме того, если менять на графиках тайм фреймы с дневного на пятиминутный, то занятая память увеличивается с 500 Мбайт до больше чем 3000 Мбайт, однако если снова переключиться на дневные графики, то объем памяти хоть и уменьшается, но не возвращается к 500 Мбайтам, а становится равным примерно 1100 Мбайт. Видимо QUIK не может полностью освободить оперативную память даже если она ему не нужна, а жаль.
Очевидно у Вас накопился большой архив 5-ти минуток. Посмотрите дату начала графика на 5 минутном интервале. без накопления архива он будет примерно от мая 2022. Проще всего стереть все в папке архив и тогда будет вам счастье некоторое время. ------------------- На самом деле КВИК не предназначен для открытия много количества графиков и стаканов. Это программа изначально разрабатывалась лишь для подачи заявок брокеру. --------------------------------------- Телега - она тоже транспорт, но летать не может.
Мне вот просто из любопытства интересно, почему разработчики Quik`а - не могут сделать нормальное полноценное API к своему (своему ли?) продукту ?? Чтобы можно было нормально и просто взаимодейстовать через единый интерфейс без всяких костылей типа: DDE, ODBC, QLUA, QPILE, trans2quik - какой б?ть шикарный выбор, аж глаза разбегаются.
Извините. :)
DDE,ODBC и QPILE, trans2quik сделали 20 лет назад. ------------------ VM Lua встроили 10 лет назад. ----------------------- Можете сами посчитать , когда сделают полноценный API. ------------------------------ "Вот только жить в эту пору прекрасную уж не придется.."
Сергей написал: Архив у меня большой. Со временем он только увеличивается. Все рекомендации здесь направлены на уменьшение требуемой оперативной памяти и никак не объясняют ее очень большие колебания. Ведь во время когда требуется 500 Мбайт памяти и во время когда требуется 3500 Мбайт памяти все настройки, архивы и другие файлы все те же.
возможно объем памяти при страте определяется числом активных окон на экране. Можно сделать следующий эксперимент. Сверните все окна с графиками и стаканы. Закройте квик нажав выход в меню система после этого откройте квик и посмотрите объем занимаемой памяти. потом активируйте свернутые окна и стаканы и смотрите занимаемую память.
Сергей написал: Добрый день. Файл настроек не удалял. У меня десятки инструментов, графиков с индикаторами, вкладок, стаканов. Новая настройка с нуля это очень долгий и сложный процесс, а то, что в результате будет требоваться меньше памяти маловероятно. Если учесть, что информация из QUIK выводится в базу данных, то если сделать что-то немного не так, то можно повредить эту базу данных. Я ранее уже делал копию терминала и пытался установить Вашу версию программы. ФИНАМ при таком обновлении блокирует двух факторную аутентификацию, что они и подтвердили во время звонка в тех. поддержку. Кроме того, обычно новые версии программы требуют больше памяти, так как появляются новые возможности, если только специально не ставилась задача сократить потребление памяти. Мое предположение, что при входе в QUIK объем требуемой памяти зависит от размера памяти при предыдущем выходе не подтвердилось.
возможно, что у Вас большая история. проверить это можно так: сделайте архив папки "архив" , чтобы потом восстановить. удалите файлы из папки архив. после этого перезакажите данные. закройте квик через выход снова загрузите и посмотрите сколько потребуется памяти.
Anzhelika Belokur написал: По поводу обрезания свечей при отрицательных значениях, демонстрируем поведение на Рис.2
Ну видно же, что минимумы свечей от 11 числа обрезаются (те, которые упираются в нижний край). Чтобы было наглядней я взял бары и увеличил масштаб (то же 11 число, время на скринах видно). Автомасшатирование: Скрытый текст Сравните с масштабированием вручную: Скрытый текст
Цитата
Anzhelika Belokur написал: можно понятным образом интерпретировать такое поведение - по инструменту отсутствует позиция и она принимается равной 0 и соответствующим образом считается цена приобретения - 0. Автомасштабирование же отрабатывает так, чтобы отображать этот нулевой уровень цены приобретения.
Весьма сомнительная версия. Откройте любой график с только положительными ценами и посмотрите будет ли там нулевой уровень цены при тех же настройках.
Потому и упирается, что это минимум т е край. А как по-вашему автоматически должно быть ?
Не надо зеркало винить. Вы читайте внимательно что написано на сайте: [img]data:image/png;base64, *[/img] Где Вы увидели отрицательные цены? Там же Вам по- русски написали- "Синтетический матчинг календарных спредов" -------------------- Что такое "спред" знаете?
Евгений написал: Внимание эта функция возвращает таблицу
Функция TABLE getPortfolioInfoEx
Соответственно и получать значение нужно из таблицы
all_assets
STRING
Текущая оценка стоимости всех позиций клиента
in_assets
STRING
Вход. активы. Оценка собственных средств клиента до начала торгов.
TABLE cena = {"all_assets" = 58955,"in_assets" = 58255} - пример
local cena = cena["all_assets"] -- текущая оценка стоимости всех позиций клиента( не цена а оценка стоимости) цены позиций получать нужно из других таблиц
или так:
portfolio_value
STRING
Стоимость портфеля. Для клиентов типа «МД» возвращается значение для строк с максимальным сроком расчётов limit_kind
Стоимость портфеля
cena = getPortfolioInfoEx (firmid,client_code,limit_kind).portfolio_value;
swerg написал: Айдар , А зачем Excel и vba? Почему не все на lua?
c VBA я знаком уже давно, некоторые вещи для меня проще делать там, лень переучиваться
езжу в город на телеге с кобылой уже давно, туда и обратно уходит дней пять, в некоторые места отхожие хожу пешком, для меня так проще. Покупать автомобиль - лень переучиваться .