В чём преимущество OnInit

Страницы: 1 2 След.
RSS
В чём преимущество OnInit
 
Никогда не пользовался колбеком 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?
В него помещается такой же кусок кода?
В чём преимущество?
Спасибо.
 
По-моему были какие-то функцииQLua, которые корректно работают только в Init(), просто в теле скрипта не работают (что-то про источники данных, да?).
Если речь про инициализацию переменных/открытие файлов и т.п. - то разницы нет никакой.
 
Зачем у Oninit в скобках параметр (script_path)?
У меня работает и без него: OnInit ()

имеется в виду, что нужно делать так?
Код
script_path=getScriptPath()
function OnInit (script_path)
--задаём переменные
end

 
Потому как параметры в Луа указывать не обязательно, и если даже функция вызвана с параметрами - всем пофик
 
Цитата
Космонавт написал:
Зачем у Oninit в скобках параметр (script_path)?
У меня работает и без него: OnInit ()

имеется в виду, что нужно делать так?
Код
  script_path =  getScriptPath ()
 function  OnInit (script_path)
 --задаём переменные 
 end 

  
Если память мне не врет, то вроде бы раньше вызов
getScriptPath () в начале подвешивал скрипт и еще были глюки вызова функций QLUA вне колбеков или main.
 
Цитата
Космонавт написал:
Зачем у Oninit в скобках параметр (script_path)?
У меня работает и без него: OnInit ()

имеется в виду, что нужно делать так?Кодscript_path=getScriptPath()
function OnInit (script_path)
--задаём переменные
end
Имеется ввиду, что quik уже за Вас вызвал getScriptPath() и результат Вам подсовывает в качестве параметра при вызове OnInit(script_path).
А уж будете Вы использовать этот "подарок" внутри OnInit или нет, дело Ваше  :smile:
 
Небольшая поправка:
В script_path Вы получаете не просто полной путь к папке запускаемого скрипта (как при вызове getScriptPath()), а полный путь, включая имя файла самого скрипта.
 
Всё же, хотелось бы получить комментарий разработчика, в чем сакральный смысл функции OnInit?
Всё пройдет. Но это не точно.
 
Цитата
Ziveleos написал:
Всё же, хотелось бы получить комментарий разработчика, в чем сакральный смысл функции OnInit?
В том, что это этот колбек вызывается раньше всех других колбеков и раньше функции main.
Без него у Вас колбеки будут вызываться раньше, чем будет вызвана функция main.
 
в итоге если вы параметры торговли определяете в main, то колбеки начнут работу без параметров и могут такого вам наторговать, что будет мучительно стыдно за такой скрипт.  
 
вообще-то ответ есть в документации:
-------------
OnInit   Функция вызывается терминалом QUIK перед вызовом функции main(). В качестве  параметра принимает значение полного пути к запускаемому скрипту.

Формат вызова:  

OnInit(STRING script_path)



В данной функции пользователь имеет возможность инициализировать все
необходимые переменные и библиотеки перед запуском основного потока main().  
 
Необходимые переменные и библиотеки перед запуском основного потока main() возможно инициализировать и в BODY.
Если скрипт не HFT, или вообще без коллбэков, получается OnInit не сильно нужен.  
Всё пройдет. Но это не точно.
 
И не нужно на меня кегль повышать.
Всё пройдет. Но это не точно.
 
Ziveleos, OnInit нафиг не нужен. Как и весь этот маразм с двумя потоками. Лично я выбросил OnInit если не в первой, то во второй версии своего скрипта. Думаю, это наследие С++ - там тоже какие-то идиотские трепыхания идут ещё до main.
 
Владимир, Второй поток все-таки нужен, иначе 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

Всё пройдет. Но это не точно.
 
Ziveleos, Второй поток нафиг не нужен, работа скрипта - это работа интерпретатора. По крайней мере, в нормальной реализации. Я в своё время потратил довольно много времени, чтобы переместить всё, что можно, в поток main, и с тех пор практически забыл про все глюки. Для эмуляции прерываний по таймеру использую sleep, а единственное "настоящее" прерывание - OnTrade.
 
Код
OnI nit=0.0
main=0.0
OnPa ram=0.072999999999979
OnPa ram=0.072999999999979
OnPa ram=0.072999999999979
OnPa ram=0.072999999999979
OnPa ram=0.073999999999984
OnQu ote=0.074999999999989
OnPa ram=0.074999999999989
OnPa ram=0.074999999999989
OnPa ram=0.074999999999989
OnPa ram=0.074999999999989
main=0.114
OnPa ram=0.17699999999999
OnPa ram=0.17699999999999
main=0.22299999999998
OnPa ram=0.31699999999998
main=0.333
OnPa ram=0.41199999999998
main=0.441
OnPa ram=0.517
OnPa ram=0.517
OnPa ram=0.517
main=0.54999999999998
OnQu ote=0.61199999999999
OnPa ram=0.61199999999999
OnPa ram=0.61199999999999
OnPa ram=0.61199999999999
main=0.65899999999999
main=0.76899999999998
OnPa ram=0.81699999999998
OnPa ram=0.81699999999998
OnPa ram=0.81699999999998
 
Объясняю, тем кто не понял.
--------------
Если у Вас скрипт запускается одновременно с запуском 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 не завершит работу.
===================
Т е все переменные будут определены и загружены без каких-либо неожиданностей.
====================
Приведу для наглядности аналогию.
На перекрестке есть светофор.
Особо буйные могут ходить через перекресток не взирая на сигналы светофора.
Особо продвинутые могут даже ходить с закрытыми глазами.
Особо осторожные будут ходить лишь на зеленый.
---------------------
Выбор за Вами.
 
