написал: SBMM торгуется в режиме T+. Почему у SBMM появится цена T0?
Я купил эту позицию вчера в количестве 100 лотов по цене X и сегодня докупил 200 лотов по цене Y. В T1, понятно, я вижу, что у меня "сейчас" 300 лотов общей себестоимостью 100X+200Y. В T0 вижу, что на начало сессии имелось 100 лотов общей себестоимостью... 0! Выглядит странно, как минимум.
T0 - это режим торгов при котором взаиморасчет выполняется в день заключения сделки. Е+ - это режим когда деньги сейчас, а стулья либо чере 1 либо через 2 дня. ----------------------------- В режиме Т0 на Московской бирже, как правило, торгуются облигации субъектов РФ, муниципальные облигации, корпоративные еврооблигации, номинированные в рублях и иностранной валюте, кроме долларов США, и облигации МФО
Стоимость позиции на начало дня, Почему-то везде нулевая в T0
Пользователь
Сообщений: Регистрация: 30.01.2015
15.01.2026 13:17:48
Если режим T+ то с какого цена приобретения будет на T0?
Стоимость позиции на начало дня, Почему-то везде нулевая в T0
Пользователь
Сообщений: Регистрация: 30.01.2015
15.01.2026 13:16:42
SBGB аналогично: SBGB ETF. Регистрационный номер. 3629. Код ISIN. RU000A1000F9. Режим торгов. Т+
Стоимость позиции на начало дня, Почему-то везде нулевая в T0
Пользователь
Сообщений: Регистрация: 30.01.2015
15.01.2026 13:14:56
SBMM торгуется в режиме T+. Почему у SBMM появится цена T0?
Стоимость позиции на начало дня, Почему-то везде нулевая в T0
Попробуйте донести поддержке, что Вы не указываете на ошибку при передаче данных, а просто хотели, чтобы брокер отправлял Вам цену приобретения и в Т0 тоже, и что это нужно Вам для анализа данных, а также написания скриптов.
nikolz, спасибо за то, что ты поделился своим подходом к созданию торгового робота, но у него есть один большой минус — он может двигать стопы, только когда он работает.
Что если я открыл позицию, потом закрыл квик, выключил компьютер, и включил его дня через три или через неделю? За это время цена могла улететь, куда угодно, задеть стоп, инициировать его исполнение, но поскольку твой отступ слишком маленький (5 шагов), то не факт, что созданная лимитная заявка будет исполнена (особенно при резком движении цены против тебя). И ты будешь нести большие убытки.
Получается, что твой робот должен работает постоянно, 24/7, но даже в этом случае не факт, что ты закроешь позицию, когда сработает стоп, потому что нельзя исключать ситуацию, когда могут быть перебои с электроэнергией. К примеру, скачок электроэнергии — и твой компьютер отключился, или есть проблема на электроподстанции — и район города сидит без электричества, или с электричеством всё нормально, но проблема у провайдера — тупо нет соединения с серверами. И пока будут чинить, торги на бирже идут, цена уходит, а ты (поскольку робот не работает) не можешь контролировать ситуацию.
Пока единственный выход — это когда ты заранее задаёшь стопу приличный отступ на всякий пожарный, например, цена минус 100 шагов , чтобы гарантированно закрыть позицию, даже когда торговый робот может не работать при исполнении стопа. Но тогда опять встаёт вопрос, не выйдет ли цена для лимитной заявки за пределы диапазона [PRICE_MIN, PRICE_MAX] . Ведь если выйдет, то заявка будет просто отклонена.
Как же неудобно, когда для срочного рынка нет простого и понятного type="M" + price="0", как оно есть для фондового! Приходится изобретать всякие костыли.
Все верно. Суть стоп-ордера - использовать удаленный сервер брокера . Если надо сделать тоже самое, то надо ставить квик на виртуальный сервер в дата-центре. ----------------------- Прикольно Ваша мечта. Поставить - и не смотреть неделю. Вы серьезно? ------------------------------ Если Вы периодически включаете комп, то можно автоматом переустанавливать стоп. В таком варианте, всегда можно подстроить цену род текущее состояние рынка. ------------------ Если Вы поставите на 100 шагов, то можете получить продажу на дне. Т е продадите и цена уйдет вверх.
написал: Но заявку linkedorder ловим в OnOrder, так как она там будет до таблицы.
А как тогда ты тогда определишь, что это не просто лимитная заявка, а лимитная заявка, созданная при активации стопа? По полю trans_id , который мы запоминаем при создании стопа?
написал: Если речь про стоп-ордер, то я делал так. ставлю цену, сместив ее относительно стоп например на 5 шагов. Когда стоп сработает, то лимитная заявка либо сработает, либо останется активной. Если она осталась активной, то на следующем тике робот ее переставляет на лучшую цену и так делает, пока вся позиция не закроется.
То есть, насколько я правильно понял, ты в коллбеке OnStopOrder(stop) читаешь поле stop.linkedorder (номер заявки, зарегистрированной по наступлению условия стоп-цены) и по номеру ищешь заявку в таблице orders , и у найденной зяавки проверяешь битовые флаги. И если она активна, то снимаешь её, и ставишь новый стоп-ордер на новую цену?
Почти так. Но заявку linkedorder ловим в OnOrder, так как она там будет до таблицы.
Рыночная заявка для торговли фьючерсами
Пользователь
Сообщений: Регистрация: 30.01.2015
14.01.2026 19:07:07
Цитата
Сергей Че написал: Если я ставлю стоп-ордер на закрытие позиции, то я не могу знать, когда именно он исполнится: может через минуту, а может через месяц. Поэтому я не знаю, какой будет диапазон [ PRICE_MIN, PRICE_MAX ] , когда цена достигнёт уровня срабатывания стопа. Если бы знал, то сразу бы выставил известный заранее PRICE_MIN при закрытии лонга (или известный заранее PRICE_MAX при закрытии шорта). Дело в том, что на срочном рынке нельзя выставить type="M" + price="0" , как документация советует для фондового рынка . А раз так, то приходится в стоп-заявке писать, что цена срабатывания Х , а цена исполнения Х ± 100 шагов (в зависимости от того, что закрываю, шорт или лонг). И тут вопрос, а не выйдет ли Х ± 100 шагов за пределы диапазона [ PRICE_MIN, PRICE_MAX ] ?
Если речь про стоп-ордер, то я делал так. ставлю цену, сместив ее относительно стоп например на 5 шагов. Когда стоп сработает, то лимитная заявка либо сработает, либо останется активной. Если она осталась активной, то на следующем тике робот ее переставляет на лучшую цену и так делает, пока вся позиция не закроется.
написал: Если в заявке указать цену меньше PRICE_MIN (или больше PRICE_MAX), она всё равно приведётся к PRICE_MIN (PRICE_MAX)? Или заявка просто будет отклонена?
Будет отклонена.
Надо ставить ту цену, по которой вы готовы купить. Ожидая роста, неплохо бы еще прикинуть, на сколько оно может вырасти. И учесть комиссии. А ставя PRICE_MAX, есть ненулевой шанс по этой цене и купить. Что может оказаться сильно завышено.
Выставляя цену, равную PRICE_MAX, я куплю по PRICE_MAX только в одном случае - если в стакане есть только 1 продавец, который выставил заявку в районе PRICE_MAX. На ликвидном инструменте это просто невозможно.
Выставляйте цену для покупки по лучшей цене предложений либо больше , чем она на несколько шагов цены. Еще можно делать так. Найти в стакане максимальный объем и выставить по его цене. тогда точно купите .
Стоимость позиции на начало дня, Почему-то везде нулевая в T0
Пользователь
Сообщений: Регистрация: 30.01.2015
14.01.2026 15:12:10
Возможно ошибаюсь, но разве в T0 отображается вчерашняя цена?
Cкорость обмена данными через файлы
Пользователь
Сообщений: Регистрация: 30.01.2015
11.01.2026 17:54:48
Цитата
Йцукен написал: , так что, не знаете как в QLua синхронизировать запись из разных скриптов в один файл?
Знаю. Но, не хочу гадать, что Вы понимаете под этим и что у Вас не получается. Напишите тест-скрипт и расскажите что не так.
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
Пользователь
Сообщений: Регистрация: 30.01.2015
10.01.2026 20:05:28
, А как Вам это:
3 февраля 2010 года ошибка в алгоритме HFT-робота компании Infinium Capital Management, торговавшего нефтяными контрактами, привела к неконтролируемому росту заявок и скачку цены на нефть на 1,3% прямо перед закрытием биржи. Примерно за секунду работы робот сгенерировал убытков на $1 млн. ------------------------ С HFT-трейдингом связывают обвал на американском фондовом рынке 6 мая 2010 года. За пять минут индекс DJIA, и без того снижавшийся весь день, потерял около 7%, чтобы ещё через 15 минут отыграть большую часть падения. Многие трейдеры сочли это естественным результатом насыщения рынка роботами: реагируя на продажи, те драматически усилили уже наметившееся движение.
23 марта 2012 года компьютерный HFT-алгоритм, запущенный с терминалов неопознанного трейдера, «убил» попытку американской компании BATS Global Markets провести IPO. Попытка вывести акции на биржу продолжалась ровно 9 секунд, в течение которых бумаги компании обесценились практически до нуля, торги по ним были приостановлены, а через некоторое время руководство компании заявило о полном отказе выходить на биржу в обозримом будущем.
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
Пользователь
Сообщений: Регистрация: 30.01.2015
10.01.2026 15:54:21
Цитата
Nikolay написал: Учет комиссий не решается колбеками и данными из таблиц. Решается же он через обработку отчетов брокера. Комиссия биржи транслируется вместе с сделкой, поэтому её условно можно считать. Брокера же чаще всего транслирует "ерунду". И только в отчете за день будут точные цифры, т.к. они могу зависеть от оборота за день, типа инструмента и др, и в момент сделки точных банально нет. Так что гораздо проще в алгоритм вбить процент либо величину комиссии и учитывать её. А корректировать через разбор отчета брокера.
Комиссия брокера считается в конце дня, так как реально сделки урегулируются лишь после сессии клиринговыми компаниями. Только эти компании могут списывать и зачислять денежные средства в оплату сделок. После получения их отчета, брокер соответственно списывает деньги у клиентов и начисляет свою комиссию.
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
Пользователь
Сообщений: Регистрация: 30.01.2015
09.01.2026 19:02:05
openbal
NUMBER
Входящий остаток
openlimit
NUMBER
Входящий лимит
currentbal
NUMBER
Текущий остаток
currentlimit
NUMBER
Текущий лимит
locked_sell
NUMBER
В продаже. Количество инструментов, заблокированное под исполнение заявок клиента на продажу
locked_buy
NUMBER
В покупке. Количество инструментов в активных заявках клиента на покупку
locked_buy_value
NUMBER
Стоимость инструментов, заблокированных под покупку
locked_sell_value
NUMBER
Стоимость инструментов, заблокированных под продажу
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
Например если в момент OnTrade мне нужно знать общее количество оставшихся акций
Для этого надо ловить это:
OnDepoLimit - изменение позиции по инструментам
алгоритм бота - стопа
Пользователь
Сообщений: Регистрация: 30.01.2015
09.01.2026 07:55:35
Предлагаю обсудить один из моих вариантов бота, который управляет стопом. ------------------------- Конструктивная критика приветствуется. =================== Открываем график с инструментом , помещаем на него скрипт-индикатор бота и совершаем сделки. ---------------------- Бот имеет два режима. ---------------------------------- В первом режиме бот автоматически установит стоп, если есть позиция по инструменту. -------------------------- Во втором режиме бот начнет управлять стопом, если руками установить стоп в любую позицию. Когда бот обнаружит установленный стоп, он будет его переставлять в соответствии с заданным алгоритмом. ---------------------- Если позиция закроется, то стоп будет снят. При появлении новой позиции бот будет управлять стопом. ---------------------------------- Чтобы бот перестал управлять, надо снять стоп руками. --------------------------------- При старте QUIK бот начинает работать в установленном режиме.
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
А слона-то вы и не заметили. Я специально модифицировал скрипт, чтобы показать, какие инструкции выполняются под блокировкой (в используемой версии Lua).
Если Вам интересно изучить, какие функции выполняются с блокировкой в Lua, то изучайте исходники.
Там все есть. Я этот этап прошел очень давно. Не вижу особого смысла снова возвращаться к этой теме.
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
Теперь если ваш код модифицировать следующим образом:
Код
local x, y
function main ()
while true do
y = 99
x = 199
x, y = y, x
if x ~ = 99 or y ~ = 199 then
s = tostring(x) .. "," .. tostring(y) .. "\n"
end
end
end
и запустить, то QUIK повесится (версия Lua: 5.4.1).
Поправьте так и ничего не повесится:
Код
local x, y
function main ()
while true do
y=99
x= 99
x, y = y, x
if x~= 99 or y ~= 199 then
s = tostring(x) .. "," .. tostring(y) .. "\n"
end
sleep(1);
end
end
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
Пользователь
Сообщений: Регистрация: 30.01.2015
07.01.2026 06:33:49
Два других должны быть не нулевые , так как определяют клиента на сервере брокера.
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
Пользователь
Сообщений: Регистрация: 30.01.2015
07.01.2026 06:33:14
Цитата
User12501 написал: Создаю заявку из lua-скрипта на покупку ровно одной акции. Т.е. никаких финтов с частичным исполнением не может быть. При исполнении происходят два вызова функции OnTrade. Сделал полную распечатку всей таблицы от обоих вызовов. Отличие только в трёх полях: uid, on_behalf_of_uid, trans_id. При первом вызове все три нулевые, при втором все три - ненулевые.
Вопросы следующие: 1. Гарантируется ли, что вызов OnTrade, в котором эти поля нулевые, является не последним, т.е. я могу его игнорировать, т.к. после него будет следующий? 2. Гарантируется ли, что вызов, в котором эти поля ненулевые, является последним? 3. Являются ли эти три поля синхронными всегда? (Т.е. либо все три равны 0, либо все три не равны 0?) Т.е. можно ли проверять только одно из них, а не все три вместе?
Если заявка, по которой пройдет сделка выставлена не скриптом Lua, то trans_id будет нулевой . ------------------------------------------- Должны быть не нулевые , так как определяют клиента на сервере брокера. ----------------------------- Полагаю , что первый раз приходит с биржи, второй - с сервера брокера.
написал: x,y=y,x; if x~=99 or y~=199 then Log:write(tostring(x)..","..tostring(y).."\n")
Даже если вы поймаете тут ошибку, то подумайте вот о чём: 1) Может ли другой поток поменять значения переменных перед if ? Будет ли это означать отсутсвие атомарности в операторе присваивания? 2) Может ли другой поток поменять значения переменных перед выводом их в файл, т.е. гарантированно ли вы получите те значения, которые проверяли в if ?
Скрытый текст Ответ на 2-й вопрос - Нет.
Не знаю что Вы называете атомарностью операции. Но В языке программирования Lua нет специальных атомарных операций. ------------------------------------- Дело в том, что скрипт луа выполняется на виртуальной машине, а его операторы преобразуются в байт код. Т е любой оператор -это набор функций на СИ. Поэтому официально в луа нет атомарных операций. Можно говорить о синхронизации потоков при обращении к данным. Что делается известными методами, в том числе и в VMLua и в библиотеке QLUA. ----------------- Кроме того, VMLua изначально сделана не многопоточная( это всем известно). Поэтому , если механизм синхронизации встроен, то ответ на ваш 2 вопрос будет нет, а если он не встроен , то ответ Да. Рекомендую открыть в КВИКе еще поток ОС с VMLua как корутину (так открыт поток main) и обратится из него к общим переменным. И Вы увидите ответ на Ваш вопрос. ( У Вас QUIK все просто вылетит аварийно)
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
Пользователь
Сообщений: Регистрация: 30.01.2015
06.01.2026 14:39:21
тест поправил:
Код
minfo=debug.getinfo(1, "S").source:sub(2); path=minfo:match("(.*[/\\])") or "."
Log=io.open(path.."/test.log","w");
fconnect=1;
local x,y;
function main()
while true do
y=99 x=199 x,y=y,x;
if x~=99 or y~=199 then
Log:write(tostring(x)..","..tostring(y).."\n");Log:flush();
end
sleep(1);
end
end
function OnParam(c, s)
y=100 x=200 x,y=y,x;
if x~=100 or y~=200 then
Log:write(tostring(x)..","..tostring(y).."\n");Log:flush();
end
end
function OnInit(p)
fconnect=1;
end
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
Пользователь
Сообщений: Регистрация: 30.01.2015
06.01.2026 14:29:22
, Вы, очевидно, ждете системные ошибки, типа ошибок обращения к памяти. Верно? Но их может и не быть. Атомарность обнаруживается например тем, что записав в ячейку 1 и прибавив к ней 1 Вы ожидаете прочитать из нее 2, а читаете 0, так как с момента прибавления 1 до момента чтения результата другое ядро успело записать в эту ячейку ноль.
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
написал: как вы проверили, что выполняется атомарно? Где доказательство?
Вот:
Цитата
написал: такой код работает без ошибок
Можете опровергнуть?
Как Вы это установили? какие ошибки? --------------------- Вот вам тест:
Код
minfo=debug.getinfo(1, "S").source:sub(2); path=minfo:match("(.*[/\\])") or "."
Log=io.open(path.."/test.log","w");
fconnect=1;
local x,y;
function main()
while fconnect do
fconnect=2
while fconnect==2 do
y=99 x=199 x,y=y,x;
if x~=99 or y~=199 then
Log:write(tostring(x)..","..tostring(y).."\n");Log:flush();
end
end
sleep(10);
end
sleep(1000)
end
function OnParam(c, s)
y=100 x=200 x,y=y,x;
if x~=100 or y~=200 then
Log:write(tostring(x)..","..tostring(y).."\n");Log:flush();
end
end
function OnInit(p)
fconnect=1;
end
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
Пользователь
Сообщений: Регистрация: 30.01.2015
06.01.2026 12:51:38
Атомарная ( άτομος — неделимое) операция — операция, которая либо выполняется целиком, либо не выполняется вовсе; операция, которая не может быть частично выполнена и частично не выполнена.
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
Пользователь
Сообщений: Регистрация: 30.01.2015
06.01.2026 12:49:03
Цитата
Йцукен написал: Похоже, операция множественного присвоения выполняется атомарно. Вот такой код работает без ошибок: Скрытый текст
Код
local run = true
local a1, a2, a3, a4, a5, a6, a7, a8, a9 = 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
local n = 100
function OnAllTrade ()
for i = 1 , n do
a1, a2, a3, a4, a5, a6, a7, a8, a9 = i, i, i, i, i, i, i, i, i
end
end
function OnParam ()
for i = 1 , n do
a1, a2, a3, a4, a5, a6, a7, a8, a9 = i, i, i, i, i, i, i, i, i
end
end
function main ()
while run do
sleep ( 1 )
local t = prec_time()
for i = 1 , n do
if a1 ~ = a2 or a1 ~ = a3 or a1 ~ = a4 or a1 ~ = a5 or a1 ~ = a6 or a1 ~ = a7 or a1 ~ = a8 or a1 ~ = a9 or a1 = = nil then
error( "error" )
end
end
end
end
function OnStop ()
run = nil
end
и как вы проверили, что выполняется атомарно? Где доказательство?
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
Пользователь
Сообщений: Регистрация: 30.01.2015
05.01.2026 10:07:07
, Интересно, как Вы реализуете обращение к этим переменным в разных потоках?
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
это выполнится на этапе компиляции. а это x, y = y, x как указано ранее
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
Пользователь
Сообщений: Регистрация: 30.01.2015
05.01.2026 07:36:03
Цитата
Йцукен написал: атомарной операция присвоения одновременно нескольким переменным
нет. При множественном присваивании Lua сначала вычисляет все значения, а затем выполняет присваивание.
Данные с индикатора. Просто и быстро.
Пользователь
Сообщений: Регистрация: 30.01.2015
04.01.2026 19:07:57
Продолжение здесь:
Торговый советник - это просто.
Пользователь
Сообщений: Регистрация: 30.01.2015
04.01.2026 19:07:20
Тема для начинающих писателей роботов. Продолжение темы:
------------------------- Чтобы сразу не сливать депозит, лучше написать робот-советник, который на истории покажет , что он сможет. --------------------------- Напишем такой советник. Для этого в приведенный по ссылке выше скрипт добавим расчет прибыли/убытков при совершении сделок по приведенному ранее(см ссылку) алгоритму ------------------------ Примем что брокер и биржа забирают com=0.006 (0.6%) Расчет будет проводить в %, количество лотов примем равным 1. Сделки совершаются в long и short. В результате получился вот такой скрипт:
Код
function OnCalculate(i)
local buy,sel;
if i==1 then OnChangeSettings()
i1=0; t={}; Prof=0; Los=0; Q=Settings.Q; com=Settings.com; ProfAll=0; BS=0;
elseif i1~=i then
ind(i1,Settings.tag,t);
if #t>0 then
local Oi,Hi,Li=O(i1),H(i1),L(i1) local prib=0; local z=T(i1); x=t[#t];
params.DATE=100*(100*z.year+z.month)+z.day;
params.TIME=100*(100*z.hour+z.min)+z.sec;
if Li>x and 0>=BS then buy=Li-0.05; if BS==0 then prib=-com; else prib=(1-com)*(price/Oi-1); end BS=1; price=Oi; params.YVALUE=buy-0.1; end
if x>Hi and BS>=0 then sel=Hi+0.05 if BS==0 then prib=-com; else prib=(1-com)*(Oi/price-1); end price=Oi; BS=-1; params.YVALUE=sel+0.1; end
if buy or sel then
ProfAll=ProfAll+prib; params.TEXT=(0.1*(1000*ProfAll//1)).."%"
if ProfAll>=0 then params.B=255 params.R=0 else params.B=0 params.R=255 end
Label=AddLabel(Settings.tag,params);
end
end
end
i1=i;
return buy,sel;
end
function Init()
local t={} Settings.line =t;
t[#t+1]={Name = "Bu",Color = RGB(0,255,0),Type = 10,Width = 4};
t[#t+1]={Name = "Se",Color = RGB(255,0,0),Type = 11,Width = 4};
return #t; end
function OnDestroy () DelAllLabels(Settings.tag) end
function OnChangeSettings()
DelAllLabels(Settings.tag);
end
а это результат его тестирования на демо-сервере:
Данные с индикатора. Просто и быстро.
Пользователь
Сообщений: Регистрация: 30.01.2015
04.01.2026 15:49:55
Теперь добавляю надписи в скрипт.
Код
Settings={ tag="moving", Name = '*nk_test'}
params={R=0,G=0,B=255,TRANSPARENCY=0,FONT_HEIGHT=10,TRANSPARENT_BACKGROUND= 1,FONT_FACE_NAME= 'Verdana'}
function ind(i,tag,t)
local M=getNumCandles (tag);
if M>=i then x=getCandlesByIndex(tag,0,i,1); if x then t[#t+1]=x[0].close end end
end
function OnCalculate(i)
local buy,sel;
if i==1 then i1=0; t={}; BS=0;
elseif i1~=i then ind(i1,Settings.tag,t);
if #t>0 then local x=t[#t]; if L(i)>x and 0>=BS then buy=L(i)-0.05; BS=1; params.TEXT="buy"
end if x>H(i) and BS>=0 then sel=H(i)+0.05 BS=-1; params.TEXT="sel" end end
-----------------------------------
if sel or buy then
local x=T(i); params.DATE=100*(100*x.year+x.month)+x.day; params.TIME=100*(100*x.hour+x.min)+x.sec;
if buy then params.YVALUE=buy-0.1 else params.YVALUE=sel+0.1 end;
Label=AddLabel(Settings.tag,params);
end
-------------------------------
end
i1=i;
return buy,sel;
end
function Init()
local t={} Settings.line =t;
t[#t+1]={Name = "Bu",Color = RGB(0,255,0),Type = 10,Width = 4};
t[#t+1]={Name = "Se",Color = RGB(255,0,0),Type = 11,Width = 4};
return #t; end
function OnDestroy () DelAllLabels(Settings.tag) end
получаем вот такой результат торгового советника:
Данные с индикатора. Просто и быстро.
Пользователь
Сообщений: Регистрация: 30.01.2015
04.01.2026 15:23:57
Теперь покажу простой скрипт-индикатор торгового советника. Он реализует следующий алгоритм: ----------------------- Покупаем, если минимум свечи выше мувинга. продаем, если максимум свечи ниже мувинга. --------------------- Чтение данных мувинга вынес в отдельную функцию. Вот этот скрипт:
Код
Settings={ tag="moving", Name = '*nk_test'}
function ind(i,tag,t)
local M=getNumCandles (tag);
if M>=i then x=getCandlesByIndex(tag,0,i,1); if x then t[#t+1]=x[0].close end end
end
function OnCalculate(i)
local buy,sel;
if i==1 then i1=0; t={}; BS=0;
elseif i1~=i then ind(i1,Settings.tag,t);
if #t>0 then local x=t[#t]; if L(i)>x and 0>=BS then buy=L(i)-0.05; BS=1; end if x>H(i) and BS>=0 then sel=H(i)+0.05 BS=-1; end end
end
i1=i;
return buy,sel;
end
function Init()
local t={} Settings.line =t;
t[#t+1]={Name = "Bu",Color = RGB(0,255,0),Type = 10,Width = 4};
t[#t+1]={Name = "Se",Color = RGB(255,0,0),Type = 11,Width = 4};
return #t; end
а это результат работы советника:
Данные с индикатора. Просто и быстро.
Пользователь
Сообщений: Регистрация: 30.01.2015
04.01.2026 09:31:27
и еще... Все существующие на графике свечи будут считаны в момент открытия графика. Поэтому в последующие моменты будет считываться лишь последняя закрытая свеча и только один раз.
Данные с индикатора. Просто и быстро.
Пользователь
Сообщений: Регистрация: 30.01.2015
04.01.2026 09:18:57
Тема для начинающих писателей роботов. ---------------------------- Ранее на форуме я рассказывал как построить робота-эксперта на основе двух любых индикаторов отображаемых на графике.
--------------------------- В этой теме поясню как читать данные с индикатора быстро и просто. ------------------------ Напишем пример скрипта индикатора, который считывает значения индикатора moving в массив t и выводит на график значения индикатора смещенные на 0.1 в виде зеленых треугольников . --------------------------- При этом сделаем так, чтобы индикатор не тратил время на считывание тиков, а читал значение индикатора один раз в момент появления новой свечи цены.
В моих роботах именно в этот момент и принимается решение о выставлении заявки.
Т е решение принимается в момент открытия новой свечи . ------------------------------ Если робот будет торговать на интервала 30 минут, то чтение индикатора будет происходить всего 1 раз в 30 минут именно на открытии новой свечи.
Код
Settings={ tag="moving", Name = '*nk_test'}
function OnCalculate(i)
if i==1 then i1=0; t={};
elseif i1~=i then local M=getNumCandles (Settings.tag);
if M>=i then x=getCandlesByIndex(Settings.tag,0,i1,1); if x then t[#t+1]=x[0].close end i1=i; end
end
i1=i; if #t>0 and t[#t]~=0 then return t[#t]+0.1; end
end
function Init()
local t={} Settings.line =t;
t[#t+1]={Name = "Bu",Color = RGB(0,255,0),Type = 10,Width = 3};
return #t;
end
это результат:
Торговые роботы без программирования
Пользователь
Сообщений: Регистрация: 30.01.2015
03.01.2026 10:33:09
Тема создана с целью обсудить мой подход к созданию торговых роботов без написания сложных скриптов на Lua. -------------------------- Приведу примеры, потом объясню что и как. ---------------------- Пример 1: Скрипт скользящего стопа на основе индикатора fractals записывается таким образом:
Пример 2: Скрипт торгового робота на основе индикаторов moving и RSI
Робот строится как скрипт индикатора и состоит из обязательной таблицы Settings, встроенных в QUIK индикаторов и библиотеки nklibi, начальным объемом 11 КБ. ------------------- Все необходимые параметры робота определяются в Settings. Изначально указывается, если надо, создание лог файла, набор индикаторов, на основе которых будет работать робот. Для каждого индикатора указывается линия, параметр свечи и смещение относительно текущего значения. ------------------- Для применения робота необходимо открыть график инструмента, поместить на него указанные в Settings индикаторы и записать им в качестве идентификаторов указанные имена. ------------------- Алгоритмы новых роботов можно добавить либо в библиотеку, либо в конец скрипта. =================== Библиотека nklibi реализует конечный автомат управления заявками и стоп-заявками, а также определяет по графику инструмента все необходимые для торговли параметры. ==================== Если график с индикатором робота связать якорем с таблицей текущих параметров(ТТП) торгов, то, перебирая инструменты в ТТП, можно переключать робота на различные торгуемые инструменты. ---------------------------------- Конструктивные предложения по расширению возможностей данного подхода приветствуются. ---------------------------- В настоящее время библиотека nklibi находится в стадии тестирования.
Нули в индикаторе там, где должны быть пустые интервалы
Пользователь
Сообщений: Регистрация: 30.01.2015
03.01.2026 07:27:26
попробуйте так:
Код
function OnCalculate(index)
...
if v and v==0 then v=nil end
return v
end
или так:
Код
function OnCalculate(index)
...
if v and v~=0 then return v end
end
Самое смешное то , что задержка измеряется в мкс и составляет в среднем не более 10 . т.е. 0.000001 сек. ------------------------- Это медленно?
Спасибо, очень интересно. Получается, для человека 0,1 сек в общем то за глаза. Меня в свое время смутило в Квике в "Импорте динамических транзакций из файла" рекомендуемый интервал аж 5 секунд! Почему? Пожалуй все на 0,1 надо переделать. А функции типа getParamEx, getNumCandles, getFuturesHolding, getNumberOf не измеряли часом?
Импорте динамических транзакций из файла - это другое. Полагаю, что 5 секунд связано с интервалом опроса терминалом файла транзакций, а не с минимальным временем чтения данных из файлов. Терминал QUIK создан для подачи заявок брокеру как альтернатива звонка по телефону. Терминал не предназначен для высокоскоростной торговли роботами (HFT).
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
30.12.2025 19:10:16
Цитата
VPM написал: , Да я умею читать справку. Речь идет о передаче из графика в луа? Есть график где исполняются в QUIK разные индикаторы и формируются свечи, но чтобы привести цену к необходимому формату нужны class_code и sec_code, а с графика получаем легенду графика, если б приходил sec_code, то все остальные торговые параметры можно было бы восстанавливать (получать) по нему. А по факту задал tag графику получил все остальные метрики в том числе и торговые.
Не сомневаюсь что Вы умеете читать справку. Я лишь показал как сам получаю эти данные с графика. Если это не то, то расскажите на примере, что Вы хотите.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
30.12.2025 17:10:28
Цитата
VPM написал: Определенное не удобство в этом подходе, вызывает от факт что нельзя вернуть с class_code и sec_code? То факт что возвращается легенда графика, мало чем помогает в автоматизации подхода.
Вы ошибаетесь. Вот так получаете class_code и sec_code и интервал:
Код
local t=getDataSourceInfo();
int=t.interval; clas=t.class_code; sec=t.sec_code;
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
написал: Все же мне сложно понять зачем выбирать чтение с медленного графика, когда есть инструмент для получения данных без каких либо ручных манипуляций.
Все дело в компетенции. Подход с запахом "нафталина", напомнил времена, когда информация передавалась на дискетах, а вместо монитора зачастую использовали телевизор. А под DOS за несколько минут можно было собрать не большое приложение, да еще работающее.
Вот и это подход позволяет за не большой промежуток времени собрать целые стратегии. Да он отправляет к истокам самого QUIK, но мне представилось, что его не забросили разработчики и что то подкрутили. По крайней мере у меня такое чувство сложилось от применения. Если отбросить мой контур управления из луа кода в виде модулей, то подход с правилами описанными выше стоит 100 - 300 кБ. Но главное это время от идеи до воплощения в терминале!
Индикатор, который управляет стопом, например по fractals, скрипт всего 4КБ.
Получить номер свечи-фрактала
Пользователь
Сообщений: Регистрация: 30.01.2015
30.12.2025 06:12:09
Пардон, ранее это уже написано, просто пояснил на примере
Получить номер свечи-фрактала
Пользователь
Сообщений: Регистрация: 30.01.2015
30.12.2025 06:10:13
Если я правильно понял, то функция function FRACTALS написана универсально для индикаторов и скриптов.
Код
Out = (O and O(I)) or (ds and ds:O(I))
В данном случае она используется в индикаторе, поэтому будет работать левая часть относительно or
Код
(O and O(I))
Если использовать ее в скрипте, то будет работать правая часть or т е ds
Код
(ds and ds:O(I))
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
29.12.2025 13:37:42
Цитата
VPM написал: Оказывается, QUIK гарантирует, если время последней свечи изменилось — свеча закрыта ! Тогда определяется ключевой элемент "детектор НОВОЙ СВЕЧИ". Важно, торговые решения применяем, только после закрытия свечи, торговля внутри незакрытой свечи Запрещена! Следящее правило, работать с 2–3 последними свечами, отсчет ведется от текущей не закрытой свечи.
getCandlesByIndex имеет смысл использовать лишь в индикаторах. Ваш вариант не имеет практического смысла. -------------------------- Например, скрипт скользящего стопа при реализации в индикаторе составляет примерно 100 строк. если торгуем руками, то используем всегда график. Тогда скрипт скользящего стопа просто бросается на график любого инструмента и автоматом управляет стопом. --------------------- При этом закон изменения стопа задается любым желаемым индикатором на графике.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
29.12.2025 05:33:11
Цитата
VPM написал: for i = 0, 50000 do local _, n = getCandlesByIndex(o.tag, o.line, i, 1)
Правильно Вас понял, Вы здесь
Код
for i = 0, 50000 do
local _, n = getCandlesByIndex(o.tag, o.line, i, 1)
читаете 5000 раз по одной свечи? и определяете конец по нулю свечей и так делаете в цикле? В таком случае можно сделать просто бесконечный цикл и выход по break --------------------------- Но лучше читать лишь новые свечи и лишь тогда, когда они есть.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
28.12.2025 15:36:30
Цитата
VPM написал: Почему портфель причем. Этим же подходом, проходим по портфелю, переключаемся в терминале на режим связанных окон от таблицы "Состояния Портфеля", и проверяем идеи на портфеле.
Когда-то давно делал это в автомате на AutoIT. Относительно не сложно написать скрипт на AutoIT (язык для автоматизации выполнения задач в Microsoft Windows) , который переключает инструменты в таблице ТТП -инструмент меняет график в связанном окне и скрипт на луа считает портфель . И получаем любое число инструментов с одним графиком. При этом QUIK сам делает подписку на нужные свечи инструментов. ------------------------- Почему AutoIT.? Потому что это язык специально созданный, чтобы лазить по окнам и автоматизировать ручное нажатие клавиш.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
28.12.2025 07:45:38
Функцию getCandlesByIndex удобно использовать для построения робота на основе встроенных в QUIK индикаторов для торговли одним инструментом. ------------------------------------- Скрипт такого робота самый простой в написании и самый быстрый в исполнении по сравнению со скриптами на самописных индикаторах. ----------------------------- При этом не надо заморачиваться алгоритмами индикаторов. ------------------------------ Очень просто тестировать различные стратегии на основе RSI,мувинг, и т д ---------------------------------- Начинающим писателям роботов и не только можно рекомендовать такой подход.