Общие вопросы по разработке > Получить список позиций

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
ensh
Сообщения: 220
Зарегистрирован: 28 июн 2017, 13:56
Благодарил (а): 4 раза
Поблагодарили: 40 раз

Re: Получить список позиций

Непрочитанное сообщение ensh » 27 янв 2019, 18:58

BugsDigger писал(а):AFAIUI, часть кода направлена на поддержку старых версий АД. (Или я ошибаюсь?)
А если без таковой поддержки?


Раньше все dll ки назывались просто, но пришли новые программисты и решили не доводить код до ума, а dll ки переназвать и DataCollections.dll В ПОСЛЕДНЕЙ версии терминала стала ADir.DataCollections.dll и еще парочку таких переименований, при том что, кодовая база осталась прежней, ну может роботы допилили...

BugsDigger
Сообщения: 535
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 92 раза

Re: Получить список позиций

Непрочитанное сообщение BugsDigger » 27 янв 2019, 19:05

ensh писал:

> Позиции у клиента бывают трех видов

Большое спасибо за информацию.

> Мне, как программисту, все эти примеры кажутся тривиальными

Не, строчки сами по себе, наверное, тривиальны, нетривиально знать, ЧТО написать. :D

> Если не знаете зачем - значит не понадобится

Если писалось, значит какой-то смысл есть, хотелось бы понять.
А так, как всегда, хочется минимизировать, если есть возможность.

ensh
Сообщения: 220
Зарегистрирован: 28 июн 2017, 13:56
Благодарил (а): 4 раза
Поблагодарили: 40 раз

Re: Получить список позиций

Непрочитанное сообщение ensh » 27 янв 2019, 19:20

BugsDigger писал(а):ensh писал:

> Позиции у клиента бывают трех видов

Большое спасибо за информацию.

> Мне, как программисту, все эти примеры кажутся тривиальными

Не, строчки сами по себе, наверное, тривиальны, нетривиально знать, ЧТО написать. :D

> Если не знаете зачем - значит не понадобится

Если писалось, значит какой-то смысл есть, хотелось бы понять.
А так, как всегда, хочется минимизировать, если есть возможность.


если нужно постоянно получать состояние КОНКРЕТНОЙ позиции, то лучше поиск по индексу, с другой стороны, если позиций на счете меньше десятка - перебор наше все, находим нужную в цикле

BugsDigger
Сообщения: 535
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 92 раза

Re: Получить список позиций

Непрочитанное сообщение BugsDigger » 27 янв 2019, 19:24

ОК, очередное спасибо за комментарий.
Мне нужен весь список, так что "перебор - наше всё" как раз мой случай.

BugsDigger
Сообщения: 535
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 92 раза

Re: Получить список позиций

Непрочитанное сообщение BugsDigger » 27 янв 2019, 20:36

Ну вот, имеем результат.
2 позиции: деньги и 1 лот SBER.
Теперь осталось разобраться где что.

Код: Выделить всё

// деньги
CodeSubAccount=NNNNN-000, // вижу номер своего счета
DailyBuySell=0,
DailyBuySellVolume=N/A,
DailyPL=0,
DailyPLPercent=0,
DailyVolume=N/A,
FSFRLongPos=0,
IdAccount=NNNNN,
IdObject=KKKKKK,         // 6 цифр; это код рублей? или что?
IdSubAccount=MMMMM, // 5 цифр, не совпадающих с № счета; что это?
LongOrders=0,
LongPosition=SUMMA,   // вижу свои рубли
NalPos=0,
NalPosRur=0,
NPL=0,
NPLPercent=0,
PlanLong=0,
PlanShort=0,
Price=1,
PriceStep=0,01,
QuoteRur=1,
ShortOrders=0,
ShortPosition=0,
TomorrowShort=0,
TorgPosRur=SUMMA,
UchPos=SUMMA,
UchPosModal=SUMMA,
UchPriceLong=0,
UchPriceLongRur=1,
UchPriceShort=0,
UchPriceShortRur=0,
Volume=SUMMA,
CAP4LASTPL=SUMMA,
SubAccNalPos=SUMMA,
NKD=0

// SBER
CodeSubAccount=NNNNN-000,
DailyBuySell=0,
DailyBuySellVolume=N/A,
DailyPL=0,
DailyPLPercent=0,
DailyVolume=N/A,
FSFRLongPos=0,
IdAccount=NNNNN,
IdObject=LLLLLL,            // код тикера SBER?
IdSubAccount=MMMMM,   // то же значение, что и в предыдущей структуре
LongOrders=0,
LongPosition=0,
NalPos=0,
NalPosRur=0,
NPL=-49,8000000000002,
NPLPercent=-2,4032429302191,
PlanLong=0,
PlanShort=0,
Price=212,2,
PriceStep=0,01,
QuoteRur=212,2,
ShortOrders=0,
ShortPosition=10,
TomorrowShort=0,
TorgPosRur=-2122,
UchPos=-10,
UchPosModal=10,
UchPriceLong=0,
UchPriceLongRur=0,
UchPriceShort=207,22,
UchPriceShortRur=0,
Volume=2122,
CAP4LASTPL=2122,
SubAccNalPos=0,
NKD=0