nikolz, В ЛЮБОМ случае "нет особой разницы, где Вы устанавливаете и загружаете начальные параметры  скрипта". Я миллион раз запускал скрипт и во время торговли, и когда её нет, и НИ МАЛЕЙШИХ "последствий в зависимости от места , где вы устанавливаете переменные" не наблюдалось.

Ладно уж, "рассмотрим эти варианты":
1) Да, именно "в начале скрипта присваиваем значения". Я лично полагаю, что в этом случае присвоение происходит ПОСЛЕ полной загрузки скрипта, но ДО запуска функции main. Впрочем, допускаю, что и ДО полной загрузки, но это при условии, что системную математику писали клинические дебилы. В любом случае, это примерно одна секунда.

2) Да, "в начале функции main" ТОЖЕ производятся кое-какие присвоения. И в середине тоже. Более того, они могут присваиваться даже из внешних файлов - например, номер счёта, код клиента, состояние портфеля и кошелька. Но мне и в страшном сне не может присниться ни "длительная процедура инициализации переменных, ни, тем более, чтобы в это время могли поступить данные по колбекам, и уж совсем невозможно, чтобы эти данные хоть как-то могли "оказать влияние на установку переменных". Это нужен ТАЛАНТИЩЕ, чтобы такого добиться. Просто программировать нужно уметь, хоть немножко.

3) Установка параметров в колбеке OnInit нафиг не нужна, как и сам OnInit. Лично у меня этого дерьма нет, не было и не будет. Точнее, было в самом начале моего знакомства с Луа в тренировочном скрипте, где я пытался понять, за каким хреном эта бредятина может быть кому-то понадобиться.
 
Владимир, что Вы называете вторым потоком?
Под  вторым потоком я подразумевал именно поток main, а коллбэки, BODY - это основной основной поток QUIK.
Всё пройдет. Но это не точно.
 
Ziveleos, Я разве называл вторым потоком? Впрочем, неважно: поток main - он обязательный, так что первый и единственный, а всё остальное - это второй: прорисовка таблиц, коллбеки, и прочая лабуда. Прорисовка у меня вообще отключаемая - так называемый "спящий режим", всех коллбеков один OnTrade, так что в этом "основном потоке QUIK" мой скрипт находится дай бог сотую долю процента.
 
QUIK создает 7 потоков.  
Скрипты  -запускают  main в следующих по очереди потоки.
 
Владимир,

зря ругаете, функция необходима и  ключевое здесь
OnInit(STRING script_path)
В данной функции пользователь имеет возможность инициализировать все
необходимые переменные и библиотеки перед запуском основного потока main().

К примеру если обрабатываете колбек OnAllTrade() без нее и не обойтись.
 
Космонавт написал: инициализирую переменные до начала main как то так:

это нормально если ваши переменные не лезут в терминал или к серверу до запуска mail()
 
В чём преимущество?
Так его и нет.

Вопрос в организации переменных Вашего скрипта их локализации и видимости.
 
VPM, НА КОЙ "функция необходима"? Я прекрасно могу инициализировать все необходимые переменные и без этого дерьма, как и без каких-либо библиотек - и перед запуском основного потока main, и после него, и во время него. OnAllTrade также нафиг не нужен.
 
Владимир, так я с Вами не спорю, где угодно!

Вопрос в организации переменных Вашего скрипта их локализации и видимости.

К примеру, "перед запуском основного потока main" всего 200 локальных переменных я постоянно выхожу за это число.
Если как у Космонавта то сам lua ругается порой.

Сервис!
 
VPM, А тут не о чем спорить, задача организации торговли настолько проста, что её можно реализовать даже на чистом Луа, даже при полной ущербности системной математики Квика.

Какие могут быть ЛОКАЛЬНЫЕ переменные "перед запуском основного потока main" - то мне неведомо. У меня их... ну, пара десятков, наверное, наберётся. Впрочем, сейчас посчитаю... ого, аж 34 штуки.
 
Я смотрел Ваши посты Как понимаю у Вас свой подход вы не пользуетесь историей данных.
А локализация в луа нужна чтоб не засорять для видимости и быстродействия.

Ну вы это сами лучше меня знаете.
 
VPM, Я даже не знаю что такое история данных.  :smile:

Нет, я как раз прекрасно знаю, что никакая локализация в луа не нужна, и ничего не засоряется для видимости и быстродействия, если специально этим не заниматься.
 
Я не обсуждаю язык, бессмысленно другого нет.
Я лишь прислушиваюсь к рекомендациям авторов.
Проверить
видимость легко,
быстродействие скрипта легко с локальными и глобальными.
SciTe одно нажатие.

А вот со сбором мусора сложней. Оказывается nil запускает сборщик.
 
Цитата
VPM написал:
Оказывается nil запускает сборщик.
Вы где это прочитали?
 
Уважаемый Космонавт, мы тут чуть отошли от темы.

На Ваш вопрос - В чём преимущество? Хотел сделать поправку на пост.
Если скрипт небольшой, не требует особого быстродействия, не затратен по памяти.
Вас все устраивает - То ни каких.

Если хотите оптимизировать Вас скрипт посмотрите "Програмирование на Lua"  сэкономит много времени.
Проверено!

С уважением VPM  
 
VPM, Да плюньте Вы на быстродействие скрипта с локальными и глобальными. И на сборщик мусора тоже. Пусть работают как работают - это ИХ проблемы.
 
Это да.

В трейдинге нет единого алгоритма по которому Все работают.

И ведь вопрос очень примитивен, даже для меня - это азы.
Если можем помочь почему бы нет.

Я уже Вам  писал в другом п. никто здесь является мне или Вам соперником в торговле.

