Очереди и двойные очереди в луа

Страницы: Пред. 1 ... 7 8 9 10 11 ... 26 След.
RSS
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
VPM написал:
Намой взгляд на оборот более надежно.
Да забыл для контроля дописал OnTrade из примера Владимир, так что не что не скроется от нас! А дальше жизнь покажет.

Основная сложность  как поднимать заявки при вылетах?
 
Nikolay,
Цитата
Nikolay написал:
Только я писал о проблеме, если колбек пропущен по любой причине.
Да но заявка формируется еще до запуска основного потока main, то есть изначально существует у нее trans_id.
если увидит свой trans_id то поступит с ней согласно SmartOrder:update(price, planned),
Ну вообще нужно посмотреть этот момент? Спасибо.
 
При переходе от одного инструмента к портфелю, встал вопрос как поступить с расчетом индикаторов:

Вариант 1) Оставить как есть, то есть расчеты вести в QUIK и получать результат.
Вариант 2) Сбросить все алгоритмы в main  и там их считать.

Стратегия реверсная по тренду, на стадии наладки Вариант1:
за)  визуализация, main просто отдыхает замедление минимальное ставим,  нет проблем с синхронизацией данных.
против) нужны графики на каждый инструмент, нагрузка на Терминал.

Пока так быстрее, да и хочется посмотреть как оно будет, такой подход практиковала команда Универ.
 
Цитата
VPM написал:
Можно утверждать что такая запись надежна?

В приведенном Вами примере контролируется нулевой бит, а описание почему-то взято от первого. А это все-таки разные вещи: ордер активен и ордер снят. По моему, определять лучше сразу оба бита.
Если bit.band(order.flags,3) или order.flags & 3 равно 3, то заявка снята, равно  2 - исполнена, 1 - активна.
 
Ziveleos, Не вижу смысла. У меня этот анализ проводится только в момент снятия заявки. Если заявка всё ещё активна - подаём команду KILL_ORDER. Если нет - какая разница, исполнена она или снята? В любом случае, ничего делать не надо.
 
Цитата
Ziveleos написал:
В приведенном Вами примере контролируется нулевой бит, а описание почему-то взято от первого.
Да действительно опять "накосячил", Спасибо.

То есть так правильно?

if (order.flags % 2) == 0 then --Заявка активна, иначе – не активна

Все равно не пойму как их различать?

Такая реализация в оригинале Фреймворка.
Но даже так  ее достаточно, если исполнена меняется позиция.
 
Владимир, это у Вас. Контролировать состояние заявки бывает нужно в разных целях.
 
Цитата
VPM написал:
нужны графики на каждый инструмент
Кто будет упражняться лучше делать через сохранение вкладки и внимательней прописывать индификаторы графика.
 
Цитата
VPM написал:
То есть так правильно?
Нет. Если order.flags делится на 2 без остатка, то число чётное, нулевой бит равен 0, а это значит, что заявка не активна.

Цитата
VPM написал:
Все равно не пойму как их различать?
Что различать? Не понял вопроса.
 
То есть так правильно?

if (order.flags % 2) == 0 then --Заявка не активна, иначе –  активна;
Цитата
Ziveleos написал:
Что различать? Не понял вопроса.
order.flags - где нулевой где не нулевой не разберешь.
 
if (order.flags % 2) == 0 then
     executor.order.active = false
   end
Действительно не по глазам. Спасибо.
 
Цитата
VPM написал:
То есть так правильно?
Да.
Цитата
VPM написал:
order.flags - где нулевой где не нулевой не разберешь.
Руководство пользователя QLua > Описание битовых флагов.
У каждого флага свой вес. Чтобы узнать состояние флагов, нужно в качестве второго операнда побитового И взять число, равное сумме весов интересующих флагов. Результат = сумме весов установленных флагов.
Пример:
Если order.flags & 5 == 4, заявка на продажу, не активна. ==1 - заявка на покупку, активна.

Старая шутка: "Нашел в телефоне кнопку Вкл.бл, значит, где-то должна быть Выкл.нах."
 
Ziveleos, Да, это у меня. Я вообще не вижу ни единой "разной цели", когда состояние заявки бывает нужно контролировать. ЗАЧЕМ? Только для того, чтобы снять, если активна.
 
Владимир, например, чтобы выставить/снять стоп-лосс, нужен еще и второй бит.
 
