Никогда не пользовался колбеком OnInit. Обычно я инициализирую переменные до начала main как то так:
Код
stop_loss_pc=3
MAsteps=1
is_run = true
send_order=false
for sec in string.gmatch(ticker_list,"%a+") do
lot[sec]=getParamEx(class,sec,"lotsize").param_value
step[sec]=getParamEx(class,sec,"SEC_PRICE_STEP").param_value
--задаём первоначальные бид, аск и ласт
last_price[sec]=tonumber(getParamEx(class,sec,"last").param_value)
if last_price[sec]==0 or last_price[sec]==nil then
last_price[sec]=tonumber(getParamEx(class,sec,"prevprice").param_value)
toLog (log, sec.." при запуске нет цены последней сделки "..type(last_price[sec]))
end
tablebid = getParamEx(class, sec, "bid") --получаем таблицу "bid"
bid_best[sec]=tonumber(toPrice(sec, tablebid.param_value)) --из таблицы берЄм значение
tableoffer = getParamEx(class, sec, "offer") --получаем таблицу "offer"
offer_best[sec]=tonumber(toPrice(sec, tableoffer.param_value)) --из таблицы берЄм значение
end
Зачем нужен OnInit? В него помещается такой же кусок кода? В чём преимущество? Спасибо.
Пользователь
Сообщений: Регистрация: 02.02.2015
миру мир!
09.10.2016 15:27:59
По-моему были какие-то функцииQLua, которые корректно работают только в Init(), просто в теле скрипта не работают (что-то про источники данных, да?). Если речь про инициализацию переменных/открытие файлов и т.п. - то разницы нет никакой.
Пользователь
Сообщений: Регистрация: 05.02.2015
30.01.2017 20:19:52
Зачем у Oninit в скобках параметр (script_path)? У меня работает и без него: OnInit ()
имеется в виду, что нужно делать так?
Код
script_path=getScriptPath()
function OnInit (script_path)
--задаём переменные
end
Пользователь
Сообщений: Регистрация: 02.02.2015
миру мир!
31.01.2017 07:26:26
Потому как параметры в Луа указывать не обязательно, и если даже функция вызвана с параметрами - всем пофик
Пользователь
Сообщений: Регистрация: 30.01.2015
31.01.2017 20:53:30
Цитата
Космонавт написал: Зачем у Oninit в скобках параметр (script_path)? У меня работает и без него: OnInit ()
имеется в виду, что нужно делать так?
Код
script_path = getScriptPath ()
function OnInit (script_path)
--задаём переменные
end
Если память мне не врет, то вроде бы раньше вызов getScriptPath () в начале подвешивал скрипт и еще были глюки вызова функций QLUA вне колбеков или main.
Пользователь
Сообщений: Регистрация: 16.01.2017
03.02.2017 17:42:24
Цитата
Космонавт написал: Зачем у Oninit в скобках параметр (script_path)? У меня работает и без него: OnInit ()
имеется в виду, что нужно делать так?Кодscript_path=getScriptPath() function OnInit (script_path) --задаём переменные end
Имеется ввиду, что quik уже за Вас вызвал getScriptPath() и результат Вам подсовывает в качестве параметра при вызове OnInit(script_path). А уж будете Вы использовать этот "подарок" внутри OnInit или нет, дело Ваше
Пользователь
Сообщений: Регистрация: 16.01.2017
03.02.2017 23:35:53
Небольшая поправка: В script_path Вы получаете не просто полной путь к папке запускаемого скрипта (как при вызове getScriptPath()), а полный путь, включая имя файла самого скрипта.
Пользователь
Сообщений: Регистрация: 22.02.2023
30.06.2023 12:38:55
Всё же, хотелось бы получить комментарий разработчика, в чем сакральный смысл функции OnInit?
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 30.01.2015
30.06.2023 13:13:12
Цитата
Ziveleos написал: Всё же, хотелось бы получить комментарий разработчика, в чем сакральный смысл функции OnInit?
В том, что это этот колбек вызывается раньше всех других колбеков и раньше функции main. Без него у Вас колбеки будут вызываться раньше, чем будет вызвана функция main.
Пользователь
Сообщений: Регистрация: 30.01.2015
30.06.2023 13:14:53
в итоге если вы параметры торговли определяете в main, то колбеки начнут работу без параметров и могут такого вам наторговать, что будет мучительно стыдно за такой скрипт.
Пользователь
Сообщений: Регистрация: 30.01.2015
30.06.2023 13:16:25
вообще-то ответ есть в документации: ------------- OnInit Функция вызывается терминалом QUIK перед вызовом функции main(). В качестве параметра принимает значение полного пути к запускаемому скрипту.
Формат вызова:
OnInit(STRING script_path)
В данной функции пользователь имеет возможность инициализировать все необходимые переменные и библиотеки перед запуском основного потока main().
Пользователь
Сообщений: Регистрация: 22.02.2023
30.06.2023 21:14:19
Необходимые переменные и библиотеки перед запуском основного потока main() возможно инициализировать и в BODY. Если скрипт не HFT, или вообще без коллбэков, получается OnInit не сильно нужен.
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 22.02.2023
30.06.2023 21:30:52
И не нужно на меня кегль повышать.
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 25.09.2020
01.07.2023 22:37:42
Ziveleos, OnInit нафиг не нужен. Как и весь этот маразм с двумя потоками. Лично я выбросил OnInit если не в первой, то во второй версии своего скрипта. Думаю, это наследие С++ - там тоже какие-то идиотские трепыхания идут ещё до main.
Пользователь
Сообщений: Регистрация: 22.02.2023
02.07.2023 21:18:58
Владимир, Второй поток все-таки нужен, иначе QUIK замрёт, пока работает скрипт. А вот, что касается:
Цитата
nikolz написал: В том, что это этот колбек вызывается раньше всех других колбеков и раньше функции main.Без него у Вас колбеки будут вызываться раньше, чем будет вызвана функция main.
коллбэки начинают работать только вместе с main.
Код
qtes = {}
function OnQuote(class, sec )
ql2 = getQuoteLevel2(class, sec)
table.insert(qtes, ql2)
end
sleep(10000)
function main()
--sleep(10000)
message(tostring(#qtes))
end
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 25.09.2020
03.07.2023 00:42:38
Ziveleos, Второй поток нафиг не нужен, работа скрипта - это работа интерпретатора. По крайней мере, в нормальной реализации. Я в своё время потратил довольно много времени, чтобы переместить всё, что можно, в поток main, и с тех пор практически забыл про все глюки. Для эмуляции прерываний по таймеру использую sleep, а единственное "настоящее" прерывание - OnTrade.
Объясняю, тем кто не понял. -------------- Если у Вас скрипт запускается одновременно с запуском QUIK, то нет особой разницы, где Вы устанавливаете и загружаете начальные параметры скрипта. ------------------------- Но если Вы запускаете скрипт при работающем QUIK, т е в реальном времени торговли, то возможны следующие последствия в зависимости от места , где вы устанавливаете переменные. Рассмотрим эти варианты: ------------------ 1) В начале скрипта присваиваем значения. В этом случае присвоение происходит до полной загрузки скрипта и запуска функции main. присвоение произойдет лишь при загрузке скрипта. При этом могут быть еще не определены Ваши функции, которые Вы используете для назначения параметров. ------------------- 2) В начале функции main В этом случае весь скрипт уже загружен и все функции определены. Но так как main - это отдельный поток, то при длительной процедуре инициализации переменных могут поступить данные по колбекам и эти данные могут оказать влияние на установку переменных. Вот пример теста main c установкой параметров:
Код
local beg=os.clock();
local x={}
local function sig(i) return i end
function main()
Log:write("main начинаем устанавливать начальные значения"..os.clock()-beg.."\n"); --Log:flush();
for i=1,10000 do x[i]=math.sin(i); Log2:write("X="..x[i].."\n"); Log2:flush();
end;
Log:write("закончили установку нач значений\n"); Log:flush();
while true do
-- nkevent.wait(event); --ждем события
Log:write("main основной цикл="..os.clock()-beg.."\n"); Log:flush();
sleep(10);
end
end
а вот результат работы этого скрипта с колбеками
Код
OnI nit=0.0
main начинаем устанавливать начальные значения0.0010000000002037
On All=0.0020000000004075
On All=0.0020000000004075
On All=0.0020000000004075
...
On All=0.0060000000003129
On All=0.0060000000003129
On All=0.0060000000003129
...
On All=0.029999999999745
On All=0.029999999999745
On All=0.029999999999745
On All=0.029999999999745
On All=0.029999999999745
On All=0.029999999999745
закончили установку нач значений
main основной цикл=0.029999999999745
On All=0.029999999999745
On All=0.029999999999745
On All=0.029999999999745
Внутри цикла установки параметров в функции main вызывается колбек OnAllTrade в основном потоке . ---------------------- 3) Установка параметров в колбеке OnInit() это самый безопасный и предсказуемый способ установки. OnInit вызывается ,когда весь скрипт загружен и определены все наши функции. OnInit вызывается в основном потоке, когда поток main еще не запущен. Так как все колбеки вызываются в основном потоке, то они не могут быть вызваны пока OnInit не завершит работу. =================== Т е все переменные будут определены и загружены без каких-либо неожиданностей. ==================== Приведу для наглядности аналогию. На перекрестке есть светофор. Особо буйные могут ходить через перекресток не взирая на сигналы светофора. Особо продвинутые могут даже ходить с закрытыми глазами. Особо осторожные будут ходить лишь на зеленый. --------------------- Выбор за Вами.
Пользователь
Сообщений: Регистрация: 25.09.2020
03.07.2023 12:52:48
nikolz, В ЛЮБОМ случае "нет особой разницы, где Вы устанавливаете и загружаете начальные параметры скрипта". Я миллион раз запускал скрипт и во время торговли, и когда её нет, и НИ МАЛЕЙШИХ "последствий в зависимости от места , где вы устанавливаете переменные" не наблюдалось.
Ладно уж, "рассмотрим эти варианты": 1) Да, именно "в начале скрипта присваиваем значения". Я лично полагаю, что в этом случае присвоение происходит ПОСЛЕ полной загрузки скрипта, но ДО запуска функции main. Впрочем, допускаю, что и ДО полной загрузки, но это при условии, что системную математику писали клинические дебилы. В любом случае, это примерно одна секунда.
2) Да, "в начале функции main" ТОЖЕ производятся кое-какие присвоения. И в середине тоже. Более того, они могут присваиваться даже из внешних файлов - например, номер счёта, код клиента, состояние портфеля и кошелька. Но мне и в страшном сне не может присниться ни "длительная процедура инициализации переменных, ни, тем более, чтобы в это время могли поступить данные по колбекам, и уж совсем невозможно, чтобы эти данные хоть как-то могли "оказать влияние на установку переменных". Это нужен ТАЛАНТИЩЕ, чтобы такого добиться. Просто программировать нужно уметь, хоть немножко.
3) Установка параметров в колбеке OnInit нафиг не нужна, как и сам OnInit. Лично у меня этого дерьма нет, не было и не будет. Точнее, было в самом начале моего знакомства с Луа в тренировочном скрипте, где я пытался понять, за каким хреном эта бредятина может быть кому-то понадобиться.
Пользователь
Сообщений: Регистрация: 22.02.2023
03.07.2023 15:31:31
Владимир, что Вы называете вторым потоком? Под вторым потоком я подразумевал именно поток main, а коллбэки, BODY - это основной основной поток QUIK.
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 25.09.2020
03.07.2023 16:42:33
Ziveleos, Я разве называл вторым потоком? Впрочем, неважно: поток main - он обязательный, так что первый и единственный, а всё остальное - это второй: прорисовка таблиц, коллбеки, и прочая лабуда. Прорисовка у меня вообще отключаемая - так называемый "спящий режим", всех коллбеков один OnTrade, так что в этом "основном потоке QUIK" мой скрипт находится дай бог сотую долю процента.
Пользователь
Сообщений: Регистрация: 30.01.2015
04.07.2023 06:33:35
QUIK создает 7 потоков. Скрипты -запускают main в следующих по очереди потоки.
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 13:20:46
Владимир,
зря ругаете, функция необходима и ключевое здесь OnInit(STRING script_path) В данной функции пользователь имеет возможность инициализировать все необходимые переменные и библиотеки перед запуском основного потока main().
К примеру если обрабатываете колбек OnAllTrade() без нее и не обойтись.
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 13:31:33
написал: инициализирую переменные до начала main как то так:
это нормально если ваши переменные не лезут в терминал или к серверу до запуска mail()
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 15:08:50
В чём преимущество? Так его и нет.
Вопрос в организации переменных Вашего скрипта их локализации и видимости.
Пользователь
Сообщений: Регистрация: 25.09.2020
04.07.2023 17:58:39
VPM, НА КОЙ "функция необходима"? Я прекрасно могу инициализировать все необходимые переменные и без этого дерьма, как и без каких-либо библиотек - и перед запуском основного потока main, и после него, и во время него. OnAllTrade также нафиг не нужен.
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 18:30:04
, так я с Вами не спорю, где угодно!
Вопрос в организации переменных Вашего скрипта их локализации и видимости.
К примеру, "перед запуском основного потока main" всего 200 локальных переменных я постоянно выхожу за это число. Если как у Космонавта то сам lua ругается порой.
Сервис!
Пользователь
Сообщений: Регистрация: 25.09.2020
04.07.2023 18:47:59
VPM, А тут не о чем спорить, задача организации торговли настолько проста, что её можно реализовать даже на чистом Луа, даже при полной ущербности системной математики Квика.
Какие могут быть ЛОКАЛЬНЫЕ переменные "перед запуском основного потока main" - то мне неведомо. У меня их... ну, пара десятков, наверное, наберётся. Впрочем, сейчас посчитаю... ого, аж 34 штуки.
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 19:00:30
Я смотрел Ваши посты Как понимаю у Вас свой подход вы не пользуетесь историей данных. А локализация в луа нужна чтоб не засорять для видимости и быстродействия.
Нет, я как раз прекрасно знаю, что никакая локализация в луа не нужна, и ничего не засоряется для видимости и быстродействия, если специально этим не заниматься.
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 19:38:44
Я не обсуждаю язык, бессмысленно другого нет. Я лишь прислушиваюсь к рекомендациям авторов. Проверить видимость легко, быстродействие скрипта легко с локальными и глобальными. SciTe одно нажатие.
А вот со сбором мусора сложней. Оказывается nil запускает сборщик.
На Ваш вопрос - В чём преимущество? Хотел сделать поправку на пост. Если скрипт небольшой, не требует особого быстродействия, не затратен по памяти. Вас все устраивает - То ни каких.
Если хотите оптимизировать Вас скрипт посмотрите "Програмирование на Lua" сэкономит много времени. Проверено!
С уважением VPM
Пользователь
Сообщений: Регистрация: 25.09.2020
04.07.2023 20:15:56
VPM, Да плюньте Вы на быстродействие скрипта с локальными и глобальными. И на сборщик мусора тоже. Пусть работают как работают - это ИХ проблемы.
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 20:50:12
Это да.
В трейдинге нет единого алгоритма по которому Все работают.
И ведь вопрос очень примитивен, даже для меня - это азы. Если можем помочь почему бы нет.
Я уже Вам писал в другом п. никто здесь является мне или Вам соперником в торговле.
Вы прекрасно знаете что ММ и Банки торгуют абсолютно др. алгоритмы. Ну к примеру ММ видит обе стороны сделок и одновременно с обоих торгует.
Пользователь
Сообщений: Регистрация: 22.02.2023
04.07.2023 21:51:27
Видимо, единственное преимущество OnInit в том, что в отличии от body, из неё можно вызывать функции не объявленные ранее. Ну, и " В качестве параметра принимает значение полного пути к запускаемому скрипту."
Скрытый текст
Код
file = io.open(getScriptPath() .. "\\Environment.txt", "w+")
local len = 0
for k, v in pairs(_ENV) do
file:write(string.format("%s\t %s \n",k,(tostring (v))))
len = len + 1
end
file:write("\n Окружение BODY: ", len, "\n\n" )
function OnInit()
local len = 0
for k, v in pairs(_ENV) do
file:write(string.format("%s\t %s \n",k,(tostring (v))))
len = len + 1
end
file:write("\n Окружение OnInit: ", len, "\n\n" )
end
function main()
file:seek("set")
local log = file:read("a")
local b_log = string.match(log, "(.-)\n\n")
local i_log = string.match(log, "Окруж.-\n\n(.-)\n\n")
file:write(" Нет в BODY: ")
for s in string.gmatch(i_log, "(.-)\t.-\n") do
if not string.match(b_log, s) then
file:write("\n", s)
end
end
file:write("\n\n Разница: ")
for s in string.gmatch(i_log, "(.-)\n") do
if not string.match(b_log, s) then
file:write("\n", s)
end
end
file:flush()
file:close()
end
--file:write("Чудо-юдо рыба-кит \n")
function tableLog(t)
for k, v in pairs(t) do
file:write(string.format("%s %s \n",k,(tostring (v))))
end
end
Ziveleos, Ну на кой кому всё это надо? Кого интересуют эти несчастные переменные окружения? Заняться больше нечем?
Пользователь
Сообщений: Регистрация: 22.02.2023
05.07.2023 11:39:18
Владимир, переменные окружения показывают разницу между body и OnInit. Получается, если до зарезу необходимо сделать что-то до начала работы коллбэков, и в этом "что-то" используются функции объявляемые позже, то без OnInit не обойтись. В остальном он на фиг не нужен.
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 27.01.2017
05.07.2023 11:56:10
Цитата
Ziveleos написал: , переменные окружения показывают разницу между body и OnInit. Получается, если до зарезу необходимо сделать что-то до начала работы коллбэков, и в этом "что-то" используются функции объявляемые позже, то без OnInit не обойтись. В остальном он на фиг не нужен.
Body скрипта выполняется в потоке терминала. Так что служебные переменные вполне себе инициализируются там.
Читаем документацию:
Цитата
Как и в предыдущей структуре скрипта Lua, после его запуска первоначально выполняются сценарии, описанные в <BODY>, если они присутствуют. Далее происходит вызов обработчика с именем OnInit(), если он присутствует. В обработчике OnInit() пользователь имеет возможность инициализировать все необходимые переменные и библиотеки перед запуском отдельного потока. После завершения функции OnInit() происходит создание отдельного потока РМ QUIK, и в этом потоке начинает выполнение функция main(), которая обязательно должна присутствовать в скрипте.
Так что тело скрипта вполне себе достаточно. OnInit вполне можно использовать для каких-то действий после выполнения служебных процедур, например проверить, что запуск возможен. А если нет - отказ. Но все это можно делать так или иначе.
Речь же про колбеки звучит странно, т.к. я слабо себе представляю использование колбеков в алгоритме, если они не обработаны все. Например, запуск в середине торгового дня. Половина колбеков уже прошла, надо читать прошедшие события из таблиц, и здесь уже не важно как инициализировать. Поэтому колбеки - это вспомогательный инструмент, не более. "Прибивать гвоздями" их к логике - не самая лучшая затея. Он может и не прийти, в конечном итоге. Гарантированной доставки в документации не декларируется.
Пользователь
Сообщений: Регистрация: 25.09.2020
05.07.2023 12:17:23
Ziveleos, Я же спросил: ДЛЯ ТОРГОВЛИ на кой эта хрень нужна? ЗА КАКИМ ХРЕНОМ кому-то "до зарезу необходимо сделать что-то до начала работы коллбэков"? И кому нужно такое говно как Луа, КРОМЕ организации торговле на бирже?
Nikolay написал: Речь же про колбеки звучит странно, т.к. я слабо себе представляю использование колбеков в алгоритме, если они не обработаны все. Например, запуск в середине торгового дня. Половина колбеков уже прошла, надо читать прошедшие события из таблиц, и здесь уже не важно как инициализировать. Поэтому колбеки - это вспомогательный инструмент, не более. "Прибивать гвоздями" их к логике - не самая лучшая затея. Он может и не прийти, в конечном итоге. Гарантированной доставки в документации не декларируется.
Просто из собственного опыта при запуске от колбека пришло а основной цикл еще не запущен. Прошедшие события читаю и из таблиц перед за основного цикла, после запуска беру из колбека. А какие еще варианты обработать т. всех сделок?
Пользователь
Сообщений: Регистрация: 22.02.2023
05.07.2023 13:18:19
Цитата
Nikolay написал: Body скрипта выполняется в потоке терминала. Так что служебные переменные вполне себе инициализируются там.
А я что сказал?
Цитата
if до зарезу необходимо сделать что-то до начала работы коллбэков, and в этом "что-то" используются функции объявляемые позже, then без OnInit не обойтись. end В остальном он на фиг не нужен.
Цитата
Nikolay написал: Речь же про колбеки звучит странно, т.к. я слабо себе представляю использование колбеков в алгоритме, если они не обработаны все.
Если в самой функции коллбэка используется нечто не объявленное ранее, и он сработает, возникнет ошибка. Поэтому это "нечто" нужно объявить до запуска main.
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 22.02.2023
05.07.2023 13:23:37
Владимир, просто давно интересовал этот вопрос: какая разница между body и OnInit, и зачем он вообще нужен?
VPM, Что почему? Идиотизм? Потому, что фиксированное имя main для того и придумано, чтобы указать место, с которого начинает работать программа. Кого-то из криворуких бездарей это не устроило, и они изобрели ВТОРОЕ фиксированное имя, чтобы указать... правильно: место, с которого начинает работать программа.
Пользователь
Сообщений: Регистрация: 27.01.2017
05.07.2023 15:36:45
Цитата
Если в самой функции коллбэка используется нечто не объявленное ранее, и он сработает, возникнет ошибка. Поэтому это "нечто" нужно объявить до запуска main.
Я не буду ничего говорить по поводу данной возможности, кроме того, что если так делается, то это очень плохой стиль. Я такое могу представить только через глобальные переменные. В колбеке идет обращение к ним, а сама переменная объявляется где-то. И это плохо. Не считая самих глобальных переменных, коих у меня нет вовсе. Каждый блок когда должен оперировать своей областью видимости, объявленной ранее. Да, глобальный контекст есть. Но использовать его как единственно доступный - это пут в ад, где происходят магические преобразования, по причине случайных коллизий в именовании переменных.
Пользователь
Сообщений: Регистрация: 15.06.2023
05.07.2023 15:48:52
Цитата
Nikolay написал: Как и в предыдущей структуре скрипта Lua, после его запуска первоначально выполняются сценарии, описанные в , если они присутствуют. Далее происходит вызов обработчика с именем OnInit(), если он присутствует. В обработчике OnInit() пользователь имеет возможность инициализировать все необходимые переменные и библиотеки перед запуском отдельного потока. После завершения функции OnInit() происходит создание отдельного потока РМ QUIK, и в этом потоке начинает выполнение функция main(), которая обязательно должна присутствовать в скрипт
Владимир, Все равно не понятно, вот документация. будет OnInit() или не будет. Из body будет брать и обрабатывать. Так устроен луа, а qlua не приделах. Я думаю это больше к вопросу с видимостью в самом луа.
Пользователь
Сообщений: Регистрация: 22.02.2023
05.07.2023 16:02:08
Цитата
Владимир написал: OnInit по определению нужен лишь затем, чтобы что-то сделать до main. То есть это идеологический идиотизм.
Не столько до main, сколько до коллбэков.
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 15.06.2023
05.07.2023 16:04:39
Nikolay, Вот это правильно! К этому Вопросу Может глянете мою веточку что то посоветуете.
Алексей написал: Имеется ввиду, что quik уже за Вас вызвал getScriptPath() и результат Вам подсовывает в качестве параметра при вызове OnInit(script_path).А уж будете Вы использовать этот "подарок" внутри OnInit или нет, дело Ваше
Зачем Вам script_path от OnInit?
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 15.06.2023
05.07.2023 16:27:30
Ziveleos, Мне не нужен это просто пример, что можно писать другие переменные.
суть другая переменная local path; локализуется в body а присвоение идет в OnInit я так делаю когда переменных >200, если меньше лучше делать как описал Владимир.
function List.popfirst (list) local first = list.first; if first > list.last then --error("list is empty") return nil end local value = list[first] list[first] = nil -- чтобы разрешить сборку мусора list.first = first + 1 return value end
Ну вот пример от автора луа list[first] = nil -- чтобы разрешить сборку мусора
local path=nil;
Пользователь
Сообщений: Регистрация: 25.09.2020
05.07.2023 17:24:08
Да просто задолбали эти криворукие своими вонючими потоками. Шибка вумные, ручонки чешутся впендюрить какую-нибудь херню, в результате простейшая, тривиальнейшая прикладная задача начинает глючить так, что и в кошмарном сне не приснится. Нет у меня никакого OnInit и не будет - это говно тупо нафиг никому не нужно. И коллбеки нафиг не нужны - тем более, что все они глючат со страшной силой. Единственный коллбек, который использую я - OnTrade, некоторые работают даже без него. А если уж припёрло использовать какую-то хрень, которая аж до мейна начинает срабатывать, так пусть флаг поставят, анализируют его, и пока он не установлен, сразу из этого коллбека вылетают. А где надо, установят его в МОЖНО. И нет проблем даже с такими маразматическими коллбеками. Уровень подавляющего большинства посетителей форума близок к абсолютному нулю, а туде же - потоки им подавай. НА ХРЕНА ОНИ ВАМ?! С переменными та же хрень: мой скрипт может обслуживать несколько тысяч тикеров, так что переменных там, возможно, миллион - и нет проблем. Вы СВОИ задачи решайте, торговые, а не занимайтесь разной хернёй с потоками,, коллбеками, библиотеками и прочим онанизмом.
Пользователь
Сообщений: Регистрация: 15.06.2023
05.07.2023 18:04:28
Цитата
Владимир написал: Уровень подавляющего большинства посетителей форума близок к абсолютному нулю, а туде же - потоки им подавай. НА ХРЕНА ОНИ ВАМ?! С переменными та же хрень: мой скрипт может обслуживать несколько тысяч тикеров, так что переменных там, возможно, миллион - и нет проблем. Вы СВОИ задачи решайте, торговые, а не занимайтесь разной хернёй с потоками,, коллбеками, библиотеками и прочим онанизмом.
Целиком поддерживаю Вас. Не от хорошей жизни колупаемся в носу и лезем не туда. Так поделитесь опытом.
Пользователь
Сообщений: Регистрация: 25.09.2020
05.07.2023 20:30:28
VPM, Опыт может быть только у каждого свой собственный, пока свои шишки не набьются - ничего не поможет. Просто нужно заниматься СВОЕЙ конкретной задачей, проблемы решать по мере их возникновения и ничего не делать на всякий случай. Зачем МНЕ нужет OnInit, зачем МНЕ нужна пассивная заявка, зачем МНЕ нужны свечи, зачем МНЕ нужны потоки, зачем МНЕ нужны коллбеки и т.д. И тогда вдруг окажется, что 99% проблем исчезнут, так и не возникнув.
Пользователь
Сообщений: Регистрация: 15.06.2023
05.07.2023 21:16:51
Владимир, Да это вы правы Опыт необходим, но ведь если не учить не подсказывать, то и опыт будет соответствующий.
Я в данном случае не о себе, о молодежи. У меня все в порядке с наставниками всегда везло, и вспоминаю их с огромной благодарностью!
Да и зарегистрировался на форуме чтоб исправили ошибку в стакане. Вроде нашли!
Пользователь
Сообщений: Регистрация: 25.09.2020
05.07.2023 22:45:22
VPM, Я тоже зарегистрировался на форуме, чтобы помогли разобраться с нюансами нового для меня языка, и мне в этом очень помогли. Потом я сам некоторое время считал своим долгом помогать новичкам. Но никакой наставник не заменит собственного опыта. Мне всю жизнь везло на учителей, но вот конкретно по программированию в институте был один семестр, да ещё и с зачётом, а не с экзаменом. Короче, знаний не было ваапще. И только после института, и даже после армии я увлёкся программированием - фактически самоучка. Нет, наставники были, и даже очень мощные, но все они были коллегами, мы вместе РАБОТАЛИ, и только это могло дать настоящий опыт. Да и чему тогда могли учить? Проминь-2, Минск-32, БЭСМ-6, Фортран, Алгол, Бейсик, ассемблеры разных видов, ничтожные по современным меркам память и быстродействие. Потом появились первые персоналки, не сразу Интеловские, появился гениальный язык С, любовь на всю жизнь. Вот это и была совершенно потрясающая Школа, когда наставники учились вместе со своими подопечными. Сейчас этого и близко нет. В школы вроде как ввели информатику, но достаточно бегло полистать любой учебник, чтобы понять: ЭТО способно только навсегда убить желание заниматься программированием. Потом уже я сам пару раз был руководителем диплома у выпускников-программистов. Один потрясающе талантливый, у него уже диплом представлял собой серьёзную разработку - что называется, программист от Бога. Второй... нет, диплом он защитил, и даже на отлично, но сразу было видно, что это не его сфера деятельности, сколько бы его ни наставляли. В общем, программисты вымерли. Как мамонты.
Пользователь
Сообщений: Регистрация: 02.02.2015
миру мир!
06.07.2023 06:49:19
Цитата
Ziveleos написал: давно интересовал этот вопрос: какая разница между body и OnInit, и зачем он вообще нужен?
Выше в этой ветке давно же уже написано: из так называемого body не все функции QLua корректно работают (во всяком случае на такое натыкались ранее; речь про разные хитрые функции типа создание DataSource или чего-то такого; изменилось ли что-то с тех пор - не знаю, если найти на форуме на что именно жаловались - то можно проверить) В то же время на момент выполнения OnInit() уже точно любые функции QLua будут работать корректно. Плюс бонусом передается путь до скрипта, если он требуется.
Т.е. вообще говоря, OnInit() QUIK вызывает так сказать осознанно, когда все готово и известно, что такая функция в скрипте определена. Но вот чтобы узнать какие callback-функции в скрипте определены - QUIK (да и вообще Lua) вынужден весь скрипт полностью выполнить, это определит для Lua имеющиеся в скрипте функции, про них станет известно. И, разумеется, при этом выполняется тот самый код, который написан мне функций и который я когда-то назвал [BODY] в . И термин этот прижился, так теперь все его и использ0уют.
Вот и вся разница. Чем пользоваться - да все равно. Если ваш инициализирующий код корректно работает в [BODY] вам такой стиль нравится - то и замечательно. Если хочется чего-то этакого - пользуйтесь OnInit(), если так вам удобнее понимать лдогику собственного скрипта. Скорее вопрос привычек, короче. Ну за исключением нюанса вызова некоторых функций. Но если вы с таким нюансом не сталкиваетесь - значит либо вы такие функции не используете, либо QUIK этот момент давно починил.
Еще раз. Выполнение [BODY} - чисто технический момент. Т.е. QLua сначала просто выполняет Lua-скрипт, при этом - главное - в глобальной области видимости для Lua-машины появляются определенные в скрипте callback-функции. После этого QLua уже может узнать какие callback-функции определены в скрипте и после знает какие callback-функции надо вызвать, т.к. они есть, а какие не надо, т.к. их нет. Вот и все, вот и весь "секрет". А то, что при этом выполняется остальной код, расположенный вне функций - просто неизбежность, никакого глубокого смысла в том нет.
Но вот чтобы узнать какие callback-функции в скрипте определены - QUIK (да и вообще Lua) вынужден весь скрипт полностью выполнить, это определит для Lua имеющиеся в скрипте функции, про них станет известно.
Вы уверены в тот, что для нахождения всех колбек надо выполнить скрипт. --------------- Не знаю как реализовали разработчики, но полагаю, что это не обязательно делать. Определение существующих колбеков можно делать либо один раз после загрузки скрипта и формировать специальную таблицу указателей (давно это тестил и вроде бы пришел к такой схеме) Но можно это делать налету при приходе соответствующих данных в терминал. ---------------- Относительно Вашего замечание "делайте как нравится" Я привел ранее аналогию перекрестка. Можно ходить на зеленый, а можно - как нравиться - с закрытыми глазами. Если потом откроите и поймете, что в больнице, ну тогда будете ходить по правилам. Но может Вам и повезет.
Пользователь
Сообщений: Регистрация: 27.01.2017
06.07.2023 09:44:49
Цитата
Вы уверены в тот, что для нахождения всех колбек надо выполнить скрипт.
Lua - интерпретируемый язык, сначала он должен заполнить пространство имен (скомпилировать кусок кода), только потом что-то вызывать. Правда это не выполнение скрипта, конечно. Т.е. если сделать определение некой глобальной переменной внутри какого-то метода, то будет ошибка, да.
Пользователь
Сообщений: Регистрация: 25.09.2020
06.07.2023 10:04:26
Nikolay, Бонусом передается путь до скрипта, если он требуется. ХОСПИДЯ! Из-за этой вот херни ковыряться в кишках QLua?! Создавать себе проблемы, а потом героически их решать? Разгадывать это СТРРРАШНУЮ ТАЙНУ? Что, трудно скинуть все нужные файлы в ту же папку, в которой лежит сам скрипт? У меня изначально так и сделано: в одной папочке лежит скрипт со всеми причендалами для одного брокера, в другой - точно такой же скрипт, но для другого брокера и даже другого Квика, в третьей - для того же самого Квика и брокера, но там я занимался отладкой алгоритмов скрипта в тестовом режиме, без реальных сделок. Во всех трёх случаях код скрипта совершенно одинаковый, и все "проблемы" с файлами решаются автоматически. Для лог-файла, например, код выглядит так: F=io.open(getScriptPath().."//LOG.TXT","a"); И ВСЁ, БЛИН!
С какого бодуна "чтобы узнать какие callback-функции в скрипте определены - QUIK (да и вообще Lua) вынужден весь скрипт полностью выполнить"? СЧИТАТЬ, не выполнить. Скомпилировать, на худой конец. Это же ИНТЕРПРЕТИРУЕМЫЙ код, бумажка с инструкциями! На хрена их ВЫПОЛНЯТЬ?! Какой идиот изобрёл эти "нюансы вызова некоторых функций"? Какая, в жопу, "неизбежность"?!
Вон, даже nikolz проняло, не говоря уже про Nikolay.
Пользователь
Сообщений: Регистрация: 27.01.2017
06.07.2023 10:56:30
Кстати по по поводу пути. У меня путь определяется так: local path = (_G.getScriptPath and _G.getScriptPath() or (arg[0]:gsub('[^\\/]*$', '', 1):gsub('\\', '/'))) or '' if path == '' then path = './' end
И это не в какой-то функции, а в самом начале скрипта. И как-то не вижу я проблем, чтобы getScriptPath не работал. Так что да, особого смысла в OnInit не вижу. Хотя, когда разбирался с окружением qlua, тоже использовал.
Пользователь
Сообщений: Регистрация: 15.06.2023
06.07.2023 11:13:44
Цитата
Владимир написал: Вы СВОИ задачи решайте, торговые, а не занимайтесь разной хернёй с потоками,, коллбеками, библиотеками и прочим онанизмом.
Нужно в Quik их записать Золотыми буквами
Только задачу как решать если нет даже основания.
Приведу аллегорию от инженеров: Пришел в магазин купить велосипед, продавец отвечает на полке педали под полкой колесо, еще есть спицы соберите и на здоровье ездите.
Это подход сервиса от программистов, по крайней мере в реализации Квик.
Вы посмотрите, на мой взгляд "Некчемный" вопрос, вызвал дискуссию на две страницы уже спецы подключились.
Сам луа читает все подряд сверху вниз, обернули в функцию "ни чего не вижу ни чего ни кому не скажу", Все что сделали Квиковцы вызов от терминала. Кому на до пользует не на до забыл.
Проблем у них выше крыше, одна вон реализация SearchItems чего стоит пойди догадайся (хоть примеры добавили).
Пользователь
Сообщений: Регистрация: 15.06.2023
06.07.2023 11:46:39
Цитата
Nikolay написал: Кстати по по поводу пути. У меня путь определяется так:local path = (_G.getScriptPath and _G.getScriptPath() or (arg[0]:gsub('[^\\/]*$', '', 1):gsub('\\', '/'))) or ''if path == '' then path = './' endИ это не в какой-то функции, а в самом начале скрипта. И как-то не вижу я проблем, чтобы getScriptPath не работал. Так что да, особого смысла в OnInit не вижу. Хотя, когда разбирался с окружением qlua, тоже использовал.
Так Вы его исключили, у вас или или это. Если его нет то идет конструкция or (arg[0]:gsub('[^\\/]*$', '', 1):gsub('\\', '/'))) or '' еще в глобальное поле занесли.
Пользователь
Сообщений: Регистрация: 15.06.2023
06.07.2023 11:51:49
Да и ключевое что OnInit вызывает термина квик.
Надо вызываем не надо не вызываем. Не глючит и "слава Богу".
Пользователь
Сообщений: Регистрация: 27.01.2017
06.07.2023 11:56:44
Цитата
Так Вы его исключили, у вас или или это. Если его нет то идет конструкция or (arg[0]:gsub('[^\\/]*$', '', 1):gsub('\\', '/'))) or '' еще в глобальное поле занесли.
Потому что одни и те же скрипты могут запускаться не только в терминале Квике. Поэтому если нет в глобальном контексте метода getScriptPath, то значит вызов из командной строки, а значит надо разбирать аргументы, коих в терминале нет.
Пользователь
Сообщений: Регистрация: 25.09.2020
06.07.2023 12:34:22
VPM, Имнно так задачу и решать - это же МОЯ задача. Да, продавец првильно говорит: соберите и на здоровье ездите. Проблема в том, что педали разломаны, спицы погнуты, а колёса пробиты. А на дискуссии на две страницы я насмотрелся выше крыши. Кстати, что за спецы подключились? Кстати, про SearchItems тоже лучше забыть.
Пользователь
Сообщений: Регистрация: 15.06.2023
06.07.2023 12:42:31
Nikolay, Ну это вы сделали под свои задачи методом исключений. это один из подходов.
Если не лезть в дебри то Смысл Вы спрятали getScriptPath() от луа, так как функция эта qlua который еще не запущен.
Пользователь
Сообщений: Регистрация: 27.01.2017
06.07.2023 12:51:26
Цитата
Смысл Вы спрятали getScriptPath() от луа, так как функция эта qlua который еще не запущен.
Что значит не запущен.
Напишите скрипт из одной строки
message(getScriptPath())
и выполните его в терминале. Никакого OnInit нет.
Пользователь
Сообщений: Регистрация: 15.06.2023
06.07.2023 13:40:10
Nikolay, Я не корректно написал, запускаем не в терминале а в луа, и прячем от самого луа или вашем случае от др.
Ваш пример это один из вариантов, OnInit другой, я прячу в функцию которую вызываю где мне нежно.
в тестах на луа свой делаю прописывая в нем полный путь getScriptPath().
Наверняка придумано еще что то. Здесь нет предмета для обсуждения на мой взгляд, пишем отталкиваясь от задачи.
Пользователь
Сообщений: Регистрация: 02.02.2015
миру мир!
06.07.2023 20:22:19
При нажатии кнопки "Запустить" (скрипт) он именно выполняется интерпретатором Lua, предварительно переводится в байт-код. Весь полностью код.
Наверное не все помнят, но привычная нам запись
Код
function MyFunc()
{
}
на самом деле синтаксический сахар. Фактически же это означает (и эквивалентно) MyFunc = function () { }
т.е. определяется глобальная переменная с именем MyFunc, которой присваивается значение с типом "функция". (Да вы сами посмотрите через type()) А чтобы переменной присвоить значение - скрипт надо выполнить.
Пользователь
Сообщений: Регистрация: 15.06.2023
06.07.2023 21:01:13
Уважаемые форумчане вот инструкция от разработчика.
Использование Lua в Рабочем месте QUIK
1. Возможные подходы написания скриптов Lua для плагина QLua в Рабочем месте QUIK
Для запуска добавьте необходимый скрипт и нажмите на кнопку «Запустить». Запуск скрипта всегда начинается с обработки тела скрипта вне каких-либо функций, обозначим его . Можно выделить три подхода при создании Lua скрипта:
1. Вся необходимая логика описывается в области . В этом случае сценарии, описанные в теле скрипта вне каких-либо функций, после запуска выполняются только один раз, и скрипт переходит в состояние «Остановлен». Данный подход применим для Lua скриптов, целью которых является разовый подсчет необходимых данных. Скрипты с такой структурой выполняются в основном потоке РМ QUIK, ...
2. Вся необходимая логика описывается в функции с предопределенным именем main(). В этом случае после запуска скрипта первоначально выполняются сценарии, описанные в , если они присутствуют. Далее в отдельном потоке выполняется функция main(). ...
3. Событийная модель. При выборе данного подхода предоставляется гибкая среда выполнения пользовательских сценариев внутри QUIK, позволяющая мгновенно получать интересующие события от РМ QUIK, производя нужную обработку этих событий. Для обработки того или иного события необходимо в скрипте прописать функцию с предопределенным названием. Описание данных функций приведено в разделе 2.2 «Функции обратного вызова» Руководства пользователя Интерпретатора языка Lua. Скрипт Lua может содержать несколько функций с предопределенными названиями, являющимися обработчиками событий, таких как новая сделка, новая обезличенная сделка, изменение котировок и т.д
Как и в предыдущей структуре скрипта Lua, после его запуска первоначально выполняются сценарии, описанные в , если они присутствуют. Далее происходит вызов обработчика с именем OnInit(), если он присутствует. В обработчике OnInit() пользователь имеет возможность инициализировать все необходимые переменные и библиотеки перед запуском отдельного потока. После завершения функции OnInit() происходит создание отдельного потока РМ QUIK, и в этом потоке начинает выполнение функция main(), которая обязательно должна присутствовать в скрипте. Скрипт считается работающим, пока работает функция main(). При завершении работы
Пользователь
Сообщений: Регистрация: 25.09.2020
06.07.2023 21:27:01
VPM, На заборе тоже много чего написано. Особенно про событийную модель.
Пользователь
Сообщений: Регистрация: 02.02.2015
миру мир!
07.07.2023 05:33:53
Цитата
VPM написал: Уважаемые форумчане вот инструкция от разработчика.
И что? что вы хотели этим сообщением сказать?
Пользователь
Сообщений: Регистрация: 30.01.2015
07.07.2023 07:27:31
Прикольно, буря в стакане. Казалось бы все просто. Сам вопрос темы не корректный спросили " в чем преимущество OnInit" , но забыли указать с чем сравнивать. Написал три возможных варианта Касалось бы все ясно. Если ты чайник в программировании, то делай как рекомендуют разработчики КВИК и спи спокойно. Нет, начинается треп а зачем, а мне насрать, а че это за такие преимущества и бла-бла бла.
Пользователь
Сообщений: Регистрация: 25.09.2020
07.07.2023 09:12:21
nikolz, Да с чем угодно. НЕТ у этого говна никаких преимуществ. Нет, И БЫТЬ НЕ МОЖЕТ. Это идеологический кретинизм. Я знаю, что Вы чайник в программировании, но даже Вам не следует тупо делать как рекомендуют разработчики КВИК - они, мягко говоря, не боги. Тем более, что они как раз меньше всех заинтересованы в качестве софта.
Не понимая смысл разработки говорить не о чем. Вот я и вытащил варианты от разработчика.
Где тут вообще преимущества? От отталкиваемся от собственной разработки принимая один из вариантов. В чем дискуссия?
Луа на писан таблицами. Читаем другого разработчика.
Цитата
swerg написал: А чтобы переменной присвоить значение - скрипт надо выполнить
А это вообще глубочайше заключение, которое нужно вывести в отдельную тему и обсудить.
Только это и хотел сказать.
Пользователь
Сообщений: Регистрация: 20.03.2023
07.07.2023 09:58:27
Цитата
Владимир написал: появился гениальный язык С, любовь на всю жизнь
Что же вы на ненавистном вам луа пишите? Можно же в одну строчку загрузить библиотеку, написанную на С. И все остальное делать уже там. Регистрировать колбеки - lua_register. Дергать функции quik через lua_pcall. И никакого тормозного интерпретатора.
Пользователь
Сообщений: Регистрация: 25.09.2020
07.07.2023 11:02:08
paluke, У меня никогда не было ни секунды сомнения, что писать нужно только на чистом Луа, и в начале своего появления здесь я раз сто подробно описывал - почему. НИКАКИХ библиотек! Только так можно почти не обращать внимания ни на версию Квика, ни на версию языка. И за всё время я помню только один случай правки кода по этой причине, когда местные умельцы заменили loadstring на load. Для столь примитивной задачи как торговля гениальный язык С тупо не нужен - достаточно даже такого дерьма как Луа. Написал и забыл. И не надо ничего грузить, ничего регистрировать, ничего компилировать, ничего дёргать. А тормозной интерпретатор позволяет спокойно обслуживать сотни и даже тысячи тикеров - выше крыши для любого трейдера. Да, у меня стоит ограничение не более двух заявок в секунду, но тут уж никакой гениальный язык не поможет.
Пользователь
Сообщений: Регистрация: 12.05.2020
07.07.2023 12:09:17
Цитата
Владимир написал: Единственный коллбек, который использую я - OnTrade, некоторые работают даже без него.
Вы до сих пор используете OnTrade? Зачем реагировать на полуфабрикаты (колбеки), когда можно использовать текущее состояние QUiK (таблица по сделкам)? Вы же не занимаетесь FTP (зачем? и точно бессмысленное занятие этим в quik)? Чем проще, тем надежнее.
Пользователь
Сообщений: Регистрация: 15.06.2023
07.07.2023 12:37:14
Владимир, Простите что вмешиваюсь в столь полезный диспут.
Но не могу не сказать, что в постановке задачи на мой взгляд есть ошибка. Вот здесь.
Цитата
Владимир написал: А тормозной интерпретатор позволяет спокойно обслуживать сотни и даже тысячи тикеров - выше крыши для любого трейдера.
Ни Каму не нужны сотни молчу про тысячи тикеров в механической торговой программе (МТС), тем более брокеру!
Для отбора тикеров их фильтрации используют другие программы, а в МТС тикеры гонят уже зная чем торговать, как торговать, за с чет кого торговать!
Маркет (ММ), где то специалист, ММВБ автоматически сводит заявки. Для поддержания десятка тикеров требуются огромные средства когда их не хватает MM запрашивает помощь у других.
Через квик торговать FTP и жаловаться на быстродействие мягко говоря бессмысленно, по одно только причине MM РАЗРЕШЕНО делать задержки. Высокочастотники сидят в подвалах биржи.
Но а для других стратегий 1млсек за глаза!
Пользователь
Сообщений: Регистрация: 02.07.2015
07.07.2023 12:51:15
Цитата
VPM написал: Через квик торговать FTP и жаловаться на быстродействие мягко говоря бессмысленно,
Дааа... Дискуссия приобретает все более неожиданные повороты. FTP - это протокол передачи данных. то, что ви иметь ввиду называется - HFT.
TGB, Да, я до сих пор используете OnTrade, намерен и дальше его использовать - это и проще, и быстрее, и надёжнее. Зачем бегать по таблице сделок, если есть прерывание? А если этих сделок сотни или тысячи за сеанс? Мой скрипт экономит своё время...
VPM, Почему это "никому не нужны сотни и тысячи тикеров"? У меня на долларовом рынке только в портфеле было с полсотни тикеров, а у моего друга и за сотню переваливало. И сделок у меня бывало под тысячу даже в боевом режиме. А уж тикеров, за которыми скрипт следил и вообще было тысячи полторы-две. При этом HFT меня никогда не интересовал - не для Квика эта технология, и вообще дурацкая.
Нет гонять следить можно, Здесь ключевое стабильно зарабатывать.
Те ребята с которыми мы имеем дело на рынке, свои сделки готовят, читают рынок на раз два, инсайд, закрытые каналы и т.д. Там где серьёзные средства, существуют отдельные отделы, следящие за RM, отдельно трейдер, аналитический отдел, в общем структура.
Нет укусить откусить конечно можно и Ваш подход наверняка имеет место быть об это толь ко Вы можете судить.
Я же говорю о стабильности.
Ну к примеру была у меня сетка нашел алгоритм сам слепил торговал брент на минутках. Набирала до открытия ам. рынка "мама негорюй" Просыпались капиталисты все отберали еще и мои просили.
Скажите Сетку нельзя торговать очень широко применяется с широким спредом и более серьезными средствами.
Пользователь
Сообщений: Регистрация: 25.09.2020
07.07.2023 14:57:12
VPM, Да не смешите Вы мою задницу. Время от времени даже солиднейшие компании с целой армией аналитиков высочайшей квалификации терпят миллиардные убытки. а инсайд вообще никакого отношения к торговле не имеет - это, по сути, жульничество. Другое дело, что с деньгами намного легче зарабатывать, чем без них. А стабильность - это минимизация рисков. И, соответственно, снижение вероятности заработать много и быстро. Сеточные алгоритмы как раз и относятся к высокорисковым.
Владимир написал: Время от времени даже солиднейшие компании с целой армией аналитиков высочайшей квалификации терпят миллиардные убытки
Недавний пример с "Colden Sachs" с ее хедж фондом или современные банкротства инцест банков. И что Одни капиталисты обули других. Или Ваш супер скрипт поучаствовал. "Зин а деньги где"?
Цитата
Владимир написал: Другое дело, что с деньгами намного легче зарабатывать, чем без них. А стабильность - это минимизация рисков
Согласен целиком и полностью.
Цитата
Владимир написал: снижение вероятности заработать много и быстро
Вероятность Выигрыша в начале нужно перетянуть на свою сторону - минимизация рисков один из подходов. А Вы мне помнится отрицаете обработку старых данных.
Цитата
Владимир написал: Сеточные алгоритмы как раз и относятся к высокорисковым.
Не знаю насчет, риска опыт мал, только в планах докрутить хорош больно во флате. Но есть подозрение что Маркет Мейкер активно пользует или ребята обеспечивающие ликвидность.
Пользователь
Сообщений: Регистрация: 25.09.2020
07.07.2023 15:55:49
VPM, Я вообще без понятия, в чём там мой скрипт участвует: денег дал - и пусть выкручивается как знает. Когда писал, стремился как раз максимально снизить риски, так что особых звёзд он с неба не хватает, но работает очень надёжно, и я давно перестал следить, чем он там занимается - всё равно он торгует лучше меня.
Я и сейчас отрицаю обработку старых данных. Разве что режим работы по историческим данным использовал для черновой отладки скрипта.
Естественно, любой, кто может, всегда с радостью откусит кусочек у соседа. А фьючерсы и вообще игра с нулевой суммой. Для меня в своё время было полной неожиданностью, что техника торговли на срочном рынке радикально отличается от фондового, и я тогда довольно прилично просел, пока отлаживал торговые алгоритмы.
Пользователь
Сообщений: Регистрация: 12.05.2020
07.07.2023 16:30:41
Цитата
Владимир написал: Зачем бегать по таблице сделок, если есть прерывание?
Не надо бегать по таблице сделок. Достаточно сохранять ее размер и только если он изменился, читать только новые записи.
Пользователь
Сообщений: Регистрация: 25.09.2020
07.07.2023 17:58:08
TGB, Какая разница, по старым или по новым? По ней нужно бегать, чего-то там сохранять, чего-то там искать. И как часто? У меня, например, блокируется подача подача новой заявки по тикеру, если предыдущая не реализована или не снята. А если у меня эта заявка будет реализована в сотню сделок? В том-то и прелесть OnTrade, что НИЧЕГО не нужно делать, ни за чем не нужно следить, пока тебя не пнут под зад прерыванием.
Пользователь
Сообщений: Регистрация: 12.05.2020
07.07.2023 18:14:34
Цитата
Владимир написал: пока тебя не пнут под зад прерыванием
Зачем вам прерывания? Вы же программу пишите не для управления системой зажигания автомобиля ?
Наверное, один раз в три секунды скорее всего будет достаточно.
Пользователь
Сообщений: Регистрация: 25.09.2020
07.07.2023 18:32:01
TGB, Затем, что сделки приходят в случайные моменты времени, алгоритмически они и есть прерывания. Точно так же, как и реакция на нажатия клавиш или клики мышкой. И мой скрипт обрабатывает и то, и другое именно как прерывания. И программу я пишу не для управления системой зажигания автомобиля, а для ещё более простой задачи торговли через Квик. И не моё собачье дело, когда придёт сделка по моей заявке: через секунду или через час. И не скрипта дело - когда придёт, тогда и обработает.
Пользователь
Сообщений: Регистрация: 12.05.2020
09.07.2023 07:00:56
Цитата
Владимир написал: Затем, что сделки приходят в случайные моменты времени, алгоритмически они и есть прерывания.
Если я правильно понимаю, вам в скрипте надо знать состояние вашего счета по сделкам. Зачем вам обрабатывать колбеки сделок в случайные моменты времени (дополнительный "геморрой"), когда вы можете посмотреть (только) изменения в таблице сделок (конечный результат), и это можно сделать просто и эффективно. Если между просмотрами таблицы сделок, возникнет несколько новых, то вы их все равно увидите. Задержка 2-3 секунды (из-за цикла просмотра таблицы) в получении состояния по сделкам вряд ли, для вас существенна, так как QUIK точно не HFT терминал.