Вы прекрасно знаете что ММ и Банки торгуют абсолютно др. алгоритмы.
Ну к примеру ММ видит обе стороны сделок и одновременно с обоих торгует.
 
Видимо, единственное преимущество OnInit в том, что в отличии от body, из неё можно вызывать  функции не объявленные ранее.
Ну, и  " В качестве параметра принимает значение полного пути к запускаемому скрипту."

Скрытый текст

Окружение  body и OnInit:

Скрытый текст
Всё пройдет. Но это не точно.
 
Ziveleos, Не очень понятно что написали.

Но мой комментарий к первому Вашему скрипту.

file = io.open(getScriptPath() .. "\\Environment.txt", "w+")
идет инициализация переменно  file.

getScriptPath() .функция QLUA. Запустите на чистом луа получите скандал!

Я уже молчу что переменная  file записана  в глобальное поле.  
 
Да пока вел беседы CNYRUBF нарисовал границы по CNYRUB.
 
Цитата
VPM написал:
Не очень понятно что написали.

Скрипт выводит в файл список переменных окружения. Сначала body, потом OnInit, и сравнивает их.

Цитата
VPM написал:
идет инициализация переменно  file. <...> Я уже молчу что переменная  file записана  в глобальное поле.  

Одной переменной больше. И что?

Цитата
VPM написал:
getScriptPath() .функция QLUA. Запустите на чистом луа получите скандал!

Зачем? В чистом lua и OnInit нет.
Всё пройдет. Но это не точно.
 
Ziveleos, Ну на кой кому всё это надо? Кого интересуют эти несчастные переменные окружения? Заняться больше нечем?
 
Владимир,  переменные окружения показывают разницу между body и OnInit.
Получается, если до зарезу необходимо сделать что-то до начала работы коллбэков, и в этом "что-то" используются функции объявляемые позже, то без OnInit не обойтись. В остальном он на фиг не нужен.
Всё пройдет. Но это не точно.
 
Цитата
Ziveleos написал:
Владимир,  переменные окружения показывают разницу между body и OnInit.
Получается, если до зарезу необходимо сделать что-то до начала работы коллбэков, и в этом "что-то" используются функции объявляемые позже, то без OnInit не обойтись. В остальном он на фиг не нужен.
Body скрипта выполняется в потоке терминала. Так что служебные переменные вполне себе инициализируются там.

Читаем документацию:
Цитата
Как и в предыдущей структуре скрипта Lua, после его запуска первоначально выполняются
сценарии, описанные в <BODY>, если они присутствуют. Далее происходит вызов обработчика с
именем OnInit(), если он присутствует. В обработчике OnInit() пользователь имеет возможность
инициализировать все необходимые переменные и библиотеки перед запуском отдельного потока.
После завершения функции OnInit() происходит создание отдельного потока РМ QUIK, и в этом
потоке начинает выполнение функция main(), которая обязательно должна присутствовать в
скрипте.

Так что тело скрипта вполне себе достаточно. OnInit вполне можно использовать для каких-то действий после выполнения служебных процедур, например проверить, что запуск возможен. А если нет - отказ. Но все это можно делать так или иначе.

Речь же про колбеки звучит странно, т.к. я слабо себе представляю использование колбеков в алгоритме, если они не обработаны все. Например, запуск в середине торгового дня. Половина колбеков уже прошла, надо читать прошедшие события из таблиц, и здесь уже не важно как инициализировать. Поэтому колбеки - это вспомогательный инструмент, не более. "Прибивать гвоздями" их к логике - не самая лучшая затея. Он может и не прийти, в конечном итоге. Гарантированной доставки в документации не декларируется.
 
Ziveleos, Я же спросил: ДЛЯ ТОРГОВЛИ на кой эта хрень нужна? ЗА КАКИМ ХРЕНОМ кому-то "до зарезу необходимо сделать что-то до начала работы коллбэков"? И кому нужно такое говно как Луа, КРОМЕ организации торговле на бирже?
 
Ziveleos, если переменная одна то и без разницы.

В Чистом  луа прогоняю свою писанину на ошибки луа, остальное на совести qlua.
Это просто мой подход к экономии времени.
 
Nikolay, Да вы правы.
Цитата
Nikolay написал:
Речь же про колбеки звучит странно, т.к. я слабо себе представляю использование колбеков в алгоритме, если они не обработаны все. Например, запуск в середине торгового дня. Половина колбеков уже прошла, надо читать прошедшие события из таблиц, и здесь уже не важно как инициализировать. Поэтому колбеки - это вспомогательный инструмент, не более. "Прибивать гвоздями" их к логике - не самая лучшая затея. Он может и не прийти, в конечном итоге. Гарантированной доставки в документации не декларируется.
Просто из собственного опыта при запуске от колбека  пришло а основной цикл еще не запущен.
Прошедшие события читаю и из таблиц перед за основного цикла, после запуска беру из колбека.
А какие еще варианты обработать т. всех сделок?
 
Цитата
Nikolay написал:
Body скрипта выполняется в потоке терминала. Так что служебные переменные вполне себе инициализируются там.

А я что сказал?

Цитата
if до зарезу необходимо сделать что-то до начала работы коллбэков,
and в  этом "что-то" используются функции объявляемые позже, then
 
 без OnInit не  обойтись.
end
В остальном он на фиг не нужен.


Цитата
Nikolay написал:
Речь же про колбеки звучит странно, т.к. я слабо себе представляю использование колбеков в алгоритме, если они не обработаны все.

Если в самой функции коллбэка используется нечто не объявленное ранее, и он сработает, возникнет ошибка.
Поэтому это "нечто" нужно объявить до запуска main.
Всё пройдет. Но это не точно.
 
