Coder Social home page Coder Social logo

finsight / quiksharp Goto Github PK

View Code? Open in Web Editor NEW
230.0 47.0 134.0 2.3 MB

QUIK# (QUIK Sharp) is the QUIK Lua interface ported to .NET.

License: Other

Lua 38.74% C# 60.99% Batchfile 0.05% Python 0.23%
quik lua c-sharp trading quantitative-trading algotrading

quiksharp's Introduction

Gitter

QUIK#

QUIK# (QUIK Sharp) is the QUIK Lua interface ported to .NET.

QUIK# exposes all functions and events available in QLUA as C# async functions and events.

A simple Ping/Pong benchmark shows c.60 microseconds roundtrip time for QUIK (MacBook Air 2012). This is almost negligible compared to QUIK's native latency (from the terminal to a remote server).

Russian version

Install & Usage

The best way to use QUIK# is to install the NuGet package:

PM> Install-Package QUIKSharp

Version 1.0 is stable and should cover most use cases. If you need some functionality that is already implemented but is not included in the stable NuGet release then you could build the project from the master branch. That will give you the latest features and bug fixes.

If some functionality from QLUA is missing or you find a bug please submit a pull request.

A folder lua with all required scritps will be added to your project. Start QuikSharp.lua script from QUIK and never stop it manually (it will be started automatically when QUIK starts). See demo applications and unit tests for usage examples in C#.

Why use .NET for QUIK

(and not Lua or DDE or other libs)

  • Because implementing trading systems with 3rd party closed source code with unclear licensing and support is risky and leads to vendor lock-in (even tested and popular like StockSharp).

  • Because QUIK's Lua interface is dumb, slow and painful - while .NET is smart, fast and pleasure to work with.

  • Because QUIK is a niche legacy soft that has its market share for historical reasons. One should not invest more than a minimum into such software, but should abstract away its idiosyncrasies as much as possible. Most platforms have .NET API and it is the choice for new development.

Who owns QUIK#?

QUIK# is owned by all its authors and contributors. This is an open source project licensed under the Apache 2.0 license. There are open issues in the issues tab that still need to be taken care of, feel free to pick one up and submit a patch to the project.

QUIK workstation and trademark are owned by ARQA Technologies. This project is not affiliated with the company in any way and our use of the name is fair use - we just make the live of the terminal users simpler and happier!

License

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

This software is distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

quiksharp's People

Contributors

alexmgerasimov avatar avently avatar buybackoff avatar chislovmax avatar dependabot[bot] avatar developman avatar euvgub avatar exvion avatar igor-san avatar nubick avatar oldschoolman avatar pr0phet1c avatar skyn avatar sm00vik avatar stanislav-111 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

quiksharp's Issues

Не создается ордер по CreateOrder

привет
на счете нехватает денег на новую заявку
создаю через CreateOrder - ожидаю ответа что нет денег а в Events.OnOrder пусто

куда приходят неторговые ответы - типа идет клиринг - нет денег и так далее?

Как подписываться на свечки?

Из NuGet скачал QuikSharp.0.2.0 и попытался повторить пример из CandlesSubscriptionTest.
В классе Quik нет определения для Candles, в итоге не смог найти функцию Subscribe.

Подумал что разработка на github ушла вперед, и попытался собрать версию из github в Visual Studio 2015, но собираться не захотела, зависимости оказались битыми, застрял на Microsoft.Isam.

Так как же подписаться на Events.OnAllTrade ?

CallBacks и стандартизация

Вопрос1: пишет ли кто-то колбэки луа?(OnAccountBalance, OnAccountPosition, OnAllTrade, ...) И соответствующие им обработчики и QuikSharp?
Если да то прошу запушить чтоб не повторятся.

Вопрос2(предложение): Давайте стандартизируем структуры данных. А то где-то SecCode, где-то sec_code.

Big threading issue with CJSON

