Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 22.02.2023
14.08.2023 13:33:59
Цитата
VPM написал: стоимость контракта = price_last * pos_qty* lot ?
С контрактом на индекса мосбиржи (MXI) такая формула не работает.
Всё пройдет. Но это не точно.
Экспорт из Quik в Excel необходимых данных!, Экспорт из Quik в Excel следующих данных!
Пользователь
Сообщений: Регистрация: 22.02.2023
08.08.2023 22:39:32
Цитата
hts написал: Можно ли вывести в эксель все свои сделки, купля продажа итд. И если можно то как. Спасибо
На таблице сделок, правая кнопка мыши > Вывод через DDE сервер.
Всё пройдет. Но это не точно.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 22.02.2023
02.08.2023 00:59:38
Цитата
Игорь М написал: Вы здесь за один удар определяете и то, что у вас заявка активная и то, что она купля/продажа
Вот и я о том же:
Всё пройдет. Но это не точно.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 22.02.2023
02.08.2023 00:29:56
Опять я наврал. Нельзя два дела одновременно делать! Так правильно:
Код
x = order.flags & 3 -- для версии lua ниже 5.3 -> bit.band(order.flags,3)
if x == 2 then
message("Заявка снята")
elseif x == 1 then
message("Заявка активна")
elseif x == 0 then
message("Заявка исполнена")
end
end
Всё пройдет. Но это не точно.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 22:43:02
Можно.
Код
x = order.flags & 3 -- для версии lua ниже 5.3: bit.band(order.flags,3)
if x == 3 then
message("Заявка снята")
elseif x == 2 then
message("Заявка исполнена")
elseif x == 1 then
message("Заявка активна")
end
Всё пройдет. Но это не точно.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 22:04:40
Цитата
Ziveleos написал: r = order.flags & Х, где Х - вес соответствующего флага. r - 1 или 0, в зависимости от того, установлен флаг, или нет.
Наврал. r - вес флага или 0, в зависимости от того, установлен флаг, или нет.
Всё пройдет. Но это не точно.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 21:44:53
Еше ватиант bit.test(order.flags,Х), где Х - номер флага. Возвращает true или false. Работает медленно, но зато даже на луа 5.1
Всё пройдет. Но это не точно.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 21:37:32
Цитата
VPM написал: Как безошибочно выяснять состояние флагов
r = order.flags & Х, где Х - вес соответствующего флага. r - 1 или 0, в зависимости от того, установлен флаг, или нет.
Всё пройдет. Но это не точно.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 21:31:56
nikolz, нафига их двигать, если можно сразу и пачкой:
Цитата
Ziveleos написал: У каждого флага свой вес. Чтобы узнать состояние флагов, нужно в качестве второго операнда побитового И взять число, равное сумме весов интересующих флагов. Результат = сумме весов установленных флагов.Пример:Если order.flags & 5 == 4, заявка на продажу, не активна. ==1 - заявка на покупку, активна.
Всё пройдет. Но это не точно.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 21:06:21
Цитата
Владимир написал: Сейчас вероятность проблем со связью близка к нулю
Это смотря в каком городе Вы живете...
Всё пройдет. Но это не точно.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 20:45:45
VPM, в каком смысле пользоваться? Как выяснить состояние флагов, или как эту информацию использовать в торговле?
Всё пройдет. Но это не точно.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 19:55:53
Владимир, это на случай проблем с интернетом, электричеством, или на сервере брокера, как это было со сбером, чтобы заявка не осталась с неприкрытой задницей. Ну и для ручной торговли.
Всё пройдет. Но это не точно.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 19:37:07
Владимир, первый, в случае управления стопом тоже нужен. Если лимитированная снята, то стоп тоже нужно снять, если исполнена - то должен остаться.
Всё пройдет. Но это не точно.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 19:24:02
Владимир, разумеется. И выставляется она на лимитированную заявку, которая может быть как на покупку, так и на продажу. Поэтому нужен второй бит.
Всё пройдет. Но это не точно.
Предотвращение убыточной продажи по TAKE_PROFIT_AND_STOP_LIMIT_ORDER
VPM написал: order.flags - где нулевой где не нулевой не разберешь.
Руководство пользователя QLua > Описание битовых флагов. У каждого флага свой вес. Чтобы узнать состояние флагов, нужно в качестве второго операнда побитового И взять число, равное сумме весов интересующих флагов. Результат = сумме весов установленных флагов. Пример: Если order.flags & 5 == 4, заявка на продажу, не активна. ==1 - заявка на покупку, активна.
Старая шутка: "Нашел в телефоне кнопку Вкл.бл, значит, где-то должна быть Выкл.нах."
Всё пройдет. Но это не точно.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 17:59:47
Владимир, это у Вас. Контролировать состояние заявки бывает нужно в разных целях.
Всё пройдет. Но это не точно.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 17:20:43
Цитата
VPM написал: Можно утверждать что такая запись надежна?
В приведенном Вами примере контролируется нулевой бит, а описание почему-то взято от первого. А это все-таки разные вещи: ордер активен и ордер снят. По моему, определять лучше сразу оба бита. Если bit.band(order.flags,3) или order.flags & 3 равно 3, то заявка снята, равно 2 - исполнена, 1 - активна.
Всё пройдет. Но это не точно.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 22.02.2023
31.07.2023 21:17:30
Извините, что вмешиваюсь,
Цитата
VPM написал: if (order.flags % 2) == 0 then -- Заявка снята. Если флаг не установлен и значение бита «0» равно «0», то заявка исполнена
чет/нечет - это проверка нулевого бита. Из руководства:
Цитата
бит 0 (0x1) Заявка активна, иначе – не активна бит 1 (0x2) Заявка снята. Если флаг не установлен и значение бита «0» равно «0», то заявка исполнена
Есть еще вариант bit.test(order.flags,0), но чет/нечет самый быстрый.
Код
function main()
order = getItem("orders", 1)
start = os.clock()
for i = 1, 1e6 do
x = order.flags % 2
--x = bit.band(order.flags,1)
--x = bit.test(order.flags,0)
end
message(tostring(os.clock() - start))
end
Всё пройдет. Но это не точно.
Таблица с измемениями открытого интереса
Пользователь
Сообщений: Регистрация: 22.02.2023
31.07.2023 14:17:54
По моему, график гораздо нагляднее, чем цифры. И скрипт писать не нужно.
Всё пройдет. Но это не точно.
Как реализовать "Карман транзакций", Как реализовать "Карман транзакций"
Пользователь
Сообщений: Регистрация: 22.02.2023
31.07.2023 00:46:44
В терминале, клавиша F7 -> Карман транзакций.
Всё пройдет. Но это не точно.
DelAllLabels приводит к "General Protection Fault", Вызов DelAllLabels при смене тикера приводит к падению QUIK с ошибкой "General Protection Fault"
Пользователь
Сообщений: Регистрация: 22.02.2023
18.07.2023 22:15:18
Придумал! Вот что ноосфера животворящая делает!
Код
if lastLbl then
repeat
sleep(10)
t_Lbl = GetLabelParams(iStr, lastLbl) -- Костыль. Ждем пока появится последняя метка.
until t_Lbl
end
lastLbl = 0
<...>
lbl_ID = AddLabel(iStr, arr)
lastLbl = lastLbl + 1
end
Но лучше, если бы не приходилось изобретать "костыли". Разработчики! Поправьте на досуге.
Всё пройдет. Но это не точно.
DelAllLabels приводит к "General Protection Fault", Вызов DelAllLabels при смене тикера приводит к падению QUIK с ошибкой "General Protection Fault"
Пользователь
Сообщений: Регистрация: 22.02.2023
18.07.2023 20:46:36
Стрелки:
Всё пройдет. Но это не точно.
Тормоза в отрисовке меток в 10 версии
Пользователь
Сообщений: Регистрация: 22.02.2023
18.07.2023 19:30:28
Цитата
Andrey Golik написал: Уточните, пожалуйста, вы тоже столкнулись с этой проблемой?
Столкнулся со смежной проблемой:
Всё пройдет. Но это не точно.
DelAllLabels приводит к "General Protection Fault", Вызов DelAllLabels при смене тикера приводит к падению QUIK с ошибкой "General Protection Fault"
Пользователь
Сообщений: Регистрация: 22.02.2023
18.07.2023 19:25:13
Значки почему-то не выкладываются.
Всё пройдет. Но это не точно.
DelAllLabels приводит к "General Protection Fault", Вызов DelAllLabels при смене тикера приводит к падению QUIK с ошибкой "General Protection Fault"
Пользователь
Сообщений: Регистрация: 22.02.2023
18.07.2023 19:18:44
Тестовый скрипт:
Скрытый текст
Код
function OnInit()
is_run = true
path = (getScriptPath() .. "\\")
Arrow_B = (path .. "Arrow_B.bmp") -- Стрелки
Arrow_S = (path .. "Arrow_S.bmp")
iStr = "Rv-1" -- Идентификатор графика.
end
function OnStop()
DelAllLabels(iStr)
is_run = false
return 3000
end
function main()
while is_run do
local cdls = -1
repeat
local cdls0 = cdls
sleep(10)
cdls = getNumCandles(iStr)
until cdls > 0 and cdls == cdls0 -- Ждем, пока загрузятся все свечи.
local tc, nc, leg = getCandlesByIndex (iStr, 0, math.floor(cdls/2), 3)
if leg ~= old_leg and leg ~= "GZU3 [Price]" and leg ~= "" then -- Если на графике сменился инструмент. Один оставляем пустым.
old_leg = leg
LinePrnt("\n \n", leg)
--sleep(500) -- Костыль. Чем больше меток, которые нужно убить, тем больше должна быть задержка.
---[[
if lbl_ID then
for i=1, 700 do
t_Lbl = GetLabelParams(iStr, i) -- После смены инструмента идентификаторы меток тоже изменяются.
if t_Lbl then
last = i
end
end
end
--]]
LinePrnt(cdls, lbl_ID, last)
local image;
local aligt;
DelAllLabels(iStr) -- Если отключить, то quik просто зависает, без "General Protection Fault".
local start = os.clock()
for i=1, 100 do -- Кол-во меток.
local date = string.format("2023%02d%02d", math.random(3, 6), math.random(1, 30)) -- Диапазон месяцев и дней.
local time = string.format("%02d%02d00", math.random(10, 22), math.random(1, 59)) -- Диапазон часов и минут.
local price = tc[1].close + math.random(-100, 100)*tc[1].close/1000 -- Диапазон цен.
--LinePrnt(date, time, price)
local hint = tostring(date.."\n"..time.."\n"..price)
local txt = tostring("Lbl "..i)
if math.floor(i/2) == i/2 then
image = Arrow_B
aligt = "BOTTOM"
else
image = Arrow_S
aligt = "TOP"
end
arr = {
TEXT = "", -- txt
FONT_FACE_NAME = "Arial",
FONT_HEIGHT = 9,
R = 250,
G = 250,
B = 250,
IMAGE_PATH = image, -- Без картинок всё ОК, quik не падает.
TRANSPARENCY = 0,
TRANSPARENT_BACKGROUND = 1,
ALIGNMENT = aligt,
DATE = tonumber(date), -- Работает даже если STRING, зачем DOUBLE - не понятно...
TIME = tonumber(time),
YVALUE = price,
HINT = hint
}
lbl_ID = AddLabel(iStr, arr)
end
LinePrnt(os.clock() - start, lbl_ID)
end
sleep(30)
end
end
-------------------------------------------------------
function LinePrnt(...)
local lin = ""
for i, v in ipairs {...} do
lin = (lin ..(tostring(v)).." ")
end
PrintDbgStr(lin)
end
По-видимому, если во время восстановления меток после смены инструмента (график подключен к каналу), вызвать DelAllLabels, QUIK не выдерживает такой "шизофрении", и падает с криком "Internal exception happened".
Помогает только задержка, позволяющая QUIK восстановить все метки. Как поймать момент окончания прорисовки, мне придумать так и не удалось, может быть разработчики что-нибудь подскажут? Версия терминала - 10, но и на 7-ой всё то же самое.
Всё пройдет. Но это не точно.
Свободное перемещение графика
Пользователь
Сообщений: Регистрация: 22.02.2023
18.07.2023 17:03:03
Цитата
Alexey Ivannikov написал: Хамство и оскорбления - это по Вашему правильно? Мы Вас верно поняли?
Неверно. И что значит "Мы"? Во множественном числе себя величали только самодержцы. У высказывания есть форма и содержание. Имелось в виду именно содержание.
Цитата
Alexey Ivannikov написал: Да, пользуются. И вполне довольны. Если Вы тоже считаете что пожелания, в которых заинтересованы 1-2-3 пользователя, должны выполняться " по щелчку" - то Вы ничего не понимаете в организации работы IT-Компании.
Ну, если "вполне довольны", то улучшений ждать не приходится. Зачем менять то, что и так работает замечательно?
Чего для мне что-то понимать в организации работы IT-Компании? Достаточно сравнить ваш продукт с тем же приснопамятным TradingView, и с вами всё становится ясно. Взять хотя бы возможность назначать оповещение на пересечение ценой любой линии, например, линии тренда.
Всё пройдет. Но это не точно.
Свободное перемещение графика
Пользователь
Сообщений: Регистрация: 22.02.2023
13.07.2023 02:10:22
Alexey Ivannikov, Ваше высказывание очень важно для нас, дождитесь ответа.
Всё пройдет. Но это не точно.
Свободное перемещение графика
Пользователь
Сообщений: Регистрация: 22.02.2023
12.07.2023 23:46:01
Цитата
Александр написал: Прошел еще месяц, с предыдущего сообщения! Вы че там вообще делаете за наши бабки? В чем сложность убрать бесконечность Фибоначчи??? И так из-за вашего тупого стакана приходится в двух терминалах работать. Вы что на столько тупые что не можете сделать стакан как в МТ фибы как у всех не бесконечные и свободное перемещение графика в окне?*???? Это че прям сложность такая за столько лет или мозгов не хватает тупо посмотреть как у других? Вы сами через свое убожество торгуете или только пишите это уродство?
А вопрос-то правильный. Разработчики OUIK сами пользуются своим продуктом, или "чисто теоретически"?
Всё пройдет. Но это не точно.
Тормоза в отрисовке меток в 10 версии
Пользователь
Сообщений: Регистрация: 22.02.2023
12.07.2023 18:35:41
Andrey Golik, снова сделаете как в 7-ке, загружать картинки один раз, при старте скрипта, и хранить их в randseed.bin в более "удобоваримом" виде? Может быть лучше сохранять картинки в каком-нибудь буфере в оперативке, чтобы AddLabel брала их оттуда? Ну, или считывать картинки как userdata и использовать вместо адреса картинки.
Это мое авторство. И привлеку я Вас за наращение авторских прав.
Диву даешься!
Ведь кроме этой путаницы, в моих рассуждениях была путаница в логике! Ну хоть один бы высказался на эту тему.
Ау, это форум о трейдинге?
Ещё один "не читатель"! Это swerg написал обращаясь ко мне, а я его процитировал. Похоже, путаница не только в логике и аббревиатурах.
Всё пройдет. Но это не точно.
Депозит на демо, Нужно обновить
Пользователь
Сообщений: Регистрация: 22.02.2023
11.07.2023 02:30:41
Здравствуйте! Продлите пожалуйста доступ к учебному серверу для логина U0210625.
Спасибо.
Всё пройдет. Но это не точно.
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 22.02.2023
10.07.2023 18:04:22
Цитата
swerg написал: , и? Я что-то неправильно написал? Тогда напишите в чем я неправ.
Один FTP и HFT путает, другой недоволен, что его не там процитировали. А по делу-то что в итоге?
swerg, правильно, неправильно, не в этом дело. Захотелось высказаться - воля Ваша. Меня-то зачем приплетать?
Всё пройдет. Но это не точно.
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 22.02.2023
09.07.2023 13:49:04
swerg, мои слова, процитированные Вами, были ответом Владимиру. Для себя я все выяснил, о чем и высказывался уже в этой ветке. Видимо, Вы поступили как в том анекдоте: "чукча - не читатель, чукча - писатель!"
Алексей написал: Имеется ввиду, что quik уже за Вас вызвал getScriptPath() и результат Вам подсовывает в качестве параметра при вызове OnInit(script_path).А уж будете Вы использовать этот "подарок" внутри OnInit или нет, дело Ваше
Зачем Вам script_path от OnInit?
Всё пройдет. Но это не точно.
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 22.02.2023
05.07.2023 16:02:08
Цитата
Владимир написал: OnInit по определению нужен лишь затем, чтобы что-то сделать до main. То есть это идеологический идиотизм.
Ziveleos написал: Зачем? В чистом lua и OnInit нет.
Всё пройдет. Но это не точно.
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 22.02.2023
05.07.2023 13:23:37
Владимир, просто давно интересовал этот вопрос: какая разница между body и OnInit, и зачем он вообще нужен?
Всё пройдет. Но это не точно.
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 22.02.2023
05.07.2023 13:18:19
Цитата
Nikolay написал: Body скрипта выполняется в потоке терминала. Так что служебные переменные вполне себе инициализируются там.
А я что сказал?
Цитата
if до зарезу необходимо сделать что-то до начала работы коллбэков, and в этом "что-то" используются функции объявляемые позже, then без OnInit не обойтись. end В остальном он на фиг не нужен.
Цитата
Nikolay написал: Речь же про колбеки звучит странно, т.к. я слабо себе представляю использование колбеков в алгоритме, если они не обработаны все.
Если в самой функции коллбэка используется нечто не объявленное ранее, и он сработает, возникнет ошибка. Поэтому это "нечто" нужно объявить до запуска main.
Всё пройдет. Но это не точно.
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 22.02.2023
05.07.2023 11:39:18
Владимир, переменные окружения показывают разницу между body и OnInit. Получается, если до зарезу необходимо сделать что-то до начала работы коллбэков, и в этом "что-то" используются функции объявляемые позже, то без OnInit не обойтись. В остальном он на фиг не нужен.
Видимо, единственное преимущество OnInit в том, что в отличии от body, из неё можно вызывать функции не объявленные ранее. Ну, и " В качестве параметра принимает значение полного пути к запускаемому скрипту."
Скрытый текст
Код
file = io.open(getScriptPath() .. "\\Environment.txt", "w+")
local len = 0
for k, v in pairs(_ENV) do
file:write(string.format("%s\t %s \n",k,(tostring (v))))
len = len + 1
end
file:write("\n Окружение BODY: ", len, "\n\n" )
function OnInit()
local len = 0
for k, v in pairs(_ENV) do
file:write(string.format("%s\t %s \n",k,(tostring (v))))
len = len + 1
end
file:write("\n Окружение OnInit: ", len, "\n\n" )
end
function main()
file:seek("set")
local log = file:read("a")
local b_log = string.match(log, "(.-)\n\n")
local i_log = string.match(log, "Окруж.-\n\n(.-)\n\n")
file:write(" Нет в BODY: ")
for s in string.gmatch(i_log, "(.-)\t.-\n") do
if not string.match(b_log, s) then
file:write("\n", s)
end
end
file:write("\n\n Разница: ")
for s in string.gmatch(i_log, "(.-)\n") do
if not string.match(b_log, s) then
file:write("\n", s)
end
end
file:flush()
file:close()
end
--file:write("Чудо-юдо рыба-кит \n")
function tableLog(t)
for k, v in pairs(t) do
file:write(string.format("%s %s \n",k,(tostring (v))))
end
end
Владимир, что Вы называете вторым потоком? Под вторым потоком я подразумевал именно поток main, а коллбэки, BODY - это основной основной поток QUIK.
Всё пройдет. Но это не точно.
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 22.02.2023
02.07.2023 21:18:58
Владимир, Второй поток все-таки нужен, иначе QUIK замрёт, пока работает скрипт. А вот, что касается:
Цитата
nikolz написал: В том, что это этот колбек вызывается раньше всех других колбеков и раньше функции main.Без него у Вас колбеки будут вызываться раньше, чем будет вызвана функция main.
коллбэки начинают работать только вместе с main.
Код
qtes = {}
function OnQuote(class, sec )
ql2 = getQuoteLevel2(class, sec)
table.insert(qtes, ql2)
end
sleep(10000)
function main()
--sleep(10000)
message(tostring(#qtes))
end
Всё пройдет. Но это не точно.
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 22.02.2023
30.06.2023 21:30:52
И не нужно на меня кегль повышать.
Всё пройдет. Но это не точно.
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 22.02.2023
30.06.2023 21:14:19
Необходимые переменные и библиотеки перед запуском основного потока main() возможно инициализировать и в BODY. Если скрипт не HFT, или вообще без коллбэков, получается OnInit не сильно нужен.