finsight / QUIKSharp

QUIK# (QUIK Sharp) is the QUIK Lua interface ported to .NET.
Other
230 stars 134 forks source link

как получить размер плеча по инструменту (DLong) через QuikSharp? #344

Closed ildarskii closed 1 year ago

ildarskii commented 1 year ago

Согласно документации Quik Lua значение плеча можно получить с помощью функции getBuySellInfo() через поле long_coef.

В реализации QuikSharp в классе TradingFunctions функция getBuySellInfo() отсутствует (она закомментирована).

Подскажите, как можно получить значение плеча по инструменту в библиотеке QuikSharp?

Pr0phet1c commented 1 year ago

Эта функция на данный момент действительно не реализована. ЕСли будет время - постараюсь реализовать. Как сейчас можно получить эту информацию в Q# к сожалению не знаю.

Pr0phet1c commented 1 year ago

Готово. Пользуйтесь

ildarskii commented 1 year ago

Функции GetBuySellInfo и GetBuySellInfoEx появились в библиотеке, спасибо. Но при их вызове ничего не возвращается и код зависает в бесконечном ожидании. Остальные функции вроде GetParamEx работают хорошо...

bak19 commented 1 year ago

Попробуйте перезагрузиться, чтоб изменение qsfunctions.lua прошло У меня все работает. Спасибо

ildarskii commented 1 year ago

А попробуйте запустить для акций ВТБ функцию GetBuySellInfo(Firmid, clientCode, "TQBR", "VTBR", 0). У меня возвращает пустые значения (отсутствие плеча): DLong = null, DShort = null, LongCoef = "1.000000" Тогда как в таблице Квик вижу DLong = 0.4, DShort = 0.37

При этом если вызвать с другими параметрами GetBuySellInfo(Firmid, clientCode, "INSTR", "RUR_2", 0). (такой инструмент и класс тоже есть в справочнике квик, что бы он ни значил), то программа зависает. А функция GetBuySellInfoEx(..) зависает даже если запросить по ВТБ. Было бы разумным возвращать управление назад с кодом ошибки, без зависания.

bak19 commented 1 year ago

GetBuySellInfo не возвращает DLong, DShort. Тут все правильно

DLong, DShort возвращает функция GetBuySellInfoEx(..) Чтобы она заработала, нужно слегка подкорректировать файл src/QuikSharp/DataStructures/BuySellInfo.cs

     /// <summary>
    /// Срок расчётов. Возможные значения: положительные целые числа, начиная с «0», соответствующие срокам расчётов из таблицы «Позиции по инструментам»: «0» – T0, «1» – T1, «2» – T2 и т.д.
    /// </summary>
    [JsonProperty("limit_kind")]
    public int LimitKind { get; set; }

public int LimitKind { get; set; } поменяйте на public string LimitKind { get; set; } После этого должно заработать

ildarskii commented 1 year ago

Да, так заработало. Включите исправление в master версию?

И по второй технической проблеме зависания. По некоторым инструментам вызовы функций GetBuySellInfo и GetBuySellInfoEx зависают. Например, вот такой вызов GetBuySellInfoEx(Firmid, clientCode, "TQOB", "SU25085RMFS0", 0) GetBuySellInfoEx(Firmid, clientCode, "PSAU", "RU000A0NR748", 0) GetBuySellInfoEx(Firmid, clientCode, "PSAU", "RU000A105ZN3", 0)

Было бы правильно завершить работу функции с возвратом соотв. статуса или значениями по умолчанию. Подскажете где и что исправить?

bak19 commented 1 year ago

Внести сам правки не смогу, т.к. не разработчик библиотеки.

По второму вопросу, попробуйте отредактировать таблицу "купить/продать" средствами самого quikа. Добавьте в нее все инструменты с которыми работаете или планируете работать. Возможно это и будет решением.

ildarskii commented 1 year ago

Добавление в таблицу квик инструментов не помогло, все равно зависает на них. Плюс нужно системное решение, т.к. набор инструментов и значение плеча по ним динамически меняются.

Проблему с зависанием решил через асинхронные запросы. Вложенный Task нужен, чтобы не было блокирующего ожидания.

var t = new Task(() => { var task = Task.Run(() => QuikLua.Trading.GetBuySellInfoEx(Firmid, clientCode, classCode, secCode, 0));

if (task.Wait(100)) // если не завис запрос
{

    DLong = task.Result.DLong;

    Console.WriteLine($"{DLong}");

}

}); t.Start();

ildarskii commented 1 year ago

Кстати, столкнулся с неожиданным поведением библиотеки QuikSharp - она не совместима с официальной последней версией пакета Newton.Json 13.0.3, хотя в настройках QuikSharp это не указано. Было бы правильным прописать в настройках несовместимость.

ildarskii commented 1 year ago

С учетом вышесказанного, изначальная проблема решена. Спасибо.