Ziveleos, Я не пользуюсь стопами, но, насколько я понимаю, стоп-лосс точно такая же заявка, как и любая другая, она точно так же может быть активна, снята, исполнена (полностью или частично) и имеет свои собственные биты состояния. Разве нет?
 
Владимир, разумеется. И выставляется она на лимитированную заявку, которая может быть как на покупку, так и на продажу. Поэтому нужен второй бит.
 
Ziveleos, У меня все заявки лимитированные. Ничего не понимаю! Ах, "на покупку и на продажу"? Так это же ВТОРОЙ бит, а я говорил про ПЕРВЫЙ.
 
Владимир, первый, в случае управления стопом тоже нужен. Если лимитированная снята, то стоп тоже нужно снять, если исполнена - то должен остаться.
 
Ziveleos, Нифигасе, технология!  :smile: Сейчас посмотрел, что у меня творится: за сегодняшний день 28 заявок, 27 сделок, одна заявка активная, остальные исполненные, ни одной снятой, 16 покупок, 11 продаж, 12-я в уме. Зачем нужны стопы, если скрипт всё равно постоянно мониторит рынок? Если он пойдёт не туда, куда хочется, всегда можно поставить ту же лимитированную заявку - именно тогда и там, где нужно, а не предугадывая это место заранее.
 
Владимир, это на случай проблем с интернетом, электричеством, или на сервере брокера, как это было со сбером, чтобы заявка не осталась с неприкрытой задницей. Ну и для ручной торговли.
 
Ziveleos, Сейчас вероятность проблем со связью близка к нулю, а уж вероятность того, что именно в этот момент случится что-то страшное, да ещё если и диверсификация нормально поставлена... зато каждая сделка будет чуть точнее, чуть прибыльнее, и общий результат почти наверняка будет лучше. Меню для ручной торговли у меня в скрипте ещё сохранилось, но я уже где-то с год им не пользовался: скрипт торгует намного лучше меня. Последнее пёрышко, которое сломило спину верблюда было такое: у меня несколько месяцев сидел в портфеле один прилично просевший тикер, который мне изрядно надоел, а закрываться в убыток жаба душила. И вдруг он резко попёр вверх. Я обрадовался: наконец-то от него избавлюсь  Скрипт тоже встрепенулся, начал им торговать. Я присмотрелся - а эта сволочь их ПОКУПАЕТ! И что же? Часа через три скрипт продал с хорошей прибылью и то, что было, и то, что он докупил. По-моему, с тех пор я и завязал с ручной торговлей. :smile:  
 
Цитата
Ziveleos написал:
Старая шутка: "Нашел в телефоне кнопку Вкл.бл, значит, где-то должна быть Выкл.нах."
Нет шутки я понимаю, логику я тоже понимаю, даже понимаю для чего это сделали, только не понимаю как этим пользоваться?
 
VPM, в каком смысле пользоваться? Как выяснить состояние флагов, или как эту информацию использовать в торговле?
 
Цитата
Владимир написал:
Сейчас вероятность проблем со связью близка к нулю
Это смотря в каком городе Вы живете...
 
Владимир,  Вы не поняли. В основном пользуются двумя видами Стоп лосов;

1) На торговый день защита депозита от чрезмерной просадки,
К примеру если депозит теряет 2-5%,
то сделки по счету закрывают, активные заявки сбрасываются, торговля останавливается, выясняется причина такой просадки.
Смысл сводится, Сколько просадок депозит выдержит что можно было восстановить счет.

2) На сделку. Здесь защищают конкретную сделку обычно привязываются к рынку (волатильности прикидывают risk/rewar или другим способом).

То что Вы описали это стоп на сделку, если бы у Вас стоял и сработал, Вы получаете ожидаемый убыток в моменте, но продолжаете крутить высвобожденную сумму,
Нет упущенной выгоды!
Пересиживать можно в акциях и то на свои.
Цитата
Владимир написал:
а уж вероятность того, что именно в этот момент случится что-то страшное
То что сейчас все спокойно, еще не повод, да и новости никто не отменял.
Цитата
Владимир написал:
Сейчас вероятность проблем со связью близка к нулю
От этого защищаются установкой на сторонней сервер.
 
Цитата
Ziveleos написал:
Как выяснить состояние флагов
Как безошибочно выяснять состояние флагов
 
