176

Re: Общие вопросы по написанию скриптов LUA.

dark184 пишет:

в .csv файл.
невозможно задать даже ширину ячейки в таблице, нельзя сохранять формулы и форматирование...

Не совсем понятно: речь пр просмотр  .csv в Excel?

dark184 пишет:

Может подскажете более удобный формат, легко писать в файл, наличие внешних программ для визуализации...

Видимо речь про просмотр каких-то табличных данных, получаемых из скрипта?
Готовых прог не знаю.
Можно наваять свою (внешнюю), которая будет показывать как надо, например.

Вообще не совсем понятно откуда у вас берутся по сути таблично-представляемые данные, которые надо именно просматривать глазами много (как я понял). Лог обычно он так - информационно-отладочный.

Можно вместо лога писать в БД, а из неё засасывать данные в Excel для визуализации, тоже вариант в принципе. (На VBA, например, скрипт намутить.)

Если хочется писать данные, которые бы открывались именно в Excel - то есть вариант писать из Lua-скрипта файл в формате "Excel 2003 xml". Это xml формат, но не обязательно его писать какой-то xml-писалкой, можно просто как тектовый файл, синтаксис/формат там простой. По сути есть фиксированный текст "начало", потом данные строк/ячеек во вполне понятном формате, потом "финальный текст". Можно в Excel сделать нужное форматирование, сохранить "ботванку",  а потом только подписывать "в середину" данные. Поддерживаются далеко не все возможности Excel, но основное форматирование, формулы - вполне.

177

Re: Общие вопросы по написанию скриптов LUA.

Вообще не совсем понятно откуда у вас берутся по сути таблично-представляемые данные

Это не логи, это сделки, чтобы вести и накапливать статистику(по сути нужно мне для того, чтобы оценить эффективность каждого инструмента в зависимости от стратегии). Ну и соответственно для расчета профита или убытков за торговый день, нужно чтобы робот мог понять в конце торгов, избавиться от позиции или рискнуть и придержать. Мы уже обсуждали тему о получении отчетов брокера из луа скрипта. К сожалению это невозможно.

речь пр просмотр  .csv в Excel?

Так формат в экселе и просматривается, файл прост как три копейки, почти идеален для накопления статистики, но если захочется посмотреть, эксель не сильно подходит. Хотя на том же луа можно написать скрипт вьювер...
Вот и думаю, чтобы не писать отдельный скрипт, идеально формат эксель, а чтобы не грузить робота расчетами, просто в нужную ячейку писать формулу а эксель сам расчитает...

178 (2023-04-12 14:17:14 отредактировано swerg)

Re: Общие вопросы по написанию скриптов LUA.

Вы напишите что вы хотите получить по смыслу. Тогда возможно удастся найти адекватные средства.
А то сначала говорите про логи, потом вдруг про csv файл(?), потом про формулы и ширины колонок (??! какие формулы в логе?! или ширины?!).
Т.е. много что подразумеваете "в уме", в итоге не понятно в чем вопрос-то.

179

Re: Общие вопросы по написанию скриптов LUA.

Прошу прощения, конечно же под "логами" я имею ввиду статистику работы робота. По сути это запись в файл таблицы сделок, но это не тупое копирование таблицы. Т.е. моя статистика будет содержать как минимум все сделки, совершенные роботами. Плюс к этому буду делать расчет дохода за торговую сессию чтобы обучить робота попытаться закрыть сделки по определенным условиям по цене аукциона закрытия, ибо зачастую сделки стали закрываться по ЦАЗ. Пускай и закрываются далеко не все и далеко не всегда, но попытаться стоит если устраивает цена. Пусть даже если сделка закроется в убыток.
Также по факту, необходимо эту статистику просматривать глазами, чтобы видеть какой из инструментов ушел в плюс или минус, насколько инструмент активно торгуется, и прочее прочее, а на основании этих данных принимать решения уже самостоятельно, держать дальше или продать немедленно, а возможно стоит подумать о смене стратегии если текущая на данном инструменте не эффективна или убыточна. Сами понимаете, ни один робот не идеален и совершает ошибки, впрочем как и человек. Хотя числа 5 роботы начали бить рекорд за рекордом по заработку и даже несмотря на фееричный 16 часовой провал 11 числа, роботы поставили абсолютный рекорд по заработку за торговый день и достигли просто фантастических процентов. Впрочем как и 12 числа с чуть более скромным результатом. И только в четверг и пятницу все вернулось к более менее средним результатам. Ну и как результат сейчас на выходных разгребаю тот бардак, тянущийся еще с 11 числа. Была бы нормальная статистика, то как минимум трети бардака бы уже не было бы, а ручной анализ оставшегося бардака был бы гораздо проще. Вот и думаю какой удобный формат выбрать для записи и чтения роботом, а также для удобного визуального восприятия. Пока думаю о csv, открыл заполненную роботом таблицу, посмотрел, решил что надо продать хоть и с убытком, вбил минимальную цену на открытии в понедельник, которая меня устраивает, а робот самостоятельно ее выставит. Или на "ожиданиях" что цена полетит вверх... Или вообще не корректировать работу робота.