CJSON is not thread safe: when callbacks are combined with requests, resulting JSON becomes badly corrupted. Changing CJSON to DKJSON fixes this, ping is 70 microsecs, echoed transaction 100 microsecs - almost no difference.

Need mutex around ToJson/FromJson, but have no idea how to do it in Lua. In the meantime, go with DKJSON.

Лицензия

Сделать LGPL как у ZMQ/NetMQ. S# еще не было на ГитХабе в декабре, когда выбирал. Для таких библиотек совершенно одинаково. Или вообще сделать Apache 2.0.

Недостающий функционал

Функционал сгруппирован по разделам справки QLUA. Чтобы дописать отсутствующие функции, нужно прочитать два issue здесь, помеченных тагом question, и реализовать по аналогии с существующими методами.

Запуск нескольких роботов одновременно

Собственно вопрос в том есть ли способ запустить одновременно несколько роботов (на данный момент у меня не получилось), или придется писать что-то вроде платформы, которая будет общаться с терминалом, а уже внутри нее реализовывать работу множества роботов?

Падение скрипта: qsutils.lua:155: attempt to index upvalue 'callback_client' (a nil value)

Если быстро создать и удалить объект Quik, то lua скрипт остановиться с ошибкой
QuikSharp\src\QuikSharp\lua\qsutils.lua:155: attempt to index upvalue 'callback_client' (a nil value)

воспроизводиться на коде:

    using QuikSharp;
    namespace QuickQuit
    {
        class Program
        {
            static void Main(string[] args)
            {
                Quik Q = new Quik();
            }
        }
    }

воспроизводиться не всегда. Причём, я смог воспроизвести только когда в Quik список скриптов закрыт. Если же список скриптов открыт, то получаю просто:
Loading values that a client missed during disconnect

Candles

Уточните, а как при помощи вашей библиотеки получить свечи? В примерах не нашёл, есть вообще такая возможность?

Прошу пример использования вашей библиотекой

Виктор привет
прошу пример на пару строк кода по использованию вашей библиотекой
В тестах что вы выложили все работает замечательно - но
я создал новый проект
добавил вашу библиотеку в референсах
создал кнопку и в ней разместил ваш код
Quik quik = new Quik(); -ок создается
long orderId = 123456789;
Order order = quik.Orders.GetOrder("TQBR", orderId).Result;
вот сюда а никогда не прихожу - программа зависает
Assert.IsNull(order);
Прошу помощи

Сбой подтверждения в QuikSharp.Transaction.OnTransReplyCall

Снова столкнулся с проблемой, решение которой мне не удается найти самостоятельно.
Итак, есть робот (WinForms), который на текущий момент работает в режиме онлайн-теста (т.е. совершает виртуальные сделки, не отправляя реальных заявок на сервер).
Параллельно работает другой робот (на QLua), который торгует в реале совершенно другим инструментом.
Так вот, когда QLua-робот выставляет заявку в квике, то в тестовом QuikSharp-роботе возникает ошибка, которая полностью останавливает работу робота, и в ряде случаев может создавать дополнительные проблемы.
На экране получаю вот такое окно:
error ontransreplycall
В режиме отладки обратил внимание, что появление таких заявок в QuikSharp распознается как некий "fakeTrans", но зачем, и что мне с этим делать я так и не понял.
Можно ли узнать как мне избежать появление указанной ошибки?
Ведь этого робота, по идее, не должно волновать что делается в квике с другими инструментами.
Может надо какую-нибудь "заглушку" сделать? Или может быть я не понял заложенного в QuikSharp принципа работы с этими колбэками?
Просьба помочь, если есть такая возможность.

Не работают тесты.

Скачал solution КШ c github. Обновил References в Profiler на проекты QuikSharp и QuikSharpTest (изначально видимо были ссылки на старую dll в которой нет Transaction). Запускаю QuikSharp.lua в Квике, запускаю Profiler с тестами. Quik выдает сообщение Connected, а когда закрывю profiler - переключается на Connecting...
Но! Никакие тесты не работают, даже IsQuik, ответа не приходит.
Где может быть проблема?

