Отправка данных из Текущей таблицы параметров в C# посредством DLL

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

СнимокСкрипт в начале, при запуске, отправляет в C# посредством библиотеки функций (DLL) всю информацию из Текущей таблицы параметров по всем бумагам из классов: TQBR (акции), SPBFUT (фьючерсы), SPBOPT (опционы), данный фильтр расположен в функции SendAllParamStrings(). Так же, в начале каждой строки параметров передается текущее время ОС в миллисекундах, благодаря чему, на стороне C# вычисляется время задержки передачи данных. После отправки бумаг этих классов, скрипт отправляет новые данные по мере их поступления, используя функцию обратного вызова OnParam().

 Поступающие данные проходят через "стек"(массив): новая строка параметров по инструменту добавляется в конец "стека", а для отправки берутся строки из начала "стека", после чего удаляются, таким образом данные не теряются. Фильтр отправляемых классов и бумаг, можно настроить в данной функции. По умолчанию, отправляются 2 бумаги: SBER и RIU5.
ВАЖНО!!! Если Вы добавите в фильтр функции OnParam() много бумаг для передачи, задержка сильно увеличится. Для примера: если отправлять все бумаги классов: TQBR (акции), SPBFUT (фьючерсы) и SPBOPT (опционы), то время задержки может достигать 10 секунд и более, в зависимости от интенсивности торгов.

Скрипт QLua(Lua)

В библиотеке DLL реализовано 3 функции взаимодействия с Lua:
1) CheckGotPARAMS() - Проверяет получил-ли C# последнюю строку параметров по инструменту (или еще не было отправлено ни одной строки), возвращает true, либо false.
2) SendPARAMS() - Получает от QLua(Lua) строку инструмента из Текущей Таблицы Параметров и отправляет ее в C#.
3) GetMilliseconds() - Возвращает текущее время работы ОС в миллисекундах.

Код DLL

Для работы данного примера создайте приложение Windows Forms на C#, если Вы не знаете как это сделать, посмотрите здесь. Разместите на форме одно текстовое поле, которое должно называться textBox1, установите его свойство "Multiline" в значение "TRUE", растяните его на всю форму и замените код файла "Form1.cs" на приведенный ниже, не забудьте функции Form1_FormClosing и Form1_Shown назначить соответствующим событиям формы и переименуйте namespace в коде так же, как называется Ваш проект (в примере namespace Test).

Код C#

Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!

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

Отправка данных из Текущей таблицы параметров в C# посредством DLL: 63 комментария

  1. Признаться, не ожидал, что "С# коннектор" закончится передачей по MMF. Всячески хочу от этого всего уйти в обычный вызов функций типа API. Сейчас обмен по простому делаю - файлы + RAM-Disk. И это можно делать непосредственно из Луа, минуя DLL. Скорость > 1ГБ/с. С учетом семафорных файлов скорость поменьше будет. По скорости, я полагаю, сравнимо с MMF.
    Для непосредственного взаимодействия С# с Луа, я полагаю, нужен COM-сервер, но реализацию плохо себе представляю.(

    1. Я тоже раньше искал способы, но я самоучка и многого не знаю, по этому, найдя MMF решил остановиться на этой технологии по следующим соображениям: обмен идет через ОЗУ, а быстрее все равно нет ничего физически на компьютере, так же, технология дает простые инструменты чтения/записи, на базе которых можно создать любой механизм, ничем не уступающий любым другим. Другого подходящего, а главное такого простого в понимании решения я не нашел.

        1. Да, то так. QLUA - это не совсем ЛУА.( По крайней мере, так было, когда она только появилась, и я, было, пробовал с ней работать - постоянно были непонятки (что-то не поддерживалось) с работой Луа в Квик. Потом на API терминала Альфы ушел. Сейчас жизнь заставляет.)
          Посмотрел реализацию MMF в Луа. Получается, что RAM-Disk вообще самое простое для взаимодействия - ничего вообще не надо. Та-же оперативная память, минуя всякие программные надстройки. А команды вЛуа получает по таймеру посредством аналога switch... case. И легко реализуется многопоточность (можно прицеприть множество скриптов и индикаторов к "роботу", а С# ловит все по событию файловой системы.

            1. Частично можно менять,т.к. такая система (через RAM файлы) легко расширяется без перекомпиляции всего и вся, и свободно меняется по ходу пьесы.
              Просто для информации. Я работаю через CSV - парсить легче и бстрей по сравнению с XML, хотя XML безусловно лучше (интересней)).
              Хотя, еще не работаю, а только отрабатываю это взаимодействие. Но, хотелось бы сделать, как писал раньше, полноценный API. Не знаю как.(

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

          1. у меня есть некоторые предложения по твоему сайту - могу вконтакт иногда писать (я его уже узнал).
            касательно моих топиков - они в некоторых местах - провокационные. Порой приходится использовать методы социальной инженерии, чтоб выведать у разработчиков информацию. Поэтому, иногда приходится умышленно тупить:))
            а иногда и не умышленно:)))))))

      1. я для себя решил - уйти полностью от стандартных коллбеков квика для получения актуальных данных. Использую старый добрый polling (т.е. опрос всего среза по времени), как это везде принято (даже в directinput, а также в игровых движках). Суть в том, что - теперь я сам управляю потоком и решаю, как мне и в каком опрашивать квик.
        следующим номером, можно взять технологию share memory - именно так работает trans2quik и iwr. В общем, всё - тоже самое: пайпы, файлы отображаемые в память и своя быстродействующая БД для сериализации (учёт дисковой дефрагментации при записи/чтении - так работают торрент-треккеры (этим и объясняется их скорость). )

        1. Здесь все зависит от задач, я считаю, чем плох, например, коллбек OnAllTrade против постоянного перебора таблицы всех сделок? "учёт дисковой дефрагментации при записи/чтении" - это для меня звучит как какая-то магическая фраза сейчас, абсолютно не знаю ни причину ни способ реализации этого механизма, просвети в 2-х словах, если не сложно 🙂

    1. Привет, Дмитрий!
      В экспресс-студии похоже нельзя подключаться к потоку памяти.. 🙁
      В общем я не понимаю, что я делаю не так.
      Пример отсюда https://quikluacsharp.ru/qlua-c-cpp-csharp/kak-otpravit-komandu-v-quik-iz-prilozheniya-c/ выполнить получилось. То есть из С# до квика я достучаться могу.
      А наоборот не выходит.
      Для проверки я сделал следующее.
      Код для dll и C# взял полностью отсюда, все нормально скомпилировалось. Скрипт луа сделал совсем простейшим:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      
      require("QluaCSharpConnector");
       
      IsRun = true;
       
      function main()
         while IsRun do
            sleep(1000);
         end;
      end;
       
      function OnStop()
         QluaCSharpConnector.SendPARAMS("1111111111");
         IsRun = false;
      end;

      То есть при закрытии скрипта в textBox C# должна появляться строка из единиц. Но не появляется.
      В чем ошибка, не могу понять?

      1. Привет, Иван!
        В студии можно подключаться к потоку памяти только в приложении C#, DLL нельзя так же отлаживать, для отладки DLL рекомендую простой способ: https://quikluacsharp.ru/c-c-osnovy/odin-iz-prostejshih-sposobov-otladki-dll-c-c-rabotayushhej-s-imenovannoj-pamyatyu/
        Можешь все решение Visual Studio прислать на reply@quikluacsharp.ru, потому, как не понятно как у тебя реализована в DLL функция SendPARAMS и как C# читает то, что она отправляет.