180 (2023-04-17 11:51:15 отредактировано swerg)

Re: Общие вопросы по написанию скриптов LUA.

Наверное самое простое было бы написать свою внешнюю программу с нужной визуализацией данных, с расчетом нужной статистики и т.д. Которая бы брала данные из сохранённой скриптом информации (в БД или текстовый файл).

Посмотрите ещё здесь, может из этого тоже получится что-то сконструировать.
[url]https://support.microsoft.com/ru-ru/office/%D0%B8%D0%BC%D0%BF%D0%BE%D1%80%D1%82-%D0%B8-%D1%8D%D0%BA%D1%81%D0%BF%D0%BE%D1%80%D1%82-%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%BE%D0%B2%D1%8B%D1%85-%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2-%D0%B2-%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B5-txt-%D0%B8%D0%BB%D0%B8-csv-5250ac4c-663c-47ce-937b-339e391393ba[/url]
Там даже обновлять можно данные из csv-файла на ходу.

В Excel можно на VBA писать свои скрипты - очень мощный инструмент в дополнение к удобной визуализации.

181

Re: Общие вопросы по написанию скриптов LUA.

Всем привет. Возник вопрос. Начинают раздражать множественные вызовы коллбэков. Как я понимаю это особенности квика и ничего с этим не поделаешь. Но можете подсказать хоть какую то идею по фильтрации повторных вызовов? В частности использую OnTrade() для записи сделок в файл. В моем случае этот коллбэк приходит 4 раза. Единственный вариант который приходит в голову, это номер сделки. Все бы ничего и это сработало бы без проблем, но как всегда есть одно большое НО! И заключается оно в частичной покупке по одной и той же заявке. Т.е. я выставил заявку на 10 лотов, она может исполнится сразу 10 лотами, а может брать и по одному, причем очень даже быстро, и даже может взять все лоты по одной цене, а может и по разным, причем интервалы между частичным исполнением могут быть абсолютно разными, вплоть до того, что частичная покупка свершилась, и даже продались уже купленные лоты...
Можно было бы при первом частичном исполнении записать остаток, а при следующем приходе коллбэка сравнить текущий остаток с записанным и таким образом избавиться от ненужных вызовов. И опять НО! OnTrade() не возвращает остаток по заявке. Что в принципе логично, ибо нафиг не нужен он здесь...
Может что подскажете как сравнить 4 коллбэка OnTrade() и отфильтровать один тот же?

182 (2023-04-23 20:19:01 отредактировано swerg)

Re: Общие вопросы по написанию скриптов LUA.

Не понятно: что при частичном исполнении вы хотите оставить в логе?

Номер сделки - уникален, так м отсекаем 4 вызова для одной сделки.
Номер заявки - уникален. Так мы отсекаем сделки частичного исполнения по одной заявке.

183

Re: Общие вопросы по написанию скриптов LUA.

Блин, всегда думал что номер заявки и сделки один и тот же smile Да и внимание не обращал. Сейчас действительно подглядел, они действительно отличаются и уникальны. Спасибо, принял к сведению на будущее. Тем не менее проблему это не решает sad. Я действительно упустил более подробное описание проблемы. Задача:
1. Необходимо копировать таблицу сделок в лог для последующих подсчетов дохода/убытка. Это можно реализовать различными способами, причем способов десятки. Лично я выбрал OnTrade(). На мой субъективный взгляд для меня это самое оптимальное решение. На данный момент я все таки выбрал *.csv файл. Запись и чтение реализовать не проблема, да и написано уже и даже работает. Так что записи/чтения не касаемся...
2. Избавиться от лишних вызовов OnTrade(). В моем случае при совершении любой сделки OnTrade() вызывается 4 раза именно по этой сделке. Очевидное решение для избавление от лишних вызовов это номер СДЕЛКИ. Да, это будет работать отлично, но ровно до тех пор, пока не совершится частичная покупка при определенных условиях. Реальный пример с демо счета.