Владимир, просто давно интересовал этот вопрос: какая разница между body и OnInit, и зачем он вообще нужен?
Всё пройдет. Но это не точно.
 
Цитата
VPM написал:
В Чистом  луа прогоняю свою писанину

Еще раз:

Цитата
Ziveleos написал:
Зачем? В чистом lua и OnInit нет.
Всё пройдет. Но это не точно.
 
Ziveleos, Здесь все просто.

Пользуюсь редактором SciTe,
1) он сам написан на луа т.е. легко модернизировать под свои нужды
а главное он запускает скрипт на исполнение.

getScriptPath() - это путь.
OnInit - это просто функция.
Я ее прячу обычно в OnInit или перед основным циклом в main.

Смысл - мне не нравится что луа ругается.
 
Ziveleos,
Цитата
Космонавт написал:
script_path=getScriptPath()
function OnInit (script_path)
--задаём переменные
end
я делаю так

local path;
function OnInit (script_path)

--задаём переменные
path=getScriptPath()

script_path -- другая переменная

end
 
OnInit по определению нужен лишь затем, чтобы что-то сделать до main. То есть это идеологический идиотизм.
 
Владимир, Почему?
 
VPM, Что почему? Идиотизм? Потому, что фиксированное имя main для того и придумано, чтобы указать место, с которого начинает работать программа. Кого-то из криворуких бездарей это не устроило, и они изобрели ВТОРОЕ фиксированное имя, чтобы указать... правильно: место, с которого начинает работать программа.
 
Цитата
Если в самой функции коллбэка используется нечто не объявленное ранее, и он сработает, возникнет ошибка.
Поэтому это "нечто" нужно объявить до запуска main.
Я не буду ничего говорить по поводу данной возможности, кроме того, что если так делается, то это очень плохой стиль. Я такое могу представить только через глобальные переменные.
В колбеке идет обращение к ним, а сама переменная объявляется где-то. И это плохо. Не считая самих глобальных переменных, коих у меня нет вовсе.
Каждый блок когда должен оперировать своей областью видимости, объявленной ранее. Да, глобальный контекст есть. Но использовать его как единственно доступный - это пут в ад, где происходят магические преобразования, по причине случайных коллизий в именовании переменных.
 
Цитата
Nikolay написал:
Как и в предыдущей структуре скрипта Lua, после его запуска первоначально выполняются сценарии, описанные в  , если они присутствуют. Далее происходит вызов обработчика с именем OnInit(), если он присутствует. В обработчике OnInit() пользователь имеет возможность инициализировать все необходимые переменные и библиотеки перед запуском отдельного потока. После завершения функции OnInit() происходит создание отдельного потока РМ QUIK, и в этом потоке начинает выполнение функция main(), которая обязательно должна присутствовать в скрипт
Владимир, Все равно не понятно,
вот документация. будет  OnInit()  или не будет.
Из body будет брать и обрабатывать. Так устроен луа, а qlua не приделах.
Я думаю это больше к вопросу с видимостью в самом луа.
 
Цитата
Владимир написал:
OnInit по определению нужен лишь затем, чтобы что-то сделать до main. То есть это идеологический идиотизм.

Не столько до main, сколько до коллбэков.
Всё пройдет. Но это не точно.
 
Nikolay, Вот это правильно! К этому Вопросу Может глянете мою веточку что то посоветуете.
 
VPM,
Цитата
VPM написал:
я делаю так

local path;
function OnInit (script_path)

--задаём переменные
path=getScriptPath()

script_path -- другая переменная

end

Так ведь:

Цитата
Алексей написал:
Имеется ввиду, что quik уже за Вас вызвал getScriptPath() и результат Вам подсовывает в качестве параметра при вызове OnInit(script_path).А уж будете Вы использовать этот "подарок" внутри OnInit или нет, дело Ваше  

Зачем Вам script_path от OnInit?
Всё пройдет. Но это не точно.
 
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;
 
Да просто задолбали эти криворукие своими вонючими потоками. Шибка вумные, ручонки чешутся впендюрить какую-нибудь херню, в результате простейшая, тривиальнейшая прикладная задача начинает глючить так, что и в кошмарном сне не приснится. Нет у меня никакого OnInit  и не будет - это говно тупо нафиг никому не нужно. И коллбеки нафиг не нужны - тем более, что все они глючат со страшной силой. Единственный коллбек, который использую я - OnTrade, некоторые работают даже без него. А если уж припёрло использовать какую-то хрень, которая аж до мейна начинает срабатывать, так пусть флаг поставят, анализируют его, и пока он не установлен, сразу из этого коллбека вылетают. А где надо, установят его в МОЖНО. И нет проблем даже с такими маразматическими коллбеками. Уровень подавляющего большинства посетителей форума близок к абсолютному нулю, а туде же - потоки им подавай. НА ХРЕНА ОНИ ВАМ?! С переменными та же хрень: мой скрипт может обслуживать несколько тысяч тикеров, так что переменных там, возможно, миллион - и нет проблем. Вы СВОИ задачи решайте, торговые, а не занимайтесь разной хернёй с потоками,, коллбеками, библиотеками и прочим онанизмом.
 
Цитата
Владимир написал:
Уровень подавляющего большинства посетителей форума близок к абсолютному нулю, а туде же - потоки им подавай. НА ХРЕНА ОНИ ВАМ?! С переменными та же хрень: мой скрипт может обслуживать несколько тысяч тикеров, так что переменных там, возможно, миллион - и нет проблем. Вы СВОИ задачи решайте, торговые, а не занимайтесь разной хернёй с потоками,, коллбеками, библиотеками и прочим онанизмом.
Целиком поддерживаю Вас.
Не от хорошей жизни колупаемся в носу и лезем не туда.
Так поделитесь опытом.
 
