Область видимости объекта

Автор: konstantinio

Область видимости объекта - Sun Jan 08 2017 04:44 PM

Всем салют! С прошедшими праздниками!
Ниже представлен скрипт который выдает ошибку типа:
Quote:
08.01.2017 16:32:17 138 System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
в TradeScript.SBRF_VTB_STATIC_SETKA.Execute(IContext ctx, ISecurity secSBRF, ISecurity secVTBR)
в TSLab.User.Script.Execute(IContext context, ISecurity Источник1, ISecurity ТоргуемИнструм)

Quote:

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TSLab.DataSource;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.Script.Helpers;
using TSLab.Script.Optimization;

namespace TradeScript
{
    public class SBRF_VTB_STATIC_SETKA : IExternalScript2
    {
        #region Параметры оптимизации

        public OptimProperty SlippageSBRF = new OptimProperty(0, 0, 0, 0);
        public OptimProperty SlippageVTB = new OptimProperty(0, 0, 0, 0);
        public OptimProperty SMASub = new OptimProperty(464, 500, 1500, 10);
        public OptimProperty SizeLevel = new OptimProperty(100, 50, 1000, 10);
        public OptimProperty SumLevel = new OptimProperty(5, 1, 5, 10);

        #endregion

        public void Execute(IContext ctx, ISecurity secSBRF, ISecurity secVTBR)
        {

            #region Расчет Индикаторов

            var sub = Series.Sub(secSBRF.ClosePrices, secVTBR.ClosePrices); //Вычитание значений закрытия инструментов
            var smaSub = ctx.GetData("SMASub", new string[] { SMASub.Value.ToString() }, () => Series.SMA(sub, SMASub));//Скользящая построенная по разнице 
            var extendable = Series.Sub(smaSub, sub); //Разница от скользящей и разницей цен


            #endregion

            for (int i = 0; i < ctx.BarsCount; i++)
            {
                ////Прямые позиции
                ////Прямые позиции
                var leVtbr = secVTBR.Positions.GetLastActiveForSignal("VTBR_LE", i);// Получаем позицию или null
                var seSbrf = secSBRF.Positions.GetLastActiveForSignal("SBRF_SE", i);// Получаем позицию или null
                if (leVtbr == null && seSbrf == null)
                {
                    if (extendable[i] < 100)
                    {
                        secSBRF.Positions.SellAtMarket(i + 1, 1, "SBRF_SE", "Продажа SBRF");// Входим в шорт
                        secVTBR.Positions.BuyAtMarket(i + 1, 2, "VTBR_LE", "Продажа VTB"); // Входим в лонг
                    }
                }
                else
                {

                    for (int j = 0; j < SumLevel; j++)
                    {
                        if (extendable[i] < SizeLevel && seSbrf.Shares <= j + 1)
                        {
                            leVtbr.ChangeAtMarket(i + 1, leVtbr.Shares + 2, "VTBR_LE2");// <<<<<<<<=======Ссылка не указывает на экземпляр объекта
                            seSbrf.ChangeAtMarket(i + 1, seSbrf.Shares - 1, "SBRF_SE2");// <<<<<<<<=======Ссылка не указывает на экземпляр объекта
                        }
                        if (extendable[i] > SizeLevel && seSbrf.Shares >= j + 1)
                        {
                            leVtbr.ChangeAtMarket(i + 1, leVtbr.Shares - 2, "VTBR_LX2");// <<<<<<<<=======Ссылка не указывает на экземпляр объекта
                            seSbrf.ChangeAtMarket(i + 1, seSbrf.Shares + 1, "SBRF_SX2");// <<<<<<<<=======Ссылка не указывает на экземпляр объекта
                        }
                    }



                    if (extendable[i] >= 0)
                    {
                        seSbrf.CloseAtMarket(i + 1, "SBRF_SX");
                    }
                }
            }

            #region Визуализация
            ...
            #endregion
        }
    }

}

Не могу понять почему не видит. Подскажите пожалуйста в какую сторону копать?
Автор: komissar

Re: Область видимости объекта - Sun Jan 08 2017 05:57 PM

И где а вас созданы обьекты VTBR_LE2 и SBRF_SE2?
Автор: konstantinio

Re: Область видимости объекта - Sun Jan 08 2017 06:06 PM

VTBR_LE2 и SBRF_SE2 - это название сигналов. Объекты тут:
Code:
var leVtbr = secVTBR.Positions.GetLastActiveForSignal("VTBR_LE", i);// Получаем позицию или null
var seSbrf = secSBRF.Positions.GetLastActiveForSignal("SBRF_SE", i);// Получаем позицию или null
Автор: komissar

Re: Область видимости объекта - Sun Jan 08 2017 06:07 PM