Ziveleos,
Вы можете делать еще так, возможно будет проще понимать что и зачем:
-----------------
Например,  есть flag
-----------------
1) надо выделить бит 0
x=flag & 1  -- x равен значению бита
-----------------
2) надо выделить бит 1
z=flag>>1;  x=z & 1  -- x равен значению бита
-----------------
3) надо выделить бит 2
z=flag>>2;  x=z & 1  -- x равен значению бита
--------------------
4) надо выделить бит 3
z=flag>>3;  x=z & 1  -- x равен значению бита
------------------------
5) надо выделить бит 4
z=flag>>4;  x=z & 1  -- x равен значению бита
 
nikolz, Вы мне объясняете?!
 
nikolz, нафига их двигать, если можно сразу и пачкой:
Цитата
Ziveleos написал:
У каждого флага свой вес. Чтобы узнать состояние флагов, нужно в качестве второго операнда побитового И взять число, равное сумме весов интересующих флагов. Результат = сумме весов установленных флагов.Пример:Если order.flags & 5 == 4, заявка на продажу, не активна. ==1 - заявка на покупку, активна.
 
VPM, Да всё я понял ещё тыщу лет назад, когда не только мой скрипт, но и я сам не торговал. Мой депозита прекрасно защищён от просадки без всяких стопов.

Да видел я, видел! И ковид видел, и войну, и панику перед банкротством, и как весь рынок за 10 минут падает на 20% и более. Никакие стопы тут не помогут, А поможет внимание и крепкие нервы. Как у моего скрипта.  :smile:  
 
Цитата
VPM написал:
Как безошибочно выяснять состояние флагов
r = order.flags & Х, где Х - вес соответствующего флага. r - 1 или 0, в зависимости от того, установлен флаг, или нет.
 
Еше ватиант bit.test(order.flags,Х), где Х - номер флага. Возвращает true или false.
Работает медленно, но зато даже на луа 5.1
 
Код
Кое что нашел:

true - флаг установлен
false - флаг не установлен
-- Функция проверяет установлен бит, или нет (возвращает true, или false)
CheckBit = function(flags, _bit)
   -- Проверяет, что переданные аргументы являются числами
   if type(flags) ~= "number" then error("Ошибка!!! Checkbit: 1-й аргумент не число!") end
   if type(_bit) ~= "number" then error("Ошибка!!! Checkbit: 2-й аргумент не число!") end
 
   if _bit == 0 then _bit = 0x1
   elseif _bit == 1 then _bit = 0x2
   elseif _bit == 2 then _bit = 0x4
   elseif _bit == 3 then _bit  = 0x8
   elseif _bit == 4 then _bit = 0x10
   elseif _bit == 5 then _bit = 0x20
   elseif _bit == 6 then _bit = 0x40
   elseif _bit == 7 then _bit  = 0x80
   elseif _bit == 8 then _bit = 0x100
   elseif _bit == 9 then _bit = 0x200
   elseif _bit == 10 then _bit = 0x400
   elseif _bit == 11 then _bit = 0x800
   elseif _bit == 12 then _bit  = 0x1000
   elseif _bit == 13 then _bit = 0x2000
   elseif _bit == 14 then _bit  = 0x4000
   elseif _bit == 15 then _bit  = 0x8000
   elseif _bit == 16 then _bit = 0x10000
   elseif _bit == 17 then _bit = 0x20000
   elseif _bit == 18 then _bit = 0x40000
   elseif _bit == 19 then _bit = 0x80000
   elseif _bit == 20 then _bit = 0x100000
   end
 
   if bit.band(flags,_bit ) == _bit then return true
   else return false end
end
function OnOrder(order)
   --бит 0 (0x1)     Заявка активна, иначе – не активна  
   --бит 1 (0x2)     Заявка снята. Если флаг не установлен и значение бита «0» равно «0», то заявка исполнена  
   --бит 2 (0x4)     Заявка на продажу, иначе – на покупку. Данный флаг для сделок и сделок для исполнения определяет направление сделки (BUY/SELL)  
   --бит 3 (0x8)     Заявка лимитированная, иначе – рыночная  
   --бит 4 (0x10)    Разрешить / запретить сделки по разным ценам  
   --бит 5 (0x20)    Исполнить заявку немедленно или снять (FILL OR KILL)  
   --бит 6 (0x40)    Заявка маркет-мейкера. Для адресных заявок – заявка отправлена контрагенту  
   --бит 7 (0x80)    Для адресных заявок – заявка получена от контрагента  
   --бит 8 (0x100)   Снять остаток  
   --бит 9 (0x200)   Айсберг-заявка  
 
   -- Проверка бита 2
   if CheckBit(order.flags, 2) then 
      message("Заявка на продажу"); 
   else 
      message("Заявка на покупку"); 
   end;