VPM, Опыт может быть только у каждого свой собственный, пока свои шишки не набьются - ничего не поможет. Просто нужно заниматься СВОЕЙ конкретной задачей, проблемы решать по мере их возникновения и ничего не делать на всякий случай. Зачем МНЕ нужет OnInit, зачем МНЕ нужна пассивная заявка, зачем МНЕ нужны свечи, зачем МНЕ нужны потоки, зачем МНЕ нужны коллбеки и т.д. И тогда вдруг окажется, что 99% проблем исчезнут, так и не возникнув.
 
Владимир, Да это вы правы Опыт необходим, но ведь если не учить не подсказывать, то и опыт будет соответствующий.

Я в данном случае не о себе, о молодежи.
У меня все в порядке с наставниками всегда везло, и вспоминаю их с огромной благодарностью!

Да и зарегистрировался  на форуме чтоб исправили ошибку в стакане. Вроде нашли!
 
VPM, Я тоже зарегистрировался  на форуме, чтобы помогли разобраться с нюансами нового для меня языка, и мне в этом очень помогли. Потом я сам некоторое время считал своим долгом помогать новичкам. Но никакой наставник не заменит собственного опыта. Мне всю жизнь везло на учителей, но вот конкретно по программированию в институте был один семестр, да ещё и с зачётом, а не с экзаменом. Короче, знаний не было ваапще. И только после института, и даже после армии я увлёкся программированием - фактически самоучка. Нет, наставники были, и даже очень мощные, но все они были коллегами, мы вместе РАБОТАЛИ, и только это могло дать настоящий опыт. Да и чему тогда могли учить? Проминь-2, Минск-32, БЭСМ-6, Фортран, Алгол, Бейсик, ассемблеры разных видов, ничтожные по современным меркам память и быстродействие. Потом появились первые персоналки, не сразу Интеловские, появился гениальный язык С, любовь на всю жизнь. Вот это и была совершенно потрясающая Школа, когда наставники учились вместе со своими подопечными. Сейчас этого и близко нет. В школы вроде как ввели информатику, но достаточно бегло полистать любой учебник, чтобы понять: ЭТО способно только навсегда убить желание заниматься программированием. Потом уже я сам пару раз был руководителем диплома у выпускников-программистов. Один потрясающе талантливый, у него уже диплом представлял собой серьёзную разработку - что называется, программист от Бога. Второй... нет, диплом он защитил, и даже на отлично, но сразу было видно, что это не его сфера деятельности, сколько бы его ни наставляли. В общем, программисты вымерли. Как мамонты.
 
Цитата
Ziveleos написал:
давно интересовал этот вопрос: какая разница между body и OnInit, и зачем он вообще нужен?
Выше в этой ветке давно же уже написано: из так называемого body не все функции QLua корректно работают (во всяком случае на такое натыкались ранее; речь про разные хитрые функции типа создание DataSource или чего-то такого; изменилось ли что-то с тех пор - не знаю, если найти на форуме на что именно жаловались - то можно проверить)
В то же время на момент выполнения OnInit() уже точно любые функции QLua будут работать корректно. Плюс бонусом передается путь до скрипта, если он требуется.

Т.е. вообще говоря, OnInit() QUIK вызывает так сказать осознанно, когда все готово и известно, что такая функция в скрипте определена.
Но вот чтобы узнать какие callback-функции в скрипте определены - QUIK (да и  вообще Lua) вынужден весь скрипт полностью выполнить, это определит для Lua имеющиеся в скрипте функции, про них станет известно. И, разумеется, при этом выполняется тот самый код, который написан мне функций и который я когда-то назвал [BODY] в своей документации описания QLua. И термин этот прижился, так теперь все его и использ0уют.

Вот и вся разница. Чем пользоваться - да все равно. Если ваш инициализирующий код корректно работает в [BODY] вам такой стиль нравится - то и замечательно. Если хочется чего-то этакого - пользуйтесь OnInit(), если так вам удобнее понимать лдогику собственного скрипта. Скорее вопрос привычек, короче. Ну за исключением нюанса вызова некоторых функций. Но если вы с таким нюансом не сталкиваетесь - значит либо вы такие функции не используете, либо QUIK этот момент давно починил.

Еще раз.
Выполнение [BODY} - чисто технический момент.
Т.е. QLua сначала просто выполняет Lua-скрипт, при этом - главное - в глобальной области видимости для Lua-машины появляются определенные в скрипте callback-функции. После этого QLua уже может узнать какие callback-функции определены в скрипте и после знает какие callback-функции надо вызвать, т.к. они есть, а какие не надо, т.к. их нет. Вот и все, вот и весь "секрет".
А то, что при этом выполняется остальной код, расположенный вне функций - просто неизбежность, никакого глубокого смысла в том нет.
 
Цитата
swerg написал:
Цитата
Но вот чтобы узнать какие callback-функции в скрипте определены - QUIK (да и  вообще Lua) вынужден весь скрипт полностью выполнить, это определит для Lua имеющиеся в скрипте функции, про них станет известно.
Вы уверены в тот, что для нахождения всех колбек надо выполнить скрипт.
---------------
Не знаю как реализовали разработчики, но полагаю, что это не обязательно делать.
Определение существующих колбеков можно делать либо один раз после загрузки скрипта и формировать специальную таблицу указателей (давно это тестил и вроде бы пришел к такой схеме)
Но можно это делать налету при приходе соответствующих данных в терминал.
----------------
Относительно Вашего замечание "делайте как нравится"
Я привел ранее аналогию перекрестка. Можно ходить на зеленый, а можно - как нравиться - с закрытыми глазами.  Если потом откроите и поймете, что в больнице, ну тогда будете ходить по правилам. Но может Вам и повезет.  
 