p.s. Еще заметил с непорядок нэймспэйсами. Например в папке QuikSharp.DataStructures.Transaction часть классов имеет такой namespace, а часть - просто QuikSharp.

Persistent storage logic & order cancelation

Сейчас мы просто игнорируем ошибки по мэтчингу ответор на транзакции/ордера, нужно проработать эту тему. Например при отмене ордера TransReply приходит с пустым комментом.

Quik начинает "подвисать" после соединения

Добрый день!

Столкнулся с тем, что после вызова конструктора QuikSharp.Quik() терминал Quik иногда начинает тормозить (подвисает). Программа QuikSharp стаканы при этом получает (работаю с тестовым примером). Версия терминала Quik 6.17.1.17, в корневой каталог Quik скопировал lua5.1.dll и lua51.dll (идущую в поставке с QuikSharp).

После закрытия программы QuikSharp терминал Quik "оживает".

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

Тесты работают а руками создать класс quik не получается

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

    mQUIK = New QuikSharp.Quik
    mdf = New DebugFunctions(Quik .DefaultPort)
    Dim ret =mDF.IsQuik.Result

и тут в Output куча мессаджей о попытке соединения с квиком
ок - посмотрел код static class Program
вижу
ServiceManager.StartServices();

пробую вызвать метод ло создания Quik

Exception thrown: 'System.MethodAccessException' in cQUIK_QuickSharp.exe
Additional information: Методу "cQUIK_QuickSharp.frm_test.button_Click(System.Object, System.Windows.RoutedEventArgs)" не удалось получить доступ к методу "QuikSharp.ServiceManager.StartServices()".

подскажи что делаю не так - не тупой но туплю второй час
спасибо

Лист ордеров

Всё стесняюсь спросить, как получить список заявок / сделок за сессию, до того как подписался на событие Events.OnOrder. Метод public async Task<List<StopOrder>> GetStopOrders() вижу, а метод возврата простых ордеров - нет.

Реактивная модель

Я тут подумал, что может быть было бы неплохо внедрить не событийную модель, а реактивную. Построить коннектор на базе Akka.NET http://getakka.net/ и раздавать приходящие сообщения потребителям. На известном трекере недавно аж три курса было выложено по этому фреймворку.

Transactions callbacks

Продублирую тут, вдруг кто не видел. #7 (comment)

Наверное стоит мне сюда написать. Вопрос: создал я новую транзакцию, и хочу обработать ее OnOrder, как это сделать?

Пишу тест:

        [Test]
        public void SendOrderTest()
        {
            Quik q = new Quik(Quik.DefaultPort, new InMemoryStorage());

            var t = new Transaction()
            {
                ACCOUNT = "NL0011100043",
                CLASSCODE = "QJSIM",
                SECCODE = "SBER",
                ACTION = TransactionAction.NEW_ORDER,
                OPERATION = TransactionOperation.B,
                PRICE = 120M,
                QUANTITY = 1,
                CLIENT_CODE = "101942",
                Comment = "",
            };

            t.OnOrder += (Order o) => {
                Console.WriteLine(
                    "New order regs with num = {0} on transaction {1}",
                    o.OrderNum, t.TRANS_ID);
                rised = true;
                mre.Set();
            };

            q.Events.OnOrder += (Order o) =>
            {
                Console.WriteLine(
                    "New order in QuikEvents regs with num = {0} on transaction {1}",
                    o.OrderNum, t.TRANS_ID);
            };

            var tRes = q.Trading.SendTransaction(t).Result;
            Console.WriteLine("Transaction Id = {0}", tRes);
            Assert.True(tRes != -1);

            mre.WaitOne(10000);
            Assert.IsTrue(rised, "Event OnOrder was not rised!");
            AfterTest();
        }