Если IdObject и правда код тикера (еще не проверял), то как получить сам тикер, если это не слишком сложно?

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

ensh
Сообщения: 220
Зарегистрирован: 28 июн 2017, 13:56
Благодарил (а): 4 раза
Поблагодарили: 40 раз

Re: Получить список позиций

Непрочитанное сообщение ensh » 27 янв 2019, 22:17

IdObject - код инструмента и где-то там должен быть тикер
IdSubAccount - id счета в базе данных с человеческим кодом CodeSubAccount

ensh
Сообщения: 220
Зарегистрирован: 28 июн 2017, 13:56
Благодарил (а): 4 раза
Поблагодарили: 40 раз

Re: Получить список позиций

Непрочитанное сообщение ensh » 27 янв 2019, 22:58

ToString() для ClientTradePosition возвращает не все...

имеется свойство finInfoExt которое ссылается на FinInfoExtEntity - торговый инструмент, правда, там тоже все весьма нечитабельно...

предлагаю заинжектить еще одну dll

Код: Выделить всё

        if (!ReferencedLibrariesArray.Contains("DataStorageShared.dll"))
        {
           // инжектим базовую библиотеку с информационными справочниками альфа-директа
           ReferencedLibrariesArray = ReferencedLibrariesArray.Concat(new[] { "DataStorageShared.dll" }).ToArray();
               ReferencedLibraries.SetValue(null, ReferencedLibrariesArray); // спасибо AP_Bor
        }



теперь уже в коде используем обращение к справочнику объектов (инструментов) альфа директа

Код: Выделить всё

function Initialize()
{
   IndicatorName = "CorePositionTest";   // Задайте название индикатора и сохраните с данным именем
   
   AddInput("Input", Inputs.Price);   // Input - входной ряд (Inputs.Price) или свечи (Inputs.Candle)
    AddSeries("CorePositionTest", DrawAs.Line, Color.Red);   // Задаем вид линии индикатора A
 
    // регистрация библиотек (как только ввели блок, жмем компиляцию и пишем дальше)
   var ReferencedLibraries = typeof(TA.Script.ScriptCompiler).GetField("ReferencedLibraries",
       System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static );

    if (ReferencedLibraries != null)
    {
       var ReferencedLibrariesArray = ReferencedLibraries.GetValue(null) as string[];
        if (!ReferencedLibrariesArray.Contains("Core.dll"))
        {
           // инжектим базовую библиотеку с данными альфа-директа
           ReferencedLibrariesArray = ReferencedLibrariesArray.Concat(new[] { "Core.dll" }).ToArray();
            ReferencedLibraries.SetValue(null, ReferencedLibrariesArray); // спасибо AP_Bor
        }
       
        if (!ReferencedLibrariesArray.Contains("DataStorageShared.dll"))
        {
           // инжектим базовую библиотеку со информационными справочниками альфа-директа
           ReferencedLibrariesArray = ReferencedLibrariesArray.Concat(new[] { "DataStorageShared.dll" }).ToArray();
            ReferencedLibraries.SetValue(null, ReferencedLibrariesArray); // спасибо AP_Bor
        }

        if (!ReferencedLibrariesArray.Contains("ADir.DataCollections.dll"))
        {
           // инжектим базовую библиотеку с "новыми" коллекциями альфа-директа
           // старые коллекции в "DataCollections.dll"
           ReferencedLibrariesArray = ReferencedLibrariesArray.Concat(new[] { "ADir.DataCollections.dll" }).ToArray();
            ReferencedLibraries.SetValue(null, ReferencedLibrariesArray); // спасибо AP_Bor
        }
   }
   
   // конец - регистрация библиотек
}

function Evaluate()
{
   // Область расчета значения индикатора

   CorePositionTest = 0.0;   // Присваиваем значение = 0.0

   // пишем блок после инжекта!!!! иначе не скомпилируется
    // в старых версиях Core.PositionManager 
   var positionManager = Core.Managers.PositionManager.Instance;
   var positionStorage = positionManager.Positions;

   //получить список позиций - пример
    IEnumerable<AD.Common.DataStructures.ClientTradePosition> positions;
    lock (positionStorage.Locker)
    {
       positions = positionStorage.Values.OfType<AD.Common.DataStructures.ClientTradePosition>().ToList();
    }

    foreach (var position in positions)
    {
       // здесь все позиции
       // а так получаем человеческие данные по инструменту из справочника
       var objectEntity = Core.DataStorageShared.GetObjectsByIdObject(position.IdObject);
        // информация по торг. инструменту   
   var finInfoExt = position.finInfoExt;                                      
    }
   // конец - получить список позиций      
}

