Из QLua (Lua) в Excel (CSV)

Автор записи: Дмитрий (Admin)
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 3, среднее: 5,00 из 5)
Загрузка...

csvФайл CSV-формата это обычный текстовый файл, с которым Excel и аналогичные программы могут работать как с таблицей. Каждая строка таблицы в этом файле записывается как новая строка со знаком переноса в конце, а значения полей разделены между собой каким-то символом, чаще ";". В самой первой строке такого файла можно (не обязательно) указать названия столбцов, так же через ";".

Ниже приведен пример создания такого файла и записи в него данных о совершенных сделках средствами QLua(Lua):

Код скрипта QLua

Скрипт создает файл следующего вида:
Таблица
Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!

Добавить комментарий

Из QLua (Lua) в Excel (CSV): 32 комментария

        1. Пожалуйста, про gsub можете здесь посмотреть: https://quikluacsharp.ru/qlua-osnovy/funktsii-raboty-so-strokami-v-qlua-lua/
          Это шаблон поиска '[\.]+', о том как они строятся можете почитать погуглив "регулярные выражения"
          Можно проще сделать:

          1
          2
          
          price = 103.39
          price = string.gsub(tostring(price),'%.', ',')

          tostring преобразует число в строку, gsub производит поиск в строке и все совпадающие с шаблоном поиска элементы заменяет шаблоном замены, в данном случае точки на запятые. Так как символ точка в регулярных выражениях означает "любой символ", то для поиска именно точки нужно его экранировать, для этого в Lua используется символ "%"

        1. Это нужно в Excel после открытия файла уже настраивать автоматическую ширину столбца, может быть можно в Excel сделать предустановленные настройки для открываемых файлов CSV, но я не знаю как это сделать. Вообще, CSV файл это обычный текстовый файл, в котором хранятся только значения ячеек и не хранится никакой информации для Excel о том, как его правильно отображать.

  1. Здравствуйте. А есть возможность реализовать вывод инфо по закрытым сделкам? Т.е. дата/время, цена, объем открытия, и тут же в строке дата/время и цена закрытия? Что-то вроде отчета брокера.
    Если рассмотреть лот размером 1, то можно просто запоминать данные открытия и при закрытии экспортировать их вместе с текущими.
    Когда же лот равен 2 и выше, то он часто исполняется частями, а если еще и сделка была открыта позавчера, а закрыта сегодня, то тогда такой метод не подойдет.

    1. Здравствуйте, можете просто сформировать строку из нужных Вам данных и таким же образом записать ее в файл.Данные можно брать из соответствующих таблиц квика, а если Вам нужно отслеживать и вчерашние сделки, то тут нужен комплексный подход, не только писать в файл, но и читать из него.

      1. Да, я это понимаю. Тут вопрос не сколько в программировании, сколько по торговле. Я не могу сообразить, как из таблиц понять и формализовать, что пришла сделка, закрывающая предыдущую. Конечно, если они друг за другом идут (открылся/закрылся), то понятно. У вас опыта больше, как я думаю, вот и интересуюсь.
        Пробую аккумулировать совершенные сделки в массиве и, как есть у вас один пример, перебирать и взаимоубирать встречные, но пока нет уверенности, что будет правильно, пока проверяю.
        Как вы думаете, как правильно перебрать много сделок и из них собрать строки для выгрузки по закрытым?

        1. Скорее всего нужно в функции OnTrade мониторить новые сделки, когда появилась новая сделка, смотрите таблицу ограничений по клиентским счетам(фьючерсы), в ней есть поле текущая чистая позиция (totalnet), по изменению этого значения будет понятно что за сделка прошла, только там нужно посмотреть, я сейчас не помню, возможно в момент срабатывания функции OnTrade значение totalnet еще не поменяется, тогда, наверное, не нужно обрабатывать данную сделку, а подождать следующего вызова OnTrade, тогда уже, наверное, totalnet поменяется, OnTrade по несколько раз вызывается для одной и той же сделки. В общем, нужно опытным путем проверять.
          Для справки:
          функции обратного вызова https://quikluacsharp.ru/qlua-osnovy/funktsii-obratnogo-vyzova-vstroennye-v-qlua/
          получение данных из таблиц Quik https://quikluacsharp.ru/quik-qlua/poluchenie-dannyh-iz-tablits-quik-v-qlua-lua/

          1. Да, так можно. Только если позиция набиралась частями (разные объемы, цены) и закрывалась через несколько дней, то так тоже не отследить.
            Конечно, однозначно нужно хранить все совершенные сделки и при уменьшении чистых позиций производить анализ. Только не могу сообразить, чем общим у открытой и закрытой сделки оперировать. При отправке транзакции добавляю комментарий, что упрощает работу, но т.к. сделка наливается и исполняется частями, то не ясно, какую с какой сделкой связывать.
            В любом случае, спасибо за совет, буду тогда думать дальше.

              1. А не, не понесло 🙂 Вы имеете в виду, когда наливается заявка, то номер заявки один на всех, да, это так, но не это интересно. У сделки есть продажа со своим номером заявки и есть закрывающая ее покупка, со своим номером заявки. И они разные.
                Если сделка продажа в 10 лотов, а потом выставляется ТП для покупки 10 лотов, то ордер ТП имеет уже совсем другой, не связанный с первой сделкой продажей, номер заявки. Как потом в таблицах понять, что это закрывающая сделка? Ну и нужно помнить, что наливается частями, что немного усложняет ситуацию.
                Выходит нужно смотреть по цене и разнонаправленности. Ну или вести массив с ключом ценой открываемой сделки и собирать туда все данные. Ладно, буду думать дальше.

  2. Здравствуйте, Дмитрий!
    Как понимаю, в Qlua не поддерживается "getFileLen" или "getFileLength", кок в таком случае считать и использовать значение из конкретной ячейки внешнего файла? Или ячейки заданного столбца в последней значимой строке?

    1. Здравствуйте, в документации есть вот такая функция:

      1
      2
      3
      4
      5
      6
      
      function fsize (file)
         local current = file:seek()      -- get current position
         local size = file:seek("end")    -- get file size
         file:seek("set", current)        -- restore position
         return size
       end

      можете ее использовать для получения размера файла.
      Чтобы получать значения ячеек, нужно учитывать то, что CSV это обычный текстовый файл, в котором есть строки, а значения в строке разделяются символом ";", обычно.
      Вот пример работы с ним:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      
      FilePath = 'C:\\MyCSVFile.csv'
      -- Открывает файл
      local CSVFile = io.open(FilePath,"r+");
      local RowNum = 0 -- номер строки
      local CellNum = 0 -- номер ячейки
      -- Перебирает все строки
      for line in CSVFile:lines() do
         RowNum = RowNum + 1
         -- Перебирает все ячейки строки
         CellNum = 0
         for str in line:gmatch("[^;^\n]+") do
            CellNum = CellNum + 1
            -- Выводит значение ячейки в виде строки "2,5: какое-то значение"
            message(RowNum..','..CellNum..': '..tostring(str))
         end
      end
      1. Спасибо! То есть получить индекс (порядковый номер) последней строки можно только через цикл? И получается можно использовать обычный *.txt с разделителем, типа ";" ?

        1. Всегда пожалуйста!
          Возможно есть какой-то другой способ узнать количество строк, но я его не знаю, к сожалению. Можете использовать любое расширение файла, Lua, в данном случае, все равно будет обращаться с ним, как с .txt

          1. Дмитрий, в приведенном выше скрипте, цикл for str in line:gmatch("[^;^\n]+") do продолжает суммировать кол-во столбцов не зависимо от значения line, то есть если в файле две строки и пять столбцов, то увидим message(RowNum..','..CellNum..': '..tostring(str)) "2,10 какое-то значение"

                1. Что у Вас в файле записано?
                  Я сейчас создал на диске С текстовый файл следующего содержания:
                  1;2;3;4;5
                  6;7;8;9;10
                  переименовал его в MyCSVFile.csv,
                  запустил скрипт, и он вывел:
                  1,1: 1
                  1,2: 2
                  1,3: 3
                  1,4: 4
                  1,5: 5
                  2,1: 6
                  2,2: 7
                  2,3: 8
                  2,4: 9
                  2,5: 10

                  Как и ожидалось!

  3. Спасибо, очень полезная статейка.

    Простенько и со вкусом можно записывать свои сделки, заявки и все что душа пожелает, даже не нажимая кнопок.))