Народ, закладываете ли вы в свои скрипты проверку на то, насколько инструмент ликвидный, прежде чем им торговать? Если да, то как вы это делаете? Каким способом вы определяете, достаточно ли ликвиден инструмент для торговли? 1. Вы запрашиваете значения оборота по инструменту? Если да, то при превышении какого порога вы считаете инструмент ликвидным?2. Вы вычисляете спред между лучшей ценой продажи и покупки? Если да, то насколько мал должен быть спред, чтобы считать инструмент достаточно ликвидным?
Если в день совершения сделки скрипт не работал, то получить информацию в другой день уже не получится. QUIK - интрадейная система, сервер не хранит исторических данных изменений сделок.
Вы можете запросить данные о сделках у вашего брокера, как вам рекомендовали пользователи выше.
Спасибо за совет. Я уже понял. Короче, QUIK сохраняет только данные за текущий торговый день, со следующего дня у него полная амнезия, и он начинает всё запоминать по-новой.
Получить данные о сделках при срабатывании стоп-ордера, когда скрипт не работает?
Пользователь
Сообщений: Регистрация: 30.10.2024
15.12.2025 14:00:37
Цитата
nikolz написал: Сергей Че, Вы удивитесь, но покупает не QUIK и не Вы, а брокер, по вашему поручению, которое Вы в данном случае подаете через QUIK. Все иное Вам только кажется.
А через Lua-скрипт?
Получить данные о сделках при срабатывании стоп-ордера, когда скрипт не работает?
Пользователь
Сообщений: Регистрация: 30.10.2024
15.12.2025 13:22:34
Можно ли получить данные о сделках при срабатывании стоп-ордера, когда скрипт не работает?
Пример. Цена растёт, я открыл лонг, поставил стоп-ордер под точку входа. Потом закрыл квик, выключил компьтер, и включил его через неделю. Как узнать, по какой цене произошла сделка (сделки), когда на следующий день после открытия позиции сработал стоп-ордер и закрыл мою позицию? Можно ли узнать данные о произошедшей сделке (сделках), когда я снова включу компьютер и открою квик?
CreateDataSource
Пользователь
Сообщений: Регистрация: 30.10.2024
14.12.2025 17:59:43
Цитата
nikolz написал: , Рекомендую почитать про потоки и не только:
Спасибо за рекомандацию, но всё-таки, что произойдёт с ИД второго скрипта, если в первом выполнить data_source:Сlose(), учитывая, как было сказано выше, что хранилище свечей одно.
CreateDataSource
Пользователь
Сообщений: Регистрация: 30.10.2024
14.12.2025 17:24:12
Цитата
nikolz написал: Сергей Че, Вы что-то путаете Функция reateDataSource()? никакие потоки не открывает. Я вам это уже давно сказал. Вы опять пошли по кругу.
Ну окей, не "поток данных", а "источник данных", ведь именно так и переводится "CreateDataSource" - "Создать Источник Данных". Это что-то изменило для вас?
написал: запуск каждого скрипта добавляет ровно один поток - функция main.
То есть сколько скриптов запрашивают поток, столько же потоков запрашивает КВИК? Даже на один и тот же инстумент?
нет. Когда запускается скрипт, то функция main запускается в отдельном потоке. Это делается для функции main, даже если в скрипте лишь эта функция пустая. так реализован механизм запуска скрипта.
Я не об этом. Есть 2 скрипта. У каждого своя функция main. Каждый скрипт запрашивает данные по одноиу и тому же инструменту на одном и том же таймфрейме. Сколько потоков создаст функция CreateDataSource()?
CreateDataSource
Пользователь
Сообщений: Регистрация: 30.10.2024
13.12.2025 19:10:53
Цитата
nikolz написал: запуск каждого скрипта добавляет ровно один поток - функция main.
То есть сколько скриптов запрашивают поток, столько же потоков запрашивает КВИК? Даже на один и тот же инстумент?
В рамках одного скрипта (торгового робота) понятно, что поток будет один. Хоть я 10 раз выполню CreateDataSource() с одними и теми же параметрами. А если разные скрипты (торговые роботы) решили поторговать одним и тем же инструментом?
CreateDataSource
Пользователь
Сообщений: Регистрация: 30.10.2024
12.12.2025 14:44:27
Цитата
Nikolay написал: Если закрыть поток, который в кеше и используется, то будет ошибка обращения.
А разве может быть ошибка при вызове Close() для непустого data_source? Конечный пользователь, опирающийся на руководство QLua, вообще не должен быть в курсе о внутренней кухне (кешируется там что-то или нет). Есть функция Close(), значит она должна всё корректно закрыть.
CreateDataSource
Пользователь
Сообщений: Регистрация: 30.10.2024
12.12.2025 13:50:30
Цитата
Nikolay написал: Здесь вопрос более тонкий. Кеш сделали и ладно. Я бы не стал полагаться на GC, все же запомнить уже заказанные потоки не сложно. А вот закрытие оных уже вопрос. Я меня есть счетчик использования потоков. Т.к. один и тот же может использоваться много раз. И по мере того, как он перестает быть необходимым счетчик уменьшается, и если он 0, то вызывается Close. Дабы закрыть поток.
Но т.к. скрипт может быть остановлен принудительно, что закрыть все открытие потоки уже не всегда будет возможно. Как себя ведет терминал при таком закрытии скрипта - не ясно. Надеюсь, что есть внутренний кеш.. В древних версиях терминала (на ранней 7-ой, кажется) при заказе потоков без закрытия или вызова GC - терминал начинал есть память.
Я думаю сделать так
Код
if sec.data_source then -- sec - торгуемый инструмент
sec.data_source:Close()
end
sec.data_source = _G[ 'CreateDataSource' ]( sec.class, sec.code, _G[ 'INTERVAL_M1' ] )
if not sec.data_source then
log.error( '...' )
end
CreateDataSource
Пользователь
Сообщений: Регистрация: 30.10.2024
12.12.2025 13:15:18
Цитата
nikolz написал: Указатель на колбек записывается в таблицу. Если таблицу уничтожили, то и указатель уничтожен.
А вот и нет! Функция будет жить самостоятельно, если создана до таблицы, а в таблице только ссылка на таблицу.
Код
$ lua
Lua 5.4.8 Copyright (C) 1994-2025 Lua.org, PUC-Rio
> f = function(x) return x*x end
> f(6)
36
> t = {aaa = f}
> t.aaa(8)
64
> t = nil
> t.aaa(3)
stdin:1: attempt to index a nil value (global 't')
stack traceback:
stdin:1: in main chunk
[C]: in ?
> f(4)
16
CreateDataSource
Пользователь
Сообщений: Регистрация: 30.10.2024
12.12.2025 12:32:37
Цитата
nikolz написал: Эта таблица ничего не триггереет. Она просто содержит указатели на функции. Все затертые таблицы вообще становятся недоступными и их сборщик соберет.
Так значит предыдущая функция-колббек будет по-прежнему вызываться квиком?
CreateDataSource
Пользователь
Сообщений: Регистрация: 30.10.2024
11.12.2025 19:26:32
Цитата
nikolz написал: если вызывать так: local x=CreateDataSource(class, sec,1); то новая таблица будет просто удалять старую. -------------------- При повторном вызове создается новая таблица:
А предыдущие таблицы будут автоматически уничтожаться сборщиком мусора? Или они по-прежнему будут триггерить функцию-коллбек?
CreateDataSource
Пользователь
Сообщений: Регистрация: 30.10.2024
11.12.2025 17:24:46
Что если вызвать функцию CreateDataSource для создания источника данных (ИД) несколько раз? Функция вернёт ту же таблицу, что в предыдущий раз? Или каждый раз будет генерировать новую таблицу с новым ИД, где снова в коллбеке будут последовательно переданы все свечи, начиная с 1-й и до текущей?
Комментарий в поле brokerref
Пользователь
Сообщений: Регистрация: 30.10.2024
01.12.2025 14:17:39
Цитата
В скриптах на lua - brokerref - это поле таблиц, в которое записывается строка формата <код клиента>/<комментарий>, которая была подана с транзакцией в поле CLIENT_CODE.
Что-то я не понял. При подаче транзакции в поле CLIENT_CODE надо записывать именно код клиента. Причём тут комментарий?
Комментарий в поле brokerref
Пользователь
Сообщений: Регистрация: 30.10.2024
29.11.2025 17:34:04
1) в скрипте в поле brokerref я могу записать любую строку, какую захочу, или эта строка должна быть вида <код клиента>/<номер поручения>, или какая-то комбинация из кода клиента + что-то своё.2) какова длина этого поля? где-то читал, что можно записать всего 20 символов, иначе транзакция отклоняется.
О торговле фьючерсами и ГО
Пользователь
Сообщений: Регистрация: 30.10.2024
20.11.2025 21:02:17
Почему ГО для покупки и ГО для продажи различаются? В чём смысл?
Всё верно. В этом примере на депозите должно хватать свободных средств на ГО под два контракта на продажу. По-хорошему, кнопочка "R" должна была бы проверять депозит, и если денег достаточно, делать переворот одной заявкой, а если нет - то в два шага. Но это QUIK.
Большое спасибо!
О торговле фьючерсами и ГО
Пользователь
Сообщений: Регистрация: 30.10.2024
19.11.2025 18:21:40
Ответьте пожалуйста на мой вопрос
О торговле фьючерсами и ГО
Пользователь
Сообщений: Регистрация: 30.10.2024
18.11.2025 14:37:58
Цитата
Ziveleos написал: Если денег хватает, то можно и сразу перевернуть, а если нет, то в два шага.Почитайте про кнопочку "R", она тупо выставляет заявку, приводящую к перевороту позиции (-6), не дожидаясь, пока позиция закроется и ГО вернется.
Для закреплления материала. Если у меня позиция, скажем, +3 и я продаю сразу 5 фьючерсов, то у меня заморозятся деньги в размере только 2-х ГО, потому что 3 проданных фьючерса пойдут на закрытие 3-х купленных фьючерсов (за которые я уже заплатил три ГО) и, соответственно, на закрытие позиции, и ещё 2 фьючерса — на открытие короткой позиции –2 . Я прав?
То есть переворот позиции лучше осуществлять в 2 шага 1) закрытие текущей позиции 2) открытие противоположной позиции так?
О торговле фьючерсами и ГО
Пользователь
Сообщений: Регистрация: 30.10.2024
18.11.2025 00:47:01
Цитата
Ziveleos написал: , когда Вы закрыли позицию +3, ГО вернулось, и Вы смогли использовать эти деньги на ГО под -3. А если сразу открывать -6, когда ГО еще не вернулось, депозита может не хватить. Заявка - это ещё не сделка.
Почему требования по деньгам в двух случаях, когда
сразу продаю 6 фьючерсов
два раза продаю по 3 фьючерса
О торговле фьючерсами и ГО
Пользователь
Сообщений: Регистрация: 30.10.2024
17.11.2025 18:37:25
Цитата
nikolz написал: Если Вы продаете то что уже купили то платите лишь комиссию Если Вы покупаете то что уже продали то аналогично
Раньше я тогровал через QUIK, и я cталкивался с такой ситуацией, когда у меня, скажем, позиция +3, и я хотел перевернуться (нажимал кнопку "R" в стакане), и QUIK не позволял мне это сделать, выдавая окно с ошибкой, где говорилось, что мне не хватает денежных средств для переворота. Однако, когда я разбивал переворот на 2 последовательные операции (сначала закрывал текущую позицию кнопкой "C", а потом открывал пртивоположную позицию такого же объёма), то никакого сообщения об ошибке не было, а я успешно "переворачился" до позиции -3.
Почему так? Ведь если для продажи трёх уже купленных фьючерсов никакие деньги не замораживаются, а наоборот размораживается, то эти два способа должны быть эквивалентными, однако я не мог просто "перевернуться" нажатием кнопки "R".
написал: Допустим, я купил 2 фьючерса с ГО = 10 000 руб. Для их покупки у меня должно быть свободно минимум 2 * 10 000 руб = 20 000 руб, которые будут заморожены при покупке. Спустся время я хочу закрыть позицию. Для этого мне надо продать два фьючерса. И для этого у меня так же должны быть свободны 20 000 руб или нет? Получается, чтобы торговать фьючерсом с плечом Х, мне надо иметь 2 * Х * ГО руб свободных денег? Я прав? Или я где-то что-то недопонимаю?
Прикольно, Вы хотите платить и когда покупаете что-то и когда продаете что-то? --------------------------- Может лучше начать с чтения учебников, а не с реальной торговли?
А можно без ёрничания? Я в своих размышлениях отталкивался от того, что для любой торговой операции замораживаться часть денег в виде ГО.
О торговле фьючерсами и ГО
Пользователь
Сообщений: Регистрация: 30.10.2024
17.11.2025 16:55:54
Допустим, я купил 2 фьючерса с ГО = 10 000 руб. Для их покупки у меня должно быть свободно минимум 2 * 10 000 руб = 20 000 руб, которые будут заморожены при покупке. Спустся время я хочу закрыть позицию. Для этого мне надо продать два фьючерса. И для этого у меня так же должны быть свободны 20 000 руб или нет? Получается, чтобы торговать фьючерсом с плечом Х, мне надо иметь 2 * Х * ГО руб свободных денег? Я прав? Или я где-то что-то недопонимаю?
Торговый счёт и код клиента
Пользователь
Сообщений: Регистрация: 30.10.2024
13.11.2025 20:24:52
Объясните пожалуйста простым языком, что такое торговый счёт и что такое код клиента, и почему они разные при торговле разными инструментами?
Какие таблицы QUIK автоматически очищаются после окончания торгового дня или после клиринга?
Пользователь
Сообщений: Регистрация: 30.10.2024
11.11.2025 14:54:39
Цитата
Dmitry Mishin написал: , Если стоп-заявка GTC к концу торгового дня не исполняется и остаётся активной, на следующий день она будет получена с сервера и отобразится в соответствующей таблице.
Ну хоть стоп-ордера не пропадают. Спасибо.
Какие таблицы QUIK автоматически очищаются после окончания торгового дня или после клиринга?
Система QUIK - интрадейная, и все данные, полученные с сервера, обнуляются при старте нового торгового дня.
Исключением являются таблицы "Таблица истории", "Таблица изменений значений параметров", и графики. За сохранение данных из этих окон отвечает настройка "Основные настройки..." - "Программа" - "Сохранение данных" - "Сохранять для получаемых инструментов и параметров" - "Данные, отражающие текущее состояние и всю историю изменений". При включении этой настройки информация, отображаемая в данных окнах, при смене дня очищаться не будет.
А как быть с таблицей стоп-ордеров? Она тоже очищается с наступлением нового торгового дня? Даже когда я создал стоп-ордер "до отмены" (GTC)? Ведь если таблица пустая, как тогда я узнаю параметры установленного мной стоп-ордера на следующий день? Ведь я даже не буду знать есть ли стоп-ордер, активен ли он или уже по-тихому исполнится и соответственно исчез. И я ни о том, ни о другом не буду знать, если таблица "stop_orders" пустая.
Какие таблицы QUIK автоматически очищаются после окончания торгового дня или после клиринга?
Пользователь
Сообщений: Регистрация: 30.10.2024
09.11.2025 14:55:46
Какие таблицы QUIK автоматически очищаются после окончания торгового дня или после клиринга?
Например, таблица trades очищается. И если ты не успел сохранить какие-то данные в файле, то из таблицы ты уже ничего не получишь.
Какие ещё таблицы самоочищаются?
Что возвращает getScriptPath()
Пользователь
Сообщений: Регистрация: 30.10.2024
30.10.2025 05:52:07
Функция getScriptPath() возвращает путь, по которому находится главный запускаемый скрипт. А если эта функция будет вызвана в модуле, который затем импортируется (require) в главный скрипт, или в другой модуль, который в свою очередь импортируется (require) в главный скрипт, то значение этой функции всегда будет одним и тем же? Это всегда путь главного скрипта?
varmargin vs real_varmargin vs total_varmargin
Пользователь
Сообщений: Регистрация: 30.10.2024
30.10.2025 05:28:32
Цитата
Izotova Liliya написал: , здравствуйте. Если вам необходима вариационная маржа по конкретной позиции, то можете использовать параметр "varmargin". Для получения суммарного значения вариационной маржи по всем позициям используйте параметр "total_varmargin".
а real_margin тогда что такое?
varmargin vs real_varmargin vs total_varmargin
Пользователь
Сообщений: Регистрация: 30.10.2024
27.10.2025 23:58:41
Цитата
Izotova Liliya написал: , здравствуйте. varmargin - вариационная маржа, рассчитанная с учетом установленных границ изменения цены; real_varmargin - реально начисленная в ходе клиринга вариационная маржа. Отображается с точностью до 2 двух знаков; total_varmargin - суммарная вариационная маржа по итогам основного клиринга, начисленная по всем позициям. Отображается с точностью до 2 двух знаков.
Можно поподробнее пожалуйста. Не вижу разницы. Просто скажите, какое поле таблицы мне запрашивать, чтобы узнать конкретную прибыль/убыток по конкретному фьючерсу. Спасибо.
varmargin vs real_varmargin vs total_varmargin
Пользователь
Сообщений: Регистрация: 30.10.2024
17.10.2025 10:36:52
varmargin vs real_varmargin vs total_varmargin В чём отличия этих полей в твблице getFuturesHolding ?
Я думаю, регистрировать коллбек, который будет вызываться при на каждом чихе (при любом измнении таблицы, например, при изменении вариационной маржи, которая изменяется постоянно) -- это не совсем правильно. Я думаю, вручную вызвать метод getFuturesLimit в тот момент, когда я закрываю позицию (выхожу из рынка), чтобы посмотреть, сколько я заработал, сравнив полученные деньги с предыдущим знанчением.
Спасибо Т.е. вызов должен быть такой? (добавил проверку на nil, если произошла ошибка при вызове функции)
Код
function get_money()
local t = getFuturesLimit( firmid, account, 0, "" )
return t and ( t.cbplused + t.cbplplanned + t.varmargin + t.accruedint - t.ts_comission )
-- ну или ...
-- return t and ( t.cbplimit + t.varmargin + t.accruedint - t.ts_comission )
end
Цитата
Если необходимо получить информацию по фьючерсному лимиту без валюты, то в качестве curr_code задается пустая строка.
Что за фьючерсный лимит без валюты? Я же торгую и фьючами с валютной привязкой, например индекс RTS и чисто рублёвыми фьячами, например, индекс МосБиржи.
Сколько у меня денег в данный момент времени?
Пользователь
Сообщений: Регистрация: 30.10.2024
15.10.2025 03:59:23
Сколько у меня всего денег в данный момент времени (на срочном рынке)?
local t = getFuturesLimit( ... )
return t.cbplused + t.cbplplanned + t.varmargin + t.accruedint - t.ts_comission
Я прав? Или нет?
И какие параметры у функции getFuturesLimit()
firmid - ID брокера (понятно)
trdaccid - торговый счёт / аккаунт (понятно)
limit_type - непонятно
currcode - непонятно
Объясните пожалуйста
Рыночная заявка для торговли фьючерсами
Пользователь
Сообщений: Регистрация: 30.10.2024
05.09.2025 12:22:27
Цитата
Nikolay написал: Вы определитесь уже - хотите исполнения ордера, сдвигаете цену и платите комиссию.
Я определился уже - мне нужна активная покупка, а не пассивное ожидание. Я разрабатываю торговый робот. Поэтому мне надо именно купить/продать, а не ждать у моря погоды. Допустим, мои индикаторы сигналят, что будет рост, а я выставляю цену в спред, в надежде, что цена до неё дойдёт и тогда я куплю без комиссии. Так можно профукать вход в позицию.
написал: На срочной секции нет рыночных ордеров. Можно только устанавливать ордера внутри ценовых границы последнего клиринга. Причина проста - сумма ГО зависит от цены. Поэтому устанавливая ордер далеко от цены клиринга, ГО возрастает и существенно.
И какую цену ставить? Текущая + сколько? (для покупки) Может быть, текущая + (текущая + максимум)/2 ?
Лучшая цена предложения/ спроса.
То есть ты предлагаешь перед подачей заявки сканировать стакан?
Рыночная заявка для торговли фьючерсами
Пользователь
Сообщений: Регистрация: 30.10.2024
29.08.2025 14:05:59
Ой, я немного ошибся. Я хотел предложить (текущая + максимум) / 2 для покупки (текущая + минимум) / 2 для продажи Подойдёт такой вариант?
Рыночная заявка для торговли фьючерсами
Пользователь
Сообщений: Регистрация: 30.10.2024
29.08.2025 14:01:11
Цитата
Nikolay написал: На срочной секции нет рыночных ордеров. Можно только устанавливать ордера внутри ценовых границы последнего клиринга. Причина проста - сумма ГО зависит от цены. Поэтому устанавливая ордер далеко от цены клиринга, ГО возрастает и существенно.
И какую цену ставить? Текущая + сколько? (для покупки) Может быть, текущая + (текущая + максимум)/2 ?
Рыночная заявка для торговли фьючерсами
Пользователь
Сообщений: Регистрация: 30.10.2024
29.08.2025 02:07:51
Цитата
funduk написал: 0 для срочки для рыночной сделки нельзя ставить, на сколько я помню.
А разве квику не должно быть пофиг на выставленную цену, если выставлен type="M"?
Рыночная заявка для торговли фьючерсами
Пользователь
Сообщений: Регистрация: 30.10.2024
28.08.2025 20:05:31
Цитата
funduk написал: Я использую type="M" и завышенную цену одновременно
А может быть можно не париться с завышенной/заниженной ценой? А то ведь не всякую цену можно указать, она должна быть в диапазоне минимуму до максимума, заданных биржей на текущий день.
Рыночная заявка для торговли фьючерсами
Пользователь
Сообщений: Регистрация: 30.10.2024
27.08.2025 18:22:37
Можно ли использовать поля type="M" и price="0" в таблице, которая передаётся в функцию sendTransaction для купли/продажи фьючерсов по рыночной цене? Или надо использовать лимитную заявки (type="L") со специально завышенной ценой для покупки и специально заниженной ценой для продажи?
Технологические времена работы биржи
Пользователь
Сообщений: Регистрация: 30.10.2024
21.07.2025 21:42:42
Цитата
Nikolay написал: Проверять на 0 цены - это плохая затея, т.к. во-первых, есть инструменты с допустимой ценой = 0, а во-вторых, для срочного рынка во время клиринга, для фондовой между сессиями цена может "бегать" от 0 до последней. Собственно в период, когда торги не идут, данные с сервера могут приходить какие угодно. Так что уже лучше время проверять, обеспечив точность своих часов. У меня сделано через несколько проверок, время, статус, сделки. И если один из них не проходит, то данные не считываются, т.к. получить цену 0 как рабочую - это проблема для алгоритмов.
Вы же сами выше написали, что полагаться на время - так себе затея.
Цитата
Времена часто изменяются. Они на сайте биржи в разделе расписание торгов есть. У Валютной секции совсем другие времена, для примера.