так вот, обработчик t.OnOrder никогда не будет вызван, потому что это не тот объект который вытягивается из QuikEvents.cs:

        internal void OnOrderCall(Order order) {
            ......
            var tr = QuikService.Storage.Get<Transaction>(correlationId);
            if (tr != null) {
                lock (tr) {
                    tr.OnOrderCall(order);
                }
            }

Может так все и задумано. Тогда как при создании транзакции реагировать на ее события?
Возможно у меня неправильный подход. Кто как тут реализует такие вещи и нужны ли они?

ссылка в описании функции ведет в никуда

ссылка ведет на ошибочную страничку

    /// <summary>
    /// Возвращает заявку из хранилища терминала по её номеру.
    /// На основе: http://help.qlua.org/ch4_5_1_1.htm
    /// </summary>
    /// <param name="classCode">Класс инструмента.</param>
    /// <param name="orderId">Номер заявки.</param>

Как корректно обработать исключение в Subscribe?

В случае ошибочной подписки (например, указание секции которой в Квике нет) получаю LuaException, который не перехватывается обычным try-catch и, кажется, валит программу.

Как его корретно принять и обработать?

JSON attributes on every property of every data structure

Initially, C# POCOs properties were named after Lua tables, e.g. CLIENT_CODE. This is ugly, in C# that should be ClientCode. Later I added attribute generation to Excel, but older POCOs still rely on property names. Other than ugly, that could be broken by simple refactoring if one forgets about this requirement.

А можно ли подписаться на получение обезличенных сделок без открытия таблиц?

привет
А можно ли подписаться на получение обезличенных сделок без открытия таблиц?
нашел метод OrderBook.Subscribe
может есть что то подобное для сделок
а то складывается впечатление что данные идет с задержкой
например я в МТ5 получаю подтверждение постановки ордера на 150 мсек раньше чем в квике

Направление заявки

Ставлю заявку на продажу. В дебагире вылавливаю событие и вижу поле Operation = Buy

Расширенная информация по инструментам && производительность

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

не понятно, зачем нужна Transaction.IsComepleted

она возвращает true, если последнее сообщение о заявках по транзакции было о том, что заявка не активна и не отменена. Т.е., видимо, предполагается, что заявка исполнилась полностью.

Но если транзакция была MOVE_ORDER с двумя заявками, и исполнилась только одна?
А если исполнилась только частично?
А если транзакция было об отмене заявки, то текущий метод "Транзакция исполнена" не вернет True никогда.

Да и вообще, какое дело транзакции, о заявке созданной по ней. Предлагаю удалить эту функцию, чтобы некого не смущать. На заявке есть свойство State. А вообще я предпочитаю сравнивать значения Balance и Quantity :), так проще, т.к. одинаковый алгоритм для частично и полностью исполнившихся заявок.

Получение стакана