ИНАРКТИКА    0    Покупка    1.0    0    603.5    603.5
ИНАРКТИКА    0    Покупка    1.0    0    603.5    603.5
ИНАРКТИКА    0    Покупка    8.0    0    603.5    4828.0
ИНАРКТИКА    0    Покупка    1.0    0    603.5    603.5
ИНАРКТИКА    0    Покупка    1.0    0    603.5    603.5
ИНАРКТИКА    0    Покупка    1.0    0    603.5    603.5
ИНАРКТИКА    0    Покупка    1.0    0    603.5    603.5
ИНАРКТИКА    0    Покупка    8.0    0    603.5    4828.0
ИНАРКТИКА    0    Покупка    8.0    0    603.5    4828.0
ИНАРКТИКА    0    Покупка    1.0    0    603.5    603.5
ИНАРКТИКА    0    Покупка    1.0    0    603.5    603.5
ИНАРКТИКА    0    Покупка    8.0    0    603.5    4828.0

Последовательность совершения сделок в точности соблюдена, жаль только не догадался вывести номер сделки, но принципиально суть проблемы должна быть понятна. По данному инструменту я беру 10 лотов. А вот по факту по одной заявке было 3 сделки 1, 1 и 8 лотов. Причем обращаю отдельное внимание на то, что все три сделки свершились очень и очень быстро, ибо колбэки пришли вперемешку. Учитывая что OnTrade() в моем случае отрабатывает 4 раза на каждую сделку, а номер сделки уникален, видим 12 записей логе. И это верно.
Теперь если я фильтрую коллбэки по номеру сделки. Первую запоминаю. Приходит следующий коллбэк, он может быть как тот же самый, так и другой для следующей сделки. Таким образом, если все коллбэки от первой сделки успевают приходить первыми, то все прекрасно будет работать. Но как только вклинивается коллбэк от следующей по порядку сделки система рушится. Конечно, проблема решаемая, но придется запоминать все сделки по данной заявке, а это и память, и время на обработку. А для меня крайне важно именно время, время упустил, не открыл или не закрыл сделку.
Вот именно над такой ситуацией я и кубатурю уже с полгода. Да, на демо счете частичная покупка совершается достаточно часто, но чтобы вот так очень быстро чтобы коллбэки перемешались уже редкость. На реальном счете ситуация обратная, частичная покупка редкость сама по себе, зато если совершается то очень часто именно так, что коллбэки перемешиваются между собой.

184

Re: Общие вопросы по написанию скриптов LUA.

dark184,
вы пишете в общих словах, без кода. Но на сколько я смог понять, в коде запоминается только 1 номер сделки в перемнной?
Когда речь шла про запоминание номеров сделок, то я имел ввиду сохранение их в таблицу конечно же. Т.е. сохранение всех номером сделок. И искать в таблице

185 (2023-04-27 10:32:34 отредактировано swerg)

Re: Общие вопросы по написанию скриптов LUA.

Простой пример для наглядности:

TradeNumbers = {}

function OnTrade(t)
  if TradeNumbers[t.trade_num] then
     print("Сделка уже обработана, выход: ", t.trade_num)
     return
  end

  TradeNumbers[t.trade_num] = true

  print("Обрабатываем новую сделку: ", t.trade_num)
end

t = {}

t.trade_num = 5
OnTrade(t)
t.trade_num = 10
OnTrade(t)
t.trade_num = 5
OnTrade(t)

Выводит:
    Обрабатываем новую сделку:     5
    Обрабатываем новую сделку:     10
    Сделка уже обработана, выход:     5

тут можно попробовать
[url]https://qlua.ru/demo/[/url]

186

Re: Общие вопросы по написанию скриптов LUA.

TradeNumbers = {}

