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. Если нет - какая разница, исполнена она или снята? В любом случае, ничего делать не надо.
VPM написал: order.flags - где нулевой где не нулевой не разберешь.
Руководство пользователя QLua > Описание битовых флагов. У каждого флага свой вес. Чтобы узнать состояние флагов, нужно в качестве второго операнда побитового И взять число, равное сумме весов интересующих флагов. Результат = сумме весов установленных флагов. Пример: Если order.flags & 5 == 4, заявка на продажу, не активна. ==1 - заявка на покупку, активна.
Старая шутка: "Нашел в телефоне кнопку Вкл.бл, значит, где-то должна быть Выкл.нах."
Ziveleos, Да, это у меня. Я вообще не вижу ни единой "разной цели", когда состояние заявки бывает нужно контролировать. ЗАЧЕМ? Только для того, чтобы снять, если активна.
Ziveleos, Я не пользуюсь стопами, но, насколько я понимаю, стоп-лосс точно такая же заявка, как и любая другая, она точно так же может быть активна, снята, исполнена (полностью или частично) и имеет свои собственные биты состояния. Разве нет?
Ziveleos, Нифигасе, технология! Сейчас посмотрел, что у меня творится: за сегодняшний день 28 заявок, 27 сделок, одна заявка активная, остальные исполненные, ни одной снятой, 16 покупок, 11 продаж, 12-я в уме. Зачем нужны стопы, если скрипт всё равно постоянно мониторит рынок? Если он пойдёт не туда, куда хочется, всегда можно поставить ту же лимитированную заявку - именно тогда и там, где нужно, а не предугадывая это место заранее.
Владимир, это на случай проблем с интернетом, электричеством, или на сервере брокера, как это было со сбером, чтобы заявка не осталась с неприкрытой задницей. Ну и для ручной торговли.
Ziveleos, Сейчас вероятность проблем со связью близка к нулю, а уж вероятность того, что именно в этот момент случится что-то страшное, да ещё если и диверсификация нормально поставлена... зато каждая сделка будет чуть точнее, чуть прибыльнее, и общий результат почти наверняка будет лучше. Меню для ручной торговли у меня в скрипте ещё сохранилось, но я уже где-то с год им не пользовался: скрипт торгует намного лучше меня. Последнее пёрышко, которое сломило спину верблюда было такое: у меня несколько месяцев сидел в портфеле один прилично просевший тикер, который мне изрядно надоел, а закрываться в убыток жаба душила. И вдруг он резко попёр вверх. Я обрадовался: наконец-то от него избавлюсь Скрипт тоже встрепенулся, начал им торговать. Я присмотрелся - а эта сволочь их ПОКУПАЕТ! И что же? Часа через три скрипт продал с хорошей прибылью и то, что было, и то, что он докупил. По-моему, с тех пор я и завязал с ручной торговлей.
Владимир, Вы не поняли. В основном пользуются двумя видами Стоп лосов;
1) На торговый день защита депозита от чрезмерной просадки, К примеру если депозит теряет 2-5%, то сделки по счету закрывают, активные заявки сбрасываются, торговля останавливается, выясняется причина такой просадки. Смысл сводится, Сколько просадок депозит выдержит что можно было восстановить счет.
2) На сделку. Здесь защищают конкретную сделку обычно привязываются к рынку (волатильности прикидывают risk/rewar или другим способом).
То что Вы описали это стоп на сделку, если бы у Вас стоял и сработал, Вы получаете ожидаемый убыток в моменте, но продолжаете крутить высвобожденную сумму, Нет упущенной выгоды! Пересиживать можно в акциях и то на свои.
Цитата
Владимир написал: а уж вероятность того, что именно в этот момент случится что-то страшное
То что сейчас все спокойно, еще не повод, да и новости никто не отменял.
Цитата
Владимир написал: Сейчас вероятность проблем со связью близка к нулю
От этого защищаются установкой на сторонней сервер.
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, нафига их двигать, если можно сразу и пачкой:
Цитата
Ziveleos написал: У каждого флага свой вес. Чтобы узнать состояние флагов, нужно в качестве второго операнда побитового И взять число, равное сумме весов интересующих флагов. Результат = сумме весов установленных флагов.Пример:Если order.flags & 5 == 4, заявка на продажу, не активна. ==1 - заявка на покупку, активна.
VPM, Да всё я понял ещё тыщу лет назад, когда не только мой скрипт, но и я сам не торговал. Мой депозита прекрасно защищён от просадки без всяких стопов.
Да видел я, видел! И ковид видел, и войну, и панику перед банкротством, и как весь рынок за 10 минут падает на 20% и более. Никакие стопы тут не помогут, А поможет внимание и крепкие нервы. Как у моего скрипта.
Кое что нашел:
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».
Ziveleos написал: По моему, определять лучше сразу оба бита.Если bit.band(order.flags,3) или order.flags & 3 равно 3, то заявка снята, равно 2 - исполнена, 1 - активна.
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
Опять я наврал. Нельзя два дела одновременно делать! Так правильно:
Код
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
Владимир написал: VPM, Я дважды предлагал совместно обсудить "технические" утилиты, вплоть до открытых кодов - один раз сам, другой вместе с Борисом. Больше не хочу. У моего скрипта техника вылизана, а остальные идут лесом.
А что их гонять? Да чтобы хернёй не маялись на публичных площадках. Впервые этот термин появился, наверное, в шахматах, причём по поводу "Пионера" Ботвинника, который вообще не сыграл ни одной партии.
В если дяди нет, то решения принимает АЛГОРИТМ.
Да было такое , но прогеры Арки на это забили и сообщество посетителей этого сайта на это забили .................. Вернее начали себя противовставлять этому посылу.................... а эти гении от Арки эту тему потом совсем забанили ....... уникальный случай от них но тема больше не активна и забанена.
А мы же Володя с тобой в той теме питали благие намерения ....... не для себя лично а для всех посетителей этого сайта стремились пользу принести . ..........................итог известен - тему эту забанили не грамотные админы этого сайта ..... ну и хрен на них и этот сайт .
БорисД, Сейчас уже и не такое. Мне сегодня Аваст и вообще доступ на этот сайт отрубил. Как известно, "ни одно доброе дечние не остаётся безнаказанным".
БорисД написал: Я дважды предлагал совместно обсудить "технические" утилиты, вплоть до открытых кодов - один раз сам, другой вместе с Борисом.
Вопрос на мой взгляд не в технических утилитах, их достаточно опубликовано (большая библиотека Универа, здесь публикуются, даются ссылки, да и свои накапливаются).
Ну к примеру если Вы не писатель, а конструктор и собираете свой еще трехколесный велосипед, то зачем знать побитовые операции? Хорошо здешние пользователи "разжёвывают" что за чем, за что им отдельное спасибо.
Все что нужно начинающему конструктору уметь делать "без ковыряния в носу":
VPM, Если Вы не знаете побитовые операции, то Вам просто нечего делать в программировании - это одна из самых популярнейших команд, уступающая разве что MOV и JMP разных видов. У Кернигана с Ричи (да и до них) просто ИДЕАЛЬНО описана вся эта кухня, а тут несколько страниц обсуждается несчастный AND. А мы с Борькой когда-то хотели обсудить и реализовать идеальный интерфейс для программиста, отлаженный в боевых условиях и нечувствительный ко всем существующим глюкам. Это вряд ли больше десятка функций, на отлладку которых и гробится 99% времени программистов и которым посвящены чуть ли не все здешние ветки