end;
https://quikluacsharp.ru/qlua-osnovy/funktsiya-dlya-raboty-s-bitovymi-flagami-v-qlua-lua/

Сейчас в QLua появилась встроенная функция bit.test, которая решает ту же задачу, 
т.е. смысла в использовании функции CheckBit больше нет!

Открываю справку
bit.test
Функция проверяет состояние указанного бита в значении. 
Возвращает 
true, если бит равен «1», и 
false, если бит равен «0». 

BOOLEAN bit.test(NUMBER х, NUMBER n)

где: 
х – значение; 
n – номер бита. Нумерация битов начинается с «0».

Всем спасибо, кое что понял!
 
Цитата
Владимир написал:
Никакие стопы тут не помогут, А поможет внимание и крепкие нервы. Как у моего скрипта
Ну это ВОООБЩЕ без спорно :smile:  :smile:  :smile:  
 
Цитата
Ziveleos написал:
r = order.flags & Х, где Х - вес соответствующего флага. r - 1 или 0, в зависимости от того, установлен флаг, или нет.
Наврал. r - вес флага или 0, в зависимости от того, установлен флаг, или нет.
 
Цитата
Ziveleos написал:
По моему, определять лучше сразу оба бита.Если bit.band(order.flags,3) или order.flags & 3 равно 3, то заявка снята, равно  2 - исполнена, 1 - активна.
А можно эту запись в виде полного код lua.
 
Можно.

Код
x = order.flags & 3 -- для версии lua ниже 5.3:  bit.band(order.flags,3)
if x == 3 then
    message("Заявка снята")
  elseif x == 2 then
    message("Заявка исполнена")
  elseif x == 1 then
    message("Заявка активна")
end


 
Ziveleos,  Спасибо.
 
Цитата
VPM написал:
Код
  Кое что нашел:

 true   -  флаг установлен
 false   -  флаг не установлен
 -- Функция проверяет установлен бит, или нет (возвращает true, или false) 

-------

где: 
х – значение; 
n – номер бита. Нумерация битов начинается с « 0 ».
  

Всем спасибо, кое что понял!
На это невозможно смотреть.  :smile:    У вас есть руководство пользователя "Интерпретатор языка Lua" ? Там в п. 6 описаны все функции для работы с битовыми масками. Зачем вам эта гроздь elseif-ов или test? test для теста. Пример:
Код
       local order = getItem("orders", i)                             -- получение таблицы данных из i-ой строки ТЗ

       if order and order.flags & 5 == act_direction and order.sec_code == SEC_CODE then       -- если есть активная заявка рабочего инструмента заданного направления
Вы здесь за один удар определяете и то, что у вас заявка активная и то, что она купля/продажа (5: 00000101). Если act_direction = 1, то это активная на покупку, если act_direction = 5, то это активная на продажу. Сразу, не выясняя по отдельности биты флагов.
Еще пример:  
Код
       if order.flags & 1 == 1 then                                    -- соответствующая заявка активна (исполнена частично)

              -- бла бла

         elseif order.flags & 2 == 0 then                              -- соответствующая заявка исполнена полностью

           if order.qty > trades_qty_order[order.order_num] then         -- количество контрактов в заявке больше суммарного количества контрактов всех сделок, соответствующих этой заявке
              -- бла бла
             else                                                            -- заявка полностью исполнена (все соответствующие данной заявке сделки появились в ТС и были обработаны)
              -- бла бла
           end

         else                                                          -- соответствующая заявка исполнена частично и снята

           if order.qty - order.balance > trades_qty_order[order.order_num] then   -- исполненная часть заявки больше суммарного кол-ва контрактов всех сделок, соответствующих этой заявке
              -- бла бла
             else                                                            -- все сделки, которые соответствуют исполненной части заявки, появились в ТС и были обработаны
              -- бла бла
           end

       end
 
Опять я наврал. Нельзя два дела одновременно делать!
Так правильно:

Код
   x = order.flags & 3 -- для версии lua ниже 5.3 ->  bit.band(order.flags,3)
  if x == 2 then
      message("Заявка снята")
    elseif x == 1 then
      message("Заявка активна")
    elseif x == 0 then
      message("Заявка исполнена")
  end