Цитата
Вы уверены в тот, что для нахождения всех колбек надо выполнить скрипт.
Lua  - интерпретируемый язык, сначала он должен заполнить пространство имен (скомпилировать кусок кода), только потом что-то вызывать. Правда это не выполнение скрипта, конечно. Т.е. если сделать определение некой глобальной переменной внутри какого-то метода, то будет ошибка, да.
 
Nikolay, Бонусом передается путь до скрипта, если он требуется. ХОСПИДЯ! Из-за этой вот херни ковыряться в кишках QLua?! Создавать себе проблемы, а потом героически их решать? Разгадывать это СТРРРАШНУЮ ТАЙНУ? Что, трудно скинуть все нужные файлы в ту же папку, в которой лежит сам скрипт? У меня изначально так и сделано: в одной папочке лежит скрипт со всеми причендалами для одного брокера, в другой - точно такой же скрипт, но для другого брокера и даже другого Квика, в третьей - для того же самого Квика и брокера, но там я занимался отладкой алгоритмов скрипта в тестовом режиме, без реальных сделок. Во всех трёх случаях код скрипта совершенно одинаковый, и все "проблемы" с файлами решаются автоматически. Для лог-файла, например, код выглядит так:
F=io.open(getScriptPath().."//LOG.TXT","a");
И ВСЁ, БЛИН!

С какого бодуна "чтобы узнать какие callback-функции в скрипте определены - QUIK (да и  вообще Lua) вынужден весь скрипт полностью выполнить"? СЧИТАТЬ,  не выполнить. Скомпилировать, на худой конец. Это же ИНТЕРПРЕТИРУЕМЫЙ код, бумажка с инструкциями! На хрена их ВЫПОЛНЯТЬ?! Какой идиот изобрёл эти "нюансы вызова некоторых функций"? Какая, в жопу, "неизбежность"?!

Вон, даже nikolz проняло, не говоря уже про Nikolay. :smile:  
 
Кстати по по поводу пути. У меня путь определяется так:
local path      = (_G.getScriptPath and _G.getScriptPath() or (arg[0]:gsub('[^\\/]*$', '', 1):gsub('\\', '/'))) or ''
if path == '' then path = './' end

И это не в какой-то функции, а в самом начале скрипта. И как-то не вижу я проблем, чтобы getScriptPath не работал. Так что да, особого смысла в OnInit не вижу. Хотя, когда разбирался с окружением qlua, тоже использовал.
 
Цитата
Владимир написал:
Вы СВОИ задачи решайте, торговые, а не занимайтесь разной хернёй с потоками,, коллбеками, библиотеками и прочим онанизмом.
Нужно в Quik их записать Золотыми буквами :lol:

Только задачу как решать если нет даже основания.

Приведу аллегорию от инженеров:
Пришел в магазин купить велосипед, продавец отвечает на полке педали под полкой колесо, еще есть спицы
соберите и на здоровье ездите.

Это подход сервиса от программистов, по крайней мере в реализации Квик.

Вы посмотрите, на мой взгляд "Некчемный" вопрос, вызвал дискуссию на две страницы уже спецы подключились.

Сам луа читает все подряд сверху вниз, обернули в функцию "ни чего не вижу ни чего ни кому не скажу",
Все что сделали Квиковцы вызов от терминала.
Кому на до пользует не на до забыл.

Проблем у них выше крыше, одна вон реализация SearchItems чего стоит пойди догадайся (хоть примеры добавили).
 
Цитата
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 '' еще в глобальное поле занесли.
 
Да и ключевое что OnInit вызывает термина квик.

Надо вызываем не надо не вызываем. Не глючит и "слава Богу".
 
Цитата
Так Вы его исключили, у вас или или это. Если его нет то идет конструкция or (arg[0]:gsub('[^\\/]*$', '', 1):gsub('\\', '/'))) or '' еще в глобальное поле занесли.
Потому что одни и те же скрипты могут запускаться не только в терминале Квике. Поэтому если нет в глобальном контексте метода getScriptPath, то значит вызов из командной строки, а значит надо разбирать аргументы, коих в терминале нет.
 
VPM, Имнно так задачу и решать - это же МОЯ задача. Да, продавец првильно говорит: соберите и на здоровье ездите. Проблема в том, что педали разломаны, спицы погнуты, а колёса пробиты. А на дискуссии на две страницы я насмотрелся выше крыши. Кстати, что за спецы подключились? Кстати, про SearchItems тоже лучше забыть.
 
Nikolay, Ну это вы сделали под свои задачи методом исключений.  
это один из подходов.

Если не лезть в дебри  то
Смысл Вы спрятали getScriptPath() от луа, так как функция эта qlua который еще не запущен.
 
Цитата
Смысл Вы спрятали getScriptPath() от луа, так как функция эта qlua который еще не запущен.
Что значит не запущен.

Напишите скрипт из одной строки

message(getScriptPath())

и выполните его в терминале. Никакого OnInit нет.
 
Nikolay, Я не корректно написал, запускаем не в терминале а в луа, и прячем от самого луа или вашем случае от др.

Ваш пример это один из вариантов, OnInit другой, я прячу в функцию которую вызываю  где мне нежно.

в тестах на луа свой делаю прописывая в нем полный путь getScriptPath().

Наверняка придумано еще что то.
Здесь нет предмета для обсуждения на мой взгляд, пишем отталкиваясь от задачи.
 