Прошу пардону. Херню сморозилс.
Автор: komissar

Re: Область видимости объекта - Sun Jan 08 2017 06:15 PM

f (leVtbr == null && seSbrf == null) - А если один из обьектов не нулл, а другой нулл- то переход на елсе и одной позииции нет.
Автор: komissar

Re: Область видимости объекта - Sun Jan 08 2017 06:28 PM

а еще мне кажется некорректное добавление позиции-здесь нужны новые обьеты.
Автор: konstantinio

Re: Область видимости объекта - Sun Jan 08 2017 06:28 PM

Не думаю что в этом дело. Тестирую на истории и то что был пропущен вход на истории этого не может быть. На всякий случай проверил так:
Code:
for (int j = 0; j < SumLevel; j++)
                    {
                        if (extendable[i] < SizeLevel && seSbrf.Shares <= j + 1)
                        {
                            if (leVtbr != null) leVtbr.ChangeAtMarket(i + 1, leVtbr.Shares + 2, "VTBR_LE2");// <<<<<<<<=======Ссылка не указывает на экземпляр объекта
                            if (seSbrf != null) seSbrf.ChangeAtMarket(i + 1, seSbrf.Shares - 1, "SBRF_SE2");// <<<<<<<<=======Ссылка не указывает на экземпляр объекта
                        }
                        if (extendable[i] > SizeLevel && seSbrf.Shares >= j + 1)
                        {
                            if (leVtbr != null) leVtbr.ChangeAtMarket(i + 1, leVtbr.Shares - 2, "VTBR_LX2");// <<<<<<<<=======Ссылка не указывает на экземпляр объекта
                            if (seSbrf != null) seSbrf.ChangeAtMarket(i + 1, seSbrf.Shares + 1, "SBRF_SX2");// <<<<<<<<=======Ссылка не указывает на экземпляр объекта
                        }
                    }

Результат тот же.
Автор: konstantinio

Re: Область видимости объекта - Sun Jan 08 2017 06:31 PM

Новые позиции создавать в предыдущих версиях нужно было. В 2,0 можно менять размер одной позиции.
Автор: komissar

Re: Область видимости объекта - Sun Jan 08 2017 06:38 PM

тогда я пас. но ошибка именно здесь. попробуйте не менять позицию.
Автор: komissar

Re: Область видимости объекта - Sun Jan 08 2017 06:42 PM

или сразу же после изменения ее проинциализировать.
Автор: konstantinio

Re: Область видимости объекта - Sun Jan 08 2017 06:48 PM

Я тестирую стратегию с донабором и сбросом позиции. К стати если не использовать цикл, а написать несколько раз то что делает цикл, то все работает. Но дело в том что цикл нужен.
Автор: komissar

Re: Область видимости объекта - Sun Jan 08 2017 06:56 PM

ТсЛаб не видит позицию. Добавте в цикле елсе
leVtbr = secVTBR.Positions.GetLastActiveForSignal("VTBR_LE", i);// Получаем позицию или null
seSbrf = secSBRF.Positions.GetLastActiveFor
Автор: konstantinio

Re: Область видимости объекта - Sun Jan 08 2017 07:07 PM

Пробовал уже. Тоже не дает результата. По идее объект должен быть виден так как он создается в родителе и используется во вложенной зоне видимости. Ни чего не понимаю. Родион недоучил. frown
Автор: komissar

Re: Область видимости объекта - Sun Jan 08 2017 07:20 PM

Тогда к нему. Создается - то в родителе, а меняется в цикле елсе. Мне кажется после каждого изменения нужна инициализация.
Автор: konstantinio

Re: Область видимости объекта - Mon Jan 09 2017 08:56 PM

С отладкой в visual Studio еще как на зло проблемы какие то начались. Не работают точки останова и все тут.
Пишет:
Quote:
В настоящий момент попадание в точку останова не произойдет. Нет загруженных символов для этого документа

Весь интернет прогуглил, все перепробовал - ничего толкового нет.
Автор: komissar

Re: Область видимости объекта - Tue Jan 10 2017 07:27 AM

Бывают такие заглюки. Оставляю в скрипте самый минимум и потихоньку добавляю. Как правило все вылазит от 'сам дурак' до версии NET и вирусов.
Автор: konstantinio

Re: Область видимости объекта - Wed Jan 11 2017 06:57 AM

Как говорится дело было не в бабине! Просто напутал количество лотов в наращивании и сбросе из за чего возникала такая ошибка.
Автор: komissar

Re: Область видимости объекта - Wed Jan 11 2017 11:16 AM

Originally Posted By: komissar
а еще мне кажется некорректное добавление позиции-здесь нужны новые обьеты.

Вот. Про что я вам и толдычил.