← Atrás

ExpressionIndexSecurity в Shell не рассчитывается

Здравствуйте, возник вопрос по формированию индексного графика в Shell. Пытаюсь сделать индекс при помощи ExpressionIndexSecurity и RoslynCompilerService, но индекс не формируется, в графе Expression после инициализации нового инструмента остается null, соответственно и инструмента нет, ошибок никаких не выдает C#. При этом вне рамок Shell все нормально работает. На приложенном скрине два варианта остановы, в которых видно , что в обычной форме индекс создается, а во втором (Shell) нет. Я в Shell пытался код с формированием индекса включать даже при инициализации главной формы но результат тот же. Не пойму, что я делаю не так?

¿Le resultó útil este tema?

Compartir tema

Comentarios (9)

Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario

Support
Support

Добрый день

Пожалуйста, пришлите ваш код на support@stocksharp.com

allint29
allint29 Autor

Support: Добрый день

Пожалуйста, пришлите ваш код на support@stocksharp.com Добрый день выслал на почту код из shell.

Support
Support

Добрый день

Попробуйте вместо RoslynCompilerService использовать следующий:

ConfigManager.RegisterService<ICompilerService>(new Fw40CompilerService(Directory.GetCurrentDirectory(), Directory.GetCurrentDirectory()));

После этого ваш код у нас заработал:

_indexSecurity = new ExpressionIndexSecurity()
           {
               Id = "INDEXTWO@FORTS",
               Code = "IndexMy",
               
           Expression = "RIM9@FORTS-10000",
           Board = ExchangeBoard.Micex,
           };

	        var result = _indexSecurity.Formula.Calculate(new[] { 167.43m });

	        if (result != -9832.57m)
	        {
		        throw new Exception(result.ToString());
	        }
allint29
allint29 Autor

Здравствуйте, данная корректировка помогла, начали производиться вычисления, но теперь вычисления заканчиваются на открытии свечи, то есть если взять индекс без всяких коэффициентов, то на выходе получаю бар с открытием закрытием и телом в одну точку равным открытию бара данного инструмента на данном таймфрейме. Сначала думал, что индекс строится не из сделок а из свечей таймфрейма, но пробовал разные таймфреймы нестандартные, всегда бар начинается и заканчивается открытием свечи того таймфрейма, который выбран. Скрин экрана прилагаю. Еще хочу уточнить, что на версии 4.4.5.4 из учебного примера все работает как надо на тех же данных.QuestByShellIndex2.jpg

Support
Support

Просьба уточнить ваш вопрос. В Шелл не было индексов. О каком архиве идёт речь?

allint29
allint29 Autor

Support: Просьба уточнить ваш вопрос. В Шелл не было индексов. О каком архиве идёт речь?

Я не только про Shell описываю, а программу которая написана на библиотеке версии (на которых пробовал) 4.4.15 и 4.4.16. В Shell которая у меня, например, версия библиотеки StockSharp.Algo 4.4.15 (версию библиотеки смотрю в свойствах ссылок на библиотеку), а версия из учебного примера (в котором все работает нормально) - 4.4.5.4, там даже модуль Expression выведен в отдельный файл. Я не разработчик данной библиотеки, но считаю что это баг, или, возможно, с версии обучающего видео процедура расчета индекса изменилась и тогда хотелось бы узнать эту процедуру.

Support
Support

Пожалуйста, пришлите ваш код для воспроизведения ошибки.

allint29
allint29 Autor

Support: Пожалуйста, пришлите ваш код для воспроизведения ошибки. В спойлере - код. :::spoiler using System; using System.IO; using System.Linq; using System.Windows; using System.Windows.Controls; using Ecng.Common; using Ecng.Configuration; using StockSharp.Algo.Candles; using StockSharp.Algo.Expressions; using StockSharp.Algo.Storages; using StockSharp.Algo.Testing; using StockSharp.BusinessEntities; using StockSharp.Logging; using StockSharp.Messages; using StockSharp.Xaml.Charting;

namespace FirstConsole.XAML { /// <summary> /// Логика взаимодействия для Index.xaml /// </summary> public partial class Index : UserControl { private HistoryEmulationConnector _connector; private ChartCandleElement _candleElement; private CandleManager _candleManager; // создадим менеджер свечей - из него будем получать свечи

    private CandleSeries _candleSeries;
    private Security _security;
    private Security _indexSecurity;
    private Portfolio _portfolio;
    private readonly LogManager _logManager;

