Может кто уже мучился с лучшим BID, OFFER?!

Страницы: 1 2 След.
RSS
Может кто уже мучился с лучшим BID, 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
В 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( ) не вернёт изменение позиции по фьючу.
Или как-то ещё?
 
https://forum.quik.ru/forum10/topic1600/
 
ой, ошибся.
пост не адресу
 
Цитата
Николай Бехтерев написал:
Цитата
Фёдор Сухов   написал:
Поясните точнее, что имеете в виду, когда пишите: "как реализовать выставление лучшим пока не взяли нашу?"
Если я правильно понял, то просто прибавьте или отнимите 1 руб. в заявке перед выставлением лимитника.
Ну, выставиться лучшей -- это уже ясно как, учитывая наши с вами конструкции: просто прибавить шаг цены и sendTransaction. Но рынок может не взять лучшую, а двинуться дальше (если, например, инструмент с дальней экспирацией и там очень разряженный стакан с большим количеством желающих стоять первым в очереди). Т.е. должен быть цикл пока коллбэк ОnFuturesClientHolding( ) не вернёт изменение позиции по фьючу.
Или как-то ещё?

Здравствуйте,
К сожалению из описания все еще не до конца понятно что именно требуется реализовать.
Вот Вы ставите заявку по лучшим ценам +- шаг цены и...?
Опишите что именно требуется
 
Цитата
Sergey Gorokhov написал:
Цитата
Николай Бехтерев   написал:
Цитата
Фёдор Сухов   написал:
Поясните точнее, что имеете в виду, когда пишите: "как реализовать выставление лучшим пока не взяли нашу?"
Если я правильно понял, то просто прибавьте или отнимите 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
 
и проверка на totalnet  вам по сути не нужна.
 
Николай, действительно, у Вас маловато опыта.
Эти игры с переставлением заявок-лимитников и погоней за лучшим местом в стакане убыточны.
А главное, с помощь маркет-мейкера Вам всегда будет предоставлена "возможность" купить на пике и продать на максимуме.
Это модель и правила не рабочие, тут необходимы дополнительные условия-фильтры, анализирующие не только стаканные игры, но кое-чего ещё.
Но кто ж Вам всё это бесплатно будет описывать.
Трудитесь сами, попробуйте и у Вас будет результат.
Я уверен в этом.
 
Цитата
Sergey Gorokhov написал:
и проверка на totalnet  вам по сути не нужна.
почему? Потому что мы должны на все 100% удостовериться, что сняли заявку и это мы опять в OnTrade смотрим?
 
Цитата
в 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
 
Цитата
Sergey Gorokhov написал:
Цитата
Николай Бехтерев   написал:
И такой вопрос, допустим выставление лучшей заявки мы засовываем в коллбек OnOrder, в OnTrade мы получаем информацию о том взята заявка или нет, как исключить момент исполнения двух заявок? Без sleep() и ожидания ответа о том, что заявка снята - тут никак не обойтись, я правильно понимаю?
можно и без speep
Например запоминать номер выставленной заявки и перед выставлением новой, проверять исполнилась старая или нет через функцию getOrderByNumber
но ведь всё равно будет какая-то разница во времени между sendTransaction для снятия заявки и коллбеком OnOrder?

Вот вы говорите номер... Ну запомили мы номер первой выставленной нашей заявки, далее, когда в стакане появляется цена лучше нашей, мы проверяем по номеру не снята ли заявка (а может быть и взята рынком), если снята, выставляем новую, а если нет?  Если заявка стоит и её надо снять, мы тут же в OnQuote кидаем sendTransaction и? Время же тикает пока заявка будет снята и мы увидим это по флагам. Что в это длящееся время будет происходить в OnQuote?
 
Цитата
Николай Бехтерев написал:
Цитата
Sergey Gorokhov   написал:
Цитата
Николай Бехтерев   написал:
И такой вопрос, допустим выставление лучшей заявки мы засовываем в коллбек 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 (пока заявка активна) do sendTransaction(убить заявку)
Это не подвесит Quik? Сервер брокера не возмутиться?
 
