Если говорить о доступных call back, то их список описан в документации. Не очень ясно, что требуется. Но можно предположить, что если речь про денежные средства, а не позиции, может подойти: OnMoneyLimit.
Но можете и сами организовать вызов некой функции при изменении данных портфеля, сделав регулярную проверку оного.
Nikolay написал: Если говорить о доступных call back, то их список описан в документации. Не очень ясно, что требуется. Но можно предположить, что если речь про денежные средства, а не позиции, может подойти: OnMoneyLimit.
Но можете и сами организовать вызов некой функции при изменении данных портфеля, сделав регулярную проверку оного.
Да интересует изменение в таблице "ПланЧистПос", но не одна из call back функций (
swerg написал: Вот же дался вам это клиентский портфель. Не надо в него смотреть с точки зрения программирования на Lua. Не надо.
Попробуйте OnFuturesClientHolding
Я же уже писал, что торгую на Един. Бр. Счете, а изменение средств (свободных) для этого типа счета видны только в таблице "Состояние счета" (не доступно для LUA) и "Клиентский портфель" OnFuturesClientHolding щас попробую...
Михаил Филимонов написал: Я же уже писал, что торгую на Един. Бр. Счете, а изменение средств (свободных) для этого типа счета видны только в таблице "Состояние счета" и "Клиентский портфель"
Единый Брокерский Счет (брокер Открытие) Это счет, на котором можно одновременно торговать фьючерсами и акциями, при этом нет раздела средств по секциям средства для фьючерсов и акций - едины.
Единый счет - это конструкция, когда данные собираются из разных мест. Вы бы сказали хоть какие изменения должны вызывать событие. Если деньги - это одно. Если позиции по бумагам - это другое. Портфель - слишком общее понятие.
Михаил Филимонов написал: Это колонка в таблице "Клиентский портфель"
С точки зрения программирования на Lua и, тем более, событий, надо опираться на другие, базовые таблицы. Из информации которых формируются уже "Клиентский портфель" и "Таблица состояния счета".
Для срочного рынка:
Ограничения по клиентским счетам --> OnFuturesLimitChange
Позиции по клиентским счетам --> OnFuturesClientHolding
Для рынка ценных бумаг и валютного рынка:
Таблица лимитов по денежным средствам --> OnMoneyLimit
Михаил Филимонов написал: Это колонка в таблице "Клиентский портфель"
С точки зрения программирования на Lua и, тем более, событий, надо опираться на другие, базовые таблицы. Из информации которых формируются уже "Клиентский портфель" и "Таблица состояния счета". Для срочного рынка: Ограничения по клиентским счетам --> OnFuturesLimitChange Позиции по клиентским счетам --> OnFuturesClientHolding Для рынка ценных бумаг и валютного рынка: Таблица лимитов по денежным средствам --> OnMoneyLimit Таблица лимитов по бумагам --> OnDepoLimit
Михаил Филимонов, Я, лапуль, ВСЕГДА знаю, сколько у меня чего куплено, когда и почём, и сколько денег имеется - как свободных, так и потенциально свободных (тех, которые я могу освободить без продажи в убыток при необходимости). И так по каждой валюте и по каждому тикеру. Программист я или дерьмо беспомощное?
О, Господи! Скрипту ДО ЛАМПАДЫ! Этот цикл нужен юзеру для эмуляции отсутствующих прерываний по таймеру. У меня это раз в секунду, раньше было раз в полторы секунды, у многих это составляет доли секунды - столько, сколько нужно Юзеру. В любом случае, на скорость работы скрипта это не влияет НИКАК - во время sleep код скрипта не интерпретируется вообще.
Цитата
while f do -- бесконечный цикл до остановки скрипта r(); -- раз в секунду запускаем утилиту опроса sleep(1000); -- текущих данных и принятия решений по ним end; -- конец бесконечного цикла
BlaZed написал: Другими словами, конструкция без слипа, типа такой
Код
function main ()
a = 0
is_run = true
while is_run do
a = a + 1
end
end
может легко повешать квик.
Нет. Если процессор одноядерный - да, это будет заметно в скорости общей работы. Если процессор многоядерный (а это нынче стандарт де-факто) - то никто ничего даже не заметит, кроме термометра на процессоре.
Если в мейне ничего не делается толкового, то единственный критерий - это сколько скрипт провисит после нажатия кнопки стоп. В этом случае одна секунда нормально. Если прицеплена длл, появляются варианты: а) создать событие и ждать на нем, тогда мейн вообще не просыпается до завершения скрипта, в OnStop выставляем событие; б) в мейне цикл сообщений, тут все как обычно в винде, из OnStop посылаем сообщение потоку мейна, что пора на выход. Окон можно не создавать и использовать PostThreadMessage; в) кому охота приключениев, тот может заценить вариант с портом завершения.
одно ядро полностью будет занято, это скорей теоретическая возможность, чем то, что надо делать. Даже слип(0) уже получше будет, поток будет сниматься и вставать в конец очереди, давая прочим потокам тоже ядро поюзать. Но тоже из области поиграть с этим.
Если есть интерфейс у скрипта, ставить задержку меньше 50млс не рекомендуется. А если поставить 0, то по идее влиять не должно, раз у нас много ядер, но Квик все же "висит". Поэтому хоть что-то да лучше поставить.
BlaZed написал: Другими словами, конструкция без слипа, типа такой
Код
function main ()
a = 0
is_run = true
while is_run do
a = a + 1
end
end
может легко повешать квик.
Нет. Если процессор одноядерный - да, это будет заметно в скорости общей работы. Если процессор многоядерный (а это нынче стандарт де-факто) - то никто ничего даже не заметит, кроме термометра на процессоре.
Так сколько ставить, чтобы бедолаге было комфортно?
Anton написал: одно ядро полностью будет занято, это скорей теоретическая возможность, чем то, что надо делать. Даже слип(0) уже получше будет, поток будет сниматься и вставать в конец очереди, давая прочим потокам тоже ядро поюзать. Но тоже из области поиграть с этим.
Мы таки про прозвучавшие в вопросе минимальные задержки говорим или просто рассуждаем?
Это способность скрипта реагировать на события (клики мышкой, нажатие клавиш). Существует и верхняя граница: "Задержка свыше 5 секунд вызывает раздражение, свыше 15 - нервные расстройства". У меня, например, возможна секундная задержка реакции на событие, а при смены режима выдачи талицы задержка может достигать 15 секунд, и это уже слегка раздражает, несмотря на то, что необходимость в это операции возникает очень редко.
BlaZed написал: Другими словами, конструкция без слипа, типа такой
Код
function main ()
a = 0
is_run = true
while is_run do
a = a + 1
end
end
может легко повешать квик.
Нет. Если процессор одноядерный - да, это будет заметно в скорости общей работы. Если процессор многоядерный (а это нынче стандарт де-факто) - то никто ничего даже не заметит, кроме термометра на процессоре.
Попробуйте, запустите Ryzen 5 3500x на 6 ядер, квик скопытился после запуска
BlaZed написал: Другими словами, конструкция без слипа, типа такой
Код
function main ()
a = 0
is_run = true
while is_run do
a = a + 1
end
end
может легко повешать квик.
Нет. Если процессор одноядерный - да, это будет заметно в скорости общей работы. Если процессор многоядерный (а это нынче стандарт де-факто) - то никто ничего даже не заметит, кроме термометра на процессоре.
Попробуйте, запустите Ryzen 5 3500x на 6 ядер, квик скопытился после запуска
В общем, значение слипа надо ставить минимум 1, тогда ничего не виснет. А выбирать адекватное значение уже в зависимости от требований конкретно вашей стратегии.
В общем, значение слипа надо ставить минимум 1, тогда ничего не виснет. А выбирать адекватное значение уже в зависимости от требований конкретно вашей стратегии.
Едрёна-батона... А я еще подумывал сменить комп на поновее-получше. Неужто опять враньё с этими ядрами/гигагерцами?!
Запустил скрипт этот с бесконечным цикл на своем Intel Pentium E2180 2ГГц, два ядра, прошу заменить. 2Гб оперативы. Да, проц грузится на 50%, это понятно, но QUIK совершенно без задержек реагирует на мышь, графики едут, к северу подключаюсь / отключаюсь, таблички сделок моргают, рукописные Lua-индикаторы работают. Неужели у вас на указанном железе в самом деле висит?! Определённо обманываете.
function OnFuturesLimitChange(f_change) a_table = getPortfolioInfoEx("MCXXXXXX", "XXXXX", 2) A_double = a_table.limit_open_pos lpParam = math.floor(A_double * 100) w32.PostMessage(HWND_BROADCAST, WM_EBS_MONEY, WParam, lpParam) end
function main() while is_run do a_table = getPortfolioInfoEx("MCXXXXXX", "XXXXX", 2) A_double = a_table.limit_open_pos lpParam = math.floor(A_double * 100) w32.PostMessage(HWND_BROADCAST, WM_EBS_MONEY, WParam, lpParam)
sleep(100)
end end
Установка ордера фьючерса отрабатывается (свободные средства изменяются), а акции проверю завтра, сегодня на счете мало средств (а это не Junior, а реал)
swerg написал: Неужели у вас на указанном железе в самом деле висит?!
Когда Lua только внедрили в QUIK sleep был обязателен в циклах, иначе QUIK зависал. Позже это дело поправили. В 8-й версии sleep снова стал обязательным. На одном и том же компьютере.
Но делать без sleep вообще, согласен с Антоном:
Цитата
Anton написал: Отдать одно ядро просто на бесполезный цикл - слишком роскошный вариант
Надо делать так, как надо. А как не надо - делать не надо.