-- ©2020 by Evgeny Shibaev, а пользуются ВСЕ !!! -- Таблица, отображающая суммарный объем бидов и асков в стакане, их разницу (DELTA),frfytв процентах рост(падение) инструмента финансового рынка за определенное количество дней -- Какие инструменты(тикеры) отслеживаем. Таблица пар тикер - площадка tickers = {["SiZ0"] = "SPBFUT", ["RIZ0"] = "SPBFUT", ["BRZ0"] = "SPBFUT", ["GAZP"] = "TQBR", ["SBER"] = "TQBR", ["YNDX"] = "TQBR"} -- GZZ0 = "SPBFUT", SRZ0 = "SPBFUT", GMKN = "TQBR", MGNT = "TQBR", SU26207RMFS9 = "TQOB" sources = {} -- Список источников данных по количеству тикеров rows = {} -- Список строк в таблице по количеству тикеров screener = AllocTable() -- Указатель на таблицу stopped = false -- Остановка скрипта local max = math.max -- локальная ссылка на math.max local min = math.min -- локальная ссылка на math.min TICKER_COLUMN = 0 PRICE_SPREAD_COLUMN = 1 VW_BID_PRICE_COLUMN = 2 VW_BID_PRICE_SPREAD = 3 VW_DELTA_COLUMN = 4 VW_ASK_PRICE_SPREAD = 5 VW_ASK_PRICE_COLUMN = 6 SUM_BID_COLUMN = 7 SUM_ASK_COLUMN = 8 DELTA_COLUMN = 9 -- Функция вызывается перед вызовом main function OnInit(path) -- Добавляем столбцы в таблицу AddColumn(screener, TICKER_COLUMN, "Ticker", true, QTABLE_STRING_TYPE, 15) AddColumn(screener, PRICE_SPREAD_COLUMN, "Spread Price", true, QTABLE_DOUBLE_TYPE, 12) AddColumn(screener, VW_BID_PRICE_COLUMN, "VW bid price", true, QTABLE_DOUBLE_TYPE, 15) AddColumn(screener, VW_BID_PRICE_SPREAD, "VW bid spread", true, QTABLE_DOUBLE_TYPE, 15) AddColumn(screener, VW_ASK_PRICE_COLUMN, "VW ask price", true, QTABLE_DOUBLE_TYPE, 12) AddColumn(screener, VW_ASK_PRICE_SPREAD, "VW ask spread", true, QTABLE_DOUBLE_TYPE, 12) AddColumn(screener, SUM_BID_COLUMN, "Sum BIDS", true, QTABLE_DOUBLE_TYPE, 12) AddColumn(screener, SUM_ASK_COLUMN, "Sum ASKS", true, QTABLE_DOUBLE_TYPE, 12) AddColumn(screener, DELTA_COLUMN, "DELTA", true, QTABLE_DOUBLE_TYPE, 12) AddColumn(screener, VW_DELTA_COLUMN, "VW DELTA", true, QTABLE_DOUBLE_TYPE, 12) CreateWindow(screener) -- Даем название таблице SetWindowCaption(screener, "BID-ASK Screener") for ticker, board in pairs(tickers) do --Для каждого тикера определяем строку в таблице и запоминаем ее в rows rows[ticker] = InsertRow(screener, -1) --В первом столбце каждой строки будет имя тикера SetCell(screener, rows[ticker], 0, ticker) end end --Функция вызывается при каждом изменении стакана любого тикера function OnQuote(board, ticker) if stopped then return end local sec = getSecurityInfo(board, ticker) local afterpoint = sec["scale"] + 1 -- Округляем значения на один знак после запятой больше чем знаков в цене local avg_format = "%."..afterpoint.."f" local level2 = getQuoteLevel2(board, ticker) --Получаем стакан local bid_size, ask_size, best_bid_price, best_ask_price, bid_vwsum, ask_vwsum = 0, 0, 0, 0, 0, 0 -- Проход по бидам for index, bid in ipairs(level2["bid"]) do best_bid_price = bid["price"] bid_size = bid_size + bid["quantity"] bid_vwsum = bid_vwsum + (bid["quantity"] * bid["price"]) end -- Проход по аскам for index, ask in ipairs(level2["offer"]) do ask_size = ask_size + ask["quantity"] ask_vwsum = ask_vwsum + (ask["quantity"] * ask["price"]) end best_ask_price = level2["offer"][1].price local VW_BidPrice = bid_vwsum/bid_size local VW_AskPrice = ask_vwsum/ask_size local VW_BidSpread = best_bid_price - VW_BidPrice local VW_AskSpread = VW_AskPrice - best_ask_price local DeltaChange = (bid_size - ask_size) / (bid_size + ask_size) * 100 local SpreadChange = (VW_AskSpread - VW_BidSpread) / (VW_AskSpread + VW_BidSpread) * 100 local wh = RGB(255,255,255) local gr = RGB(0,128,0) local rd = RGB(128,0,0) SetCell(screener, rows[ticker], DELTA_COLUMN, string.format("%d", bid_size - ask_size)) -- Подкрашиваем ячейку соответственно росту(падению) и величины роста(падения) SetColor(screener, rows[ticker], DELTA_COLUMN, BCellColor(DeltaChange), FCellColor(DeltaChange), BCellColor(DeltaChange), FCellColor(DeltaChange)) SetCell(screener, rows[ticker], SUM_BID_COLUMN, string.format("%d", bid_size)) SetColor(screener, rows[ticker], SUM_BID_COLUMN, wh, gr, wh, gr) SetCell(screener, rows[ticker], SUM_ASK_COLUMN, string.format("%d", ask_size)) SetColor(screener, rows[ticker], SUM_ASK_COLUMN, wh, rd, wh, rd) SetCell(screener, rows[ticker], VW_BID_PRICE_SPREAD, string.format(avg_format, VW_BidSpread)) SetColor(screener, rows[ticker], VW_BID_PRICE_SPREAD, wh, gr, wh, gr) SetCell(screener, rows[ticker], VW_ASK_PRICE_SPREAD, string.format(avg_format, VW_AskSpread)) SetColor(screener, rows[ticker], VW_ASK_PRICE_SPREAD, wh, rd, wh, rd) SetCell(screener, rows[ticker], VW_DELTA_COLUMN, string.format(avg_format, VW_AskSpread - VW_BidSpread)) SetColor(screener, rows[ticker], VW_DELTA_COLUMN, BCellColor(SpreadChange), FCellColor(SpreadChange), BCellColor(SpreadChange), FCellColor(SpreadChange)) SetCell(screener, rows[ticker], VW_BID_PRICE_COLUMN, string.format(avg_format, VW_BidPrice)) SetColor(screener, rows[ticker], VW_BID_PRICE_COLUMN, wh, gr, wh, gr) SetCell(screener, rows[ticker], VW_ASK_PRICE_COLUMN, string.format(avg_format, VW_AskPrice)) SetColor(screener, rows[ticker], VW_ASK_PRICE_COLUMN, wh, rd, wh, rd) SetCell(screener, rows[ticker], PRICE_SPREAD_COLUMN, string.format(avg_format, (best_ask_price+best_bid_price)/2)) end -- Цвет текста в ячейке. Если рост - то цвет "зеленый", падение - "красный" function FCellColor(change) if change > 0 then return RGB(0,0,0) else return RGB(0,0,0) end end -- Маленькая "тепловая карта". Делает фон ячейки более интенсивным, взависимости от процента изменения величины function BCellColor(change) bright = math.floor(255 - min(math.abs(change*5), 235),1) --10 110 if change > 0 then return RGB(bright,255,bright) else return RGB(255,bright,bright) end end -- Функция вызывается перед остановкой скрипта function OnStop(signal) stopped = true end -- Функция вызывается перед закрытием квика function OnClose() stopped = true end; -- Основная функция выполнения скрипта function main() while not stopped do sleep(1) end endИли ссылка ScreenerBidAsk.lua
Искренне Ваш!
покупайте дешевых дальних опционов при работе с фьючом.
Таким образом и ГО уменшится и дядя Коля уже никогда не постучится.
Все уже давно придумано до нас без нас и для нас.
Я в своих старых разработках дальше средневзвеса бидов и оферов не пошел. А здесь интересная идея с
«VW DELTA, «VW bid spread» «VW ask spread».
Браво,…
Если бы можно было со 100% уверенностью исключить все биды и аски маркетмейкеров, то анализ стакана имел бы место. И то не по любому инструменту. В USD/RUB, например, такая дичь в стакане при волатильности, что хоть заанлизируйся. За шаг до исполнения ММ свои заявки на пару тысяч лотов снимает или смещает. И плавают там его биды/аски как Г в проруби.
то есть идея автора с VW DELTA на практике не очень себя покажет для прогноза будущей цены?
часто возвращает хрен знает что, а не стакан. если offer более менее терпимо, то bid не можешь получить по несколько минут пока торги не успокоятся.
Вероятно, есть смысл делить каждую следующую заявку на 2, чтобы учесть предполагаемую вероятность её исполнения, тогда и дальше 7 позиции можно не заглядывать.
А как там вопрос с новым коннектором?