Роман Н написал: А если же такую же заявку я выставлю в ручном режиме в терминале с признаком "полностью или отклонить", то такая заявка будет ждать снижения цены и встречного предложения и не отменится.
Так не должно быть. Если вы выставляете заявку с признаком "полностью или отклонить", а она ждет - это ошибка.
У меня тоже Linux и тоже проблема с некорреткным обновлением файла vcomp110.dll. Обновляется всё, кроме него. Из-за чего, каждый раз при загрузке крика всплывает сообщение о необходимости обновить квик.
Запустите winecfg и на вкладке libraries добавьте эту библиотеку.
w32 = require("w32")
QuikMainWindowHandle = 0
function OnInit()
QuikMainWindowHandle = GetMainWindowHandle()
end
function main()
if QuikMainWindowHandle ~= 0 then
-- тут можно писать, что вашей душе угодно
w32.SetWindowText(QuikMainWindowHandle, "Testing....")
end
end
function GetMainWindowHandle() -- Получить дескриптор главного окна QUIK
local CurrentProcessId = w32.GetCurrentProcessId()
local hWnd=0
while true do
hWnd = w32.FindWindowEx(0, hWnd, "InfoClass", "")
if hWnd == 0 then break end -- Окно не найдено
local ThreadId, ProcessId = w32.GetWindowThreadProcessId(hWnd)
if ProcessId == CurrentProcessId then break end -- Окно найдено
end
return hWnd
end
Kypat написал: Да добавьте в настройках галочку убрать uid , и добавьте время или бегущую строку мировых индексов типа типа hang seng nasdaq moex и ТД чтоб можно было видеть в % изменении и объем
Можно lua скриптом писать в заголовок окна все, что вам хочется...
Roman Koledin написал: что то не понятно - причем тут винда
Я сейчас уже точно не помню, в Windows чтобы окно можно было перемещать у него должен быть специальный атрибут. Если его нет, то окно не двигается, как сейчас закреплённый стакан. Если этот атрибут вернуть, окно может выглядеть немного иначе, что впрочем не должно быть проблемой.
В Windows, чтобы окно можно было перемещать, у него должен быть заголовок. Тот, который с кнопками.
ДмитрийР написал: а есть ли способ поставить лимитную заявку так, что бы если в этой цене окажется противоположная заявка, она не исполнилась как рыночная, а просто отменилась?
Я бы хотел иметь возможность в LUA видеть статус отправки сообщений в Телегу и если сообщения перестали уходить, то получить какой-то message, Версия с io.popen это позволяла бы сделать, как в приведённом выше примере, но он не работает :(. Ваш вариант отличный, но он позволит только постфактум узнать о проблемах. Но все равно, Вам огромное спасибо за идею в принципе! Это просто прекрасное решение почти всех моих запросов!
Не знаю, что у вас не так, у меня io.popen работает, и ответ от curl я получаю. Может, дело в версии curl
у меня io.popen вообще ничего не возвращает и команду не выполняет. Я пробовал просто dir отправить. У вас windows какой версии?
У меня в win10 работает. И под wine в линуксе тоже работает. Просто dir работать не будет, надо "cmd /c dir" Можно попробовать добавить в начало "cmd /c 2>&1 " перед curl - получите вывод сообщений об ошибках. Ну или в файл ошибки отправлять "cmd /c 2>errorfile.txt "
Я бы хотел иметь возможность в LUA видеть статус отправки сообщений в Телегу и если сообщения перестали уходить, то получить какой-то message, Версия с io.popen это позволяла бы сделать, как в приведённом выше примере, но он не работает :(. Ваш вариант отличный, но он позволит только постфактум узнать о проблемах. Но все равно, Вам огромное спасибо за идею в принципе! Это просто прекрасное решение почти всех моих запросов!
Не знаю, что у вас не так, у меня io.popen работает, и ответ от curl я получаю. Может, дело в версии curl
function tgmsg(text)
local curl = 'curl.exe'
local token = '.....'
local chatid = '....'
text = string.gsub(text, '[^0-9a-zA-Z\x80-\xff._~-]', function(chr) return string.format("%%%02x", string.byte(chr)) end)
local h, e, c = io.popen(curl .. ' -X POST --data-raw text="' .. text .. '" https://api.telegram.org/bot' .. token .. '/sendMessage?chat_id=' .. chatid)
if h then
local a = h:read('a')
return a, h:close()
else
return false, e, c
end
end
Ну только в -I надо путь к заголовкам, а в -L к библиотекам от openssl и нужной версии lua (я просто все накидал рядом с исходниками). По хорошему конечно надо makefile подправить для mingw сборки, а не так вручную.
В transaq можно выставлять стоп-заявки по исполнению в другом инструменте. Из документации:
Цитата
При вводе связанного стопа его направление (покупка/продажа) устанавливается противоположным направлению активной заявки, поля Инструмент, Режим и Клиент также копируются из активной заявки, но при необходимости могут быть изменены.
Связь по исполнению может быть использована как способ автоматизации торговых операций в одном финансовом инструменте по условию цены в другом инструменте. Выставляется «триггерная» заявка на минимальный объём в индикативном инструменте, и к ней привязывается стоп по исполнению, открывающий или закрывающий позицию в торговом инструменте. К этой же «триггерной» заявке можно привязать стоп, который автоматически закроет позицию, возникшую при ее исполнении
Сейчас есть условные стоп-заявки по исполнению. Но там всегда один инструмент. А для арбитражных стратегий хочется иметь возможность при исполнении лимитной заявки в одном инструменте автоматически активировать лимитную/рыночную заявку в другом.
Повторю свой вопрос. Я нажимаю alt-I в таблице "Состояние счёта" и вижу информацию об инструменте по конкретному классу. Как мне получить этот класс в lua? getSecurityInfo('', 'тикер') дает другой класс. Вряд ли на этот вопрос может ответить брокер.
Ну если вы видите нужные значения в таблице, то в чем проблема? Включаете в настройках "Формальное представление заголовков строк и столбцов", копируете всю таблицу, вставляете куда-нибудь и смотрите, как называется нужная колонка.
Текущая цена инструмента таблицы "Состояние счёта" берётся из параметров таблицы текущих торгов для данного класса/инструмента. Для данного показателя позиции используются следующие параметры ТТТ:
1. Цена последней сделки по инструменту из таблицы «Текущие торги». Если такой цены нет, то цена закрытия. 2. Для срочного рынка – цена последней сделки. Если такой цены нет, то указывается расчетная цена. 3. Для облигаций значение указывается в % от номинала, для срочных контрактов – в пунктах. 4. Для клиентов типа «МП»: лучшая цена спроса / предложения из таблицы «Текущие торги»
То, из какого именно класса берутся данные параметры - настраивается на стороне сервера QUIK. Получить эту цену, Вы можете обратившись к таблице текущих торгов с указанием класса и инструмента при помощи функций getParamEx и getParamEx2.
Вопрос актуальный - как именно этот класс, настроенный на стороне сервера, получить? Я нажимаю alt-I (информация об инструменте) в таблице "Состояние счёта" и вижу один конкретный класс. Как его получить в lua? Три дня назад у LQDT ETF был класс TQTF, а сегодня у ВТБ стал класс TQTF_F, а у другого брокера по прежнему TQTF. Поэтому вариант "зафиксировать класс где-то в настройках" не рабочий, класс может меняться.
Меняют конечно. Как минимум, туда добавлено несколько функций: os.sysdate(), table.sconcat(), table.sremove(), table.sinsert(), table.ssort(). А еще должна быть какая-то непустая реализация макросов lua_lock()/lua_unlock() в llimits.h
А профайлер показал, что изменение строки - узкое место, на которое тратится больше всего времени? Или вы хотите разбираться с тем, как поменять значение в обход api, c рисками неопределенного поведения, ради ускорения в ноль целых хрен десятых процента?
Serge123 написал: Сегодня на этом форуме читал старые споры и препирательства, в которых говорилось, что мьютексы работают медленно и подходят для синхронизации потоков из разных процессов. А в одном процессе надо использовать какую-то критическую секцию. Я пока не знаю, что это такое и как это сделать быстрее, чем с мьютексами...
Событие - это не мьютекс и не критическая секция.
Просто проверка концепции:
Код
w32 = require("w32")
run = true
evt = false
function OnInit()
evt = w32.CreateEvent(nil, 0, 0, nil)
end
function OnStop()
run = false
w32.SetEvent(evt)
end
function main()
while run do
w32.WaitForSingleObject(evt, 1000000)
end
w32.CloseHandle(evt)
end
В колбеках вызываете SetEvent - main сразу просыпается.
А, да, еще надо чтобы брокер считал свою комиссию не с каждой сделки, а как процент от дневного оборота. Вроде есть такие. А биржевая комиссия с мейкера не берется.
nikolz написал: По одной заявке выставляют HFT роботы, скальперы и ММ.
А какой смысл это делать на дешёвом инструменте с шагом цены ноль целых шиш десятых копейки?
Тут дело в округлении... https://roem.ru/12-08-2021/286525/tinkoff-cents/ Вот продали вы один лот ценой 1.3862, а получили 1.39 из-за округления. А можно можно купить сразу два лота по той же цене за 2.77. То есть продали два раза по одному, купили сразу два - заработали копейку. Сумеете купить пятьсот заявок по два лота и потом продать тысячу по одному - плюс 5 рублей. С теми объемами торгов, которые там есть - можно и много больше. Вопрос только в том, когда брокер скажет "ай ай ай".