При нажатии кнопки "Запустить" (скрипт) он именно выполняется интерпретатором Lua, предварительно переводится в байт-код. Весь полностью код.

Наверное не все помнят, но привычная нам запись
Код
function MyFunc()
{
}


на самом деле синтаксический сахар. Фактически же это означает (и эквивалентно)
MyFunc = function ()
{
}

т.е. определяется глобальная переменная с именем MyFunc, которой присваивается значение с типом "функция". (Да вы сами посмотрите через type())
А чтобы переменной присвоить значение - скрипт надо выполнить.
 
Уважаемые форумчане вот инструкция от разработчика.

Использование 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(). При завершении работы
 
VPM, На заборе тоже много чего написано. Особенно про событийную модель.  
 
Цитата
VPM написал:
Уважаемые форумчане вот инструкция от разработчика.
И что? что вы хотели этим сообщением сказать?
 
Прикольно, буря в стакане.
Казалось бы все просто.
Сам вопрос темы не корректный
спросили " в чем преимущество OnInit" , но забыли указать с чем сравнивать.
Написал три возможных варианта
Касалось бы все ясно.
Если ты чайник в программировании, то делай как рекомендуют разработчики КВИК и спи спокойно.
Нет, начинается треп а зачем, а мне насрать, а че это за такие преимущества и бла-бла бла.
 
nikolz, Да с чем угодно. НЕТ у этого говна никаких преимуществ. Нет, И БЫТЬ НЕ МОЖЕТ. Это идеологический кретинизм. Я знаю, что Вы чайник в программировании, но даже Вам не следует тупо делать как рекомендуют разработчики КВИК - они, мягко говоря, не боги. Тем более, что они как раз меньше всех заинтересованы в качестве софта.
 
Уважаемый swerg, ветка называется преимущество OnInit.

Не понимая смысл разработки говорить не о чем. Вот я и вытащил варианты от разработчика.

Где тут вообще преимущества?
От отталкиваемся от собственной разработки принимая один из вариантов.
В чем дискуссия?

Луа  на писан таблицами. Читаем другого разработчика.
Цитата
swerg написал:
А чтобы переменной присвоить значение - скрипт надо выполнить
А это вообще глубочайше заключение, которое нужно вывести в отдельную тему и обсудить.

Только это и хотел сказать.
 
Цитата
Владимир написал:
появился гениальный язык С, любовь на всю жизнь
Что же вы на ненавистном вам луа пишите? Можно же в одну строчку загрузить библиотеку, написанную на С. И все остальное делать уже там. Регистрировать колбеки - lua_register. Дергать функции quik через lua_pcall. И никакого тормозного интерпретатора.
 
paluke, У меня никогда не было ни секунды сомнения, что писать нужно только на чистом Луа, и в начале своего появления здесь я раз сто подробно описывал - почему. НИКАКИХ библиотек! Только так можно почти не обращать внимания ни на версию Квика, ни на версию языка. И за всё время я помню только один случай правки кода по этой причине, когда местные умельцы заменили loadstring на load. Для столь примитивной задачи как торговля гениальный язык С тупо не нужен - достаточно даже такого дерьма как Луа. Написал и забыл. И не надо ничего грузить, ничего регистрировать, ничего компилировать, ничего дёргать. А тормозной интерпретатор позволяет спокойно обслуживать сотни и даже тысячи тикеров - выше крыши для любого трейдера. Да, у меня стоит ограничение не более двух заявок в секунду, но тут уж никакой гениальный язык не поможет.
 
Цитата
Владимир написал:
Единственный коллбек, который использую я - OnTrade, некоторые работают даже без него.
  Вы до сих пор используете OnTrade? Зачем реагировать на полуфабрикаты (колбеки), когда можно использовать текущее состояние QUiK (таблица по сделкам)?  Вы же не занимаетесь FTP (зачем? и точно бессмысленное занятие этим в quik)? Чем проще, тем надежнее.
 
Владимир, Простите что вмешиваюсь в столь полезный диспут.

Но не могу не сказать, что в постановке задачи на мой взгляд есть ошибка. Вот здесь.
Цитата
Владимир написал:
А тормозной интерпретатор позволяет спокойно обслуживать сотни и даже тысячи тикеров - выше крыши для любого трейдера.
Ни Каму не нужны сотни молчу про тысячи тикеров в механической торговой программе (МТС), тем более брокеру!

Для отбора тикеров их фильтрации используют другие программы,
а в МТС тикеры  гонят уже зная чем торговать, как торговать, за с чет кого торговать!

Маркет  (ММ), где то специалист, ММВБ автоматически сводит заявки.
Для поддержания десятка тикеров требуются огромные средства когда их не хватает MM запрашивает помощь у других.

Через квик торговать FTP и жаловаться на быстродействие мягко говоря бессмысленно,
по одно только причине MM РАЗРЕШЕНО делать задержки. Высокочастотники сидят в подвалах биржи.

Но а для других стратегий 1млсек за глаза!
 
Цитата
VPM написал:
Через квик торговать FTP и жаловаться на быстродействие мягко говоря бессмысленно,
Дааа... Дискуссия приобретает все более неожиданные повороты.
FTP - это протокол передачи данных.
то, что ви иметь ввиду называется - HFT.
 
Kalmar, Да спасибо за поправку.
 
TGB, Да, я до сих пор используете OnTrade, намерен и дальше его использовать - это и проще, и быстрее, и надёжнее. Зачем бегать по таблице сделок, если есть прерывание? А если этих сделок сотни или тысячи за сеанс? Мой скрипт экономит своё время...

