Nikolay написал: Только я писал о проблеме, если колбек пропущен по любой причине.
Да но заявка формируется еще до запуска основного потока main, то есть изначально существует у нее trans_id. если увидит свой trans_id то поступит с ней согласно SmartOrder:update(price, planned), Ну вообще нужно посмотреть этот момент? Спасибо.
Пользователь
Сообщений: Регистрация: 15.06.2023
01.08.2023 14:24:09
При переходе от одного инструмента к портфелю, встал вопрос как поступить с расчетом индикаторов:
Вариант 1) Оставить как есть, то есть расчеты вести в QUIK и получать результат. Вариант 2) Сбросить все алгоритмы в main и там их считать.
Стратегия реверсная по тренду, на стадии наладки Вариант1: за) визуализация, main просто отдыхает замедление минимальное ставим, нет проблем с синхронизацией данных. против) нужны графики на каждый инструмент, нагрузка на Терминал.
Пока так быстрее, да и хочется посмотреть как оно будет, такой подход практиковала команда Универ.
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 17:20:43
Цитата
VPM написал: Можно утверждать что такая запись надежна?
В приведенном Вами примере контролируется нулевой бит, а описание почему-то взято от первого. А это все-таки разные вещи: ордер активен и ордер снят. По моему, определять лучше сразу оба бита. Если bit.band(order.flags,3) или order.flags & 3 равно 3, то заявка снята, равно 2 - исполнена, 1 - активна.
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 25.09.2020
01.08.2023 17:30:53
Ziveleos, Не вижу смысла. У меня этот анализ проводится только в момент снятия заявки. Если заявка всё ещё активна - подаём команду KILL_ORDER. Если нет - какая разница, исполнена она или снята? В любом случае, ничего делать не надо.
Пользователь
Сообщений: Регистрация: 15.06.2023
01.08.2023 17:52:01
Цитата
Ziveleos написал: В приведенном Вами примере контролируется нулевой бит, а описание почему-то взято от первого.
Да действительно опять "накосячил", Спасибо.
То есть так правильно?
if (order.flags % 2) == 0 then --Заявка активна, иначе – не активна
Все равно не пойму как их различать?
Такая реализация в оригинале Фреймворка. Но даже так ее достаточно, если исполнена меняется позиция.
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 17:59:47
Владимир, это у Вас. Контролировать состояние заявки бывает нужно в разных целях.
VPM написал: order.flags - где нулевой где не нулевой не разберешь.
Руководство пользователя QLua > Описание битовых флагов. У каждого флага свой вес. Чтобы узнать состояние флагов, нужно в качестве второго операнда побитового И взять число, равное сумме весов интересующих флагов. Результат = сумме весов установленных флагов. Пример: Если order.flags & 5 == 4, заявка на продажу, не активна. ==1 - заявка на покупку, активна.
Старая шутка: "Нашел в телефоне кнопку Вкл.бл, значит, где-то должна быть Выкл.нах."
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 25.09.2020
01.08.2023 18:49:25
Ziveleos, Да, это у меня. Я вообще не вижу ни единой "разной цели", когда состояние заявки бывает нужно контролировать. ЗАЧЕМ? Только для того, чтобы снять, если активна.
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 18:59:15
Владимир, например, чтобы выставить/снять стоп-лосс, нужен еще и второй бит.
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 25.09.2020
01.08.2023 19:07:30
Ziveleos, Я не пользуюсь стопами, но, насколько я понимаю, стоп-лосс точно такая же заявка, как и любая другая, она точно так же может быть активна, снята, исполнена (полностью или частично) и имеет свои собственные биты состояния. Разве нет?
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 19:24:02
Владимир, разумеется. И выставляется она на лимитированную заявку, которая может быть как на покупку, так и на продажу. Поэтому нужен второй бит.
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 25.09.2020
01.08.2023 19:29:48
Ziveleos, У меня все заявки лимитированные. Ничего не понимаю! Ах, "на покупку и на продажу"? Так это же ВТОРОЙ бит, а я говорил про ПЕРВЫЙ.
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 19:37:07
Владимир, первый, в случае управления стопом тоже нужен. Если лимитированная снята, то стоп тоже нужно снять, если исполнена - то должен остаться.
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 25.09.2020
01.08.2023 19:47:08
Ziveleos, Нифигасе, технология! Сейчас посмотрел, что у меня творится: за сегодняшний день 28 заявок, 27 сделок, одна заявка активная, остальные исполненные, ни одной снятой, 16 покупок, 11 продаж, 12-я в уме. Зачем нужны стопы, если скрипт всё равно постоянно мониторит рынок? Если он пойдёт не туда, куда хочется, всегда можно поставить ту же лимитированную заявку - именно тогда и там, где нужно, а не предугадывая это место заранее.
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 19:55:53
Владимир, это на случай проблем с интернетом, электричеством, или на сервере брокера, как это было со сбером, чтобы заявка не осталась с неприкрытой задницей. Ну и для ручной торговли.
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 25.09.2020
01.08.2023 20:16:02
Ziveleos, Сейчас вероятность проблем со связью близка к нулю, а уж вероятность того, что именно в этот момент случится что-то страшное, да ещё если и диверсификация нормально поставлена... зато каждая сделка будет чуть точнее, чуть прибыльнее, и общий результат почти наверняка будет лучше. Меню для ручной торговли у меня в скрипте ещё сохранилось, но я уже где-то с год им не пользовался: скрипт торгует намного лучше меня. Последнее пёрышко, которое сломило спину верблюда было такое: у меня несколько месяцев сидел в портфеле один прилично просевший тикер, который мне изрядно надоел, а закрываться в убыток жаба душила. И вдруг он резко попёр вверх. Я обрадовался: наконец-то от него избавлюсь Скрипт тоже встрепенулся, начал им торговать. Я присмотрелся - а эта сволочь их ПОКУПАЕТ! И что же? Часа через три скрипт продал с хорошей прибылью и то, что было, и то, что он докупил. По-моему, с тех пор я и завязал с ручной торговлей.
Пользователь
Сообщений: Регистрация: 15.06.2023
01.08.2023 20:20:20
Цитата
Ziveleos написал: Старая шутка: "Нашел в телефоне кнопку Вкл.бл, значит, где-то должна быть Выкл.нах."
Нет шутки я понимаю, логику я тоже понимаю, даже понимаю для чего это сделали, только не понимаю как этим пользоваться?
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 20:45:45
VPM, в каком смысле пользоваться? Как выяснить состояние флагов, или как эту информацию использовать в торговле?
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 21:06:21
Цитата
Владимир написал: Сейчас вероятность проблем со связью близка к нулю
Это смотря в каком городе Вы живете...
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 15.06.2023
01.08.2023 21:14:39
Владимир, Вы не поняли. В основном пользуются двумя видами Стоп лосов;
1) На торговый день защита депозита от чрезмерной просадки, К примеру если депозит теряет 2-5%, то сделки по счету закрывают, активные заявки сбрасываются, торговля останавливается, выясняется причина такой просадки. Смысл сводится, Сколько просадок депозит выдержит что можно было восстановить счет.
2) На сделку. Здесь защищают конкретную сделку обычно привязываются к рынку (волатильности прикидывают risk/rewar или другим способом).
То что Вы описали это стоп на сделку, если бы у Вас стоял и сработал, Вы получаете ожидаемый убыток в моменте, но продолжаете крутить высвобожденную сумму, Нет упущенной выгоды! Пересиживать можно в акциях и то на свои.
Цитата
Владимир написал: а уж вероятность того, что именно в этот момент случится что-то страшное
То что сейчас все спокойно, еще не повод, да и новости никто не отменял.
Цитата
Владимир написал: Сейчас вероятность проблем со связью близка к нулю
От этого защищаются установкой на сторонней сервер.
, Вы можете делать еще так, возможно будет проще понимать что и зачем: ----------------- Например, есть 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, нафига их двигать, если можно сразу и пачкой:
Цитата
Ziveleos написал: У каждого флага свой вес. Чтобы узнать состояние флагов, нужно в качестве второго операнда побитового И взять число, равное сумме весов интересующих флагов. Результат = сумме весов установленных флагов.Пример:Если order.flags & 5 == 4, заявка на продажу, не активна. ==1 - заявка на покупку, активна.
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 25.09.2020
01.08.2023 21:37:10
VPM, Да всё я понял ещё тыщу лет назад, когда не только мой скрипт, но и я сам не торговал. Мой депозита прекрасно защищён от просадки без всяких стопов.
Да видел я, видел! И ковид видел, и войну, и панику перед банкротством, и как весь рынок за 10 минут падает на 20% и более. Никакие стопы тут не помогут, А поможет внимание и крепкие нервы. Как у моего скрипта.
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 21:37:32
Цитата
VPM написал: Как безошибочно выяснять состояние флагов
r = order.flags & Х, где Х - вес соответствующего флага. r - 1 или 0, в зависимости от того, установлен флаг, или нет.
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 21:44:53
Еше ватиант bit.test(order.flags,Х), где Х - номер флага. Возвращает true или false. Работает медленно, но зато даже на луа 5.1
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 15.06.2023
01.08.2023 21:50:03
Код
Кое что нашел:
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».
Всем спасибо, кое что понял!
Пользователь
Сообщений: Регистрация: 15.06.2023
01.08.2023 21:52:08
Цитата
Владимир написал: Никакие стопы тут не помогут, А поможет внимание и крепкие нервы. Как у моего скрипта
Ну это ВОООБЩЕ без спорно
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 22:04:40
Цитата
Ziveleos написал: r = order.flags & Х, где Х - вес соответствующего флага. r - 1 или 0, в зависимости от того, установлен флаг, или нет.
Наврал. r - вес флага или 0, в зависимости от того, установлен флаг, или нет.
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 15.06.2023
01.08.2023 22:13:37
Цитата
Ziveleos написал: По моему, определять лучше сразу оба бита.Если bit.band(order.flags,3) или order.flags & 3 равно 3, то заявка снята, равно 2 - исполнена, 1 - активна.
А можно эту запись в виде полного код lua.
Пользователь
Сообщений: Регистрация: 22.02.2023
01.08.2023 22:43:02
Можно.
Код
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
Кое что нашел:
true - флаг установлен
false - флаг не установлен
-- Функция проверяет установлен бит, или нет (возвращает true, или false)
-------
где:
х – значение;
n – номер бита. Нумерация битов начинается с « 0 ».
Всем спасибо, кое что понял!
На это невозможно смотреть. У вас есть руководство пользователя "Интерпретатор языка 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
Пользователь
Сообщений: Регистрация: 22.02.2023
02.08.2023 00:29:56
Опять я наврал. Нельзя два дела одновременно делать! Так правильно:
Код
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
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 22.02.2023
02.08.2023 00:59:38
Цитата
Игорь М написал: Вы здесь за один удар определяете и то, что у вас заявка активная и то, что она купля/продажа
Вот и я о том же:
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 14.10.2021
02.08.2023 03:24:14
Цитата
Владимир написал: , Я дважды предлагал совместно обсудить "технические" утилиты, вплоть до открытых кодов - один раз сам, другой вместе с Борисом. Больше не хочу. У моего скрипта техника вылизана, а остальные идут лесом.
А что их гонять? Да чтобы хернёй не маялись на публичных площадках. Впервые этот термин появился, наверное, в шахматах, причём по поводу "Пионера" Ботвинника, который вообще не сыграл ни одной партии.
В если дяди нет, то решения принимает АЛГОРИТМ.
Да было такое , но прогеры Арки на это забили и сообщество посетителей этого сайта на это забили .................. Вернее начали себя противовставлять этому посылу.................... а эти гении от Арки эту тему потом совсем забанили ....... уникальный случай от них но тема больше не активна и забанена.
Пользователь
Сообщений: Регистрация: 14.10.2021
02.08.2023 03:28:39
А мы же Володя с тобой в той теме питали благие намерения ....... не для себя лично а для всех посетителей этого сайта стремились пользу принести . ..........................итог известен - тему эту забанили не грамотные админы этого сайта ..... ну и хрен на них и этот сайт .
Пользователь
Сообщений: Регистрация: 25.09.2020
02.08.2023 08:28:11
БорисД, Сейчас уже и не такое. Мне сегодня Аваст и вообще доступ на этот сайт отрубил. Как известно, "ни одно доброе дечние не остаётся безнаказанным".
вот так можно проверять нужный бит (n), результат 1 или 0 - значение бита (n) n>=0
Код
local function (flag,n) return (flag>>n)&1; end
Пользователь
Сообщений: Регистрация: 15.06.2023
02.08.2023 09:11:45
Цитата
БорисД написал: Я дважды предлагал совместно обсудить "технические" утилиты, вплоть до открытых кодов - один раз сам, другой вместе с Борисом.
Вопрос на мой взгляд не в технических утилитах, их достаточно опубликовано (большая библиотека Универа, здесь публикуются, даются ссылки, да и свои накапливаются).
Ну к примеру если Вы не писатель, а конструктор и собираете свой еще трехколесный велосипед, то зачем знать побитовые операции? Хорошо здешние пользователи "разжёвывают" что за чем, за что им отдельное спасибо.
Все что нужно начинающему конструктору уметь делать "без ковыряния в носу":
buy = line1 > line2 sell = line1 < line2
На мой взгляд не хватает СОЛИДНОСТИ!
Пользователь
Сообщений: Регистрация: 15.06.2023
02.08.2023 09:12:39
Цитата
nikolz написал: local function (flag,n) return (flag>>n)&1; end
Спасибо
Пользователь
Сообщений: Регистрация: 25.09.2020
02.08.2023 09:44:47
VPM, Если Вы не знаете побитовые операции, то Вам просто нечего делать в программировании - это одна из самых популярнейших команд, уступающая разве что MOV и JMP разных видов. У Кернигана с Ричи (да и до них) просто ИДЕАЛЬНО описана вся эта кухня, а тут несколько страниц обсуждается несчастный AND. А мы с Борькой когда-то хотели обсудить и реализовать идеальный интерфейс для программиста, отлаженный в боевых условиях и нечувствительный ко всем существующим глюкам. Это вряд ли больше десятка функций, на отлладку которых и гробится 99% времени программистов и которым посвящены чуть ли не все здешние ветки