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

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
BugsDigger
Сообщения: 535
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 92 раза

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

Непрочитанное сообщение BugsDigger » 26 янв 2019, 17:43

Привет всем.

Можно ли получить список всех моих позиций или содержимое окна "Позиции"?

Есть ф-ция

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

var currentPosition = GetPosition(RazdelGroupType.MICEX, ticker);
Однако, если не знать по каким тикерам есть позиции, то с ней пройтись по всем своим позициям не получится...

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

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

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

юзаем PositionsManager на манер OperationsManager

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

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

Непрочитанное сообщение BugsDigger » 26 янв 2019, 18:47

Привет, ensh, спасибо за ответ.

> юзаем PositionsManager

Нету такого :)

Только что сам нарыл

___[NSP] Core
|___[NSP] Core.Managers
| |___[CLS] Core.Managers.PositionManager
| | | method GetPositions :
class [mscorlib]System.Collections.Generic.IEnumerable`1<class AD.Common.DataStructures.ClientTradePosition>(string,int32)

Пробовать буду уже завтра...

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

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

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

BugsDigger писал(а):Привет, ensh, спасибо за ответ.

> юзаем PositionsManager

Нету такого :)

Только что сам нарыл

___[NSP] Core
|___[NSP] Core.Managers
| |___[CLS] Core.Managers.PositionManager
| | | method GetPositions :
class [mscorlib]System.Collections.Generic.IEnumerable`1<class AD.Common.DataStructures.ClientTradePosition>(string,int32)

Пробовать буду уже завтра...


Этот не надо, нужен без параметров

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

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

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

Привет, ensh.

> нужен без параметров

Уммм... Что-то не вижу такого.

---- upd ---------------

| | | |___[FLD] field SubAccountPositions : public class [ADir.DataCollections]AD.Common.DataStructures.IndexedListManager`2
<int32,class [ADir.ClientStructures]AD.Common.DataStructures.ClientSubAccPositionEntity>

Это?

AP_Bor
Сообщения: 170
Зарегистрирован: 18 дек 2017, 08:18
Благодарил (а): 12 раз
Поблагодарили: 8 раз

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

Непрочитанное сообщение AP_Bor » 27 янв 2019, 12:40

Доброго времени суток, BugsDigger
BugsDigger писал(а):Это?
► Показать
С наилучшими пожеланиями
► Показать

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

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

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

Собственно вот

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

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("ADir.DataCollections.dll"))
        {
           // инжектим базовую библиотеку с "новыми" коллекциями альфа-директа
           // старые коллекции в "DataCollections.dll"
           ReferencedLibrariesArray = ReferencedLibrariesArray.Concat(new[] { "ADir.DataCollections.dll" }).ToArray();
            ReferencedLibraries.SetValue(null, ReferencedLibrariesArray); // спасибо AP_Bor
        }
   }
   
   // конец - регистрация библиотек
   
   // пишем блок после инжекта!!!! иначе не скомпиллируется   
   // регистрация своего индекса (если нужно) после инжекта библиотек
   
   // в старых версиях Core.PositionManager 
   var positionManager = Core.Managers.PositionManager.Instance;
   var positionStorage = positionManager.Positions;

    var positionIndexNumber = -1;

    // локальная функция внутри метода, так сказать, полезный пруф
    Func<string, int> getIndexNumberByName = (name) =>
    {
       for (int i = 0; i < int.MaxValue; i++)
       {
          var positionIndex = positionStorage[i];

          if (positionIndex == null)
             return -1;

          if (positionIndex.Name == name)
          return i;
       }

       return -1; // дошли досюда... ну ну
    };

   // нужно быть осторожным, индексы никак не проверяются на уникальность и если наплодить индексов
   // все может затормозиться... ну это нужно постараться конечно, но зачем
   if ((positionIndexNumber = getIndexNumberByName("index by idfi")) == -1)
    {
       var index = new IndexedList<int, AD.Common.DataStructures.ClientTradePosition>("index by idfi",
          (AD.Common.DataStructures.ClientTradePosition pos) => pos.IdFiBalance);

       positionStorage.AddIndex(index);

       positionIndexNumber = getIndexNumberByName("index by idfi");
    }
   
    AddGlobalVariable("IndexByIdFi", Types.Int, positionIndexNumber);
   // конец - регистрация своего индекса
}

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)
    {
       // здесь все позиции               
    }
   // конец - получить список позиций   
      
              
    // использование стандартного индекса - позицию по idObject-у - пример
    var position123456 = positionStorage.GetSingle(123456, (int)Core.Managers.PositionManager.PositionsIndexNumber.IdObject);

   // использование своего индекса - пример
    var position789 = positionStorage.GetSingle(789, IndexByIdFi);
   
}


нужно еще иметь в виду, что есть позиции, по которым есть остатки и они расчитываются и прилетают с сервера,
а есть локальные позиции (у которых нет остатков по инструменту) они создаются в самом терминале по выставленным заявкам клиента

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

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

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

Дааа, это круто. :shock:

Реально проще невозможно? (Хотя, какая разница :) )
Запишу в тему "Хотелки" получение списка позиций, м.б. когда-нибудь реализуют...

> нужно еще иметь в виду, что есть позиции, по которым есть остатки и они расчитываются и прилетают с сервера,
> а есть локальные позиции (у которых нет остатков по инструменту) они создаются в самом терминале по выставленным заявкам клиента

Если не затруднит, поясните, пожалуйста, поподробнее.
И можно ли думать, что эти позиции в конце концов попадут в список (или уйдут из него как имеющие кол-во 0) и потом ничем не будут отличаться?

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

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

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

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

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

BugsDigger писал(а):Дааа, это круто. :shock:

Реально проще невозможно? (Хотя, какая разница :) )
Запишу в тему "Хотелки" получение списка позиций, м.б. когда-нибудь реализуют...


Десяток строчек кода, из них большая часть стандартного инжекта, которая никогда не меняется и копируется, для вас сложно!?
Мне, как программисту, все эти примеры кажутся тривиальными

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

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

3. потенциальные - если заявка (по инструменту, который не участвует в предыдущих вариантах) лежит на бирже в стакане и еще не исполнилась, с точки зрения брокера, еще (почти) никакого результата по ним нет, кроме комиссий )))), а с точки зрения терминала, автоматически(по приходу статуса с биржи, что заявка принята) появляется позиция с входным остатком - ноль, неизвестной учетной ценой, текущим остатком - ноль, маржой - ноль, и только количество на покупку и/или количество на продажу соответствует заявкам на бирже

так яснее?

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

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

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

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

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


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

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

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