VPM, Почему это "никому не нужны сотни и тысячи тикеров"? У меня на долларовом рынке только в портфеле было с полсотни тикеров, а у моего друга и за сотню переваливало. И сделок у меня бывало под тысячу даже в боевом режиме. А уж тикеров, за которыми скрипт следил и вообще было тысячи полторы-две. При этом HFT меня никогда не интересовал - не для Квика эта технология, и вообще дурацкая.
 
Владимир,

Нет гонять следить можно, Здесь ключевое стабильно зарабатывать.

Те ребята с которыми мы имеем дело на рынке, свои сделки готовят, читают рынок на раз два, инсайд, закрытые каналы и т.д.
Там где серьёзные средства, существуют   отдельные отделы, следящие за RM, отдельно трейдер, аналитический отдел, в общем структура.  

Нет укусить откусить конечно можно и Ваш подход наверняка имеет место быть об это толь ко Вы можете судить.

Я же говорю о стабильности.

Ну к примеру была у меня сетка нашел алгоритм сам слепил торговал брент на минутках.
Набирала до открытия ам. рынка "мама негорюй" Просыпались капиталисты все отберали еще и мои просили.

Скажите Сетку нельзя торговать очень широко применяется с широким спредом и более серьезными средствами.  
 
VPM, Да не смешите Вы мою задницу. Время от времени даже солиднейшие компании с целой армией аналитиков высочайшей квалификации терпят миллиардные убытки. а инсайд вообще никакого отношения к торговле не имеет - это, по сути, жульничество. Другое дело, что с деньгами намного легче зарабатывать, чем без них. А стабильность - это минимизация рисков. И, соответственно, снижение вероятности заработать много и быстро. Сеточные алгоритмы как раз и относятся к высокорисковым.
 
Владимир,
Цитата
Владимир написал:
Время от времени даже солиднейшие компании с целой армией аналитиков высочайшей квалификации терпят миллиардные убытки
Недавний пример с "Colden Sachs" с ее хедж фондом или современные банкротства инцест банков.
И что Одни капиталисты обули других. Или Ваш супер скрипт поучаствовал.
"Зин а деньги где"?

Цитата
Владимир написал:
Другое дело, что с деньгами намного легче зарабатывать, чем без них. А стабильность - это минимизация рисков
Согласен целиком и полностью.
Цитата
Владимир написал:
снижение вероятности заработать много и быстро
Вероятность Выигрыша в начале нужно перетянуть на свою сторону - минимизация рисков один из подходов.
А Вы мне помнится отрицаете обработку старых данных.
Цитата
Владимир написал:
Сеточные алгоритмы как раз и относятся к высокорисковым.
Не знаю насчет, риска опыт мал, только в планах докрутить хорош больно во флате.
Но есть подозрение что Маркет Мейкер активно пользует или ребята обеспечивающие ликвидность.
 
VPM, Я вообще без понятия, в чём там мой скрипт участвует: денег дал - и пусть выкручивается как знает. Когда писал, стремился как раз максимально снизить риски, так что особых звёзд он с неба не хватает, но работает очень надёжно, и я давно перестал следить, чем он там занимается - всё равно он торгует лучше меня.

Я и сейчас отрицаю обработку старых данных. Разве что режим работы по историческим данным использовал для черновой отладки скрипта.

Естественно, любой, кто может, всегда с радостью откусит кусочек у соседа. А фьючерсы и вообще игра с нулевой суммой. Для меня в своё время было полной неожиданностью, что техника торговли на срочном рынке радикально отличается от фондового, и я тогда довольно прилично просел, пока отлаживал торговые алгоритмы.
 
Цитата
Владимир написал:
Зачем бегать по таблице сделок, если есть прерывание?
   Не надо бегать по таблице сделок. Достаточно сохранять ее размер и только если он изменился, читать только новые записи.
 
TGB, Какая разница, по старым или по новым? По ней нужно бегать, чего-то там сохранять, чего-то там искать. И как часто? У меня, например, блокируется подача подача новой заявки по тикеру, если предыдущая не реализована или не снята. А если у меня эта заявка будет реализована в сотню сделок? В том-то и прелесть OnTrade, что НИЧЕГО не нужно делать, ни за чем не нужно следить, пока тебя не пнут под зад прерыванием.
 
Цитата
Владимир написал:
пока тебя не пнут под зад прерыванием
  Зачем вам прерывания? Вы же программу пишите не для управления системой зажигания автомобиля :smile: ?
Цитата
Владимир написал:
И как часто?
  Наверное, один раз в три секунды скорее всего будет достаточно.
 
TGB, Затем, что сделки приходят в случайные моменты времени, алгоритмически они и есть прерывания. Точно так же, как и реакция на нажатия клавиш или клики мышкой. И мой скрипт обрабатывает и то, и другое именно как прерывания. И программу я пишу не для управления системой зажигания автомобиля, а для ещё более простой задачи торговли через Квик. И не моё собачье дело, когда придёт сделка по моей заявке: через секунду или через час. И не скрипта дело - когда придёт, тогда и обработает.
 
Цитата
Владимир написал:
Затем, что сделки приходят в случайные моменты времени, алгоритмически они и есть прерывания.
 Если я правильно понимаю, вам в скрипте надо знать состояние вашего счета по сделкам. Зачем вам обрабатывать колбеки сделок в случайные моменты времени (дополнительный "геморрой"), когда вы можете посмотреть (только) изменения в таблице сделок (конечный результат), и это можно сделать просто и эффективно. Если между просмотрами таблицы сделок, возникнет несколько новых, то вы их все равно увидите. Задержка 2-3 секунды (из-за цикла просмотра таблицы) в получении состояния по сделкам вряд ли, для вас существенна, так как QUIK точно не HFT терминал.
Страницы: 1 2 След.
Читают тему
Наверх