← Back

После обновления 4.0.6 не работают правила

Доброго времени суток

После обновления на версию 4.0.6, перестал работать вот такой код


this
   .When(CandleToken.CandlesStarted())
   .Do<IEnumerable<Candle>>(candles =>
   {
     var candle = candles.ElementAt(0);
   };


Ошибка	1	Делегат "System.Func<StockSharp.Algo.Strategies.StrategyRule<System.Collections.Generic.IEnumerable<StockSharp.Algo.Candles.Candle>>,System.Collections.Generic.IEnumerable<StockSharp.Algo.Candles.Candle>,System.Collections.Generic.IEnumerable<StockSharp.Algo.Candles.Candle>>" не принимает "1" аргументов	C:\VS2010\AmBot\Strategy.cs	53	42	AmBot

Comments (18)

Login or Create account, Log in or register to leave a comment

esper
esper

Попробуйте так

this
   .When(CandleToken.CandlesStarted())
   .Do(candles =>
   {
     var candle = candles.ElementAt(0);
   };
pehas
pehas Author

esper: Попробуйте так

this .When(CandleToken.CandlesStarted()) .Do(candles => ;


Какая-то ерунда. Если сделать так как в вашем примере, то candles - это не IEnumerable<candles>, а StrategyRule IEnumerable<candles>. Соответственно, когда ставишь после candles точку, студия показывает все методы и свойства StrategyRule. Хотя если навести на candles указатель мыши, показывает что candles имеет тип IEnumerable<candles>
Может в какие-то библиотеки конфликтуют после апдейта? (я не так давно знаком со студией, не уверен что такое возможно, но очень похоже)

Вот что я пользую
:::spoiler


```csharp

namespace AmBot
{
    using System;
    using System.Collections.Generic;
    using System.Linq;

    using StockSharp.Algo;
    using StockSharp.Algo.Logging;
    using StockSharp.Algo.Candles;
    using StockSharp.Algo.Indicators;
    using StockSharp.Algo.Indicators.Trend;
    using StockSharp.Algo.Indicators.Misc;
    using StockSharp.Algo.Indicators.Oscillator;
    using StockSharp.Algo.Strategies;
    using StockSharp.BusinessEntities;
    using StockSharp.Quik;

    class TurtleStrategy : Strategy
    {
        ...
        protected override void OnStarting()
        {
            var CandleToken = this.CM.Tokens.ElementAt(0);

            this
                .When(CandleToken.CandlesStarted())
                .Do(candles => {
                    var candle = candles.ElementAt(0);
                    ...
                });
            ...

pehas
pehas Author

Вот это еще интересно

Alexander
Alexander

Обновите все либы, перекомпилируйте проект. всё очень смахивает на локальные баги

Alexander
Alexander

Проверил - всё работает как прежде. Нужно пересобрать всё локально Проверял на таком примере:

this
   .When(order.NewTrades())
   .Do(trades =>
   {
     var trade = trades.ElementAt(0);
   });
pehas
pehas Author

Я новичек в с#. Не совсем понимаю, что значит пересобрать локально. Но, надеюсь, делаю правильно.

  • Перезалил папку References,
  • удалил obj и bin из проекта.
  • Запустил проект,
  • удалил из него все лишние юсинги и все ссылки.
  • Добавил заново нужные ссылки из References.
  • В меню отладка выбрал "пересобрать проект"

Если просто вставить ваш пример, то да ошибок не выдает (что уже плюс). Но если поставить точку после trades в теле Do, то все равно выдает методы StrategyRule в автокомплите. У вас нет? Я приложил скрин, может проблема в этой перегрузке?

Alexander
Alexander

Он у вас подсказку выдаёт для метода Do. candle тут не при чём.

pehas
pehas Author

Alexander Mukhanchikov: Он у вас подсказку выдаёт для метода Do. candle тут не при чём.

Подсказку я имею ввиду внутри Do а не на самом Do, как в первом моем скриншоте

Разве так должно быть? В версии 4.0.5 такого не было, выдавались методы для коллекции IEnumerable<Candle> ...

Alexander
Alexander

Убедили :)

Вот так работает:

				this
					.When(order.NewTrades())
					.Do((t, trades) =>
					    	{
								var trade = trades.ElementAt(0);
					    	});
pehas
Mikhail Sukhov
Mikhail Sukhov

У меня и вот такой работает:

this
  .When(order.NewTrades())
  .Do(trades =>
  {
	trades.ElementAt(0);
  });
Mikhail Sukhov
Mikhail Sukhov

Mikhail Sukhov: У меня и вот такой работает:

this .When(order.NewTrades()) .Do(trades => { trades.ElementAt(0); });


И вот такое:

```csharp
this
  .When(new CandleToken<TimeFrameCandle, TimeSpan>(null, TimeSpan.MinValue).CandlesStarted())
  .Do(candles =>
  {
    var candle = candles.ElementAt(0);
  });

Что-то видимо не до конца указываете. Можете прислать проектный файл целиком с минимальным не компилирующимся кодом.

pehas
pehas Author

Alexander Mukhanchikov: Убедили :)

Вот так работает:

			this
				.When(order.NewTrades())
				.Do((t, trades) =>
				    	{
							var trade = trades.ElementAt(0);
				    	});

О, другое дело!) Так работает. Ато я уже думал, у меня крыша начинает ехать 🤬 
pehas
pehas Author

Mikhail Sukhov: Что-то видимо не до конца указываете. Можете прислать проектный файл целиком с минимальным не компилирующимся кодом.

Работать то у меня работают и те примеры, что вы указали. Но это если их просто скопировать и вставить. А когда начинаешь там что-то менять - добавлять, студия сходит с ума.

Но если определение Do делать, как указал Александр, то все в порядке

Mikhail Sukhov
Mikhail Sukhov

pehas: Работать то у меня работают и те примеры, что вы указали. Но это если их просто скопировать и вставить. А когда начинаешь там что-то менять - добавлять, студия сходит с ума.

У меня то не сходит.

Alexander
Alexander

pehas:

Mikhail Sukhov: Что-то видимо не до конца указываете. Можете прислать проектный файл целиком с минимальным не компилирующимся кодом.

Работать то у меня работают и те примеры, что вы указали. Но это если их просто скопировать и вставить. А когда начинаешь там что-то менять - добавлять, студия сходит с ума.

Но если определение Do делать, как указал Александр, то все в порядке

приложите проект. может дело в юзингах \ референсах. дайте посмотреть, лучше сейчас разобраться чем откладывать.

pehas
pehas Author

Александр, Михаил

Отправил вам проект в личку. Файл TurtleStrategy.cs

Пробую на двух машинах - домашней и рабочей. Результат одинаковый Референсес все качал из 4.0.6 - Sources c SourceForge Проект перестраивал, юсинги все неиспользуемые удалял. Сыылки тоже все по одной передобавил только те, что были нужны.

Так же пробовал создать чистый проект и вставил туда только те либы, которые нужны были для запуска примера. Результат тот же..

Действительно студия себя ведет неадекватно..

Alexander
Alexander

К сообщению прикрепляю файл - всё ок. Ничего не менял в проектах, просто вписал это правило вместо того что там было.

Узнал что это нормально когда студия по нажатию . (интелли сенс) думает что candles - StrategyRule. Тип-то не знает. А он действительно может быть StrategyRule. Допишите руками ElementAt(0) и всё нормально.

в общем - удалите старые файлы, перекомпилируйте - и в бой :)

pehas
pehas
pehas Author

Значит не глюк.. Видимо просто добавили перегрузку и теперь оно может быть и StrategyRule тоже. Раньше видимо не могло в предыдущих версиях. Ладно, тогда мылю лыжи и в перед к новым подвигам. Хорошо что разобрались 😎