Последний раз редактировалось ensh 28 янв 2019, 09:35, всего редактировалось 1 раз.

BugsDigger
Сообщения: 535
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 92 раза

Re: Получить список позиций

Непрочитанное сообщение BugsDigger » 28 янв 2019, 07:00

Привет, ensh.
Большое спасибо, вечерком погоняю.
------------------------------------------------
Вот и результаты для справки (получено методом ToString):
Рублевая позиция:

Код: Выделить всё

ObjectEntity(14):
{
 IdObject: 174368,          // код инструмента
 IdObjectType: CC,
 IdObjectFaceUnit: 0,
 IdObjectBase: 0,
 IdIndustry: 0,
 SymbolObject: 'RUB',
 NameObject: 'Рубль РФ',
 DescObject: 'Рубль РФ, Рег№ 643',  // оказывается, у рубля есть регистрационный номер :)
 RegCodeObject: '643',
 Nominal: 0,
 Mult: 1,
 MatDateObject: 21000101 00:00:00.000,
 Expired: 0,
 IsEnabledObject: False,
 Version: 12401274580,
 Operation: Updated
}

FinInfoExtEntity(32):
{
 IdFI: 150111,
 IdGate: EQ,
 IdMarket: 0,
 IdBoard: ABEQ,
 IdTradePeriodStatus: 10,
 IdAllowOrderStatus: 4,
 IdSession: 9999,
 SessionDate: 21000101 00:00:00.000,
 Lot: 1,
 PriceStep: 0,01,
 PriceStepCost: 0,01,
 IdObjectCurrency: 174368,
 Rate: 0,
 PSTNKD: 0,
 UpPrice: 0,
 DownPrice: 0,
 GtBuy: 0,
 GtSell: 0,
 AgentCode: Null,
 AuctActivationDate: 00010101 00:00:00.000,
 CounterPrice: 0,
 PrevSessionId: 9999,
 PrevSessionDate: 21000101 00:00:00.000,
 PrevQuote: 1,
 PrevLastDate: 21000101 00:00:00.000,
 PrevLast: 1,
 NextCoupon: 00010101 00:00:00.000,
 BuyBackDate: 00010101 00:00:00.000,
 CouponPeriod: 0,
 Duration: 0,
 AccruedInt: 0,
 CouponValue: 0,
 CloseYield: 0,
 YieldAtPrevWaPrice: 0,
 Version: 1137481829,
 Operation: Inserted
}


1 лот SBER

Код: Выделить всё

ObjectEntity(14):
{
 IdObject: 285270,
 IdObjectType: AO,                 // очевидно, Акции Обыкновенные
 IdObjectFaceUnit: 174368,
 IdObjectBase: 284396,
 IdIndustry: 0,
 SymbolObject: 'SBER',
 NameObject: 'Сбербанк',
 DescObject: 'Акции обыкновенные ПАО Сбербанк, Рег№ 10301481B',
 RegCodeObject: '10301481B',
 Nominal: 3,                           // правда? кто бы мог подумать :)
 Mult: 1,
 MatDateObject: 21000101 00:00:00.000,
 Expired: 0,
 IsEnabledObject: False,
 Version: 12404209142,
 Operation: Updated
}

Fin inf:
FinInfoExtEntity(32):
{
 IdFI: 144950,
 IdGate: MICEX,
 IdMarket: 2,
 IdBoard: TQxx,
 IdTradePeriodStatus: 10,
 IdAllowOrderStatus: 4,
 IdSession: 10619,
 SessionDate: 20190128 00:00:00.000,
 Lot: 10,
 PriceStep: 0,01,
 PriceStepCost: 0,01,
 IdObjectCurrency: 174368,
 Rate: 1,
 PSTNKD: 0,
 UpPrice: 229,23,
 DownPrice: 192,83,
 GtBuy: 0,
 GtSell: 0,
 AgentCode: 'MC0002500000',
 AuctActivationDate: 00010101 00:00:00.000,
 CounterPrice: 0,
 PrevSessionId: 10616,
 PrevSessionDate: 20190125 00:00:00.000,
 PrevQuote: 212, PrevLastDate: 20190125 00:00:00.000,
 PrevLast: 212,
 NextCoupon: 00010101 00:00:00.000,
 BuyBackDate: 00010101 00:00:00.000,
 CouponPeriod: 0,
 Duration: 0,
 AccruedInt: 0,
 CouponValue: 0,
 CloseYield: 0,
 YieldAtPrevWaPrice: 0,
 Version: 14469871289,
 Operation: Updated
}


Вернуться в «Общие вопросы по разработке»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей