← Zurück

Неверное значение ВМ, полученное из Portfolio.VariationMargin

Сегодня запустил программу, работающую через S# PlazaTrader и заметил что значение ВМ в портфеле сильно отличается от значений ВМ для этого счета в привязанном к этому счету квике. Разница в несколько порядков. При этом на этом же логине у меня работают написанные мною программы, которые транслируют ВМ, не отличающуюся от квика. Данные ВМ в своей программе беру из потока FORTS_VM_REPL таблицы fut_vm поле vm.

War dieses Thema hilfreich?

Thema teilen

Kommentare (6)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Alexander
Alexander

Поправил. Мы по полю vm_real определяем.

Limfocit
Limfocit
Limfocit Autor

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

Alexander
Alexander

на codeplex еще не положил

Alexander
Alexander

Limfocit: Сегодня запустил программу, работающую через S# PlazaTrader и заметил что значение ВМ в портфеле сильно отличается от значений ВМ для этого счета в привязанном к этому счету квике. Разница в несколько порядков. При этом на этом же логине у меня работают написанные мною программы, которые транслируют ВМ, не отличающуюся от квика. Данные ВМ в своей программе беру из потока FORTS_VM_REPL таблицы fut_vm поле vm.

Посмотрел ещё раз. В vm и vm_real транслируется ведь информация по вариционной марже по отдельным инструментам, поэтому как раз она и суммируется у нас. Т.е. суммируется вариционка по суммарным показателям id_инструмента, id_сессии

Limfocit
Limfocit Autor

Стало понятно что дело в нескольких счетах на логине. Так как на тестовом полигоне где всего один счет все отлично работает. На данный момент удалось добиться совпадения с данными в квике с помощью следующего кода:

вешаем обработчик события

Trader.TableRegistry.VarMarginFuture.Inserted +=new Action<PlazaRecord>(VarMarginFuture_Inserted);

сам код обработчика


        //сохраняем сессию, чтобы очистить словарь ВМ от значений при изменении сессии
        private int LastSessionId = 0;

        private void VarMarginFuture_Inserted(PlazaRecord record)
        {
            var metadata = Trader.TableRegistry.ColumnRegistry.VarMarginFuture;

            if (LastSessionId == 0)
            {
                LastSessionId = record.GetInt(metadata.SessionId);
            }
            if (LastSessionId != record.GetInt(metadata.SessionId))
            {
                VMDict = new Dictionary<string, Dictionary<int, decimal>>();
            }
            var isin = record.GetInt(metadata.IsinId);
            var curr = record.GetDecimal(metadata.VarMarginReal);
            var client = record.GetString(metadata.ClientCode);
            if (!VMDict.ContainsKey(client))
            {
                VMDict[client] = new Dictionary<int, decimal>();
            }
            VMDict[client][isin] = curr;
        }
        //мой метод для получения ВМ текущего портфеля
        public decimal getVM()
        {
            decimal res = 0.0m;
            //получаю текущий для робота портфель
            var portfolioName = getPortfolio().Name;
            if (VMDict.ContainsKey(portfolioName))
            {
                foreach (int isin in VMDict[portfolioName].Keys)
                {
                    res += VMDict[portfolioName][isin];
                }
            }
            return res;
        }
        //словарь ВМ, основной ключ код клиента, второй ключ - isin
        private Dictionary<string,Dictionary<int, decimal>> VMDict = new Dictionary<string,Dictionary<int,decimal>>();
Alexander
Alexander
Alexander

Fixed

Limfocit