VPM, Все, что Вы повторяете из прочитанных Вами книжек есть лишь пересказ чужих рассуждений. ------ Возможно будет работать, а возможно и нет. ----- Есть еще множество различных рассуждений в подобных книжках. ------------------------ Было бы интересно увидеть результат применения ваших скриптов хотя бы на истории, которая уже есть в КВИКЕ. А написать что-то на луа ,да еще без тестов - это может любой начинающий. ------------------------- Покажите хотя бы какой-нибудь результат. Ну хотя бы советника , который будет иметь положительное мат ожидание сделок хотя бы на истории. ------------------- Уверен, что не получится. Можете доказать иное?
Судя по тому, что вы всегда цитируете сообщения полностью (даже самые длинные), вы, наверное, спамер. Но нельзя исключать с учетом качества выдаваемого вами текста, что вы полуинтеллектуальный робот-спамер :: .
Судя по тому, что вы всегда цитируете сообщения полностью (даже самые длинные), вы, наверное, спамер. Но нельзя исключать с учетом качества выдаваемого вами текста, что вы полуинтеллектуальный робот-спамер :: .
Вы любитель ярлыков? ---------------------- вас так колебет что я повторно написал то, что Вы написали выше? -------------------
вот тут можете посмотреть варианты как делать очередь. И результаты тестов различных вариантов. https://forum.quik.ru/forum17/topic8426/ --------------- С интересом посмотрю Ваши результаты решений. Может обсудить конкретные решение, что будет полагаю интересно начинающим.
Вы тоже не читаете внимательно чужие предложения. Я на форуме не только предлагал, но и показывал как это работает у меня. ------------------- Например, я выполнение различных алгоритмов обработки событий реализую не только на Lua, но и на Luajit ( что более чем на порядок быстрее) на Terra, на Python, на julia.
TGB, Про колебки Вы пишите фигню. Колбеки не запускаются, а вызываются. ------------------------ Никто не мешает Вам запустить в колбеке новый поток. -------------- Я это использую уже давно. Об это писал у же на форуме.
nikolz написал: Если Вы это сообщение выводите в файл, то пишите сразу в файл. куски сообщения. Каждый новый кусок добавится в конец файлаВ итоге Вам не надо наращивать строки.
nikolz писатель? Зачем вы пишите, то что было уже написано два раза?: 1)
Цитата
TGB написал: Почему бы не записывать строку сразу в файл (в системе это буферизуется). Вы проверяли, сколько записей выполняется в файл за 1 секунду, если писать напрямую? Если вы это сделаете, то, возможно, удивитесь.
2)
Цитата
Nikolay написал: У меня такие потоки для каждой новой записи просто пишутся в файл черезf:write(str..'\n')
Serge123 написал: Как-то уже об этом писал... Есть строка mess (age), в которой коллбэки накапливают свой вывод, при превышении определённой длины строка записывается в файл. Потом обычно пишут mess='', чтобы сбросить длину строки в 0, но что в этом случае произойдёт? Создастся новая строка, или в структуре TString для этой строки её длина установится в 0? Я не вижу, где хранится число байтов, выделенных под строку, и как контролируется выход за её предел при дописывании к строке? Не хочется ненужного пересоздания строки и сборки мусора, а хочется просто зарезервировать под строку 10 Мб и использовать эту же память под строку постоянно. Зачем выметать сор из избы строки, если можно обойтись без этого? Как это всё оптимизировать и сделать, как в нормальных языках типа того же си?
Если Вы это сообщение выводите в файл, то пишите сразу в файл. куски сообщения. Каждый новый кусок добавится в конец файла В итоге Вам не надо наращивать строки.
nikolz написал: - запуск коллбеков всех Lua-скриптов пользователя;Мое мнение:Колбеки не запускаются, а вызываются. Вызываются они в основном потоке, потому что иначе они не могут вызываться. Они и есть реакция на события в этом потоке.Вы знаете иной механизм вызова колбеков? Расскажите .
Как я понимаю человек предлагает вызывать колбеки в потоке Lua-скрипта.
Мечтать не вредно. Пусть сначала сделает и докажет, что это лучше. -------------- Существующее решение работает быстро и даже раньше, чем данные попадают в таблицы терминала.
Constantin написал: Как я понимаю человек предлагает вызывать колбеки в потоке Lua-скрипта.
Один из возможных вариантов предлагаемой обработки событий Qlua: 1) вместо регистрации функций обратного вызова, регистрация соответствующих потокобезопасных очередей событий (возможно, с теми же именами); я бы сделал эти очереди (можно, в принципе, обойтись и одной) циклическими, с указанием их длины при регистрации, но не более некоторого значения; 2) вместо sleep, служебная функция с тем же именем ожидания либо истечения интервала времени (как в sleep), либо появления данных в очередях событий (с выдачей списка непустых очередей); 3) добавление функции чтения очередей событий (их параметров). Эта схема реализует рекомендованную ARQA обработку параметров событий в main (смотрите "Использование Lua в Рабочем месте QUIK"), с тем, чтобы не было проблем синхронизации в скриптах. Кроме того, в такой схеме решается тяжелая задача подключения новых версий Lua в QUIK, так как не будет требоваться конфигурирования Lua для многопоточного использования (из-за запуска функций коллбеков в потоке, отличном от потока main, но в контексте пользователя). Подключение новых версий Lua в QUIK станет в описанной выше схеме рутинной задачей.
Это делается очень просто. ---------------------- Применяю это с момента появления VMLua в КВИКЕ. --------------------- Возьмите готовую библиотеку https://quik2dde.ru/viewtopic.php?id=78 ------------------ и используйте всего две функции CreateEvent и WaitForSingleObject ------------------- Как реализовать очередь есть в документации QLUA
TGB написал: 1) В текущей версии в одном основном потоке обслуживаются:- запуск всех Lua-скриптов пользователя;- запуск коллбеков всех Lua-скриптов пользователя;-- обработка всех коллбеков таблиц QUIK (это не таблицы Lua);-- обработка всех индикаторов пользователя.
Зачем столько фантазии и эмоций. Сложно понять что думал человек, написавший три предложения. Давайте разберем то, что Вы написали и то, как я это понял. ------------------ Вот Ваши предложения: 1) В текущей версии в одном основном потоке обслуживаются: - запуск всех Lua-скриптов пользователя; - запуск коллбеков всех Lua-скриптов пользователя; -- обработка всех коллбеков таблиц QUIK (это не таблицы Lua); -- обработка всех индикаторов пользователя. ---------------------------- Разбираем: Вам не нравиться ,что в основном потоке терминала выполняется: запуск всех Lua Скриптов пользователя. -------------- И что в этом плохого? Мое мнение - это выполняется однократно и на дальнейшую работу скриптов не влияет. поэтому никакой проблемы в этом нет. Докажите, что это не так. ---------------------- - запуск коллбеков всех Lua-скриптов пользователя; Мое мнение: Колбеки не запускаются, а вызываются. Вызываются они в основном потоке, потому что иначе они не могут вызываться. Они и есть реакция на события в этом потоке. Вы знаете иной механизм вызова колбеков? Расскажите . -------------------- -- обработка всех коллбеков таблиц QUIK (это не таблицы Lua); Вообще непонятно. Что за "обработка" ? В каком основном потоке ? ------------------- -- обработка всех индикаторов пользователя. В каком основном потоке? Где это Вы прочитали ? =================== Поэтому Ваши высказывания ошибочны. если Вы не согласны, то докажите,а не обвиняйте, что другие не умеют читать Ваши мысли.
1) - ошибочное утверждение. ------------------ Вот доказательства: - запускаем QUIK и смотрим сколько потоков используется без подключения к серверу:
При запуске QUIK создает 5 потоков. (это уже больше чем число ядер) --------------------------------- - запускаем скрипт
Потоков уже 8. ---------------------------------- -- Запускаем еще один скрипт
Потоков уже 9 ----------------------------- -- Запускаем третий скрипт
Потоков уже 10. ===================== 2) - Разработчики дали решение этой проблемы. Оно прекрасно работает. Так как QUIK - это бесплатное приложение, то дареному в... не заглядывают. сделать что-то еще - это их право, но не обязанность. ================== 3) - с этим согласен. Хотя бы просто открыли формат файлов dat. Остальное я бы написал и выложил в свободный доступ. ----------------- Даже макрософт выкладывает форматы свои файлов.
nikolz написал: Serge123 , А Вы знаете, зачем нужен DNS? ---------------------- Судя по вопросу, Вы этого не знаете. ---------------------- Прочитайте в интернете и вопрос отпадет сам собой.
Я когда-то знал это, даже своей программкой получал пакет по UDP с корневого сервера. Сейчас поискал в Гугле, зачем нужен DNS, оказалось, что для того же, для чего и раньше:
=== DNS (система доменных имен) преобразует доменные имена, удобные для человеческого восприятия (например, www.amazon.com ), в IP-адреса, понимаемые машиной (например, 192.0.2.44). ===
и вдобавок
=== Какой DNS самый быстрый? 1.1.1.1 — самый быстрый в мире, ориентированный на конфиденциальность DNS-резолвер ===
А в чём был замечен криминал у этой темы?
Криминала нет, есть бессмысленность вопроса. ---------------------- Система доменных имен (DNS) представляет собой распределенную систему хранения и обработки информации о доменных зонах. Она необходима, для соотнесения IP-адресов устройств в сети и более удобных для человеческого восприятия символьных имен. ---------------------------- Ну скажите на кой хрен КВИКУ доменные имена? ---------------------------- У Вас в квике уже прописан IP адрес сервера брокера. -------------------- DNS - это список имен типа "ВАСЯ ПУПКИН " и напротив него записан IP адрес. ------------------ В Квике нет надобности искать васю пупкина.
Выкладываю скрипт mos.lua, в котором устанавливается номер счета. отредактируйте его сами как хотите и потом скомпилируйте и замените в папке робота.
Код
EDP = "NO"
FIRMID = "не об\255зателе\237"
RISK_CHANGE = "NO"
RISK_CONST = 6
LICENSE_RISK = "NO"
VEDLOG = "Ведётс\255"
PAPER = "RTS"
ACCOUNT_DEPO = "99999"
CLIENTCODE = "11111"
MODULD = "10092021"
SALUT = "1000000000"
MODULPRO ="10092021"
RISK_LIC = 6
Trade = function(Type)
-- function num : 0_0 , upvalues : _ENV
local temp = nil
trans_id = trans_id + 1
local spred = 100
local Price = 0
local operation = ""
if Type == "BUY" then
for j = 0, 9 do
Price = (getParamEx(CLASS_CODE, SEC_CODE, "offer")).param_value
if Price == 0 then
do
temp = (getParamEx(CLASS_CODE, SEC_CODE, "bid")).param_value
end
end
end
spred = Price + spred
operation = "B"
else
for j = 0, 9 do
Price = (getParamEx(CLASS_CODE, SEC_CODE, "bid")).param_value
if Price == 0 then
do
temp = (getParamEx(CLASS_CODE, SEC_CODE, "offer")).param_value
end
end
end
spred = Price - (spred)
operation = "S"
end
local Transaction = {ACCOUNT = ACCOUNT_DEPO, TYPE = "L", TRANS_ID = tostring(trans_id), CLASSCODE = CLASS_CODE, SECCODE = SEC_CODE, ACTION = "NEW_ORDER", OPERATION = operation, PRICE = tostring(spred), QUANTITY = "1"}
for j = 0, 10 do
sendTransaction(Transaction)
while not stopped and trans_Status == nil do
sleep(10)
end
local Status = trans_Status
trans_Status = nil
if Status ~= 3 then
row = t:AddLine()
t:SetValue(row, "Дата", Data.date, i)
t:SetValue(row, "Врем\255", TimeF, i)
t:SetValue(row, "Событи\229", (string.format)("Зайт\232 \226 сделку не удалос\252 по цене %d! Статус %d: %s", Price, Status, trans_result_msg), i)
i = i + 1
f:write("\n", Data.date, " ", TimeF, " ", (string.format)("Зайт\232 \226 сделку не удалос\252 по цене %d! Статус %d: %s", Price, Status, trans_result_msg))
f:flush()
f:seek("end", 0)
;
(bot.sendMessage)(from_id, (string.format)("Zajti v sdelku ne udalos` po cene %d! Status %d", Price, Status))
if j == 9 then
return false
end
else
row = t:AddLine()
t:SetValue(row, "Дата", Data.date, i)
t:SetValue(row, "Врем\255", TimeF, i)
t:SetValue(row, "Событи\229", (string.format)("\194 сделку зашл\232 по цене: %d", Price), i)
i = i + 1
f:write("\n", Data.date, " ", TimeF, " ", (string.format)("\194 сделку зашл\232 по цене: %d", Price))
f:flush()
f:seek("end", 0)
;
(bot.sendMessage)(from_id, (string.format)("V sdelku zashli po cene: %d", Price))
sleep(10)
return true
end
end
CountVolat = function(period, interV)
-- function num : 0_0_0 , upvalues : _ENV
tCandle = CreateDataSource(codeclass, codebum, interV)
NumEndCandle = tCandle:Size()
Sum = 0
for j = 1, period do
Volat = tCandle:H(NumEndCandle - j) - tCandle:L(NumEndCandle - j)
Sum = Sum + Volat
end
avgVolat = Sum / period
target = avgVolat / 2
Hi = tCandle:H(NumEndCandle - 1)
Lo = tCandle:L(NumEndCandle - 1)
HiO = tCandle:H(NumEndCandle - 2)
LoO = tCandle:L(NumEndCandle - 2)
trd = "ничего"
if HiO < Hi and LoO < Lo then trd = "Лонг"
else
if Hi < HiO and Lo < LoO then trd = "Шорт"
else
if HiO < Hi and Lo < LoO then trd = "Внеш.свеч\224"
else
if Hi < HiO and LoO < Lo then
HiOO = tCandle:H(NumEndCandle - 3)
LoOO = tCandle:L(NumEndCandle - 3)
if HiOO < HiO and LoOO < LoO then trd = "Лонг(внут\240.свеч\224)"
else
if HiO < HiOO and LoO < LoOO then trd = "Шорт(внут\240.свеч\224)"
else trd = "ХЗ"
end
end
else trd = "ничего"
end
end
end
end
trend = trd
return avgVolat, target, Hi, Lo, trend
end
insertLabel = function(labelType, labelDate, labelTime, yValue)
label_params = {}
if labelType == 1 then
label_params.IMAGE_PATH = "C:\\pic_qlua\\купл\255.bmp"
else
if labelType == 2 then
label_params.IMAGE_PATH = "C:\\pic_qlua\\продаж\224.bmp"
end
end
label_params.TIME = labelTime
label_params.DATE = labelDate
label_params.YVALUE = yValue
label_params.ALIGNMENT = TOP
AddLabel(id_grafic, label_params)
end
end
nikolz написал: QLUA - это библиотека функций, написанная на СИ --------------------------- VMLua - это виртуальная вычислительная машина , тоже написанная на CИ , интерпретирующая байт-код скрипта Lua.
Но ведь ветка называется "Программирование на языке Lua".
Но вопросы не о программировании на луа, а о внутреннем строении функций на СИ.
QLUA - это библиотека функций, написанная на СИ --------------------------- VMLua - это виртуальная вычислительная машина , тоже написанная на CИ , интерпретирующая байт-код скрипта Lua.
nikolz написал: 1. Вы ошибаетесь. NULL и nil это не одно и то же. Это одно и тоже в objective-c, но не в луа. В Lua нет NULL.
Допустим, но глобально в текущей ситуации это разве что-то меняет? Это пусто, 0, ничего, false.
Цитата
Serge123 написал: Но если сравнить различные языки, то , если в данных присутствуют значения NULL, логические операторы и операторы сравнения могут возвращать, кроме TRUE или FALSE, также и третий результат — UNKNOWN.
Только JS встречал, с которым сейчас в основном и работаю. Больше нигде.
Цитата
nikolz написал: 2. Этот способ адресации делает VMLua не только стековой машиной, но и регистровой машиной.Отрицательный индекс удобен, когда работаем с вершиной, положительные, когда работаем с фактическими параметрами функций.
Ну вот примерно про это я и спрашивал. Получается, что это просто работа со стеком таким образом, чтобы не превращать его в массив. Стек - это первый зашел и последний вышел. А если читать стек по положительным индексам - это массив получится. Получается, что это просто выбор разраба, как читать - ок. Меня это и интересовала: это правило или просто так сложилось.
Цитата
nikolz написал: 4. Зря Вы не читаете учебники и документацию, а придумываете объяснение сами. Проблема Вашего непонимания в том, что Вы не знаете архитектуры процессоров.Пытаетесь разобраться в "железе" на основе знания какого-либо языка программирования. -------------------- Очевидно, что Ваши ощущения - это и есть результат незнания.
Ну так я сюда и пришел за знаниями. Разве форумы не для того чтобы быстро получить ответ на вопрос и продвинуться дальше? Читать документацию и прочее можно до бесконечности. У меня знакомый 4 года назад начал изучение ReactJS с чтения документации, тогда как я советовал ему освоить базу и начать работать. До сих пор учит. Зачем же в такие крайности?
Цитата
nikolz написал: Подробнее написано в ссылках, выше и в других статьях в интернете.
Спасибо.
Массив регистров. - это и есть регистровый способ адресации. Т е VMLua это не только стековая, но и регистровая машина. Два в одном.
Serge123, А Вы знаете, зачем нужен DNS? ---------------------- Судя по вопросу, Вы этого не знаете. ---------------------- Прочитайте в интернете и вопрос отпадет сам собой.
Maater написал: Всем привет! Столкнулся с такой проблемой: купил робота, он был привязан к конкретному счёту, который теперь закрыт, а автор робота на связь не выходит, чтоб сменить счёт. Кто-то может помочь снять защиту? Вам робот считайте просто так достанется!) Работает на логике Ларри Вильямса
еще хотел заметить. Так как фьючерсы и опционы - это не материальные активы, и они изначально заложены у биржи. Поэтому давать в дол под залог намерений (опционов) это прикольно.
Вручную на практике снимать удается (хорошо, что он не рыночные заявки создает), смотришь в таблицу - новая заявка и сразу отменяешь. Возможно брокер и прав, но, не называя имена брокеров хочу сказать, что у старого такой фигни не было, он позволял держать опционы до дня исполнения даже если не хватает обеспечения, а новый за пару дней уже мутит что хочет. Старого брокера выкупили...
Ставить такие заявки могут в региональном офисе брокера. Дело конечно ваше, полагаю зря в опционы полезли. Возможно у Вас позиция при которой в случае неудачи Вы будете должны брокеру кучу бабла. Вот он и страхуется, так как деньги не его а клиентов.
Дело вот в чем. Опционы куплены (а не проданы, то есть не short) с запасом на балансе (потерять в данном случае больше стоимости самих опционов невозможно). Далее если опционы "в цене" есть два варианта: либо ДО момента исполнения обеспечить деньгами сумму ГО для фьючерсов, либо продать эти опционы. Но брокер заранее, за несколько дней уже продает эти опционы обратно (если на балансе не хватает ГО) и пропускается хорошие движения цен (я бы их продал например за пару часов до исполнения, а не за 3 дня). А к примеру, на 70 опционов Si нужно иметь на счете 1 000 000 рублей, что то не хочется доверять брокеру такие деньги с таким поведением... Да и вообще никому нельзя доверять большие деньги)
Теперь все понятно. Дело в том, что на фьючерсах и опционах нет short как на акциях. Рынок производных инструментов тем и отличается от рынка базовых. Поэтому брокер по регламенту не обязан Вам давать в долг на этих инструментах. -------------------- Но некоторые брокеры дают , могу догадаться у кого вы раньше обслуживались. Другие не дают, и это их законное право. Вот Ваш брокер сейчас из таких.
Как получить информацию о количестве у меня на покупку/продажу лотов типа CNYRUB_TOM?, Как получить информацию о количестве у меня на покупку/продажу лотов типа CNYRUB_TOM?
Александр написал: Вдогодку. Зато появились 3 строчки по CNY в таблице "Позиции по деньгам". Но в Таблице "Позиции по деньгам" нету колонок типа "В покупке", "В продаже", т.е. невозможно увидеть итоговое количество лотов на покупку и продажу по портфелю и походу на сегодня нигде в квике по валютным лотам эту итоговую информацию не получить(. Разрабочики!!! Что это за недоработка? Почему такую немаловажную информацию, как итоговое количество лотов валюты на продажу/покупку нигде невозможно найти?
По деньгам - это ваши деньги. Там указывается сколько есть и сколько вы потратили на позиции или сколько у вас заблокировано. Но это деньги. Позиции по инструментам - это не деньги, т е Ваши контракты. ----------------- Я Вам привел картинку в которой есть позиция по валюте и по акциям.
Виталий написал: 1. Вопрос к знатокам: при работе со стеком, перед началом чтения через lua_next(L, -2), нам необходимо делать lua_pushnil(L). Зачем? Ведь это по сути означает "положить сверху NULL". Для чего мы это делаем? 2. Далее, почему в некоторых случаях мы читаем данные, как lua_tostring(L, -1). А в некоторых lua_tostring(L, 1). Если я правильно понимаю - это не одно и то же. В стеке из двух элементов индекс 1 - это низ стека, а -1 - верх стека! 3. Потом, для чего мы делаем lua_pop(L, 1); при использовании lua_next(L, -2), когда читаем стек? Ведь это удалит только один верхний элемент и все. Т.е., когда я читаю из стека некую таблицу - я должен посмотреть ключ (поле) по lua_next(L, -2) и, если он есть, то прочесть данные через lua_tostring(L, -1). Но потом я удаляю всего 1 элемент сверху. Не понимаю, что за дичь. 4. Есть у кого-то понимание / объяснение / картинка как выглядит стек qLua, когда в нем лежат смешанные данные? Т.е. как туда кладется таблица, строки и т.д.? Потому что по логике чтения я могу предположить, что туда кладется сначала ключ, а сверху значение. Это следует из логики чтения: -2 ключ, -1 значение (что тоже какая-то хрень, но это еще как-то понять можно набухавшись). Но что если у меня таблица в таблице или плоские данные, типа строка / число? Документация не то чтобы объясняет это все.
Можно конечно забить и принять это как факт, а для себя сделать класс-обертку и забыть навсегда эти ужасы. Но стало уж очень принципиально понять, как это работает и что вообще происходит.
1. Не NULL а nil. Чтобы выбрать первый элемент таблицы. ------------------------ 2. -1,1 - выбор с разных концов стека. --------------------------- 3. см документацию: int lua_next (lua_State *L, int index); Снимает ключ со стека, ложит пару ключ-значение из таблицы Т е ключ функция сама убирает из стека, а значение убираем сами. ------------------------------ 4. qLua - это библиотека функций. У нее нет стека. Стек есть у виртуальной машины луа. qLua никаким боком не имеет отношение к этому. ------------------- Не надо ничего предполагать или гадать, лучше прочитать: https://web.archive.org/web/20230415092320/https://lua.org.ru/contents_ru.html https://jevico.github.io/ https://eligovision.ru/media/upload/lua.pdf
Спасибо.
1. Не принципиально, суть поняли. Я на разных языках пишу, где-то NULL (что даже привычней мне), но это одно и то же. 2. Вот зачем и почему? Т.е. я не понимаю почему в одном случае мы читаем через 1, а в других через -1. От чего зависит? Ну т.е. есть какое-то правило по которым таблицы сверху всегда или что, почему таблицы обчитываются через отрицательные индексы сверху стека? 3. Это типа lua_next снимает ключ, а мы через pop убираем остальное после чтения? Жесть какая-то, ну ладно. 4. Хорошо, допустим, но вот интересно как раз как это работает в Lua. Потому что у меня сложилось ощущение какого-то изврата. Хочу понять подробнее как оно работает
Небольшой ликбез. ------------------------- 1. Вы ошибаетесь. NULL и nil это не одно и то же. Это одно и тоже в objective-c, но не в луа. В Lua нет NULL. --------------------- Но если сравнить различные языки, то , если в данных присутствуют значения NULL, логические операторы и операторы сравнения могут возвращать, кроме TRUE или FALSE, также и третий результат — UNKNOWN. --------------- nil в Lua - это всегда false. ----------------- 2. Этот способ адресации делает VMLua не только стековой машиной, но и регистровой машиной. Отрицательный индекс удобен, когда работаем с вершиной, положительные, когда работаем с фактическими параметрами функций. -------------------------------- 4. Зря Вы не читаете учебники и документацию, а придумываете объяснение сами. Проблема Вашего непонимания в том, что Вы не знаете архитектуры процессоров. Пытаетесь разобраться в "железе" на основе знания какого-либо языка программирования. -------------------- Очевидно, что Ваши ощущения - это и есть результат незнания. ------------------ Подробнее написано в ссылках, выше и в других статьях в интернете.
еще у брокера может работать бот, у которого есть порог. Бот срабатывает , вы отменяете. Попробуйте спокойно узнать у брокера по какому критерию они ставят заявки,
Вручную на практике снимать удается (хорошо, что он не рыночные заявки создает), смотришь в таблицу - новая заявка и сразу отменяешь. Возможно брокер и прав, но, не называя имена брокеров хочу сказать, что у старого такой фигни не было, он позволял держать опционы до дня исполнения даже если не хватает обеспечения, а новый за пару дней уже мутит что хочет. Старого брокера выкупили...
Ставить такие заявки могут в региональном офисе брокера. Дело конечно ваше, полагаю зря в опционы полезли. Возможно у Вас позиция при которой в случае неудачи Вы будете должны брокеру кучу бабла. Вот он и страхуется, так как деньги не его а клиентов.
Айдар написал: Кто может подсказать, как отследить заявку от администратора, и моментально снять ее? А то брокер совсем ... . До исполнения опционов еще два торговых дня, а он делает что хочет... Тут даже дело не в отслеживании конкретного номера заявки, можно простой код для снятия всех заявок (буду ночью запускать скрипт от вредителей) Примерно так: отследит колбек черер OnTransReply() и далее снять все активные заявки. Вот со снятием всех активных заявок нужно разобраться.
Вы этого не сделаете. А если сделаете, то Вас брокер заблокирует. --------------- Читайте внимательно договор с брокером. Заявки на биржу подаете не вы а брокер. Системой КВИК Вы подаете заявку брокеру. Тот при возможности ее исполнить отправляет ее на биржу. Брокер имеет право сократить Вашу позицию, если у Вас не хватает обеспечения. ----------------- Фактически брокер всегда прав.
Как получить информацию о количестве у меня на покупку/продажу лотов типа CNYRUB_TOM?, Как получить информацию о количестве у меня на покупку/продажу лотов типа CNYRUB_TOM?
Александр написал: Для получения денежных позиций (класс CETS, бумаги типа CNYRUB_TOM ) что нужно использовать?
Надо смотреть позиции по инструментам., но фирма и счет должны быть другими чем для акций Поэтому предположил, что Вы не выбрали надлежащую фирму и счет.
Как получить информацию о количестве у меня на покупку/продажу лотов типа CNYRUB_TOM?, Как получить информацию о количестве у меня на покупку/продажу лотов типа CNYRUB_TOM?
Виталий написал: 1. Вопрос к знатокам: при работе со стеком, перед началом чтения через lua_next(L, -2), нам необходимо делать lua_pushnil(L). Зачем? Ведь это по сути означает "положить сверху NULL". Для чего мы это делаем? 2. Далее, почему в некоторых случаях мы читаем данные, как lua_tostring(L, -1). А в некоторых lua_tostring(L, 1). Если я правильно понимаю - это не одно и то же. В стеке из двух элементов индекс 1 - это низ стека, а -1 - верх стека! 3. Потом, для чего мы делаем lua_pop(L, 1); при использовании lua_next(L, -2), когда читаем стек? Ведь это удалит только один верхний элемент и все. Т.е., когда я читаю из стека некую таблицу - я должен посмотреть ключ (поле) по lua_next(L, -2) и, если он есть, то прочесть данные через lua_tostring(L, -1). Но потом я удаляю всего 1 элемент сверху. Не понимаю, что за дичь. 4. Есть у кого-то понимание / объяснение / картинка как выглядит стек qLua, когда в нем лежат смешанные данные? Т.е. как туда кладется таблица, строки и т.д.? Потому что по логике чтения я могу предположить, что туда кладется сначала ключ, а сверху значение. Это следует из логики чтения: -2 ключ, -1 значение (что тоже какая-то хрень, но это еще как-то понять можно набухавшись). Но что если у меня таблица в таблице или плоские данные, типа строка / число? Документация не то чтобы объясняет это все.
Можно конечно забить и принять это как факт, а для себя сделать класс-обертку и забыть навсегда эти ужасы. Но стало уж очень принципиально понять, как это работает и что вообще происходит.
1. Не NULL а nil. Чтобы выбрать первый элемент таблицы. ------------------------ 2. -1,1 - выбор с разных концов стека. --------------------------- 3. см документацию: int lua_next (lua_State *L, int index); Снимает ключ со стека, ложит пару ключ-значение из таблицы Т е ключ функция сама убирает из стека, а значение убираем сами. ------------------------------ 4. qLua - это библиотека функций. У нее нет стека. Стек есть у виртуальной машины луа. qLua никаким боком не имеет отношение к этому. ------------------- Не надо ничего предполагать или гадать, лучше прочитать: https://web.archive.org/web/20230415092320/https://lua.org.ru/contents_ru.html https://jevico.github.io/ https://eligovision.ru/media/upload/lua.pdf
выводит цену в виде 150,0 но в стакане цена вида 150 и заявка не выставляется если добавляю так bid = math.floor(bid) тогда все нормально bid = 150 Но если меняю инструмент в котором к примеру 3 знака после запятой то такой код будет округлять до целого. Пробовал получить количество знаков после запятой через Шаг цены, с помощью чат жпт получился такой код
Код
function countDecimalPlaces (number) local _, decimal = tostring(number):match"([^.] * ).(. * )" return # decimalend -- Получаем информацию о выбранном инструментеlocal security_info = getSecurityInfo(classcod, ticker)-- Получаем шаг ценыlocal price_step = security_info.min_price_steplocal decimal_places = countDecimalPlaces(price_step)
и вот тут возникла проблема decimal_places (кол-во знаков после запятой) при шаге цены к примеру 2 выдает 1, а если инструмент имеет шаг к примеру 0,5 то decimal_places выдает тоже 1 каждый раз при смене инструмента приходится менять код, прошу помочь с решением этой проблемы.
можно делать так:
Цитата
Lankaster написал: Профи, подскажите пожалуйста как правильно получить цены "BID" и "OFFER" делаю так
выводит цену в виде 150,0 но в стакане цена вида 150 и заявка не выставляется если добавляю так bid = math.floor(bid) тогда все нормально bid = 150 Но если меняю инструмент в котором к примеру 3 знака после запятой то такой код будет округлять до целого. Пробовал получить количество знаков после запятой через Шаг цены, с помощью чат жпт получился такой код
Код
function countDecimalPlaces (number) local _, decimal = tostring(number):match"([^.] * ).(. * )" return # decimalend -- Получаем информацию о выбранном инструментеlocal security_info = getSecurityInfo(classcod, ticker)-- Получаем шаг ценыlocal price_step = security_info.min_price_steplocal decimal_places = countDecimalPlaces(price_step)
и вот тут возникла проблема decimal_places (кол-во знаков после запятой) при шаге цены к примеру 2 выдает 1, а если инструмент имеет шаг к примеру 0,5 то decimal_places выдает тоже 1 каждый раз при смене инструмента приходится менять код, прошу помочь с решением этой проблемы.
если надо целое, то можно делать так:
Код
local bid=150.123456; local price=bid//1>>0; print("price="..price)
Рассказываю как просто сделать функцию для воспроизведения звука в различных форматах. Надо сделать на СИ dll для луа вот с такой функцией.
Код
static int mciSS(lua_State*L){ mciSendString((char*)lua_tostring(L,1),0,0,0); }
если кто-то не сможет ,пишите - выложу готовую dll. Далее у меня такая dll называется nks. Вызов функции в скрипте записан как nks.mciss ================= Поясняю как ее применять: =========== Чтобы воспроизвести файл в формате WAV надо открыть устройство с этим файлом так:
Код
local file="C:/Windows/Media/Alarm10.wav" -- звуковой файл
nks.mciss("open "..file.." alias MediaFile wait"); -- открыть устройство
Для воспроизведения содержимого файла пишем там , где хочется:
Код
nks.mciss("play MediaFile FROM 0 wait");
======================== Чтобы воспроизвести файл в формате MP3 надо сделать все тоже самое, но для этого файла Например у меня это файл "D:/nks/test.mp3"
Код
local file="D:/nks/test.mp3" -- звуковой файл
nks.mciss("open "..file.." alias MediaFile wait"); -- открыть устройство
Для воспроизведения содержимого файла пишем там, где хочется:
Код
nks.mciss("play MediaFile FROM 0 wait");
Опции : ---------------------------- Если Вам хочется запустить звук и не ждать, когда закончится, то уберите в последней команде "wait" ---------------------------- Если Вам хочется воспроизводить много различных звуков в разных местах скрипта, то в начале скрипта откройте все звуковые файлы и для каждого из них сделайте уникальное имя устройства. Его надо написать вместо "MediaFile" Для воспроизведения конкретного файла надо указать имя его устройства в команде воспроизведения вместо "MediaFile" ============== Желаю успешного прослушивания звуковых файлов.
Serge123 написал: Вернее, дело не в звуковом устройстве: в упрощённом варианте команд файлы с пробелами не играются, а в той форме, что была у w32, как помню, они игрались.
Выкладываю исходник на варианте mciSendString
Код
static int mciSS(lua_State*L){
mciSendString((char*)lua_tostring(L,1),0,0,0);
if (lua_gettop(L)>1)SleepEx(lua_tointeger(L,2),1);
return 0; }
позволяет воспроизводить файлы wav, MP3, повторять, делать паузу
Показал как воспроизвести звуковой файл на Lua из командной строки. ---------------- Недостаток такого способа - затраты времени на загрузку приложения плеера. Достоинство - ничего не надо писать на СИ. =============== В данной теме, по просьбе трудящихся, показываю как воспроизводить звуковой файл сохранить его в памяти для многократного воспроизведения. -------------- Решить эту проблему невозможно без написания функции на СИ. =============== По данной ссылке https://cloud.mail.ru/public/PYXu/YrjyXLvcP можно загрузить zip файл nks.dll c такой функцией, там же есть пример, который напишу ниже, и библиотека Lua53.dll -------------------------- Пример :
Код
--функция для Lua 5.3 выводит на динамики звуковой файл
--при первом вызове записывает файл в буфер
--при последующих вызовах воспроизводит содержимое буфера
--автор nikolz 2024
--распакуйте файл на диск желательно D
--пример вызова функции для вывода на динамики системного звука
path = "D:/nks/" --путь где находится файл nks.dll
package.cpath =path.."?.dll;"..package.cpath
require"nks"
local x="C:/Windows/Media/Alarm10.wav" -- звуковой файл
nks.run(x); -- первый вызов с указанием файла
for x=1,5 do
nks.run(); -- вызов воспроизведение из буфера памяти
end
nks.stop(); -- завершение работы и удаление буфера памяти
nikolz написал: Кроме музыки, в модуле можно синтезировать предложения .
Круть. На след. этапе можно сделать виртуальную дикторшу. А для простых смертных у mciSendString предусмотрено проигрывание звука с заданного смещения и заданной длительности.
Так Вы ничего и не поняли. Поясняю. В начале темы написана одна строчка как воспроизвести звуковой файл. -------------------- Тоже самое что и ваша dll на основе устаревшей функции mciSendString. -------------- Т е не надо никаких dll для этого , понятно?
Есть еще они способ о котором возможно мало кто знает. Я использую такое решение в своих умных устройствах и для отладки звуковых команд для них на луа. --------------------------- Берем модуль внешнего плеера (цена вопроса 1 доллар) подключаем его к USB и загружаем на него свои звуковые файлы . На выход модуля можно подключить динамики. Есть вариант модуля с памятью на чипе флеш либо с внешней флеш. Число таких файлов может быть тысячи В луа используется функция вывода на виртуальнуй UART. Выводим код любого файла и модуль его играет, а скрипт работает дальше. Время вывода команды на модуль несколько мкс. Кроме музыки, в модуле можно синтезировать предложения .