VPM, вот этот вариант можно сделать еще быстрее: это ваш вариант
Код
---- 3. Простой вариант с переменной currentIndex
local F = {} for i = 1, 1000 do F[i]=0 end
size=1000000
local N=1024
local currentIndex = 1
local function addElement(x) F[currentIndex]=x currentIndex=currentIndex+1 if currentIndex>N then currentIndex=1 end return F end
local start_time = os.clock()
for i = 1, size do addElement(i) end -- повторяем 1 млн.
local end_time = os.clock()
print("4. Время выполнения для варианта 3:", end_time - start_time, "секунд")
это мой вариант:
Код
local N=1024
local F = {} for i = 1,N do F[i]=0 end
size=1000000
local currentIndex = 1
local function addElementNK(x) F[currentIndex&(N-1)]=x currentIndex=currentIndex + 1 return F end
local start_time = os.clock()
for i = 1, size do addElementNK(i) end -- повторяем 1 млн.
local end_time = os.clock()
print("5. Время выполнения для варианта NK:", end_time - start_time, "секунд")
это результат:
Код
4. Время выполнения для варианта 3: 0.046 секунд
5. Время выполнения для варианта NK: 0.043 секунд
Пару слов без протокола. В этих функциях лишним является оператор return F т к нет смысла возвращать то, что изначально определено вне функции тоже самое относится и к переменной currentIndex нет смысла ее индексировать внутри функции, можно снаружи в моем случае все можно записать так:
Код
local N=1024
local F = {} for i = 1,N do F[i]=0 end
size=1000000
local currentIndex = 1
local start_time = os.clock()
for i = 1, size do F[currentIndex&(N-1)]=i;currentIndex=currentIndex + 1 end -- повторяем 1 млн.
local end_time = os.clock()
print("6. Время выполнения для варианта NK без функции:", end_time - start_time, "секунд")
результат:
Код
6. Время выполнения для варианта NK без функции: 0.014 секунд
Куда все подевались?
Пользователь
Сообщений: Регистрация: 30.01.2015
12.07.2024 17:23:37
а это время вычисления для 1 млн.элементов для циклического массива в 1000 элементов для стека указано время push pop для очереди указано время записи и извлечения Lua 5.4
Код
Время выполнения стек 0(сек): 0.048,0.051
Время выполнения очередь(сек): 0.036,0.051
>Exit code: 0
Luajit
Код
Время выполнения стек 0(сек): 0.003,0.001
Время выполнения очередь(сек): 0,0.001
Куда все подевались?
Пользователь
Сообщений: Регистрация: 30.01.2015
12.07.2024 17:18:44
Если интересует производительность, то вот результат запуска скрипта, который выше, в lua 5.4 и luajit ------------- lua5.4
Код
1. Время выполнения для варианта 1: 0.005 секунд
2. Время выполнения для варианта 1a: 0.005 секунд
3. Время выполнения для варианта 2: 0.077 секунд
4. Время выполнения для варианта 3: 0.004 секунд
>Exit code: 0
luajit
Код
1. Время выполнения для варианта 1: 0.001 секунд
2. Время выполнения для варианта 1a: 0.001 секунд
3. Время выполнения для варианта 2: 0.015 секунд
4. Время выполнения для варианта 3: 0 секунд
>Exit code: 0
Все индикаторы на Lua
Пользователь
Сообщений: Регистрация: 30.01.2015
10.07.2024 17:13:20
Цитата
Сергей написал: Благодарю, я так и предположил, что двойной расчёт идет. Написал "костыль", теперь показывает верно, правда только с первого просмотра, после обновления свечи опять слетает, но мне достаточно для анализа. ------------------------------- Создателям QUIK 'респект'
проблема решается путем установки в начальное значение всех переменных при индексе=1 например,так ваш скрипт:
Код
name="*Vet_Rollback"
Settings={Name =name};
function OnCalculate(i)
local Hi,Li=H(i),L(i)
if i==1 then
maxh=0
else
if Hi then
if maxh<Hi then maxh = Hi end
rollback=(Li-maxh)/maxh * 100
message(tostring(maxh..";"..Hi..";"..Li..";"..rollback))
end
end
return rollback
end
function Init()
Settings.line ={ { Color = RGB(153, 204, 0),Type = TYPE_HISTOGRAM,Width = 0}}
return #Settings.line
end
Все индикаторы на Lua
Пользователь
Сообщений: Регистрация: 30.01.2015
10.07.2024 07:15:58
Цитата
Сергей написал: что бы понятнее было, на графике просадка составила -31%, а на индикаторе -36, как от самого последнего хая.
У Вас так и считает скрипт. Т е просадка вычисляется от самого большого High. ------------------- Есть такая особенность в расчетах индикаторов: -------------------- Индикатор при запуске вычисляется два раза. В первый раз в нем запомнится самый большой максимум на графике Во второй раз вы и получите просадку всех значений относительного этого максимума. -------------- Такой способ вычисления индикаторов это такой прикол создателей QUIK. Чтобы жизнь медом не казалась. ------------- Про это писал лет ...надцать назад. Потом еще многие и много. ---------------- Пишите скрипт с учетом этого факта.
Снять защиту с робота на LUA, Снять защиту с робота на lua, привязанного к закрытому счёту
написал: , Вам же nikolz выше ответил с исправленным кодом робота
Да теперь надо адаптировать этого робота под QUICK версии от 11й. За денежку конечно.
Скрипт на луа не надо адаптировать под 11 версию. Вам надо исправить его под свои параметры. ------------------------ Кроме того, этот робот при запуске лезет на какой-то сайт . Я Вас спрашивал в личке об этом , Вы не ответили. ---------------------------- Переделывать этот мутный скрипт нет желание. Сомневаюсь, что он может что-то путное делать.
Все индикаторы на Lua
Пользователь
Сообщений: Регистрация: 30.01.2015
09.07.2024 09:32:35
Цитата
Сергей написал: Settings = { Name = "*Vet_Rollback", line = { { Color = RGB(153, 204, 0), Type = TYPE_HISTOGRAM, Width = 0 }, }}function Init() maxh = 0 return #Settings.lineendfunction OnCalculate(idx) if idx > 1 and H(idx)~= nil then if maxh < H(idx) then maxh = H(idx) rollback = (L(idx) - maxh) / maxh * 100 else rollback = (L(idx) - maxh) / maxh * 100 end message(tostring(maxh).." "..H(idx).." "..L(idx)) message(tostring(rollback)) return rollback end end
При выводе на график выходят те данные, что приходят в месседж. Верно?
Проблема версии 11.2.0.16
Пользователь
Сообщений: Регистрация: 30.01.2015
09.07.2024 09:25:51
11.3.1 полет нормальный.
Проблема версии 11.2.0.16
Пользователь
Сообщений: Регистрация: 30.01.2015
09.07.2024 06:57:21
Обнаружил такой эффект. делаем так:
1) Вызываем QUIK Junior, но не подключаемся к серверу. 2) Открываем любой индикатор в отдельном окне Например ADX 3) Удаляем второе окно В результате QUIK зависает, окно не удаляется. 4) Принудительно убиваем QUIK
Куда все подевались?
Пользователь
Сообщений: Регистрация: 30.01.2015
03.07.2024 19:20:31
Цитата
VPM написал: , Когда Вы голову подымите чуть выше, заметите что я поправил Ваш вариант, и для сравнения выложил альтернативное решение с использованием кольцевого буфера, даже попробовал разный порядок хранения данных. Что лучше, почему лучше, когда какой применять, решает пользователь под свои задачи. А я лишь привожу пример про универсальный способ, и показываю его преимущества, относительно других. Но в любом случае их нужно погонять в условиях когда пропадают свечи, когда вызывается по нескольку раз на одном индексе алгоритмы и прочие радости жизни алгоритмов в квике.
можете ответить кратко на мой вопрос. Чем ваш конкретный вариант на 3 элемента лучше чем тот который я привел. Я просто написал вам то, что элементарно делается. Так делают сортировку 3 элементов. ----------------------- И так ответьте на вопросы: Обсуждаем вот эти две функции:
Код
local ChannelPDF={}
function ChannelPDF:FilterSmooth()
local F = {0, 0, 0} -- кольцевой буфер на 3 элемента
local index = 1
local start = true
return function(I, x)
if I == 1 or start then
F = {0, 0, 0} -- Инициализация значений
index = 1 -- Инициализация индекса
start = false
end
F[index] = x -- Обновление (новое значение)
local y = F[index] + 2 * F[(index - 1 - 1) % 3 + 1] + F[(index - 2 - 1) % 3 + 1]
y = y and (y >= 1 and 0.999 or y <= -1 and -0.999 or x) or y
index = index % 3 + 1 -- Обновление индекса
return y
end
end
Код
function shiftArray (x) local z = F[ 1 ] F[ 1 ] = F[ 2 ] F[ 2 ] = F[ 3 ] F[ 3 ] = x return z end
Чем функция 1 лучше, чем функция 2. Прошу Вас не отвлекаться и не рассказывать мне, где и что Вы раньше написали. Напишите кратко и конкретно здесь --------------- Мой ответ на мой вопрос такой: Функция 1 сложнее, чем функция 2. ------------------ Ваш ответ?
Не работает скомпилированный cURL для QUIK (Lua-cURLv3), но работает в простом lua-интерпретаторе
вам надо написать путь туда, где вы положили эту библиотеку можно сделать так
Код
path="C:/clibs/" -- здесь лежит dll
package.cpath = package.cpath ..path.."?.dll"
Куда все подевались?
Пользователь
Сообщений: Регистрация: 30.01.2015
03.07.2024 18:21:08
Цитата
VPM написал: , Ну смотрите на моем примере выше при использовании двусвязной очереди, все Вами описанные задачи по сути сводятся к одному задать длину и метод извлечения, то есть ввести входные данные, которые можно менять динамически ведя дополнительные расчеты, или жестко установить. А вот что у меня получилось из примера , я в кольцевом буфере попытался поменять порядок хранения данных. Ну в общем то и не получается поменять.
Код
Давайте вернемся к Вашей функции циклического массива на 3 элемента. Я исправил ошибку в своем варианте и он работает. ----------------- Предлагаю не перескакивать с одной задачи на другую, Давайте сначала закончим с Вашим вариантом циклического массива на 3 потом перейдем к связанным или нет спискам. ------------------- Повторю свой вопрос. Чем Ваш вариант лучше по сравнению с указанным мною примером ( могу потом написать еще проще) но давайте закончим с этим. Что не так у меня и что лучше у Вас? прошу подробно объяснить именно про это.
написал: Мне непонятно, в чем его выгода и что же он делает. ------------------Полагаю, что есть другие вариант решения.
Цитата
написал: Классический кольцевой буфер, также известный как циклический буфер или кольцевая очередь, используется для хранения фиксированного количества последних значений в массиве.
Наверняка есть, , выложил свой, я могу в виде класса выложить.
Цитата
написал: Если я правильно Вас понял, то вот элементарное альтернативное решение:Кодlocal F={0,0,0} local function shiftArray(x) local x=F[1] F[1]=F[2] F[2]=F[3] F[3]=x return x end
Массив F имеет размер как у Вас. В нем хранится последние 3 элемента. При записи нового , первый выталкивается. Что не так? И в чем преимущество Вашего решения?
Если Вы загрузите в SciTe это пример он не будет работать. Вот я уже попробовал
Код
local F = { 0 , 0 , 0 }
local function shiftArray (x) local x = F[ 1 ] F[ 1 ] = F[ 2 ] F[ 2 ] = F[ 3 ] F[ 3 ] = x return x end
for I = 1 , 10 do
print (shiftArray(I), F[ 1 ], F[ 2 ], F[ 3 ] )
end
ответы:
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
> Exit code: 0 Time: 0.4064
Пардон, опечатка. ---------------- должно быть так:
Код
local function shiftArray (x) local z = F[ 1 ] F[ 1 ] = F[ 2 ] F[ 2 ] = F[ 3 ] F[ 3 ] = x return z end
---------------------------
for I = 1 , 10 do print (shiftArray(I), F[ 1 ], F[ 2 ], F[ 3 ] )
end
-----------------------
результат:
0 0 0 1
0 0 1 2
0 1 2 3
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
>Exit code: 0
Куда все подевались?
Пользователь
Сообщений: Регистрация: 30.01.2015
03.07.2024 15:55:22
Цитата
VPM написал: Судите сами вот тот же пример. Изменение класса Ehlers.ChannelPDF, чтобы использовать двусвязную очередь для кольцевого буфера.
Код
Называть наверно следует, кольцевая очередь, используется для хранения фиксированного количества последних значений в массиве
Вы правы, я не читаю форумы полностью. Когда зашел, то и прочитал. Спасибо, что написали примеры. ------------------- Возможно не понял Ваши объяснения. попробую задать вопросы снова, если не сложно расскажите свое понимание. -------------------- Возьмем для начала беседы ваш кольцевой буфер на три элемента.
Код
- Метод FilterSmooth
local ChannelPDF={}
function ChannelPDF:FilterSmooth()
local F = {0, 0, 0} -- кольцевой буфер на 3 элемента
local index = 1
local start = true
return function(I, x)
if I == 1 or start then
F = {0, 0, 0} -- Инициализация значений
index = 1 -- Инициализация индекса
start = false
end
F[index] = x -- Обновление (новое значение)
local y = F[index] + 2 * F[(index - 1 - 1) % 3 + 1] + F[(index - 2 - 1) % 3 + 1]
y = y and (y >= 1 and 0.999 or y <= -1 and -0.999 or x) or y
index = index % 3 + 1 -- Обновление индекса
return y
end
end
Мне непонятно, в чем его выгода и что же он делает. ------------------ Полагаю, что есть другие вариант решения. ============= Если мы с Вами говорим об одном и том же, то кольцевой буфер на три элемента позволяет нам получить лишь три последних элемента последовательности чисел. --------------------------- Т е это буфер данных, но его глубина всего три элемента. Верно? -------------------------- Т е это его недостаток, а за это Вы полагаете, получается экономия памяти . Верно? =============== Если я правильно Вас понял, то вот элементарное альтернативное решение:
Код
local F={0,0,0}
local function shiftArray(x) local x=F[1] F[1]=F[2] F[2]=F[3] F[3]=x return x end
Массив F имеет размер как у Вас. В нем хранится последние 3 элемента. При записи нового , первый выталкивается. Что не так? И в чем преимущество Вашего решения?
Куда все подевались?
Пользователь
Сообщений: Регистрация: 30.01.2015
03.07.2024 12:29:28
Цитата
VPM написал: -- Метод FilterSmooth local ChannelPDF={} function ChannelPDF:FilterSmooth() local F = {0, 0, 0} -- кольцевой буфер на 3 элемента local index = 1 local start = true return function(I, x) if I == 1 or start then F = {0, 0, 0} -- Инициализация значений index = 1 -- Инициализация индекса start = false end F[index] = x -- Обновление (новое значение) local y = F[index] + 2 * F[(index - 1 - 1) % 3 + 1] + F[(index - 2 - 1) % 3 + 1] y = y and (y >= 1 and 0.999 or y <= -1 and -0.999 or x) or y index = index % 3 + 1 -- Обновление индекса return y end end
хорошо бы еще пример с доказательством, что это лучше чем , что?
Индикаторы
Пользователь
Сообщений: Регистрация: 30.01.2015
03.07.2024 06:17:50
Цитата
Дмитрий Квази написал: Я может быть не так выражаюсь. Меня не беспокоит время загрузки меня беспокоит что дельта отрисовывается только на том инструменте который активен. Можно это как то исправить, чтобы на всех выбранных инструментах дельта отрисовывалась не зависимо открыт график или нет. Если это в принципе не возможно и дельта будет отрисовываться только на активном графике тогда это вопрос в другом. В квике у меня 10 инструментов на них на всех стоит индикатор. таблица обезличенных сделок идет постоянно. как я понял дельта будет строится только на открытом графике. остальные графики будут ждать пока я на них не перейду. Одновременно на всех 10 инструментах дельта не отрисуется так как активно я выбираю только 1 инструмент я правильно понял?
У Вас открывается всегда один инструмент. Создайте для нескольких инструментов графики. Тогда они будут рассчитываться одновременно. Т е что 10 инструментов считались попробуйте открыть 10 графиков с ними.
Индикаторы
Пользователь
Сообщений: Регистрация: 30.01.2015
02.07.2024 18:32:14
и еще... если будете ставить эксперимент с одним инструментом, то отключите остальные в таблице обезличенных сделок и перегрузите QUIK для чистоты эксперимента.
Тоже посмотрел Ваш ролик. Так как у Вас экраны белые после перехода на инструмент, то это говорит о том что Ваш индикатор долго считает и тормозит КВИК Вполне реально, так как работа с таблицей обезличенных сделок именно к этому и приведет. Можно сделать следующее так. Откройте диспетчер задач и попереключайте инструменты не сворачивая окон. Посмотрите как сильно будет QUIK грузить процессор.
Индикаторы
Пользователь
Сообщений: Регистрация: 30.01.2015
02.07.2024 13:56:24
Цитата
Дмитрий Квази написал: У меня установлен платный индикатор дельты. Вы хотите, чтобы я вам прислал корень программы вместе с ним? 👍 Я вам описал проблему. Не прогружаються данные на не активных вкладках. Могу прислать корень программы без индикатора
попробуйте открыть таблицу обезличенных сделок и явно выбрать в ней Ваши инструменты.
Получить информацию об изменении цены активов с течением времени не в графическом виде
Задача: нужно тем или иным способом получить информацию об изменении цены актива с течением времени (то есть то, что обычно смотрят при помощи графика), но не в графическом виде, а в текстовом, табличном, csv, json или подобном. Иными словами, нужно так или иначе преобразовать график цены в текстовую форму.
Как это можно сделать?
скачайте архив с сайта finam.ru .для любого инструмента, тайма и периода. Еще можно получить архивы скриптом с сайта биржи.
А в какое время после 0:00 можно выставить новую стоп-заявку на следующую сессию?
на следующий торговый день (т.е. когда на сервере сменится дата и будет доступно выставление заявок).
Спасибо. Значит в, к примеру, в 0:05 можно выставлять заявки.
...и будет доступно выставление заявок
Все индикаторы на Lua
Пользователь
Сообщений: Регистрация: 30.01.2015
25.06.2024 20:07:14
Цитата
написал: Подскажите как с помощью индикатора ADX получить данные DI+ и DI-. Нужен пример.
Никак. ---------- Это ADX вычисляется через D+ и D-, а не наоборот. -------------------- Можно вычислить индикаторы D+ и D-: D+ это EMA от High(i)-High(i-1) D- 'это EMA от Low(i)-Low(i-1) ----------------- см. в интернете.
Стоп по исполнению
Пользователь
Сообщений: Регистрация: 30.01.2015
25.06.2024 12:02:19
Применение заявок «по исполнению»
Срок действия заявок «по исполнению» - до окончания текущей торговой сессии, т.е. пока заявка-условие может быть активной.
Параметры «Класс», «Инструмент», «Счет», «Код клиента», «Комментарий» для заявки «по исполнению» заимствуются из заявки-условия.
Направленность заявки «по исполнению» всегда противоположная к заявке-условию. Например, если заявка-условие имеет направленность «на покупку», то заявка «по исполнению» выставляется «на продажу».
Если в момент активации заявки «по исполнению» количество доступных средств недостаточное для выполнения заявки, то такая заявка не активируется и становится «Снятой».
Если заявка-условие снята или отвергнута торговой системой, то снимаются все связанные с ней заявки «по исполнению».
Индикатор insidebar, Написать индикатор
Пользователь
Сообщений: Регистрация: 30.01.2015
25.06.2024 07:29:20
Цитата
Павел Лоскутов написал: Мот быть кто-то уже писал индикатор внутреннего бара для квика, или какой-нибудь подобный. Может ли кто написать простой индикатор insidebar, чтобы он изменял цвет или он отмечался точкой или другим знаком?
написал такой вариант:
Код
name="nk_insBar";
Settings={Name =name};
local function Cn(i) local Ci,Oi=C(i),O(i);if Ci>=Oi then return Ci,Oi; end return Oi,Ci; end
j=1;
function OnCalculate(i)
Hi,Li=H(i),L(i);
if Hi~=Li then
BH,BL=Cn(i)
if i~=j then BH1,BL1=Cn(j); H1,L1=H(j),L(j); j=i; end
if H_ then
if Hi>H_ or L_>Li then H1_,L1_=H_,L_; H_,L_=nil; end
else
if H1>=Hi and Li>=L1 then BH_,BL_,H_,L_=BH1,BL1,H1,L1; end
end
end
if H_ then return H_,L_; else return H1_,L1_; end
end
function Init()
Settings.line = {
{Name = "H_",Color = RGB(0, 0, 255), Type =3, Width = 2},
{Name = "L_",Color = RGB(255, 0, 255), Type =3, Width = 2},
};
return #Settings.line;
end
Запись в лог
Пользователь
Сообщений: Регистрация: 30.01.2015
18.06.2024 08:23:40
Цитата
VelikiyTrader написал: Добрый день. Как записать строку в лог? Нашел старый скрипт, раньше так работало, но сейчас не находит Log
Код
function ToLog (str)
local datetime = os.date ( "*t" , os.time ()); -- Текущие дата/время
local sec_mcs_str = tostring( os.clock ()); -- Секунды с микросекундами
-- local mcs_str = string.sub(sec_mcs_str, sec_mcs_str:find("%.") + 1); -- Микросекунды
-- Записывает в лог-файл переданную строку, добавляя в ее начало время с точностью до микросекунд
Log:write(tostring(datetime.day) .. " - "
.. tostring(datetime.month) .. " - "
.. tostring(datetime.year) .. " "
..tostring(datetime.hour).." :"
.. tostring(datetime.min) .. ":"
.. tostring(datetime.sec) .. "."
- - .. mcs_str .. " "
..str.." \n"); -- Записывает в лог-файл
Log:flush(); -- Сохраняет изменения в лог-файле
end ;
надо сначала открыть файл Log , а потом писать в него.
Возможно ли на Lua написать такой скрипт?
Пользователь
Сообщений: Регистрация: 30.01.2015
17.06.2024 16:39:31
Цитата
Евгений_174 написал: Здравствуйте! Ребята, подскажите, возможно ли на Lua написать следующий скрипт:
С периодичностью 1 минута скрипт проходит по окну "Текущие торги" и для каждого инструмента сохраняет данные в файл (ПКМ на свечах и в контекстном меню будет "Сохранить данные в файл"). Имя сохраняемого файла каждый раз отличается, например порядковым числом. Кто может написать и сколько будет стоить?
Заранее благодарю за ответ!
Написать можно. ------------------------------- Чтобы не играть в угадайку, тех задание, цену и сроки определяет тот, кому это нужно. --------------------------------- Цена продукта - это не то, сколько стоит его сделать, а то, за сколько его покупают.
написал: Нет никаких проблем в работе моей программы,Осталась лишь тебе понять то, что я написал Карл!!!
Я не Карл... Это уже какая-то патология...
Тогда не волнуйтесь. Я вам раньше уже ответил, что мой вариант решает вашу проблему. Но Вы стали утверждать обратное, так как ничего не поняли. -------------------- Я на вашем примере написал ликбез для карла и других читателей. Вы можете это не читать. Я же Вас не заставляю, а Вы меня не нанимали. --------------------- Вместо "спасибо" за то, что я вам разжевал бесплатно что-то и в рот положил, вы надулись как рыба луна. вот это действительно патология. ---------------------------- Я просто погулять вышел, ты понял Карл!!! .
Удаление не используемых счетов и перенос настроек, Удаление не используемых счетов и перенос настроек
Пользователь
Сообщений: Регистрация: 30.01.2015
13.06.2024 07:28:45
Но если вам надо скрыть их на экране, то включите в КВИКЕ фильтр.
Удаление не используемых счетов и перенос настроек, Удаление не используемых счетов и перенос настроек
Пользователь
Сообщений: Регистрация: 30.01.2015
13.06.2024 07:26:21
пардон, опечатка "Кухарка должна не управлять Государством, а сначала УЧИТЬСЯ управлять им" В.И.Ленин
Удаление не используемых счетов и перенос настроек, Удаление не используемых счетов и перенос настроек
Пользователь
Сообщений: Регистрация: 30.01.2015
13.06.2024 07:25:16
Цитата
major написал: Два вопроса. Подскажите как удалить из системы не используемы счета. В настройках есть выбранные и доступные, но удалить от туда не рабочие не получается
И второй вопрос, есть ли возможность из разных систем переносить не все настройки а только отдельных вкладок или таблиц?
Сначала пример, У меня краш- тесте, результаты я приводил на форуме, в таблице заявок в конечном счете было 250 тысяч строк по 200 инструментам. При этом для каждого инструмента там было не более одной активной (но можно сделать и несколько активных, если надо) При этом скорость обработки не зависит от числа не активных заявок. Суть решения проблемы сводится алгоритмическому исключению из обработки не активных заявок. Могу посоветовать лишь изучать технологию разработки алгоритмов. ----------------------------------------- "Кухарка должна не управлять Государством, а сначала УЧИТСЯ управлять им" В.И.Ленин
написал: могу лишь рассказать как я решил эту проблему.
К сожалению, в этом ответе не сказано о решении этой проблемы... А именно: как в main (которая сидит в dll) обработать таблицу alltrade, если при завершении работы OnAllTrade (которая тоже сидит в dll) стек её вызова (в котором сидит ссылка на табл. alltrade) должен очиститься? Я вижу такие костыли: - запретить сборку мусора (до 18:45). - dll из OnAllTrade как-то связывается с Lua и Lua дублирует ссылки на alltrade в массив локальных переменных области видимости этого файла lua. Потом dll как-то даёт знать, что каким-то из этих переменных можно присвоить nil. Как это сделать, пока не знаю. М.б. это делается через (light)userdata, но я с этим не связывался.
Как из Си заставить Lua продублировать ссылку на таблицу, если эта ссылка сидит в стеке? Как из Си вызвать скрипт Lua, чтобы он получил этот стек вызова OnAllTrade? Иначе придётся коллбэки делать на Lua и только main на Си, а этого не хочется из-за какой-то потери скорости.
Попробую объяснить. ------------------ Не важно, что и где сидит. dll - это код программы. Для кода не нужна синхронизация потоков. Синхронизация потоков нужна при обращении к данным. ---------------- Попробую снова объяснить как Ваша проблема решается на моей программе. ОЧЕРЕДЬ и EVENT - эти элементы и решают проблему. ------------------ Поясняю на примере: 1) Терминал вызывает OnAllTrade и передает в стеке указатель на таблицу, которая является новой строкой таблицы alltrade. -------------------- 2) В OnAllTrade указатель на полученную таблицу новой строки записывается в очередь Cохраняется в другой таблице КАРЛ ! ! ----------------------- 3) OnAlltrade заканчивает работу. Если очередь при этом содержит лишь один элемент, то устанавливается флаг EVENT. ---------------------------------- 4) Если функция main была в состоянии WAIT, то она начинает обрабатывать элемент очереди И о чудо, Карл!!! там есть указатель на таблицу новой строки alltrade, при этом onAllTrade давно уже завершилась или может быть даже снова вызвана с новой таблицей новой строки. Ты понимаешь, Карл? Снова хоть тысячу раз!!! -------------------------- Если функция main обрабатывала очередь, то она и продолжает это делать, а новые вызовы onAllTrade подкидывают новые таблицы новых строк alltrade в очередь. -------------------------- И это все. Нет никаких проблем в работе моей программы, Осталась лишь тебе понять то, что я написал Карл!!!
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
11.06.2024 07:02:16
«Дурак думает, что он мудр, но мудрец знает, что он дурак» - Шекспир, пьеса «Как вам это понравится».
Ускоряем скрипт и выкидываем sleep
Пользователь
Сообщений: Регистрация: 30.01.2015
11.06.2024 06:57:44
Цитата
Serge123 написал: Тут возникла новая проблема: если обработчик OnAllTrade на Си уже не будет обрабатывать этот вызов, а будет что-то записывать в очередь и делать выход, то как гарантировать, что память под таблицу alltrade не будет освобождена до обработки этой таблицы в функции main, которая тоже находится в dll? Совсем отключить сборку мусора, или есть что-то ещё?
могу лишь рассказать как я решил эту проблему. У меня колбеки обрабатываются не только в main, но и в других, новых потоках. Так как все колбеки вызываются последовательно, то нет надобности делать много Event У меня один event (см мои скрипты на форуме) и очередь. Т е вызвал терминал колбек. В колбеке в очередь записывается номер колбека и входные параметры. Если очередь пустая, то устанавливается флаг события. В функции main , если очередь пустая wait ждет событие, иначе проводится обработка очереди. Если колбеки не требуют сложных вычислений, то они обрабатываются внутри main. Для сложной обработки, например , в портфеле множество бумаг, то для принятия решения для каждой бумаги вызывается новый поток из пула потоков ОC. В этом потоке я запускаю LuasJIT (могу запустить python, terra,julia и др) вместо lua, что обеспечивает ускорение вычислений на порядок, по сравнению с вычислениями в main.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
11.06.2024 06:43:43
Цитата
VPM написал: , Для того чтоб читать, нужно научиться читать. А нести всякую "ахинею", ну Вам то уж не к лицу.
рекомендую почитать, тем кто уже научился читать:
Ускоряем скрипт и выкидываем sleep
Пользователь
Сообщений: Регистрация: 30.01.2015
10.06.2024 13:11:49
Цитата
Serge123 написал: Насколько я понял, надо использовать параметр lpName в CreateEventA: коллбэки создают события со своими именами. Осталось уточнить: что будет, если оба коллбэка успеют создать события, а main ещё не запустилась для их обработки. Не будет ли потеряно второе событие?
createEvent создает не событие, а объект "событие) упрощенно это значит, что OS выделяет для флага события ячейку и вернет его имя Имя флага всегда уникально. ----------------- Далее мы либо устанавливаем Set флаг или сбрасываем Reset. Wait.. - это как бы аналог условного цикла проверки состояния флага c заданием времени ожидания. Проверку делает OC а поток бездействует пока Wait ------------ Если событий много то используем wait дя нескольких событий либо более сложные функции ожидания (семафоры и т д) ================= Если есть желание изучить механизмы синхронизации потоков рекомендую книгу:
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
10.06.2024 12:57:34
'Математически логарифмирование заменяет умножение сложением" -------- тогда исходя из этого правила получается, что 2*2=2*log(2) Круто!
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
10.06.2024 12:54:30
Не хватает примеров
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
07.06.2024 14:10:13
Цитата
VPM написал: , Ни чего нового. Фрактальность, концепция, используется для описания сложных объектов (процессов), которые имеют повторяющуюся структуру на разных масштабах. В контексте анализа временных рядов, проблема сравнения данных разных масштабов имеет значение для корректного анализа и принятия решений. Классическая задача демонстрирующая данную проблематику, измерение длины береговой линии на разных масштабах (можно на гугл картах по экспериментировать).
, Ну очень остроумно, чтобы Вас хотя бы начали понимать окружающие, научитесь мысли формировать понятно, а предложений я жду от Вас, или страна напрасно Вас учила?.
Понятно, но повторяемость картинки на рынках в различных масштабах есть у Эллиотта (почти 100 лет тому назад).. а термин «фрактал» введён Бенуа Мандельбротом в 1975 году т е примерно через пол века, Причем этот термин к рынкам никто не применяет. Полагаю, что Вы зря притянули Мандельброта и понятие фрактальность. Так как похожесть рынков это не тоже самое что подобие самому себе в фрактальности. --------------- Но если Вам нравится это слово применяйте. Важно то, как Вы его реально используете в форме алгоритмов и чем ваши алгоритмы отличаются от описанных в популярных книжках? Можете пояснить?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
дайте определение, что вы под этим понимаете? ================ "необходимо найти их отношения и сравнить изменения для принятия решений" напоминает классический арбитраж, ------------------- можете пояснить Вы о чем говорите?
Индикаторы, документация
Пользователь
Сообщений: Регистрация: 30.01.2015
06.06.2024 05:21:38
Цитата
Georgii написал: Всем привет. Посмотрел код индикаторов и конечно много вопросов возникает. Пример MACD:
Код
function Init ()
func = MACD()
return # Settings.line
end
Вот в этой реализации вообще не понятно что такое func? То есть при инифиализации индикатора эта переменная заполняется функцией. Но что это за переменная и как она используется? В документации нет пояснений. Может где-то есть более подробная информация или кто-то поясняет?
Что изменилось в 11.1.1.11, что перестали приходить данные по CreateDataSource?
Пользователь
Сообщений: Регистрация: 30.01.2015
05.06.2024 19:14:36
Цитата
Georgii написал: Всем привет. В продолжении вопроса ветки еще раз хочу уточнить: выполняю операцию создания источника данных, пытаюсь получить значение функции size и мне выдает ошибку Текст модуля:
Код
function main ()
if isConnected () then
DataSource = CreateDataSource ( "TQBR" , "FLOT" , INTERVAL_H1)
dssize = DataSource:size()
message (tostring(dssize))
end
end
Текст ошибки: " attempt to call a nil value (method 'size') "
Добавлял ожидание в 10 секунду перед обращением к размеру, результат тот же.
CreateDataSource надо делать один раз, а у вас на каждый чих. Вы сервер просто за...ли . Напишите с проверкой и ожиданием. На форуме когда выкладывал.
Сложный индикатор с сохранением его данных для каждой свечи
Хочу написать индикатор, для которого нужно сохранять данные предыдущих значений индикатора в контейнер. Как при инициализации индикатора пройтись по всем предыдущим свечкам и записать значения индикатора для каждой из них в контейнер?
может не писать индикатор куда-то, а читать индикатор с графика , когда надо. либо записать формулу и вычислять, когда надо.
написал: т е два квака запущены на одном компе?Два брокера?
Да. Один брокер ВТБ. И на одном сервере даже. Просто 2 UID. Версии одинаковые.
предположу, что проблема на стороне сервера.
Колбек на остановку Скрипта, Колбек на остановку Скрипта
Пользователь
Сообщений: Регистрация: 30.01.2015
04.06.2024 03:20:22
OnStop
Функция вызывается терминалом QUIK при остановке скрипта из диалога управления и при закрытии терминала QUIK.
Формат вызова:
[NUMBER time_out] OnStop(NUMBER flag)
Функция возвращает количество миллисекунд, которое дается скрипту на завершение работы. Если функция не возвращает число, то таймаут завершения работы скрипта остается равным 5 секундам.
По истечении интервала времени, данного скрипту на завершение работы, функция main() завершается принудительно. При этом возможна потеря системных ресурсов.
При остановке или удалении работающего скрипта Lua из диалога управления «Доступные скрипты» параметр вызова flag принимает значение «1». При закрытии терминала QUIK – значение «2».
Пример:
function OnStop(flag) stopped = true return 3000 -- задается таймаут в 3 секунды end function OnStop(flag) stopped = true return '3000' -- возвращаемое значение - не число, таймаут остается равным 5 секундам end
написал: , как уже подметили ранее: рекомендуем обновить рабочее место QUIK. Если обновиться нет возможности, то просьба увеличить интервал обновления данных.
Поставил 3 сек. Но опять произошло зависание приёма данных на 60 секунд. При этом в файл curr_data.log ничего не записалось. Так что дело не в нём. Так же дело и не в интервале обновления, потому что в другом терминале стоит 1 сек и существенно больший объём данных принимается и он не зависал. Может это брокер блокирует?
Правильно я понимаю, что у Вас два компа в одной сети. На одном все ок, на другом виснет? Если так, то я бы сравнил в диспетчере задач параметры CPU ,памяти и сети.
Глобальные переменные индикатора, не работает код индикатора на lua при попытке обратится к переменной объявленной в функции Init()
Пользователь
Сообщений: Регистрация: 30.01.2015
31.05.2024 07:17:02
Цитата
zveno013 написал: К сожалению я так и не избавился от многократного расчёта индикатора,
Это глюк КВИКА. Существует давно и избавиться от него сложно. Можно сделать костыль, но он не удобный. Делал но потом отказался. --------------------- Вы очевидно не правильно понимаете работу функции Init Она вызывается один раз при загрузки скрипта. ------------------------ Надо делать как у меня написано. т е все глобальные переменные надо устанавливать внутри onCalculate в условии равенства индекса 1.