← Zurück

После обновления 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

War dieses Thema hilfreich?

Thema teilen

Kommentare (18)

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

esper
esper

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

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

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 Autor

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

Alexander
Alexander

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

Alexander
Alexander

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

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

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

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

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

Alexander
Alexander

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

pehas
pehas Autor

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 Autor

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

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

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

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

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

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

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

Mikhail Sukhov
Mikhail Sukhov

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

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

Alexander
Alexander

pehas:

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

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

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

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

pehas
pehas Autor

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

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

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

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

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

Alexander
Alexander

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

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

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

pehas
pehas
pehas Autor

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