Целиком и полностью согласен что работать будет. Но что будет с памятью через неделю работы? Ее же просто напросто забьет напрочь, сколько бы ее не было(роботы запущены круглосуточно). Это вопрос времени. А у меня сотня сделок только за сессию и это еще мало... 200-300 уже что-то.

187

Re: Общие вопросы по написанию скриптов LUA.

Не хватает памяти - докупите еще. Я серьёзно в данном случае.
Есть задача - она решается вот так, минимальными средствами.

Также если у вас в самом деле терминал не выключаясь работает много дней подряд - есть смысл добавить обработчик:

function OnCleanUp()  -- вызывается терминалом QUIK при смене сессии.
   TradeNumbers = {}
end

188 (2023-04-27 15:11:56 отредактировано dark184)

Re: Общие вопросы по написанию скриптов LUA.

Не хватает памяти - докупите еще.

Так куда еще больше 32 гигов smile Хотя, Билл Гейтс в свое время тоже самое говорил про 64 килобайта smile А если серьезно сколько бы ее ни было рано или поздно она забьется.

function OnCleanUp()  -- вызывается терминалом QUIK при смене сессии.
   TradeNumbers = {}
end

Спасибо. А луа разве даст переобъявить уже объявленную переменную? Хотя это же луа. Как я понял просто заново проинициализирует массив и он будет пустым?

деле терминал не выключаясь работает много дней подряд

Даже не сомневайтесь, это так и есть, иначе нафига я уже год полирую робота? smile

function OnCleanUp() 

Вот все думал, куда его приспособить. Вот он и будет при деле smile

189

Re: Общие вопросы по написанию скриптов LUA.

dark184 пишет:

А луа разве даст переобъявить уже объявленную переменную?

Это не "переобъявление2 переменной.
Это присвоение переменной нового значения, в частности - пустой таблицы.

Хотя вот тут обсуждают разные умопомрачительные методы очистки таблицы. Даже не знаю зачем это, может чего не  понимаю.
[url]https://stackoverflow.com/questions/4880368/how-to-delete-all-elements-in-a-lua-table[/url]

190

Re: Общие вопросы по написанию скриптов LUA.

Там просто человеку понадобилось сохранить адрес таблицы в памяти. Видимо здесь в луа если переинитить переменную, меняется и адрес в памяти. Но это уже дебри компилятора. Возможно в этом случае компилятор луа тупо удаляет переменную, тем самым освобождая память, а потом создает новую пустую переменную. Хотя для программиста это выглядит как присвоение нового пустого значения. В любом случае это теория, но полагаю с луа возможно все smile

191 (2023-04-27 17:10:37 отредактировано dark184)

Re: Общие вопросы по написанию скриптов LUA.

Хотя вот тут обсуждают разные умопомрачительные методы очистки таблицы.

Хотя почитал до конца и в конце концов они пришли к тому же самому smile

Change the variable to anything else and then back to a table, so then it is empty.

t = {1,2,3}
print(t[1])      -- 1
t = "Hello World"
print(t)          -- Hello World
t = {}
print(t[1])       -- nil

192

Re: Общие вопросы по написанию скриптов LUA.