Цитата
Николай Бехтерев написал:
sleep( ) прерывается КоллБеками?
Если у вас многоядерный комп, то 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(
Но в примерах везде другая конструкция.
Можно как-то прояснить мне ситуацию с тем, как это работает, чтобы лучше понимать как использовать?
 
Здравствуйте,
OnFuturesClientHolding(fut_pos)
message(type(fut_pos))
end
 
Всё, туплю уже, мы же специально их расписываем, чтобы можно было внутри коллбека сделать побольше нужного нам.
 
Цитата
Sergey Gorokhov написал:
Здравствуйте,
OnFuturesClientHolding(fut_pos)
message(type(fut_pos))
end
т.е. пустой блок функции не пойдёт? Никак нельзя так:
Код
function OnFuturesClientHolding(fut_pos)

end
 
Цитата
Николай Бехтерев написал:
т.е. пустой блок функции не пойдёт? Никак нельзя так:Кодfunction OnFuturesClientHolding(fut_pos)

end

Можно, только смысл какой?
Можете хоть так написать
function OnFuturesClientHolding()
message("сработал OnFuturesClientHolding")
end
 
Цитата
Sergey Gorokhov написал:
Цитата
Николай Бехтерев   написал:
т.е. пустой блок функции не пойдёт? Никак нельзя так:Код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'ом щупать.
Флаги описаны в хелпе, глава "Описание битовых флагов"
 
Цитата
Sergey Gorokhov написал:

В Вашем примере Вы ничего не делаете с "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




Цитата
Николай Бехтерев написал:
И что же меняется?
Добавьте логирование параметров, будет видно.

Цитата
Николай Бехтерев написал:
Ясно, что описаны, просто я не совсем понимаю, что делают другие битовые функции, вот и спросил, есть ли способ за одну битовую функцию на этими битами узнать всё и сразу. Ясно, будем тыкать.
Рекомендуем почитать в интернете статьи на тему "Битовые операции".
Без этой теории трудно будет разобраться, зато когда разберетесь флаги покажутся легким делом.
 
Да, у меня явно нет ясного понимания КоллБек функций. И к сожалению пока не попалось ни одной подробно разъясняющей статьи.
 
Цитата
Николай Бехтерев написал:
Да, у меня явно нет ясного понимания КоллБек функций. И к сожалению пока не попалось ни одной подробно разъясняющей статьи.

Принцип работы с колбеками в Lua ничем не отличается от аналогичного функционала в других языках.
 
Цитата
Николай Бехтерев написал:
Да, у меня явно нет ясного понимания КоллБек функций. И к сожалению пока не попалось ни одной подробно разъясняющей статьи.
Попробую объяснить.
Про колбек.
Колбеком называется функция, которая вызывается из вне Вашей программы(скрипта)
Такую функцию обычно определяют для обработки каких-либо асинхронных событий, время прихода которых нам заранее неизвестно.
В QLUA колбеки - это функции с зарезервированными именами, которые будут вызваны при возникновения определенного в документации события.
--------------------------------------
про main
Эта  функция,  которая вызывается  при запуске скрипта и используется для его(скрипта) зависания в режиме активности.
Такой способ активации скрипта - это изобретение автора QLUA.
Решение вполне работающее, но не очевидное для пользователей и не самое лучшее.
но как говорят, дареному коню в ... не смотрят.
Поэтому что состряпали, то и кушаем.
-------------------------
Так вот, колбеки и функция main никаким образом не связаны между собой.
Если Вам надо, чтобы в main обрабатывалось то,
что будет получено в колбеке,
то Вы должны это передать в майн
и осуществить синхронизацию работы колбеков и майн.
При этом, надо еще и синхронизировать обращение к общей памяти в колбеках и майн, так как это разные потоки.
Т е Вы должны решать
1) синхронизацию потоков
2) синхронизацию обновления информации
--------------------------
Т е декларация разработчиков о том,  что QLUA сделано для дилетантов в программировании - это такой шутка
---------------------
Примерно так
 
Цитата
--------------------------
Т е декларация разработчиков о том,  что QLUA сделано для дилетантов в программировании - это такой шутка
---------------------
Примерно так
мда...
меня тут только одно интересует. Если я не буду ничего делать с табличкой в коллбеке, но она будет у меня с глобальной видимостью, она будет обновляться, её составляющие можно будет использовать в других коллбеках и в майне? Или мне нужно будет её обязательно скопировать внутри коллбека, чтобы данные остались внутри скрипта?
 
Добрый день.
Николай немного сгустил краски.
достаточно сохранить ссылку на полученную в колбеке таблицу. Примерно так:
Код
gTrade = {}
function OnTrade(t)
 gTrade = t
end
function main()
--в gTrade будет последняя сделка из OnTrade
end
 
Если я не правильно Вас понял, то опишите задачу подробнее.
Страницы: 1 2 След.
Читают тему
Наверх