    private readonly string _pathHistory = @"G:\Sharp\Hydra\CSVFromFinamReady\".ToFullPath();
    public Index()
    {
        InitializeComponent();
        //здесь без разницы какую службу включать, в Shell работает только Fw40
        //     ConfigManager.RegisterService<ICompilerService>(new RoslynCompilerService());
        ConfigManager.RegisterService<ICompilerService>(new Fw40CompilerService(Directory.GetCurrentDirectory(), Directory.GetCurrentDirectory()));
        _logManager = new LogManager();
        _logManager.Listeners.Add(new FileLogListener("log.txt"));
        _logManager.Listeners.Add(Monitor);

        CandleSettingsEditor.Settings = new CandleSeries()
        {
            CandleType = typeof(TimeFrameCandle),
            Arg = TimeSpan.FromMinutes(5)
        };

        DatePickerBegin.SelectedDate = new DateTime(2019, 03, 23);
        DatePickerEnd.SelectedDate = new DateTime(2019, 05, 10);
    }

    private void Start_Click(object sender, RoutedEventArgs e)
    {
        //здесь без разницы какую службу включать, в Shell работает только Fw40
 //       ConfigManager.RegisterService<ICompilerService>(new Fw40CompilerService(Directory.GetCurrentDirectory(), Directory.GetCurrentDirectory()));
   //     ConfigManager.RegisterService<ICompilerService>(new RoslynCompilerService());
        _security = new Security
        {
            Id = "RIM9@FORTS",
            Code = "RTS",
            PriceStep = 10m,
            Board = ExchangeBoard.Micex,
        };
        _indexSecurity = new ExpressionIndexSecurity()
        {
            Id = "IndexInstr@FORTS",
            Code = "IndexInstr",
            Expression = "RIM9@FORTS/2",
            Board = ExchangeBoard.Micex,
        };

        _portfolio = new Portfolio { Name = "test portfolio", BeginValue = 10000000 };


        var storageRegistry = new StorageRegistry
        {
            DefaultDrive = new LocalMarketDataDrive(_pathHistory),
        };

        _connector = new HistoryEmulationConnector(new[] { _security, _indexSecurity }, new[] { _portfolio })
        {
            HistoryMessageAdapter =
            {
                StorageRegistry = storageRegistry,
                StorageFormat = StorageFormats.Csv,
                StartDate = DatePickerBegin.SelectedDate.Value.ChangeKind(DateTimeKind.Utc),
                StopDate = DatePickerEnd.SelectedDate.Value.ChangeKind(DateTimeKind.Utc),
            },
            LogLevel = LogLevels.Info,
        };
        _logManager.Sources.Add(_connector);

        //зарегистрируем в менеджере конфигураций коннектор как источник инструментов
        //в версии 4.15 4.16 работает и без регистрации
 //       ConfigManager.RegisterService<ISecurityProvider>(_connector);

        _candleSeries = new CandleSeries(CandleSettingsEditor.Settings.CandleType, _indexSecurity, CandleSettingsEditor.Settings.Arg)
        {
            BuildCandlesMode = MarketDataBuildModes.Build,
            BuildCandlesFrom = MarketDataTypes.Trades,
        };

        InitCart();

        _candleManager = new CandleManager(_connector);
        _candleManager.Processing += Processing;
        _connector.NewSecurity += Connector_NewSecurity;
        _connector.Connect();
    }


    private void Connector_NewSecurity(Security security)
    {
        if (_connector.Securities.Count() < 2) return;
        //в версии 4.15, 4.16 работает и без этого
       _connector.RegisterTrades(_indexSecurity);
        //запускаем менеджер свечей на получение свечей по индексу
        _candleManager.Start(_candleSeries);
        _connector.Start();
    }

    private void Processing(CandleSeries candleSeries, Candle candle)
    {
        //в методе отрисовки свечей нужно проверять - является ли свеча индекса или нет и только их отрисовывать на графике
        if (candleSeries.Security != _indexSecurity) return;

        Chart.Draw(_candleElement, candle);
    }

    private void InitCart()
    {
        Chart.ClearAreas();
        var area = new ChartArea();
        _candleElement = new ChartCandleElement();

        Chart.AddArea(area);
        Chart.AddElement(area, _candleElement);
    }

}

}

Support
Support

В приложении модицифированный пример SampleHistoryTesting, который выводит индексные свечи согласно формуле:

508e1b0ebae2eec2b77394615221a0d4.png