Alexey Ivannikov написал: Рабочее место QUIK версии 8.0 является 64-разрядным приложением. Перед тем как запускать обновление на новую версию, необходимо обязательно ознакомиться со следующими особенностями новой версии.1. Новая версия может некорректно работать с LUA-скриптами, использующими внешние библиотеки dll. Перед обновлением рекомендуем обратиться к разработчикам скриптов за их обновлением.
Как раз возникла соответствующая проблема, уже хотел было открывать тему но прочитав это понимаю что видимо в этом дело, и что же теперь делать? А проблема вот в чём - Имеется QUIK 7.27.1.18, в нём все норм работает, захотел немного потренироваться на демо счете от arqatech, скачал самый последний QUIK Junior 8.0 установил, перенес из QUIK 7.27.1.18 в новый QUIK Junior 8.0 скрипт и все его сторонние библиотеки в по точно таким же путям в в квик юниор, при запуске скрипта вылетает ошибка - error loading module 'socket.core' from file 'Z:\QUIK-Junior\lua\ssl\socket\core.dll': не является приложением Win32. То есть в QUIK 7.27.1.18 все тоже самое лежит по точно таким же путям и все работает нормально
Иван Ру, Здравствуйте! Решилась ли ваша проблема с сообщением "Превышено ограничение на количество котировочных окон"? У меня тоже вот такая же проблема началась после того как я скачал и установил QUIK от другого брокера, но той же версии - 7.27.2.1, что и у предыдущего, перенес в новый квик из предыдущего файл wnd с настройками и скрипт, скрипт не привязан к каким либо параметрам прошлого квика, к путям например, и параметрам брокера, и при запуске скрипта, когда сразу когда через некоторое неопределенное время квик начинает сыпать сообщениями - "Превышено ограничение на количество котировочных окон. Одновременно может быть открыто не более 200 окон" всего выскакивает примерно 60-70 таких сообщений одно за другим потом все тихо, и причем скрипт не выполняет тех операций что он совершал в предыдущем квике, но и сообщений об ошибках никаких, и все нужные для работы скрипта библиотеки я перенес в новый квик, все как в предыдущем, как я подозреваю на каком то моменте выполнения скрипта и просходит эта проблема, но почему так - непонятно, ведь всё тоже самое
Николай Камынин написал: поясню откуда что берется.Данная формула берется из следующей гипотезы.Полагаем что цена отклоняется от оценки среднего значения случайным образом по гауссовскому закону плотности вероятности отклонения тогда с вероятностью 0.95 имеем 1.96*ср.квадр-----------------Но это гипотеза не верна (доказано в прошлом веке)так как закон распределения цены не нормальныйследовательно центр тяжести нельзя считать как среднееследовательно закон двух сигма не работает
Можно ссылочку на какой нибудь ресурс почитать поподробней об этом?
Цитата
Николай Камынин написал: Вообще-то зачем городить расчет индикатора когда он есть в КВИКЕпоставьте метку и читайте значения в своем скрипте Зачем изобретать дырку от бублика.
Есть некоторые совершенно очевидные причины иногда "загородить" собственный расчет индикатора в скрипте, но впрочем я не буду распространятся на эту тему, кому это непонятно тому это и ненадо
Я и говорю что ваши формулы для расчета верхней и нижней полосы такие же как и везде в остальных источниках То есть BBLower/BBUpper = MA(P,N) –+ k * StDev(P,N) Но вот среднеквадратичное отклонение StDev(P,N) у вас рассчитывается иным методом: StdDev = SQRT ( (SUM(CLOSE(N)^2)-SUM(CLOSE(N-P)^2)) - 2*MA(C,N-P)*(SUM(CLOSE(N))-SUM(CLOSE(N-P))) + P*MA(C,N-P)^2 То есть кв.корень разницы сумм цен, разницы скользящей средней умноженной на 2 и плюс период умноженный на скользящую средню в квадрате! О как! В то время как везде где только можно нагуглить среднеквадратичное отклонение StDev(P,N) рассчитывается намного проще: StdDev = SQRT (SUM ((CLOSE — SMA (CLOSE, N))^2, N)/N) то есть кв.корень из суммы разниц цен(обычно закрытия потому и CLOSE) и скользящей средней некоторого периода цен
Nikolay написал: Я тоже подозреваю, что с интерпретатором lua в Квике не все ладно. У меня также из ZeroBraneStudio все работает. Также не все библиотеки можно подключить в Квике, для примера strict - Квик падает без слов. Также обнаружил, что внутри фунции SearchItems (в функции проверки) у меня почему-то проверка nil как false не срабатывает. Приходится явно писать ~= nil
Кстати забыл сразу рассказать: у меня тоже по началу были такие проблемы с квиковским интерпретатором луа, но они решились все и больше не появлялись, а вызваны как мне кажется следующим - ты как и все остальные делаете так: В папку со сторонними библиотеками ложите файл qlua.dll переименовав его в lua51.dll, еще хуже если люди берут lua51.dll откуда нибудь со стороны, из Zerobrane например, не переименовав оригинальный qlua.dll, тогда всякие глюки 100% будут, но и в первом случае - с помощью переименовывания qlua.dll в lua51.dll я тоже наблюдал различные глюки и сообщения о некоторых ошибках во время выполнения скрипта, все эти ошибки у меня решились так: 1. В каждую папку со сторонними библиотеками ложится оригинальный qlua.dll а всякие lua51.dll удаляются. 2. Есть такая хорошая программка Dependency walker, с её помощь можно посмотреть с какими другими dll связана нужная тебе dll библиотека, но еще удобнее это посмотреть с помощью Total Commander Extended - просто становишся на dll'ку курсором, жамкаешь F3, вкладка Dll Dependency - смотрим - эта библиотека, к примеру ssl.dll требует для своей работы библиотеку lua51.dll, и кстати там будет показано - может ли нужная тебе библиотека связаться со всеми далее необходимыми ей библиотеками, если нет то возле нее будет гореть красный крестик 3. Далее любым HEX редактором, например WinHex, открываем ssl.dll для записи, ищем текст - lua51.dll находим, далее осторожно! Необходимо стать курсором в текстовое поле отображения файла! не в шестнадцатиричное! необходимо написать qlua вместо lua51, но при этом существующее положение точки т.е. символа разделения имени файла и расширения не должно измениться, т.е. точку трогать нельзя! qlua это на один символ меньше чем lua51, поэтому "q" писываем вместо "u" и т.д. итого у нас должно получится - lqlua.dll, после того как писали qlua осторожно переходим в шестнадцатиричное поле и в ту позицию (байт) в которой содержится шестнадцатиричное значение буквы l ставим два нуля - "00" и буква l должна исчезнуть, сохраняем все изменения, открываем ssl.dll в Total'е, или в Dependency walker, смотрим - ssl.dll уже запрашивает не библиотеку lua51.dll а qlua.dll! Так проделываем со всеми своими сторонними библиотеками подключаемыми в скрипте самостоятельно - после этого у меня все проблемы с интерпретатором луа в квике пропали!
Здравствуйте, написал для своего скрипта индикатор вычисления полос Боллинджера, опираясь на предыдущее написание написание индикатора AD которое я обсуждал с вами тут https://forum.quik.ru/messages/forum10/message37868/topic4504/#message37868 тогда у меня возникли вопросы - почему мои показания AD не совпадают с вашими показаниями AD из AD.lua на графиках, эти вопросы были решены, а именно вычисление AD (как и практически всех ваших индикаторов) идут у вас начиная с самой 1ой свечи которая получается с биржи и до последней, т.е. за весь диапазон, свой скрипт я поправил после чего мои показания AD стали идти точь в точь с вашими, но при однако же значения вычисляемых полос Боллинджера опять стали несовпадать хоть в этот раз я сразу написал их вычисление с самого начала диапазона как и у вас, причем средняя линия у меня везде совпадает с вашей но несовпадают верхняя и нижняя полосы, т.е. отклонения полос, стал изучать ваш скрипт BB.lua в итоге вижу что у вас полосы боллинджера вычисляются по какой то совсем другой формуле а не по оригинальной, потому и не совпадение, а именно сама формула в целом у вас стандартная -
1. Средняя линия ML (обычное скользящее среднее) рассчитывается по формуле:
ML = SUM (CLOSE, N) / N = SMA (CLOSE, N),
где: — SUM (…, N) — сумма за N периодов; — CLOSE — цена закрытия; — N — количество периодов, используемых для расчета; — SMA — простая скользящая средняя.
2. Верхняя линия TL (средняя линия ML, смещенная вверх на определенное число D стандартных отклонений StdDev) рассчитывается по формуле:
TL = ML + (D * StdDev),
3. Нижняя линия BL (средняя линия ML, смещенная вниз на число стандартных D отклонений StdDev) рассчитывается по формуле:
BL = ML — (D * StdDev).
StdDev - среднеквадратичное отклонение
Далее же - везде где только можно нагуглить чтолибо о полосах Боллинджера везде формула расчета среднеквадратичного отклонения
проанализировав же ваш скрипт BB.lua, а именно место вычисления отклонения от средней линии в функции SD ():
Код
function SD() --Standard Deviation ("SD")
local SD_MA=MA()
local sum = {}
local sum2 = {}
local it = {p=0, l=0}
return function (I, Fsettings, ds)
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 20)
local M = (Fsettings.Metod or SMA)
local VT = (Fsettings.VType or CLOSE)
if (P>0) then
if I == 1 then
sum = {}
sum2 = {}
it = {p=0, l=0}
end
local t_ma = SD_MA(I, {Period=P, Metod = M, VType=VT}, ds)
if CandleExist(I,ds) then
if I~=it.p then it={p=I, l=it.l+1} end
local Ip,Ipp,Ippp = Squeeze(it.l,P),Squeeze(it.l-1,P),Squeeze(it.l-P,P)
sum[Ip]=(sum[Ipp] or 0) + GetValueEX(it.p, VT, ds)
sum2[Ip]=(sum2[Ipp] or 0) + GetValueEX(it.p, VT, ds)^2
if it.l >= P and t_ma then
return math.sqrt((sum2[Ip]-(sum2[Ippp] or 0) - 2*t_ma*(sum[Ip]-(sum[Ippp] or 0)) + P*(t_ma^2)) / P)
end
end
end
return nil
end
end
Из которого непосредственно само вычисление отклонения:
Код
sum[Ip]=(sum[Ipp] or 0) + GetValueEX(it.p, VT, ds)
sum2[Ip]=(sum2[Ipp] or 0) + GetValueEX(it.p, VT, ds)^2
И итоговая формула вычисления:
math.sqrt((sum2[Ip]-(sum2[Ippp] or 0) - 2*t_ma*(sum[Ip]-(sum[Ippp] or 0)) + P*(t_ma^2)) / P)
Я понял что ваша формула имеет иной вид, математически её можно записать примерно так:
соответственно - формула другая, дает другие значения ( не совпадающие с оригинальной формулой) в итоге значения верхней и нижней полос отличаются
Хотелось бы услышать ваши обьяснения - что это за формула, откуда она взята, чем обьясняется её использование, для того чтобы лучше понимать её смысл и смысл использования полос Боллинджера вашего вида.
Кстати нехитрым путём я подправил ваш скрипт чтобы он рассчитывал отклонение по стандартной формуле:
Код
function SD() --Standard Deviation ("SD")
local SD_MA=MA()
local sum = {}
local sum2 = {}
local sum3 = {}
local it = {p=0, l=0}
return function (I, Fsettings, ds)
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 20)
local M = (Fsettings.Metod or SMA)
local VT = (Fsettings.VType or CLOSE)
if (P>0) then
if I == 1 then
sum = {}
it = {p=0, l=0}
end
local t_ma = SD_MA(I, {Period=P, Metod = M, VType=VT}, ds)
if CandleExist(I,ds) then
if I~=it.p then it={p=I, l=it.l+1} end
local Ip,Ipp,Ippp = Squeeze(it.l,P),Squeeze(it.l-1,P),Squeeze(it.l-P,P)
sum[Ip]=(sum[Ipp] or 0)+(GetValueEX(it.p, VT, ds)-(t_ma or 0))^2
if it.l >= P and t_ma then
return = math.sqrt((sum[Ip]-(sum[Ippp] or 0))/P)
end
end
end
return nil
end
end
И этот индикатор стал давать значения (и рисовать на графике линии соответственно) в точности совпадаемые с рассчетными в скрипте по оригинальной формуле, только лишь что из за этого места
Код
sum[Ip]=(sum[Ipp] or 0)+(GetValueEX(it.p, VT, ds)-(t_ma or 0))^2
Значения полос неправильны в самом начале диапазона на нескольких самых первых свечах, это можно поправить но нет смысла поскольку те давние свечи и значения индикаторов по ним уже никому ненужны а далее же на всем остальном диапазоне расчет идет правильный
И что интересно - мои, т.е. оригинальные полосы Боллинджера, на всём графике во многом совпадают с полосами вычисляемыми вашим скриптом но только в местах где свечи начинают убывать, т.е. снижаться, ваши полосы резко сужаются следуя за свечами, оригинальные же полосы сужаются плавно и неспеша, что исключает вероятность ложных пробоев, зато после окончательного сужения полосы совпадают и с началом нового расширения расширяются одинаково так же полностью совпадая дос следующего сужения и т.д. В общем хотелось бы услышать обьяснение по поводу вашей формулы расчета
Лол ))))) Вообщем с помощью отладки вашего скрипта индикатора AD.lua выяснил что итоговое значение AD он выдает суммируя мгновенные значения (по формуле для каждой свечки) за весь диапазон доступных с биржи свечей, от самой последней до самой первой, однакож вам видимо трудно было об этом сразу сказать.. ))))
А у меня такой строчки нету и все работает, короче у меня все прописано вот так: package.cpath = getScriptPath () .. "\\ssl\\?.dll;C:\\ZeroBraneStudio\\bin\\clibs\\?.dll;C:\\ZeroBraneStudio\\bin\\?.dll;C:\\ZeroBraneStudio\\bin\\socket\\?.dll" package.path = getScriptPath () .. "\\?.lua;"..package.path
В папке квика - папка lua, в ней папки socket и ssl в них я закинул dll'ки, ssl.lua в самой папке lua, надо подумать какой прогой можно сделать чтобы сделать удобный листинг папок и закинуть их сюда, Но есть еще один удобный выход который я и предпочел т.к. у меня либа ssl хоть и подключилась и работает однако она доставляет неудобства - с ней скрипт очень долго стартует - минут 5 наверно, почему непонятно, поэтому я от неё отказался и воспользовался прогой Stunnel, ищи в инете, она создает прокси SSL туннель и переправляет направляемый на неё траффик по ssl, и тогда в скрипте
ты отправляешь через неё мыло вот так:
function sendmail (message) local r,e
r, e = smtp.send{ from = "somemail@mail.ru", rcpt = "recepient@mail.ru", source = smtp.message(message), password = "password", user = "somemail", domain = "mail.ru", server = "127.0.0.1", port = 25, }
Nikolay написал: Я тоже подозреваю, что с интерпретатором lua в Квике не все ладно. У меня также из ZeroBraneStudio все работает.
С интерпретатором луа в квике все ладно, просто там есть нюансы, у меня были все эти проблемы и я их решил, помоему ты всетаки не все скопировал из окна ошибок, полностью все оттуда скопируй и вставь сюда, или лучше сделай скрин и выложи
К томуже количеством свечей по которому рассчитывается AD не является количество свечей отображаемых на графике - я хотьь увеличиваю хоть уменьшаю диапазон отображаемого графика, т.е. кол-во свечей на графике, но знаения AD для каждой свечи остаются неизменными, отсюда вывод что количество свечей у вас в индикаторе фиксированное но не пойму где оно задается
Только вот непойму где у вас для индикатора AD определяется количество свечей по которым он рассчитывается? В настройках индикатора на графике нет ничего связанного с выбором периода для расчета, в скрипте AD.lua я тоже чтото ничего связанного с определением диапазона расчета (т.е. с количеством свечек по которому он рассчитывается) невижу
Nikolay написал: Я подключил все библиотеки, socket подключается нормально. Но при подключении ssl, не находит ssl.core. ssl.lua, собственно, и пытается его включить local core = require("ssl.core")Т.е. нужна папка \ssl а в ней файл core.dll
Скопируй из квика из окна "Ошибки выполнения скрипта" то что там пишется при твоей попытке выполнить скрипт и выложи это сюда"
Sergey Gorokhov написал: Следовательно n-1 это предыдущая свечка.
Хорошо - значит если свечек пять то тогда получается - для 5ой (последней) свечи: CumAD = ADn + CumADn-1 где CumADn-1 это CumAD для 4ой свечи и т.д. в итоге каким же тогда будет CumAD для последней, 1ой, свечи? Получается что для 1ой свечи CumAD = ADn и он же будет CumADn-1 для 2ой свечи правильно? т.е. в вашем индикаторе A/D и индикаторе Чайкина они рассчитываются от выбранного интервала (количества свечей взятых для рассчета)?
Sergey Gorokhov написал: Нет никакого периода. n в формуле обозначает текущую свечку для которой происходит расчет.Например если свечек 5 значит n=5
Тут опять непойму - что же есть тогда tmp.pp (CumADn-1) из tmp.p = CLH/HL + (tmp.pp or 0)? т.е. согласно вашей формуле CumAD = ADn + CumADn-1 Для каждой свечи можно получить только одно значение ADn согласно значениям цен (открытия закрытия и т.д.) и обьема этой свечи чтоже вы тогда прибавляете к ADn в качестве CumADn-1 если говорите что CumADn-1 тоже для этой же свечи?
Sergey Gorokhov написал: Документация к терминалу в файле info.chm, или можно открыть нажав F1Формулы к индикаторам приведены в следующем разделе:
Ясно спасибо, нетуда смотрел, скажите еще пожалуйста: 1) За какой период получается суммируются вычисленные значения AD? Чему равно n-? 2) Для чего это делается? В литературе по тех.анализу я ненашел ничего о суммировании этого индикатора с его предыдущими значениями, хотя литературы очень много всю ее пересмотреть сложно, можно у вас попросить ссылку на литературу по которой у вас сделан индикатор AD, т.е. с сумрованием тогового значения за n периодов?
Да точно tmp.p = CLH/HL + (tmp.pp or 0) - это и есть CumAD = ADn + CumADn-1
Изменил эту строчку на tmp.p = CLH/HL в файлах AD.lua и CO.lua после чего индикатор AD стал совпадать с моим расчетным но CO по прежнему несовпадает хотя отличается ненамного, у себя CO я рассчитываю как
CO = SMA (AD,3) - SMA(AD,10) - где SMA - среднеарифметическое суммы индикаторов AD за периоды 3 и 10
у вас формула в CO.lua в functions CO() такая же - return rS_MA - rL_MA В настройках индикатора метод подсчета средней - SMA я естественно выставил, почему несовпадение непойму
Ну и хотел еще добавить - ваш индикатор A/D («Накопление/распределение») вовсе не оригинальный индикатор A/D разработанный Ларри Вильмсом в 1972 и вычисляемый по формуле
A/D = ( ( C - O) / ( H - L) ) * V
Ваш индикатор A/D не что иное как индикатор аккумуляции/распределения VA Чайкина (Volume Accumulation) - накопленный обьем ( т.е. не осциллятор а индикатор)
Zoya Skvorcova написал: С этой ошибкой надо разбираться со стороны брокера.
Понятно, ну брокеру я уже написал просьбу - обновить наконец таки свой квик, дальше все зависит от их желания, ну а писать им что я такой хитрый взял у разработчиков самый последний квик и прикрутил его к вам (их серверу) я конечно же не буду )))
Sergey Gorokhov написал: Да но дальше еще сложение, согласно формуле (которая если что есть в документации)CumAD = ADn + CumADn-1,
Где в вашей документации эта формула? Ненашел, Где в скрипте индикатора AD.lua этот код CumAD = ADn + CumADn-1 ? В функции AD () непосредственно такого ненаблюдаю
function AD() --Accumulation/Distribution ("AD") local tmp = {pp=nil, p=nil} local it = {p=0, l=0} return function (I, Fsettings, ds) if I == 1 then tmp = {pp=nil, p=nil} it = {p=0, l=0} end if CandleExist(I,ds) then if I~=it.p then it={p=I, l=it.l+1} tmp.pp = tmp.p end local CLH=(2*GetValueEX(it.p,CLOSE,ds)-GetValueEX(it.p,HIGH,ds) - GetValueEX(it.p,LOW,ds))*GetValueEX(it.p,VOLUME,ds) local HL=GetValueEX(it.p,HIGH,ds) - GetValueEX(it.p,LOW,ds) if HL==0 then tmp.p = tmp.pp or 0 else tmp.p = CLH/HL + (tmp.pp or 0) end if it.l==1 then if HL == 0 then return 0 else return CLH/HL end else return tmp.p end end return nil end end
Вижу только в
if HL==0 then tmp.p = tmp.pp or 0 else tmp.p = CLH/HL + (tmp.pp or 0) end
Sergey Gorokhov написал: Функции для получения данных с графиков описаны в документации QLUA.chm
Читал,
getCandlesByIndex Функция предназначена для получения информации о свечках по идентификатору (заказ данных для построения графика плагин не осуществляет, поэтому для успешного доступа нужный график должен быть открыт): Формат вызова: TABLE t, NUMBER n, STRING l getCandlesByIndex (STRING tag, NUMBER line, NUMBER first_candle, NUMBER count) Параметры: • tag – строковый идентификатор графика или индикатора,
что указывать в поле tag? Пробовал указывать название индикатора из поля name, т.е. для CO из CO.lua Settings = { Name = "*CO (Chaikin Oscillator)",
Указал tag = "*CO (Chaikin Oscillator)" т.е.
t,n,l = getCandlesByIndex( "*CO (Chaikin Oscillator)", data[Security]:Size(),1,1) В итоге t,n,l мне ничего не вернули, data[Security]:Size() - номер последней свечки, график инструмента с добавленным индикатором открыт, хотя конечно понятно что в аргументах getCandlesByIndex нехватает указания ему графика, откуда функция знает с какого графика ей взять значения индикатора? Но как это все правильно оформить?
Всех приветствую, опять вопрос по индикаторам, стал изучать скрипт индикатора Accumulation/Distribution AD.lua из дополнительно предоставленных индикаторных скриптов для графиков любезно предоставленных компанией ARQATECH https://pastebin.com/ZCjRxVd9 Вот подскажите пожалуйста, функция OnCalculate, из описания - функция вызывается при поступлении новой или изменении существующей свечки в источнике данных для индикатора, возвращает два аргумента - один из них координата x другой координата y я так понимаю, т.е. первый - местоположение свечки в рядяах свечей, второй фактически само значение индикатора
Я запрограммировал в своем скрипте получение индикатора AD непосредственно из значений свечей и в итоге мои значения AD не такие как показывает ваш индикатор на графике, причем что как у меня так и у вас сама формула расчета AD одинаковая -
У вас она в скрипте выглядит как:
function AD() --Accumulation/Distribution ("AD") local tmp = {pp=nil, p=nil} local it = {p=0, l=0} return function (I, Fsettings, ds) if I == 1 then tmp = {pp=nil, p=nil} it = {p=0, l=0} end if CandleExist(I,ds) then if I~=it.p then it={p=I, l=it.l+1} tmp.pp = tmp.p end local CLH=(2*GetValueEX(it.p,CLOSE,ds)-GetValueEX(it.p,HIGH,ds) - GetValueEX(it.p,LOW,ds))*GetValueEX(it.p,VOLUME,ds) local HL=GetValueEX(it.p,HIGH,ds) - GetValueEX(it.p,LOW,ds) if HL==0 then tmp.p = tmp.pp or 0 else tmp.p = CLH/HL + (tmp.pp or 0) end if it.l==1 then if HL == 0 then return 0 else return CLH/HL end else return tmp.p end end return nil end end
((2*datatb:C(candle)-datatb:L(candle))-(datatb:H(candle)))/(datatb:H(candle)-datatb:L(candle)))*datatb:V(candle) Где datatb - таблица с получаемыми значениями свечей Так вот по вашему индикатору AD значения получаются какие то совсем астрономические - скажем для образца возьмем график ИнтерРао с дневным периодом - У вас у меня 08.05.19 6006783,524897 -129967.14285714 07.05.19 6084763,810612 -9633.2300884955 Ну и так далее
Ну и соответственно рассчитываемые по индикатору AD значения осциллятора Чайкина тоже какие то совсем другие, хотя его формула и у меня и у вас тоже абсолютно одинаковая
У вас у меня 08.05.19 11650,613 -18427.413178682 07.05.19 7774,461856 -19034.307618411 Ну и так далее
Раз формулы одинаковые и значения свечей тоже то значит полученные из формулы значения в вашем скрипте еще и после формулы зачем то дополнительно меняются изучив скрипт AD.lua не трудно догадатся что изменяются они в функции OnCalculate в функции ConvertValue(Settings, func(Index, Settings)) где func(Index, Settings) это переименованная в Init функция AD():
function Init() func = AD() return #Settings.line end
function OnCalculate(Index) local Out = ConvertValue(Settings, func(Index, Settings)) local HL = tonumber(Settings.Horizontal_line) if Out then if Out > (HL or 0) then return HL,Out,nil else return HL,nil,Out end else return HL,nil,nil end end
И вот сама функция ConvertValue
function ConvertValue(T,...) local function r(V, R) if R and string.upper®== "ON" then R=0 end if V and tonumber® then if V >= 0 then return math.floor(V * 10^R + 0.5) / 10^R else return math.ceil(V * 10^R - 0.5) / 10^R end else return V end end if arg.n > 0 then for i = 1, arg.n do arg[i]=arg[i] and r(arg[i] * ((T and T.Multiply) or 1), (T and T.Round) or "off") end return unpack(arg) else return nil end end
Будьте любезны обьясните пожалуйста что она делает и зачем? Зачем она дополнительно меняет уже готовое значение функции AD?
Здравствуйте, подскажите пожалуйста возможно ли в свой скрипт получить значения индикатора из открытого графика? (я так понимаю что график должен быть открыт и нужный индикатор на него должен быть добавлен) Кое что тут есть https://forum.quik.ru/messages/forum13/message5399/topic564/#message5399
Есть два пути 1) в самом индикаторе брать данные с другого графика по Идентификатору. Таким образом индикатор сможет использовать любой другой график с указанным Идентификатором. 2) в самом индикаторе добавить код другого индикатора как функцию и брать значения из нее.
Не совсем пойму как это делается, можно поподробнее?
Здравствуйте, я обслуживаюсь у брокера который использует уже несколько подустаревшую версию квика - 7.19, в этой версии квик выдает ошибку при создании копии графика, я как то обращался сюда на форум по этому вопросу, мне тут подсказали что необязательно использовать квик от брокера, я намек понял - скачал с arqatech.com самый последний квик - 7.27 установил и перекинул в него все что касается авторизации квика с сервером моего брокера - файлы ini txk и еще некоторые его dll, вообщем все работает норм но время от времени выскакивают мессиджи: "Недостаточно лицензий", выскакивает как правило при запуске квика, но иногда невыскакивает, и в процессе работы иногда https://cloud.mail.ru/public/Ka27%2Fb8ZiqJWwi "Нарушен порядок рассылки информационного сообщения" обычно выскакивает в процессе работы https://cloud.mail.ru/public/KJmh%2F2hUjVNsYi При работе оригинального брокерского квика - 7.19 скачанного с его сайта таких мессиджей не возникало Вроде все работает нормально, эти сообщения не мешают работать но все таки хотелось бы знать что они значат и возможно ли их исправить
Здравствуйте опять, вообщем вы мне там в личном сообщении конечно же толком ничем не помогли но я уже разобрался в чем была проблема - думаю вам это пригодится чтобы потом другим пользователям с такой же проблемой помочь да и может в эту ветку кто зайдет и прочитает - т.к. судя по форуму эта проблема часто случается но толком не решена. Вообщем у меня была установлена Windows 10 Build 1607, билд винды особенно 10-ки имеет большое значение, чтобы его проверить необходимо: Пуск - выполнить - msconfig - вкладка сервис - самая верхняя строчка "О программе", Выбранная команда - C:\Windows\system32\winver.exe Или можно сразу - Пуск - выполнить - winver И смотрим свой билд и в этом билде 1607 DDE Server почему то неработал совсем, никакое штудирование многочисленных форумов в инете и пляски с бубном непомогли, только что обнаружил на многих иностранных форумах что и у других людей есть проблемы с DDE в билде 1607, пробовал другие проги которые выводят по DDE в Excel - ничто не выводит, тут же попробовал в Windows 10 Build 1709 - все выводится по DDE без проблем, попробовал в Windows 7 - так же все без проблем. Но тут есть еще одно НО - разрядность проги которая выводит по DDE должна быть такой же как и разрядность установленного MS Office, а т.к. QUIK 32-х битный то и Excel должен быть из MS Office x86, но у меня на Windows 10 Build 1607 изначально был установлен MS Office 64 битный, для работы с QUIK я его снёс вычистил от его остатков винду установил 32-х битный оффис но вполне могло быть что 64х битный офис повредил DDE, так что оно могло остатся только под 64бит, так что еще одна рекомендация - не ставить вообще на систему 64битный MS Office
Александр Копяткевич написал: После сообщите нам о результате. Если ошибка все равно будет появляться, то нужно будет прислать архив папки с терминалом QUIK без ключей нам на quiksupport@arqatech.com с ссылкой на эту ветку форума.
Ошибка по прежнему повторяется, выслал вам архив QUIKа, и теперь после всех манипуляций с попытками вывода на DDE сервер посоветованных вами QUIK при каждом запуске сам теперь открывает EXCEL и пытается что то туда вывести, но у него как и раньше ничего не получается, с прежним сообщением об ошибке, как от этого избавиться?
Александр Копяткевич написал: Если возможно, пришлите так же файл Excel, в который Вы пытаетесь сделать экспорт данных.
Только непойму о чем скажет этот файл, абсолютно новый чистый xlsx файл, уже как только не пробовал листы называть, нехочет квик ничего в эксель выводить, проблема видимо во взаимодействии квика с DDE сервером https://cloud.mail.ru/public/MQhB%2Fizwu35p3a
новичок написал: ну как можно не знать про 8-е марта? ну как?
Что незнать? Незнать почему квик целый день нормально работал, коннектился, а вечером после реконнекта пошли ошибки? Впрочем на ММВБ действительно мог быть выходной я чтото даже не подумал но тем не менее терминал обычно даже в нерабочее время коннектится нормально, просто торгов нет, и кстати когда квик перестал коннектится через вебквик я зашёл нормально
Александр Копяткевич написал: Пришлите, пожалуйста, скриншот формы "Вывод через DDE сервер" когда Вы уже выполните все действия и останется только нажать кнопку "Начать вывод". Возможно, Вы не совсем верно ее заполняете.
Александр Копяткевич написал: Уточните, пожалуйста, если не заполнять поля и выставить настройку "Запускать приложение DDE сервера автоматически", то при нажатии на кнопку "Начать вывод" ошибка тоже появляется?
Да, попробовал тоже появляется - "Не удалось установить DDE соединение с сервером 'excel'. Либо не запущен 'Книга1', либо в него не загружен лист 'Таблица сделок'. Таблица 'Таблица сделок' '"
И кстати галочка "Игнорировать DDE-запросы от других приложений" в экселе снята была изначально Office 2010 Standart, как я вижу из форума эта проблема имеет место быть уже давно но однозначного решения еще ненайдено, может вы написали и отладили эту функцию, вывода через DDE сервер, используя ранние редакции MS Office? 2003 например?
Александр Копяткевич написал: Попробуйте выполнить следующие действия:1. Если Вы уже создали файл Excel, то запустите этот файл.2. Укажите путь до Excel файла в окне "Вывод через DDE сервер".3. Сотрите все символы, за исключением самого имени файла. В поле "Лист" укажите название листа в файле (в Вашем случае "Таблица сделок", но предварительно убедитесь, что имя листа такое и есть)
И с путём и без пути пробовал, имя файла правильное, лист в нём с таким именем существует, но все равно не выводит, причем если Эксель не открыт то он открывается, открывается этот файл для вывода но выскакивает эта ошибка
Здравствуйте, помогите, QUIK не выводит таблицы по DDE в Excel - в контекстном меню нажимаю "Вывод через DDE сервер", при незаполненных полях QUIK сам создает новую книгу и лист в EXCEL, при заполненных выбирает их но результат одинаков при попытке вывести данные - выскакивает ошибка -
Не удалось установить DDE соединение с сервером 'excel'. Либо не запущен 'C:\QUIK\Книга2.xlsx', либо в него не загружен лист 'Таблица сделок'. Таблица 'Таблица сделок'
Почему у вас нет модерирования на сайте, почему такой серьезный ресурс допускает троллинг и спам на сайте как выше? Где возможность пожаловаться на пользователя?
Здравствуйте господа разработчики, в пятницу вечером, 08.03.2019, примерно начиная с 17.30 по моск.времени у меня в квике при работе с брокером Сбербанком случилась следующая неприятность: Квик весь день работал нормально - с утра законнектился и пошел работать, по некоторым своим соображениям я захотел перезапустить квик после чего при попытке коннекта получил следующую ошибку:
Application error: Net error: Удаленный хост принудительно разорвал существующее подключение. Сервер по указанным сетевому адресу и порту не обнаружен. Возможно, Вы пытаетесь установить соединение в нерабочее время, или же указываете неверные сетевой адрес и порт. https://cloud.mail.ru/public/3SDx%2F2JEukHgbA
причем после повторной попытки коннекта квик законнектился, потом почти сразу мне понадобилось еще раз перезапустить квик и после это эту ошибку при попытке коннекта я уже получал непрерывно - в ответ на каждую ошибку, пробовал законнектится много много раз, вплоть до окончания торговой сессии - все бесполезно одна и та же ошибка, даже попробовал из скачанного дистрибутива от Сбербанка установить новый чистый квик в новую папку - и он при коннекте стал упорно выдавать ту же ошибку, т.е. проблема заключалась только на стороне серверной части Квика у Сбербанка, в итоге был потерян час драгоценного времени, возможность выполнить важную работу, сегодня же утром 09.03.19 попробовал законнектится, в старой копии Квика, не в новой, и все нормально законнектилось с первого раза без всяких ошибок, еще сразу же как только проблема возникла гуглил - оказывается такая проблема не нова и ей уже много лет, и пока решения нет так как её решение зависит от вас, вот например https://forum.finam.ru/posts/t12966-Kvik-ne-mozhe-zakonnektit-sjaКлиенты Финам немогли зайти через Квик зато могли зайти через Транзак
Александр Копяткевич написал: К сожалению, в данной реализации можно получить только параметры Стоимость портфеля, Мин.маржа и Нач.маржа, и по ним уже рассчитать УДС.Да, в функции getPortfolioInfo эти параметры получить нельзя. Однако, можно их получить, используя функцию getPortfolioInfoEx. Рекомендуем использовать именно getPortfolioInfoEx.
Уже разобрался - надо было в getPortfolioInfoEx указать тип лимита - 2, что соответствует Т2, и там все есть - и Мин.маржа и Нач.маржа, и параметр fundslevel это видимо и есть УДС, только что странно что он не описан в руководстве по Qlua
Александр Копяткевич написал: К сожалению, в данной реализации можно получить только параметры Стоимость портфеля, Мин.маржа и Нач.маржа, и по ним уже рассчитать УДС.Да, в функции getPortfolioInfo эти параметры получить нельзя. Однако, можно их получить, используя функцию getPortfolioInfoEx. Рекомендуем использовать именно getPortfolioInfoEx.
Я уже понял что придется рассчитывать самому, только вот что странно и getPortfolioInfoEx у моего брокера выдает мне почти такую же таблицу как сверху, т.е. все кроме тех мест где я указал - "реальная сумма", причем эта сумма выдается только по T0, все остальное - нули, видимо и Мин.маржу и Нач.маржу придется тоже самому рассчитывать
Подскажите пожалуйста как можно получить значение УДС? Как я вижу в функции getPortfolioInfo есть возвращаемый параметр fundslevel но что странно он у меня все время 9.99 сколько бы при этом ни был реальный УДС в таблице клиентского портфеля, причем что тоже странно что этот параметр не описан в руководстве по Qlua, можно конечно рассчитать УДС самому по формуле УДС = (Стоимость портфеля - Мин.маржа)/(Нач.маржа – Мин.маржа) но для этого надо получить стоимость портфеля, мин.маржу, нач.маржу а они все у меня в функции getPortfolioInfo имеют значения 0, хотя опять же в терминале в таблице клиентского портфеля они совсем не 0 Вообще getPortfolioInfo все время мне возвращает вот только такие значения: (У одного из известных брокеров, не демо-счет)
Конечно регистрируйте, у ваших конкурентов - Transaq уже давно есть такая возможность, одним кликом по инструменту открывается график с шаблоном в котором есть ВСЕ - и индикаторы и прочее, да и ещё много каких удобств в transaq есть и в этом плане вы от них к сожалению отстаете
Всех приветствую, подскажите пожалуйста - возможно ли чтобы сохранить настройки графика в шаблон со всеми имеющимися на нем индикаторами и их настройками а потом чтобы этот шаблон по умолчанию применялся к новым открываемым графикам, вместе с индикаторами? Такая возможность сохранения текущих настроек графика в шаблон имеется, я её применял, но сохраненный шаблон применяется к новым графикам без индикаторов, только временной интервал и еще какие то мелочи, раскраска линий вроде и отметки сделок заявок и пр.на графике, а это очень плохо поскольку заново на каждом графике открывать по новой кучу всех своих используемых индикаторов и редактировать все их настройки это как то совсем не хорошо
В момент выполнения строки registry[s] = ctx: ctx= SSL context: 0D72EE88 тип - userdata s = SSL connection: 0D848F00 тип - userdata sock = tcp{client}:0D846E88 setfd=nil Вообщем мне кажется что это связано с квиковским интерпретатором луа, т.к. операция registry это сохранение любых значений C кода в специальной общей таблице для всех выполняемых С кодов, вот тут в чем о и проблема, т.к. в других интерпретаторах, том же Zerobrane, такой проблемы нет
SDL написал: Цитата s_mike@rambler.ru пишет: Серверов, не нуждающихся, например, в TLS/SSL, уже мало и количество их уменьшается. Обычно это древние сервера. Дописывать библиотеку для поддержки новых стандартов, как я понимаю, никто не собирается.Главное не отчаиваться и слишком быстро не сдаваться.Качаем модуль LuaSec:Проект: https://github.com/brunoos/luasec Бинарники можно взять тут: http://love2d.org/forums/viewtopic.php?f=5&t=76728 . Нужны 2 файла - ssl.dll и ssl.lua.Использует библиотеки OpenSSL libeay32.dll и ssleay32.dll. Скачать, если нет, и не забыть обеспечить к ним доступ - через окружение (PATH) или можно кинуть в папку с QUIK.Подключаем: Код package.path = ... package.cpath = ... ssl = require "ssl" Добавляем вот такую функцию: Код function sslCreate() local conn = { sock = socket.tcp(), connect = function(self, host, port) local r, e = self.sock:connect(host, port) if not r then return r, e end self.sock = ssl.wrap(self.sock, {mode = 'client', protocol = 'tlsv1'}) return self.sock:dohandshake() end }
local fnIdx = function(t, key) return function(self, ...) return self.sock[key](self.sock, ...) end end
return setmetatable(conn, {__index = fnIdx}) end ... и отправляем:Кодsocket.smtp.send { from = ..., rcpt = ..., source = ..., server = "smtp.mail.ru", port = 465, user = "user", password = "password", create = sslCreate }И еще вкратце, что это за безобразие такое. Вся соль в возможности smtp.send() luasocket'а (см. доки) задать свою функцию создания сокета для отправки сообщения (create = sslCreate), который по умолчанию делается библиотекой просто как socket.tcp(). Мы делаем то же самое, но только обертываем его в подмененном методе connect, где нужно "договориться" с сервером по протоколу SSL. Всё. Еще в этой функции код для доступа к остальным методам сокета, ведь далее luasocket будет работать с ним как со стандартным.С mail.ru, например, работает без проблем.
Здравствуйте, взял все что необходимо для работы с сокетами SMTP и SSL из ZerobraneStudio и закинул в QUIK, закинул все нужные библиотеки core.dll socket.lua smtp.lua ssl.dll ssl.lua по нужным местам, скопировал ssleay32.dll и libeay32.sdll, скопировал Qlua.dll в lua51.dll, сделал все по рецепту автора, при выполнении скрипт в QUIKе отваливается с сообщением " Lua run time error occurred.", провел отладку выполнения скрипта через Decoda - результат такой мой скрипт выполняется нормально, потом доходит до отправки емейла - тут тоже все нормально, доходит до строчки create = sslCreate дальше переходит в функцию function sslCreate() дальше при идет нормально и в один из моментов когда в файле ssl.lua доходит до строчки № 134 registry[s] = ctx весь скрипт в QUIKе тваливается с вот этой вот ошибкой " Lua run time error occurred."
ssl.lua строчка 134 registry[s] = ctx
Код
local function wrap(sock, cfg)
local ctx, msg
if type(cfg) == "table" then
ctx, msg = newcontext(cfg)
if not ctx then return nil, msg end
else
ctx = cfg
end
local s, msg = core.create(ctx)
if s then
core.setfd(s, sock:getfd())
sock:setfd(-1)
registry[s] = ctx
return s
end
return nil, msg
end
При том что проверил в ZerobraneStudio мой кусок кода отправляющий емейл и функция автора sslCreate() работают нормально - емейл отправляется без проблем, у кого будут какие соображения в чем проблема?
нет написал: Подскажите, пожалуйста, как вызвать саму функцию RSI?
Её как то можно получить из индикаторов графиков, я не стал разбираться как и написал функцию RSI сам с нуля основываясь на получаемые значения цен из свечей
Всем доброго времени суток, подскажите плиз как можно узнать тип произошедшей сделки в скрипте, в частности в функции ontrade, была ли это сделка по корткой позиции ( шорт покупка или продажа) , т.е. с использованием взятых в долг ценных бумаг, или сделка по длинной позиции (лонг покупка или продажа), это конечно можно сделать если задать скрипту присваивать при совершении транзакции соответствующий идентификатор этой транзакции и по этому идентификатору узнавать её в ontrade, но если я совершаю сделку вручную, а не скрипт, а скрипт при этом работает в фоне и записывает мои сделки, тогда я немогу обьяснить скрипту какого типа это была сделка, но надо чтобы он как то сам распознал что это была за сделка, что то ненашел в описаниях таблиц depo_limits, trades, orders ничего чтобы узнать что это был за тип сделки кроме side_qualifier в таблице возвращаемой ontrade но ним еще не все ясно, помоему он у меня все время "0" при любой сделке
Всем доброго времени суток, подскажите кто знает, возможно ли в QUIKе сделать две вещи: 1. Автоматическое возобновление работы скрипта после разрыва связи с сервером и ее восстановления квиком, а то бывает рвется связь, скрипт останавливается - по той причине что в в этот момент не смог получить какие нибудь данные с сервера, но скрипт то об этом не знает а просто данные которые он запрашивал по причине их неполучения с сервера имеют значение nil, в результате из за этого скрипт отваливается с ошибкой, и после реконнекта квика с сервером он уже сам не запустится, и квик его тоже не собирается запускать, а пихать через строчку if isconnected()==1 then .... тоже не дело, в цикле main() я то такую строчку сделал но вот если команды внутри цикла уже начали выполнятся то обрыв связи и отвал скрипта. 2. Возможно ли приостанавливать скрипт по временным условиям (нерабочие часы и дни биржи) и также возобновлять его работу по этим условиям (наступление времени торговой сессии)
Вообще я такую временную приостановку в цикле main() сделал
while isConnected()~=1 or нерабочее время do
sleep (60000)
end
где нерабочее время - функция путем нехитрых вычислений и системного времени выдающая true или false но в итоге в нерабочее время весь квик просто зависает с курсором в виде крутящегося кругляшка а на следующий день при наступлении рабочего времени не развисает функция времени у меня 100% рабочая много раз проверял багов там быть не может
Извините за глупый вопрос - но что такое клиенты типа МД? ))) И как мне в будущем на других счетах (Тем более на реальных) узнавать МД ли я или нет? Мелочь но это может быть очень важно