Всем салют! С прошедшими праздниками!
Ниже представлен скрипт который выдает ошибку типа:
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
        }
    }

}

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


Отредактировано konstantinio (Mon Jan 09 2017 08:49 PM)