end
 
Цитата
Игорь М написал:
Вы здесь за один удар определяете и то, что у вас заявка активная и то, что она купля/продажа

Вот и я о том же: https://forum.quik.ru/messages/forum10/message71098/topic8137/#message71098
 
Цитата
Владимир написал:
VPM, Я дважды предлагал совместно обсудить "технические" утилиты, вплоть до открытых кодов - один раз сам, другой вместе с Борисом. Больше не хочу. У моего скрипта техника вылизана, а остальные идут лесом.

А что их гонять? Да чтобы хернёй не маялись на публичных площадках. Впервые этот термин появился, наверное, в шахматах, причём по поводу "Пионера" Ботвинника, который вообще не сыграл ни одной партии.

В если дяди нет, то решения принимает АЛГОРИТМ.
Да  было такое , но прогеры Арки на это забили и сообщество посетителей этого сайта на это забили ..................    Вернее начали себя противовставлять этому посылу.................... а эти гении от Арки эту тему  потом совсем забанили ....... уникальный случай от них но тема больше не активна и забанена.  
 
А мы же Володя с тобой в той теме питали благие намерения ....... не для себя лично а для всех посетителей этого сайта стремились  пользу  принести .                             ..........................итог  известен - тему эту забанили не грамотные админы этого сайта ..... ну и хрен на них и этот сайт .  
 
БорисД, Сейчас уже и не такое. Мне сегодня Аваст и вообще доступ на этот сайт отрубил. Как известно, "ни одно доброе дечние не остаётся безнаказанным". :smile:  
 
Игорь М, Пример шик, спасибо.

Версию поднял не давно, и раньше с побитовыми операциями не дружил, а теперь то

3.4.2-Побитовые операторы

Lua поддерживает следующие битовые операторы:

  • & : побитовое И
  • | : побитовое ИЛИ
  • ~ : побитовое исключающее ИЛИ
  • >> : сдвиг вправо
  • << : сдвиг влево
  • ~ : унарное побитовое НЕ
Цитата
Игорь М написал:
На это невозможно смотреть.
Нет этот пример я притащил не для работы, в нем четко прослеживается логика, что откуда (откуда ноги растут), раскрывает логику.
Цитата
VPM написал:
Сейчас в QLua появилась встроенная функция bit.test, которая решает ту же задачу,
 
Цитата
Ziveleos написал:
nikolz, Вы мне объясняете?!
пардон, ошибся, не Вам.
 
вот так можно проверять нужный бит (n), результат 1 или 0 - значение бита (n)  n>=0
Код
local function (flag,n)  return (flag>>n)&1;  end
 
Цитата
БорисД написал:
Я дважды предлагал совместно обсудить "технические" утилиты, вплоть до открытых кодов - один раз сам, другой вместе с Борисом.
Вопрос на мой взгляд  не в технических  утилитах, их достаточно опубликовано (большая библиотека Универа, здесь публикуются, даются ссылки, да и свои накапливаются).

Ну к примеру если Вы не писатель, а конструктор и собираете свой еще трехколесный велосипед,
то зачем знать побитовые операции? Хорошо здешние пользователи "разжёвывают" что за чем,  за что им отдельное спасибо.

Все что нужно начинающему конструктору уметь делать "без ковыряния в носу":

buy = line1 > line2
sell =  line1 < line2

На мой взгляд не хватает СОЛИДНОСТИ!
 
Цитата
nikolz написал:
local function (flag,n)  return (flag>>n)&1;  end
Спасибо
 
VPM,  Если Вы не знаете побитовые операции, то Вам просто нечего делать в программировании - это одна из самых популярнейших команд, уступающая разве что MOV и JMP разных видов. У Кернигана с Ричи (да и до них) просто ИДЕАЛЬНО описана вся эта кухня, а тут несколько страниц обсуждается несчастный AND. А мы с Борькой когда-то хотели обсудить и реализовать идеальный интерфейс для программиста, отлаженный в боевых условиях и нечувствительный ко всем существующим глюкам. Это вряд ли больше десятка функций, на отлладку которых и гробится 99% времени программистов и которым посвящены чуть ли не все здешние ветки
Страницы: Пред. 1 ... 7 8 9 10 11 ... 26 След.
Читают тему
Наверх