разбираюсь с конмольным примером, столкнулся с таким поведением:
если в квике не открыт стакан инструмента, то данные стакана не идут ( в _quik.Events.OnQuote += (orderBook) => {… ), если открываю стакан, то данные идут. Но ведь есть возможность получать стакан без открытия в квике?

Transaction callback hell

Сдесь будут собираться мысли, как жить и что делать с асинхронными OnTransReply, OnTrade, OnOrder. Самое неприятное место во всем квике.

Документация

Здравствуйте! Проект очень интересный, но совершенно не понятно, как им пользоваться. "Из кода должно быть всё ясно" -- это очень громкое заявление, если учесть, что проект содержит 143 файла.
Особенно сложно для тех, кто, как я например, ненавидит эту дурацкую Visual Studio.
Если бы Вы написали несколько коротеньких инструкций. Первую, как написать простейшую программу с использованием QuikSharp. Вторую, как добавлять новые функции. То, я думаю, большое количество людей с энтузиазмом принялось бы развивать ваш проект.
Мне приходится каждый файл отдельно открывать наугад, так как сам проект QuikSharp.sln моей Visual Studio не открывается (пишет, что проект был создан более новой версией программы, привет рабовладельцем из майкрософта).
Очень надеюсь на Вашу помощь, так как проект вызывает интерес, но времени и сил на реверс-инжиниринг сейчас нет.

Работает ли библиотека с несколькими клиентами?

привет
будет ли работать ваша разработка при работе с несколькими клиентами
тоесть 1 скрипт луа - и 3-5 клиентов
например написал свой стакан - каждый запускается как отдельое приложение
могут ли они работать с 1м скриптом луи и при этом совершать сделки - предусмотрена ли такая возможность и есть ли потенциальные проблемы - например нумерация внутренних ордеро и так далее

FileLoadException

Подключение, вроде как, есть. Но что за исключение появляется при подписки на события и проверки await _quik.Service.IsConnected()?

Request channel connected
Exception thrown: 'System.IO.FileLoadException' in QuikSharp.dll

Не стартует QuikSharp.lua

Не стартует QuikSharp.lua.
Ошибка
error loading module 'socket.core' from file 'C:\Program Files (x86)\Quik-Zerich\lua\clibs\socket\core.dll':
Не найден указанный модуль.

Локализация

Нужно написать по-русски, что это коннектор для Квик (Quik, Квика) на онове Луа (Lua). Подходит для автоматизации торговли, алгоритмического трейдинга (алготрейдинг), на площадках Московской Биржи, ММВБ, РТС, ФОРТС (FORTS). Альтернатива StockSharp, если нужно по минимуму получить удобный доступ к Квику, и т.д. А то люди случайно находят, а по поиску невозможно найти из-за того, что все на английском. Может люди со временем и подтянутся. Если Гугл умный, то этого issue должно хватить.

Вывод данных на форму Wpf

подскажите как вывести данные стакана на форму wpf,
как преобразовать данные в itemsource?
_quik.Events.OnQuote += (orderBook) => {
if (orderBook.sec_code == securityCode)
{

                bestBidPrice = orderBook.bid.OrderByDescending(o => o.price).First().price;
                bestOfferPrice = orderBook.offer.OrderByDescending(o => o.price).Last().price;

                this.Dispatcher.BeginInvoke(new Action(() => Quotes.ItemsSource = ...));


            }

Update Readme, NuGet + Add examples

60 microsecs - throughput, not latency. Latency is closer to 100.

Nice definition what QS is 😄 "минимальный базовый рабочий сетап, без перегруза деталями каких-то частных методов анализа данных и включения всех мыслимых нюансов с документации и чей-то практики. Как АК-47, чтобы просто, сурово и фундаментально" http://forum.moex.com/viewtopic.asp?t=28925

By popular demand, need to create simplest examples, including the threading issue WinForms.

Unfortunately, very low priority now.

Борьба с последствиями дисконнекта

Не знаю как у других, а у меня после восстановления коннекта с сервером (если перед этим был дисконнект) Квик некоторое время "висит" (около минуты), прежде чем вновь оказывается в состоянии отдавать какие-либо данные. За это время, робот успевает вывалиться с ошибкой. Причем, ошибка может возникнуть где угодно.
Собственно задача, после восстановления связи определить, что Квик уже начал стабильно отдавать данные. Кто-нибудь уже решал такую задачку, или это только у меня такая проблема??

Spreads integration

В Spreads уже есть пример примитивной торговой стратегии. Нужно добавить в КШ API для получения всех данных как IAsyncEnumerable или IObservable, что дуально. Также нужно сделать пример атомарного трейдера, Квик поддерживает режим 2 (но не 3) на ФОРТС. Интересно, поддерживает ло он режим 2 на акциях и споте валюты? В принципе, потом можно писать стратегии настолько гибкие и сложные, насколько люди разберутся в Spreads, которые не будут зависеть от Квика и смогут работать с любом месте.

C++

Victor, hello!

Планируете ли вы, сделать дополнительно клиента на C++?

Особенности создания приложения Windows Forms

В процессе тестирования QuikSharp в Windows Forms-приложении, столкнулся с необходимостью все функции, которые получают какие-либо данные из Quik, запускать в отдельных процессах.
Для простоты написания кода в дальнейшем, пришлось создать отдельных класс, дублируя там все реализованные функции QuikSharp.

В результате, строка которая в консольном приложении выглядит так:

IsConn = _quik.Service.IsConnected().Result;

у меня превращается в:

    static class Get
    {
        public static bool IsConnected()
        {
            bool Res = false;
            Thread trCon = new Thread(delegate() { Res = Form1._quik.Service.IsConnected().Result; });
            trCon.Start();
            trCon.Join();
            return Res;
        }
    }
....
                IsConn = Get.IsConnected();

Более изящного решения пока не нашел.
Собственно вопрос вот в чем:
А нельзя ли непосредственно в QuikSharp реализовать все эти функции в отдельных потоках?
Попробовал бы сам, но думаю знаний не хватит.

Также, при создании этого приложения столкнулся с проблемой изменения свойств объектов Form из методов вызванных колбэками.
В частности, система ругается на попытку получить доступ к методу объекта не из того потока, в котором такой объект был создан.
Пока решил задачку через кросспотоковый вызов, типа:

    public delegate void ChangerLabels(Label label, object value);
...
        ChangerLabels ChangeLabelText;
...
            ChangeLabelText = new ChangerLabels(ChngLabelTxt);
...
        private void ChngLabelTxt(Label label, object value)
        {
            label.Text = Convert.ToString(value);
        }
...
                    Invoke(ChangeLabelText, label_LastPrice, last_price);

Возможно, кому-то эта информация будет полезна.
Если кто-нибудь подскажет более простое решение - буду рад.

Ошибка при запуске Lua

error loading module 'socket.core' from file 'C:\TFS3\TRADING\AAA\QUIK\cQUIK_QuickSharp\QuikSharp-master\src\QuikSharp\lua\clibs\socket\core.dll':
Не найден указанный модуль.

Версия квика 6,16,1,15
в 7мой все работает - натравливаю на ту же папку со скриптами

OnParam

Попытался реализовать подписку на колбэк OnParam.

В файле qscallbacks.lua:
--- Функция вызывается терминалом QUIK при изменении текущих параметров.

function OnParam(class_code, sec_code)
    local msg = {}
    msg.cmd = "OnParam"
    msg.t = timemsec()
    msg.data = sec_code
    sendCallback(msg)
end

В файле IQuikEvents.cs:

        event ParamHandler OnParam;

В файле QuikEvents.cs:

    /// <summary>
    /// Обработчик события OnParam
    /// </summary>
    /// <param name="sec_code">Код бумаги</param>
    public delegate void ParamHandler(string sec_code);

....
в классе: internal class QuikEvents : IQuikEvents
...

        public event ParamHandler OnParam;
        internal void OnParamCall(string sec_code) { if (OnParam != null) OnParam(sec_code); }

Проект собрал все необходимые файлы перенес в нужные папки (по аналогии с одной из функций, которые мне удалось благополучно реализовать)

В проекте, на котором тестирую подписался на событие:

                _quik.Events.OnParam += (param) => OnParamDo(param);

...

        void OnParamDo(string param)
        {
                Console.WriteLine("Есть колбэк OnParam");
        }

После запуска этот колбэк не приходит. (тот же OnQuote например исправно работает)
в логах "MissedCallbacks.1444311584.log"
есть записи типа
{"cmd":"OnParam","t":1444311584417.4,"data":"SBER"}
{"cmd":"OnParam","t":1444311584466.4,"data":"GAZP"}
{"cmd":"OnParam","t":1444311584502.5,"data":"SBER"}
{"cmd":"OnParam","t":1444311584528.5,"data":"SBER"}
{"cmd":"OnParam","t":1444311584549.5,"data":"GAZP"}
{"cmd":"OnParam","t":1444311584570.5,"data":"SBER"}
{"cmd":"OnParam","t":1444311584591.6,"data":"SiZ5"}
{"cmd":"OnParam","t":1444311584612.6,"data":"SRZ5"}

т.е. из квика колбэки отправляются, если я правильно понимаю.

Что я сделал неправильно в реализации колбэка?

Непонятки с Newtonsoft.Json и Esent.xxxx

Скачал проект QuikSharp-master, запустил в VS.
После разных манипуляций Newtonsoft.Json и Esent.xxxx в проекте "Profiler" видятся нормально (проект можно скомпилировать и запустить).
А вот дальше не знаю что делать.

В проекте "QiukSharp.Tests" в References -- > Newtonsoft.Json с восклицательным знаком и ошибки следующего вида:
Ошибка 1 Не удалось найти имя типа или пространства имен "Newtonsoft" (пропущена директива using или ссылка на сборку?) C:\Users\Владислав\Dropbox\C#\Чужое\QuikSharp-master\tests\QuikSharp.Tests\TransactionSpecTest.cs 4 7 QuikSharp.Tests

В проекте "QiukSharp" - те же проблемы, но плюс еще и с Esent.xxxx

Знания в C# на начальном уровне. Просьба сильно не пинать, если вопрос получился идиотский.
Рискну предположить, что автору проекта без моих "нубских" вопросов забот хватает, но может кто-то уже решал такую проблему?

P.S.: Проект реально очень актуальный (более десятка одновременно работающих ботов на QLua в одном терминале уже начинают порождать различные неудобства), хочется всю логику вынести за пределы терминала.

Примите ли пулриквест? Только актуальное состояние заявки в транзакции.

Планирую изменения, вопрос в том, реализовывать ли их в QuikSharp, и будут ли они приняты в мастер ветку? Или делать локально у себя, и не тревожить QuikSharp?

  1. Из Transaction убирается список Orders. Вместо него добавляется два свойства Order и Order2.
    Зачем: насколько я понимаю не бывает транзакций, которые сгенерировали бы больше 2х заявок. 99% транзакций генерят 0 или одну заявку, и только MOVE_ORDER может создать две.
    Т.е. для доступа к заявке по транзакции будет достаточно получить свойство Transaction.Order.

  2. Order начинает реализовать интерфейс INotifyPropertyChanged, т.е. на сообщение из Quik о заявки, находим транзакцию, и если у транзакции Order или Order2 уже заполнен заявкой с таким же номером, то просто меняем свойства у существующей в транзакции заявке, а не добавляем новую.

  3. Отмену заявки делаем в классе Order

Вопрос по скорости обмена с Квиком

Добрый день.

Начал изучать Ваш коннектор QuikSharp, уже почти дописал платформу для робота и решил измерить скорость исполнения запросов, по сравнению с таким же роботом на Lua.

Вы пишете, что скорость около 60 МИКРОсекунд.
Я в своем роботе на C#, получая все свечи по инструменту через "get_candles_from_data_source", делаю замер в двух местах:
в Lua (получается меньше 1 МИЛИсекунды) от входа до выхода функции.
в C# (получается 400 МИЛИсекунд), это с момента вызова quik.Candles.GetLastCandles("SPBFUT", "RIM6", CandleInterval.M1, 0).Result и до получения обратно данных о свечах.
Получается C# за секунду успевает исполнить 2-3 функции или циклов, а тот же самый робот на луа, без C# успевает выполнить гораздо больше 100 функций или циклов расчета и обмена с квиком.

Основная задержка идет от
internal async Task Send(IMessage request, int timeout = 0)
...
...
var response = await tcs.Task; >200 МИЛИсекунд.

Как перейти в МИКРОсекунды, я что то не так делаю, или что то не так понимаю?

Подскажите, пожалуйста.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.