function OnQuote(class, sec)
if class == "SPBFUT" and sec == "SiM6" then
stock = getQuoteLevel2(class, sec)
OFFER_PRICE = stock.offer[1].price
BID_PRICE = stock.bid[20].price
end
end
В offer_price и bid_price имеем цены для лучшего предложения и спроса соответственно. А вот как реализовать выставление лучшим пока не взяли нашу? Вообще имеет смысл реализовывать такое на луа, не слишком ли это медленно для Луа+Квик?
Маленькая коррекция из моего опыта: Объясню почему столько условий: 1. Бывает моменты когда заявки резко снимаются и стакан пустеет на мгновения; 2. Перед клирингом или после него стакан может иметь другое количество заявок по биду и оферу. 3. Ноль прибавляю, чтобы уже точно быть уверенным, что будет число, может я не прав, но это работает без сбоев.
Поясните точнее, что имеете в виду, когда пишите: "как реализовать выставление лучшим пока не взяли нашу?" Если я правильно понял, то просто прибавьте или отнимите 1 руб. в заявке перед выставлением лимитника.
Код
function OnQuote(class, sec)
if class==sClassCode and sec==sSecCode then
local qt=getQuoteLevel2(class, sec)
if qt.bid_count+0~=nil and qt.bid_count+0>0 then
if qt.bid[qt.bid_count+0].price+0~=nil and qt.bid[qt.bid_count+0].price+0>0 then
priceBid=qt.bid[qt.bid_count+0].price
if priceBid~=priceBid_prev then
priceBid_prev=priceBid
end
end
end
if qt.offer_count+0~=nil and qt.offer_count+0>0 then
if qt.offer[1].price+0~=nil and qt.offer[1].price+0>0 then
priceAsk=qt.offer[1].price
if priceAsk~=priceAsk_prev then
priceAsk_prev=priceAsk
end
end
end
end
end
Фёдор Сухов написал: Поясните точнее, что имеете в виду, когда пишите: "как реализовать выставление лучшим пока не взяли нашу?" Если я правильно понял, то просто прибавьте или отнимите 1 руб. в заявке перед выставлением лимитника.
Ну, выставиться лучшей -- это уже ясно как, учитывая наши с вами конструкции: просто прибавить шаг цены и sendTransaction. Но рынок может не взять лучшую, а двинуться дальше (если, например, инструмент с дальней экспирацией и там очень разряженный стакан с большим количеством желающих стоять первым в очереди). Т.е. должен быть цикл пока коллбэк ОnFuturesClientHolding( ) не вернёт изменение позиции по фьючу. Или как-то ещё?
Фёдор Сухов написал: Поясните точнее, что имеете в виду, когда пишите: "как реализовать выставление лучшим пока не взяли нашу?" Если я правильно понял, то просто прибавьте или отнимите 1 руб. в заявке перед выставлением лимитника.
Ну, выставиться лучшей -- это уже ясно как, учитывая наши с вами конструкции: просто прибавить шаг цены и sendTransaction. Но рынок может не взять лучшую, а двинуться дальше (если, например, инструмент с дальней экспирацией и там очень разряженный стакан с большим количеством желающих стоять первым в очереди). Т.е. должен быть цикл пока коллбэк ОnFuturesClientHolding( ) не вернёт изменение позиции по фьючу. Или как-то ещё?
Здравствуйте, К сожалению из описания все еще не до конца понятно что именно требуется реализовать. Вот Вы ставите заявку по лучшим ценам +- шаг цены и...? Опишите что именно требуется
Фёдор Сухов написал: Поясните точнее, что имеете в виду, когда пишите: "как реализовать выставление лучшим пока не взяли нашу?" Если я правильно понял, то просто прибавьте или отнимите 1 руб. в заявке перед выставлением лимитника.
Ну, выставиться лучшей -- это уже ясно как, учитывая наши с вами конструкции: просто прибавить шаг цены и sendTransaction. Но рынок может не взять лучшую, а двинуться дальше (если, например, инструмент с дальней экспирацией и там очень разряженный стакан с большим количеством желающих стоять первым в очереди). Т.е. должен быть цикл пока коллбэк ОnFuturesClientHolding( ) не вернёт изменение позиции по фьючу. Или как-то ещё?
Здравствуйте, К сожалению из описания все еще не до конца понятно что именно требуется реализовать. Вот Вы ставите заявку по лучшим ценам +- шаг цены и...? Опишите что именно требуется
Хорошо, перефразирую, хотя я уже примерно понимаю конструкцию, но любопытно сравнить свои "карты" с чужими. Полезно иногда бывает ;) Задача: Стоять лучшим OFFER пока заявку не возьмут по рынку, если заявка перестала быть лучшей - снова встать лучшей. Я вижу это примерно так:
Код
function OnQuote(class, sec)
if class == "SPBFUT" and sec == "SiM6" then
stock = getQuoteLevel2(class, sec)
OFFER_PRICE = stock.offer[1].price
BID_PRICE = stock.bid[20].price
end
end
function OnFuturesClientHolding(fut_pos)
if fut_pos.sec_code == "SiM6" then
totalnet = fut_pos.totalnet
end
end
function OnOrder(order)
if order.code == "SiM6" then
--здесь проверка на биты снята ли заявка или нет, пока не очень понимаю как это сделать.
-- вот я пока не сложил в голове общую схему, какие коллбеки и как использовать
end
end
function main()
while is_run == 1 do
while totalnet >= 0 do
if (OFFER_PRICE < LAST_OFFER_PRICE) then
--sendTransactio("ТУТ УБИВАЕМ ПРЕДЫДУЩУЮ ЗАЯВКУ")
-- while не выясним убили мы заявку или нет, не выставляем новую.
--sendTransaction
LAST_OFFER_PRICE = OFFER_PRICE
end
sleep (???)
end
end
end
Примерная конструкция, я её по сути тут, на форуме накропал, так что пробовать её нет смысла, кучу ошибок допустил наверняка.
Sergey Gorokhov написал: К сожалению из описания все еще не до конца понятно что именно требуется реализовать. Вот Вы ставите заявку по лучшим ценам +- шаг цены и...? Опишите что именно требуется
Про выставление с двух сторон пока рано, там посложнее для меня. Для начала простой пример решу.
В коде действительно много ошибок, но суть понятна В колбеке на стакан Вы обновляете текущую цену. в main проверяете, если она меньше предыдущей то снимаете старую заявку и ставите новую. Однако, лучше убрать проверку из main и перенести ее целиком в OnQuote, только без sleep
Николай, действительно, у Вас маловато опыта. Эти игры с переставлением заявок-лимитников и погоней за лучшим местом в стакане убыточны. А главное, с помощь маркет-мейкера Вам всегда будет предоставлена "возможность" купить на пике и продать на максимуме. Это модель и правила не рабочие, тут необходимы дополнительные условия-фильтры, анализирующие не только стаканные игры, но кое-чего ещё. Но кто ж Вам всё это бесплатно будет описывать. Трудитесь сами, попробуйте и у Вас будет результат. Я уверен в этом.
в main проверяете, если она меньше предыдущей то снимаете старую заявку и ставите новую. Однако, лучше убрать проверку из main и перенести ее целиком в OnQuote, только без sleep
Не понимаю почему проверку в OnQuote если всё равно происходит выставление заявки в main? Т.е. допустим мы в OnQuote будем иметь два ценовых уровня OFFER и LAST_OFFER допустим мы сравнили и выяснили, что наша заявка не лучшая, тогда нам всё равно эту перемену как-то нужно передать в main и получится уже два if-then, а значит большая вычислительная мощность, разве нет?
в main проверяете, если она меньше предыдущей то снимаете старую заявку и ставите новую. Однако, лучше убрать проверку из main и перенести ее целиком в OnQuote, только без sleep
Не понимаю почему проверку в OnQuote если всё равно происходит выставление заявки в main? Т.е. допустим мы в OnQuote будем иметь два ценовых уровня OFFER и LAST_OFFER допустим мы сравнили и выяснили, что наша заявка не лучшая, тогда нам всё равно эту перемену как-то нужно передать в main и получится уже два if-then, а значит большая вычислительная мощность, разве нет?
1) колбек исполняется в основном потоке квик . Поэтому его завершение ждут другие колбеки и основной поток. Если действий мало, то можно все делать в колбеке. Когда алгоритм большой и у Вас есть несколько ядер , то исполнение основных вычислений в майн теоретически даст ускорение вычислений процентов на 10-20. почему теоретически ? потому что переключение потоков имеет накладные расходы и для оптимального переключения надо управлять ос. 2) При играх в лучшую заявку надо учитывать следующее. На ликвидных бумагах спреда может не буть и ваша заявка будет бить в противоположную лучшую, т е Вы будете двигать рынок. Это обычный прием маркет-майкеров заставить двигать рынок чужими деньгами. Забиваю спред , а подобные Вашему алгоритмы начинают съедать встречные заявки.
Sergey Gorokhov написал: и проверка на totalnet вам по сути не нужна.
почему? Потому что мы должны на все 100% удостовериться, что сняли заявку и это мы опять в OnTrade смотрим?
OnTrade - это НЕ заявки, это сделки. Если Вам нужно смотреть снятие заявки, это OnOrder
Цитата
Николай Бехтерев написал: Цитатав main проверяете, если она меньше предыдущей то снимаете старую заявку и ставите новую. Однако, лучше убрать проверку из main и перенести ее целиком в OnQuote, только без sleepНе понимаю почему проверку в OnQuote если всё равно происходит выставление заявки в main? Т.е. допустим мы в OnQuote будем иметь два ценовых уровня OFFER и LAST_OFFER допустим мы сравнили и выяснили, что наша заявка не лучшая, тогда нам всё равно эту перемену как-то нужно передать в main и получится уже два if-then, а значит большая вычислительная мощность, разве нет?
Зачем в main передавать переменную и там ставить заявку когда все можно сделать в OnQuote? Сейчас у Вас как раз код написан не оптимально. Раз есть sleep то значит проверка произойдет с задержкой, а оно Вам не надо Я Вам предлагаю наиболее оптимальный вариант без всяких циклов и sleep. Прислушаться к совету или нет дело Ваше.
Зачем в main передавать переменную и там ставить заявку когда все можно сделать в OnQuote? Сейчас у Вас как раз код написан не оптимально. Раз есть sleep то значит проверка произойдет с задержкой, а оно Вам не надо Я Вам предлагаю наиболее оптимальный вариант без всяких циклов и sleep. Прислушаться к совету или нет дело Ваше.
Ооо, теперь понимаю. Т.е. по идее вообще никакого main'a может и не быть, вся логика может быть реализована в коллбеках?! Но, я всегда думал, что main нужен в принципе, оттуда скрипт исполняться начинает, а если всё засунем в коллбеки, main можно совсем убрать? Или что туда засунуть то? print("Hello world")?)))) Наличие main обязательно для скрипта?
Николай, Никто не говорил что main надо убрать. речь о том чтобы перенести проверку и выставление заявки в колбек OnQuote Без main скрипт отработает один раз и остановится.
2) При играх в лучшую заявку надо учитывать следующее. На ликвидных бумагах спреда может не буть и ваша заявка будет бить в противоположную лучшую, т е Вы будете двигать рынок. Это обычный прием маркет-майкеров заставить двигать рынок чужими деньгами. Забиваю спред , а подобные Вашему алгоритмы начинают съедать встречные заявки.
Собственно, у меня сейчас простейшая торговая система и если прошла сделка по сигнальному уровню мне было бы логичнее выставляться лучшей и пусть даже лупить по рынку, в любом случае для системы это будет оптимально.
Sergey Gorokhov написал: Николай, Никто не говорил что main надо убрать. речь о том чтобы перенести проверку и выставление заявки в колбек OnQuote Без main скрипт отработает один раз и остановится.
какой минимальный набор в main, я чувствую что у меня всё по коллбекам сейчас раскидается. что же оставить в main?
А ещё у меня ощущение, что без sleep( ) скрипт, даже если засунуть по коллбекам всё, работать не будет. Я прав? Получается в main засовывается sleep всё равно?
Николай Бехтерев написал: какой минимальный набор в main, я чувствую что у меня всё по коллбекам сейчас раскидается. что же оставить в main?
Достаточно в main оставить цикл вида while is_run == 1 do sleep (1000) end
Цитата
Николай Бехтерев написал: А ещё у меня ощущение, что без sleep( ) скрипт, даже если засунуть по коллбекам всё, работать не будет. Я прав? Получается в main засовывается sleep всё равно?
Во первых никто не говорил что надо "все" перетаскивать. Как уже было не раз сказано, перенести надо только проверку и только результат этой проверки (выставление заявки)
Во вторых, рекомендация дана исходя из того кода который Вы привели,, если у Вас код другой рекомендация тоже может быть другой. В общем случае, если есть циклы их желательно держать в main В частном случае (то что Вы написали выше) в цикле (который "while totalnet >= 0 do") нет необходимости и только по этому была дана рекомендация от него избавиться.
function OnQuote(class, sec)
if class == "SPBFUT" and sec == "SiM6" then
stock = getQuoteLevel2(class, sec)
OFFER_PRICE = stock.offer[1].price
if (OFFER_PRICE < LAST_OFFER_PRICE) then
--sendTransactio("ТУТ УБИВАЕМ ПРЕДЫДУЩУЮ ЗАЯВКУ")
-- while не выясним убили мы заявку или нет, не выставляем новую.
--sendTransaction
end
LAST_OFFER_PRICE = OFFER_PRICE
end
end
function main()
while is_run == 1 do
sleep(1000)
end
end
И такой вопрос, допустим выставление лучшей заявки мы засовываем в коллбек OnOrder, в OnTrade мы получаем информацию о том взята заявка или нет, как исключить момент исполнения двух заявок? Без sleep() и ожидания ответа о том, что заявка снята - тут никак не обойтись, я правильно понимаю?
Николай Бехтерев написал: И такой вопрос, допустим выставление лучшей заявки мы засовываем в коллбек OnOrder, в OnTrade мы получаем информацию о том взята заявка или нет, как исключить момент исполнения двух заявок? Без sleep() и ожидания ответа о том, что заявка снята - тут никак не обойтись, я правильно понимаю?
можно и без speep Например запоминать номер выставленной заявки и перед выставлением новой, проверять исполнилась старая или нет через функцию getOrderByNumber
Николай Бехтерев написал: И такой вопрос, допустим выставление лучшей заявки мы засовываем в коллбек OnOrder, в OnTrade мы получаем информацию о том взята заявка или нет, как исключить момент исполнения двух заявок? Без sleep() и ожидания ответа о том, что заявка снята - тут никак не обойтись, я правильно понимаю?
можно и без speep Например запоминать номер выставленной заявки и перед выставлением новой, проверять исполнилась старая или нет через функцию getOrderByNumber
но ведь всё равно будет какая-то разница во времени между sendTransaction для снятия заявки и коллбеком OnOrder?
Вот вы говорите номер... Ну запомили мы номер первой выставленной нашей заявки, далее, когда в стакане появляется цена лучше нашей, мы проверяем по номеру не снята ли заявка (а может быть и взята рынком), если снята, выставляем новую, а если нет? Если заявка стоит и её надо снять, мы тут же в OnQuote кидаем sendTransaction и? Время же тикает пока заявка будет снята и мы увидим это по флагам. Что в это длящееся время будет происходить в OnQuote?
Николай Бехтерев написал: И такой вопрос, допустим выставление лучшей заявки мы засовываем в коллбек OnOrder, в OnTrade мы получаем информацию о том взята заявка или нет, как исключить момент исполнения двух заявок? Без sleep() и ожидания ответа о том, что заявка снята - тут никак не обойтись, я правильно понимаю?
можно и без speep Например запоминать номер выставленной заявки и перед выставлением новой, проверять исполнилась старая или нет через функцию getOrderByNumber
но ведь всё равно будет какая-то разница во времени между sendTransaction для снятия заявки и коллбеком OnOrder?
Вот вы говорите номер... Ну запомили мы номер первой выставленной нашей заявки, далее, когда в стакане появляется цена лучше нашей, мы проверяем по номеру не снята ли заявка (а может быть и взята рынком), если снята, выставляем новую, а если нет? Если заявка стоит и её надо снять, мы тут же в OnQuote кидаем sendTransaction и? Время же тикает пока заявка будет снята и мы увидим это по флагам. Что в это длящееся время будет происходить в OnQuote?
Небольшая лекбес 1) робот - это конечный автомат. т е устройство, которое имеет набор состояний и по событиям переходит из одного в другое. ------------------------------ 2) первоначально надо определить перечень этих состояний Например , хотим играть по очереди заявок состояния: 1.свободно - нет заявок 2. есть заявка - купить.продать 4. есть лучшая цена 5. есть сделка ... 3) потом определяем, в какие состояния переходит робот из каждого состояния
4) потом определяем какие события создают эти переходы
5) и после того, как нам стало понятна логика работы нашего робота, мы переводим эту логику на язык программирования, например луа. ------------------------------------ Это подобно написанию художественного произведения например на японском языке. ---------------------- Придумываем сюжет, героев, пишем на том языке, на котором умеем думать (т е на русском) . Когда все написали и получился хороший рассказ(роман, повесть, сказка), после этого берете словарь японского и переводите на японский (луа) ------------------------------------------------------------ Не в обиду будет сказано, но Ваш пост свидетельствует о том, что Вы пытаетесь, еще не придуманный свой роман писать сразу на японском, без словаря, спрашивая на форуме, как написать на японском ...то или иное слово и зачем это слово надо писать. ------------------ Примерно так.
Николай Камынин написал Не в обиду будет сказано, но Ваш пост свидетельствует о том, что Вы пытаетесь, еще не придуманный свой роман писать сразу на японском, без словаря, спрашивая на форуме, как написать на японском ...то или иное слово и зачем это слово надо писать. ------------------ Примерно так.
Да ладно вам, я же спрашиваю конкретный вопрос про функционал КоллБеков, под конкретную задачу: Выставляем лучшую заявку и обновляем её, пока нашу заявку не сожрут.
Я уже узнал, что всё можно закидать в КоллБеки мне это очень понравилось, этого не было в help'e и я наивно полагал, что коллбеки нужно использовать лишь для получения данных. Я уже смотрю на скрипт qlua другими глазами. Осталось уточнить как работают КоллБеки.
То что робот это состояния, это понятно любому, кто попыхтел над самым маленьким скриптом или программой :)) Но всё равно спасибо за напоминание. Всегда приятно удостовериться, что ты на правильном пути.
Вот я и спрашиваю, после появления состояния "Оффер обновился": -- Нам нужно опять выставиться лучшей заявкой, но для этого нужно снять старую заявку, что мы тут же и делаем при помощи sendTransaction ( ) в КоллБеке OnQuote( ), где мы и узнали про новый "Оффер". У меня появился закономерный вопрос: ставить sleep ( ) ? или довериться новым включениям КоллБеков и новой проверки состояния старой заявки? Что логичнее, или точнее что быстрее сработает?! По сути это вопрос технический, я узнаю как устроен qLua, разве нет?
1. sleep в колбэке с большой долей вероятности приводит к зависанию скрипта и QUIK в целом. Поэтому, использовать sleep в колбэках опасно. 2. Даже если бы это было не так, вы не получите следующий колбэк, пока не закончите обрабатывать текущий. А чтобы получить новое состояние заявки - снята - терминал должен получить колбэк OnOrder с этим состоянием. Поэтому, после подачи транзакции на снятие заявки вам ничего не остаётся, как ждать следующего OnOrder с новыми флагами.
Надо делать так, как надо. А как не надо - делать не надо.
Старатель написал: 1. sleep в колбэке с большой долей вероятности приводит к зависанию скрипта и QUIK в целом. Поэтому, использовать sleep в колбэках опасно. 2. Даже если бы это было не так, вы не получите следующий колбэк, пока не закончите обрабатывать текущий. А чтобы получить новое состояние заявки - снята - терминал должен получить колбэк OnOrder с этим состоянием. Поэтому, после подачи транзакции на снятие заявки вам ничего не остаётся, как ждать следующего OnOrder с новыми флагами.
Понятно, никаких sleep( ) кинули sendTransaction и вышли из коллБека, попали в main, где скорее всего sleep( )... вот тут у меня опять вопрос, sleep( ) прерывается КоллБеками? Просто то, что без слипов никак (иначе скрипт не оставить) я уже понял опытным путём. Выше, на мой вопрос, что оставлять в main() если у меня всё может раскидываться по КоллБекам мне порекомендовали цикл со sleep( ), встаёт вопрос о размере переменной для этого sleep( ), если он прерывается коллБеками, то хорошо, можно хоть минуту туда зафигачить, а если нет, то никаких преимуществ в том, чтобы раскидывать всё по КоллБекам я уже и не вижу тогда... Ведь если sleep( ) не прерывается, то он один фиг имеет место быть и робот в этот момент не занят делом и какая тогда разница в КоллБеках у меня логика или из КоллБеков попадает в майн, по-моему никакой.
А что будет если замутить в коллБеке OnQuote( ) цикл while (пока заявка активна) dosendTransaction(убить заявку) Это не подвесит Quik? Сервер брокера не возмутиться?
Если у вас многоядерный комп, то main и колбэки будут работать параллельно.
Цитата
Николай Бехтерев написал: А что будет если замутить в коллБеке OnQuote( ) цикл while (пока заявка активна) do sendTransaction(убить заявку)
Тут надо включить мозг и подумать над написанным раннее:
Цитата
Старатель написал: вы не получите следующий колбэк, пока не закончите обрабатывать текущий. А чтобы получить новое состояние заявки - снята - терминал должен получить колбэк OnOrder с этим состоянием.
Все колбэки приходят последовательно.
Надо делать так, как надо. А как не надо - делать не надо.
Николай Бехтерев написал: sleep( ) прерывается КоллБеками?
Если у вас многоядерный комп, то main и колбэки будут работать параллельно.
Цитата
Николай Бехтерев написал: А что будет если замутить в коллБеке OnQuote( ) цикл while (пока заявка активна) do sendTransaction(убить заявку)
Тут надо включить мозг и подумать над написанным раннее:
Цитата
Старатель написал: вы не получите следующий колбэк, пока не закончите обрабатывать текущий. А чтобы получить новое состояние заявки - снята - терминал должен получить колбэк OnOrder с этим состоянием.
Все колбэки приходят последовательно .
Спасибо! Теперь картинка начинает складываться! А есть возможность убедиться в том, что коллбеки и майн работают параллельно? Просто мало ли... :-Р
Попробую пояснить далее Вот примерный алгоритм Вашего робота: ---------------------------- СОСТОЯНИЯ ( S) 1) свободно 2) торгуем 3) ждем ------------------------- Onorder S==1 - если нет позы, то покупаем, иначе продаем. Выставляем заявку по лучшей цене , S=3 S==2 - цена в заявке хуже лучшей, снимаем заявку, S=3 ------------------------- OnOrder если заявка активна, то S=2, иначе S=1 ---------------------
пардон опечатка Попробую пояснить далее Вот примерный алгоритм Вашего робота: ---------------------------- СОСТОЯНИЯ ( S) 1) свободно 2) торгуем 3) ждем ------------------------- OnQuote S==1 - если нет позы, то покупаем, иначе продаем. Выставляем заявку по лучшей цене , S=3 S==2 - цена в заявке хуже лучшей, снимаем заявку, S=3 ------------------------- OnOrder если заявка активна, то S=2, иначе S=1 ---------------------
Николай Камынин написал: пардон опечатка Попробую пояснить далее Вот примерный алгоритм Вашего робота: ---------------------------- СОСТОЯНИЯ ( S) 1) свободно 2) торгуем 3) ждем ------------------------- OnQuote S==1 - если нет позы, то покупаем, иначе продаем. Выставляем заявку по лучшей цене , S=3 S==2 - цена в заявке хуже лучшей, снимаем заявку, S=3 ------------------------- OnOrder если заявка активна, то S=2, иначе S=1 ---------------------
Угу, я уже сам понял, что состояния робота фиксируются в глобальных переменных, которые логично менять внутри коллбеков.
Я подведу небольшой итог: 1. КоллБеки поступают последовательно, пока не будет обработан весь коллбек, пусть даже с очень длинным циклом внутри, другой коллбек не поступит в обработку. 2. Майн и КоллБеки работают в скрипте параллельно, при условии многоядерности машины.
Так, возник вопрос по форме реализации КоллБеков: Допустим есть функция OnFuturesClientHolding(TABLE fut_pos) из описания в хелпе, не совсем понятно, как она (они, коллбеки) работает. То ли мы передаём им табличку, ну т.е. точно передаём и они их заполняют и... нужно что-то ещё? Ведь я правильно понимаю, что fut_pos -- это результат работы коллбека и эта таблица более чем расписанная от и до, почему мы её передаём а не ставим слева от знака равно? Из моих опытов ясно, что табличку достаточно просто обозначить, типа:
Код
fut_pos = { }
какова будет минимально описанная рабочая функция OnFuturesClientHolding обновляющая табличку fut_pos? Мне казалось, что логичная такая конструкция:
Код
fut_pos = OnFuturesClientHolding(
Но в примерах везде другая конструкция. Можно как-то прояснить мне ситуацию с тем, как это работает, чтобы лучше понимать как использовать?
Николай Бехтерев написал: т.е. пустой блок функции не пойдёт? Никак нельзя так:Кодfunction OnFuturesClientHolding(fut_pos)
end
Можно, только смысл какой? Можете хоть так написать function OnFuturesClientHolding() message("сработал OnFuturesClientHolding") end
Хорошо, но если в описании функции КоллБека не передать табличку, то она не обновится, верно? Т.е. в моём примере выше, в отличие от вашего табличка с данными обновится, а в вашем нет, по сколько функции не передаётся таблица, верно?
И ещё пару вопросов, у меня вот такого вида код:
Код
function OnOrder(order)
PrintDbgStr(tostring(bit.band(order.flags,4)))
end
У меня выводит две строчки в DebugView как при выставлении, так и при снятии. Т.е. при выставлении заявки КоллБек срабатывает дважды, и дважды при снятии. Что это значит? Что-то меняется? Есть способ выяснить за одну функцию (хелп в этом деле скромный помощник, я чуть ли не методом тыка выведываю всё) сразу все флаги? А то как-то нелепо каждый бит bit.band'ом щупать.
Николай Бехтерев написал: Хорошо, но если в описании функции КоллБека не передать табличку, то она не обновится, верно? Т.е. в моём примере выше, в отличие от вашего табличка с данными обновится, а в вашем нет, по сколько функции не передаётся таблица, верно?
В Вашем примере Вы ничего не делаете с "fut_pos", а раз ничего не делаете какой к нем смысл. Зачем обновлять таблицу раз Вы с этими обновлениями все равно ничего не делаете. Поэтому в моем примере я убрал ее, тем самым показав что этот параметр не обязателен. Проще говоря, хотите работать с данными которые пришли в колбек, задайте параметр функции, если нет можете не задавать, на ваш вкус.
Николай Бехтерев написал: Есть способ выяснить за одну функцию (хелп в этом деле скромный помощник, я чуть ли не методом тыка выведываю всё) сразу все флаги? А то как-то нелепо каждый бит bit.band'ом щупать.
Флаги описаны в хелпе, глава "Описание битовых флагов"
В Вашем примере Вы ничего не делаете с "fut_pos", а раз ничего не делаете какой к нем смысл. Зачем обновлять таблицу раз Вы с этими обновлениями все равно ничего не делаете. Поэтому в моем примере я убрал ее, тем самым показав что этот параметр не обязателен. Проще говоря, хотите работать с данными которые пришли в колбек, задайте параметр функции, если нет можете не задавать, на ваш вкус.
А если мой пример, и функция main( ), в которой я что-то делаю с fut_pos? Да, в коллбеке пусто, но в майн табличка будет обновляться после коллбека?
Цитата
Да что-то меняется. Флаги описаны в хелпе, глава "Описание битовых флагов"
И что же меняется?
Ясно, что описаны, просто я не совсем понимаю, что делают другие битовые функции, вот и спросил, есть ли способ за одну битовую функцию на этими битами узнать всё и сразу. Ясно, будем тыкать.
Николай Бехтерев написал: А если мой пример, и функция main( ), в которой я что-то делаю с fut_pos? Да, в коллбеке пусто, но в майн табличка будет обновляться после коллбека?
Причем тут Main и колбек? Видимо происходит какое-то непонимание процесса.
В main ничего не будет обновляться пока Вы сами это не напишите. Хотите передавать таблицу в main напишите так:
Код
mytable={}
function OnFuturesClientHolding(fut_pos)
mytable=fut_pos
end
function main()
while true do
message(type(mytable)) --работаем с таблицей mytable
end
end
Николай Бехтерев написал: Ясно, что описаны, просто я не совсем понимаю, что делают другие битовые функции, вот и спросил, есть ли способ за одну битовую функцию на этими битами узнать всё и сразу. Ясно, будем тыкать.
Рекомендуем почитать в интернете статьи на тему "Битовые операции". Без этой теории трудно будет разобраться, зато когда разберетесь флаги покажутся легким делом.
Николай Бехтерев написал: Да, у меня явно нет ясного понимания КоллБек функций. И к сожалению пока не попалось ни одной подробно разъясняющей статьи.
Попробую объяснить. Про колбек. Колбеком называется функция, которая вызывается из вне Вашей программы(скрипта) Такую функцию обычно определяют для обработки каких-либо асинхронных событий, время прихода которых нам заранее неизвестно. В QLUA колбеки - это функции с зарезервированными именами, которые будут вызваны при возникновения определенного в документации события. -------------------------------------- про main Эта функция, которая вызывается при запуске скрипта и используется для его(скрипта) зависания в режиме активности. Такой способ активации скрипта - это изобретение автора QLUA. Решение вполне работающее, но не очевидное для пользователей и не самое лучшее. но как говорят, дареному коню в ... не смотрят. Поэтому что состряпали, то и кушаем. ------------------------- Так вот, колбеки и функция main никаким образом не связаны между собой. Если Вам надо, чтобы в main обрабатывалось то, что будет получено в колбеке, то Вы должны это передать в майн и осуществить синхронизацию работы колбеков и майн. При этом, надо еще и синхронизировать обращение к общей памяти в колбеках и майн, так как это разные потоки. Т е Вы должны решать 1) синхронизацию потоков 2) синхронизацию обновления информации -------------------------- Т е декларация разработчиков о том, что QLUA сделано для дилетантов в программировании - это такой шутка --------------------- Примерно так
-------------------------- Т е декларация разработчиков о том, что QLUA сделано для дилетантов в программировании - это такой шутка --------------------- Примерно так
мда... меня тут только одно интересует. Если я не буду ничего делать с табличкой в коллбеке, но она будет у меня с глобальной видимостью, она будет обновляться, её составляющие можно будет использовать в других коллбеках и в майне? Или мне нужно будет её обязательно скопировать внутри коллбека, чтобы данные остались внутри скрипта?