Может я уже схожу с ума или луа полон загадок ;( Можете пояснить мне вот такой феномен?

function OnTransReply(repl)

        message("OnTransReply(): Статус заявки " .. tool[repl.sec_code].NAME .. " = " .. repl.status)
        if repl.status == 3 then
        
            ...
            
        else
        
            -- Обработка ошибок
            message("OnTransReply(): Статус заявки " .. tool[repl.sec_code].NAME .. " = " .. repl.status) 
            tool[repl.sec_code].cur_state = "Error_st-" .. repl.status

        end

end

Если выставляю заявку роботом, все отлично, все месседжи выводятся как полагается. Беру инструмент, на который не настроен робот, выставляю заявку вручную и опля... НЕТУ МЕССЕНДЖЕЙ!
Сначала подумал что не отрабатывает OnTransReply при выставлении заявки, но она не может не отрабатывать. Следовательно стал искать причину. Понимаю, что tool[repl.sec_code].NAME у меня nil(да, в руководстве написано что sec_code может иметь значение nil здесь, но в моем случае там код инструмента и на демо счете и на реальном), тут именно поле NAME равно nil, ибо так задумано smile ... Ну это лирика... Просто нет месседжей и все. НО! В другом колбэке

function OnTrade(trade)

        message("OnTrade(): " .. tool[trade.sec_code].NAME .. " Цена - " .. trade.price)
        Write_CSV(trade)

end

Эта же самая таблица, тот же самый идентификатор, тоже самое поле, тоже самое значение nil, тот же самый месседж, таже самая конкатенация с двух сторон, а в первом случае просто сообщение не появляется и ни каких ошибок вообще даже в окне Доступные скрипты. А во втором случае робот хоть и не стопится, но дает ошибку попытки конкатенации значения nil. Мало того, это даже одна и таже программа. Как такое может быть?

193 (2023-04-27 22:18:02 отредактировано swerg)

Re: Общие вопросы по написанию скриптов LUA.

OnTransReply() срабатывает только для заявок, отправленных из скрипта.
Заявки, подаваемые из терминала руками, не приводят к срабатыванию OnTransReply().

194

Re: Общие вопросы по написанию скриптов LUA.

А, понял smile Не учел, спасибо.

195 (2023-05-01 17:22:58 отредактировано dark184)

Re: Общие вопросы по написанию скриптов LUA.

Всем привет. Вплотную подошел к тому, чтобы научить робота по истории сделок рассчитывать доход/убыток + сколько средств вложено на текущий момент по каждому инструменту. Решил использовать формат CSV, правда надо бы еще научиться точки подменять запятыми при записи, а то эксель числа с точками может воспринять как дату smile
Вобщем с записью истории сделок принципиально все готово. А вот с чтением как то не очень пока. Написал и отладил функцию, считать деньги она пока не умеет. Думаю как оптимизировать. На данный момент пока ничего лучшего этого, в голову не пришло

function Read_CSV()

    local file_path = getScriptPath() .. "\\Robot\\log\\" .. month[os.date("%m")] .. " " .. os.date("%Y") .. ".csv"
    local n = 0
    f = io.open(file_path,"r+");                        -- Пытается открыть файл в режиме "чтения/записи"
    if f == nil then                                    -- Если файл не существует
        message("Истории сделок пока нет!")
        return
    end;
    message("Читаю файл " .. file_path)
    
    local str = ""
    local i
    local row    = 0                                        -- Номер читаемой из файла строки
    local indx
    for str in io.lines(file_path) do
        local table_value = {}
        local column = 0                                -- Номер читаемой из файла колонки
        if row > 0 then                                    -- Если строка первая, то не разбираем (заголовки).
            for i in string.gmatch(str, "[^;]+") do        -- Разбираем строку на запчасти по шаблону ";".
                if column == 0 then                        -- На первой колонке создаем индекс, равный коду инструмента.
                    indx = i
                else                                    -- Иначе заполняем поля временной локальной таблицы.
                    table_value[column] = i
                end
                column = column + 1
            end
            message("Индекс - " .. indx)
            if Total[indx] == nil then                    -- Если таблицы не существует,
                message("Создаем")
                Total[indx] = {}                        -- То создаем
            end
            message("Заполняем")
            Total[indx].NAME         = table_value[1]    -- Заполняем таблицу и при необходимости считаем.
            Total[indx].strategy    = table_value[2]
            message("Инструмент - " .. Total[indx].NAME .. " " .. "Стратегия - " .. Total[indx].strategy)
        end
        message("Строка - " .. str .. "Строка " .. row)
        row = row + 1
    end

end

Если кратко:
Сначала проверим существует ли файл, если да то читаем итератором io.lines по одной строке за раз. Если строка самая первая, то выкидываем, т.к. это заголовки (саму строку оставил, может потребуется, разбирать по косточкам не стал). Далее строки разбираю по шаблону на колонки, первая это код инструмента, его я превращаю в индекс глобальной таблицы Total. Остальные значения кидаю в локальную временную таблицу table_value (эта таблица будет нужна для подсчетов позже). Ну в завершение проверил как все это работает. Если в Total нет текущего индекса, то создаем, затем уже заполняю или рассчитываю нужные значения. Сейчас поля заполнил чисто для теста.
Вобщем я хочу создать отдельную сводную таблицу со списком всех торгуемых роботами инструментов, куда, исходя из истории сделок вносить данные по доходу/убытку за торговый день, за месяц и за всю историю торгов. Скорее всего данную сводную таблицу вынесу в отдельный файл. Т.к. история сделок это помойка, куда в рандомном порядке пишется все что ни попадя. Сводная же таблица будет строго упорядочена, по каждому инструменту отдельная строка с необходимыми данными.
Подскажите, в qlua вообще есть встроенные инструменты для работы с CSV файлами? Или же можно сделать попроще и побыстрее?

196

Re: Общие вопросы по написанию скриптов LUA.

По моему я лопухнулся с форматом файла CSV. Проблема пришла оттуда, откуда ее не ждал.
Если конкретно. Qlua работает с точкой в десятичных дробях, а эксель только с запятой. В большинстве случаев в принципе все равно, но если десятичная дробь похожа на дату, она будет преобразована в дату и теперь если сохранить такой файл из эксель, получим потерю данных.
Если же при записи в файл заменять все точки на запятую, эксель воспринимает все верно, но тогда скрипт читая такие дроби воспринимает их как строку и отказывается преобразовывать в дробь. Как бы требуется теперь запятые заменить на точки smile

197

Re: Общие вопросы по написанию скриптов LUA.

1. Надо в Excel правильно настраивать формат данных. Кроме того
1*. Формат данных в Excel зависит от региональных настроек Windows.

2. В скрипте прочитать универсально строку (с точкой или запятой) - вообще нефик делать. Выделили кусок строки  с числом, заменили в нем зпт на тчк - и преобразуем  в число. И тогда не важно были там запятые или точки.
Короче это всё какие-то мелкие несущественные мелочи.

198

Re: Общие вопросы по написанию скриптов LUA.

В общем то так и делал string.gsub... Потом подумал, да ну нафиг редактировать файл в экселе smile По крайней мере пока...

199

Re: Общие вопросы по написанию скриптов LUA.

Подскажите ее ответ на такой вопрос. Если из скрипта я читаю таблицы "orders" и "trades"(таблицы заявок и сделок соответственно) то при чтении скриптом данные всегда читаются в хронологическом порядке? Т.е. по мере поступления. Или же возможны и другие варианты? Я пробовал читать таблицы, сортируя их по разным столбцам, данные в скрипт отдаются вроде бы одинаково в хронологическом порядке.
Этот вопрос в моем случае принципиален. В первом случае при старте робота я восстанавливаю уникальный номер транзакции если уже были заявки от роботов, во втором случае случае читаю таблицу для подсчета точных сумм сделок и ведения статистики. Чтение таблицы необходимо, чтобы минимизировать вероятность потери данных если вдруг что то случилось(например отвалился квик, робот пришлось тормознуть, или же банально потерялась связь), а также в случае чего вовремя обнаружить потерю данных.
И еще один вопрос. Есть таблица обезличенных сделок(как я понял это "all_trades" и соответствующий коллбэк OnAllTrades). Как я понял это таже самая таблица сделок, за исключением того, что в ней пишутся абсолютно все сделки, произошедшие на бирже... Насколько глубоко эта таблица сохраняет данные?
Думаю попробовать использовать ее для чтения потерянных данных если ее глубина будет достаточной.

200

Re: Общие вопросы по написанию скриптов LUA.

dark184 пишет:

из скрипта я читаю таблицы "orders" и "trades"(таблицы заявок и сделок соответственно) то при чтении скриптом данные всегда читаются в хронологическом порядке?

Сортировка/фильтрация визуальных таблиц терминала не влияет на данные в скрипте.
А вот на гарантированный порядок я бы не закладывался. В момент, когда у вас может произойти одновременно много сделок/заявок по разным инструментам - порядок может и "перемешаться" наверняка. Но этот момент лучше уточнить у разработчиков.
Хотя я бы всё равно не закладывался на какой-либо порядок данных. Это дешевле, чем потом выгребать непонятные глюки.

dark184 пишет:

таблица обезличенных сделок(как я понял это "all_trades" и соответствующий коллбэк OnAllTrades). Как я понял это таже самая таблица сделок, за исключением того, что в ней пишутся абсолютно все сделки, произошедшие на бирже...

Это не "за исключением", это как раз её суть - все сделки, совершенные на бирже, всех участников. Кроме того, в ней направление покупка/продажа - "условны" (т.к. по любой сделке на бирже один покупает, другой продаёт).

dark184 пишет:

Насколько глубоко эта таблица сохраняет данные?

Текущая торговая сессия.