← Назад

Не формируются свечи

Коллеги!

Никак не соображу в чем проблема, вот код (версия 4.1.4) :

security = new Security { Id = "GAZP@EQNE", MinStepSize = 0.01m, Exchange = Exchange.Micex };
        List<Trade> trades = makeDealsFromHistory(edtPathToHistoryFile.Text);
        foreach (var trade in trades)
        {
            trade.Security = security;
            trade.OrderDirection = OrderDirections.Sell;
        }
        DateTime from = trades.Min(trade => trade.Time).AddDays(-1);
        DateTime to = trades.Max(trade => trade.Time).AddDays(1);
        var builderSource = new RawConvertableCandleBuilderSource<Trade>(security, from , to, trades);

        CandleSeries series = new CandleSeries(typeof(RangeHLCandle), security, edtStockRange.Value);
        CandleManager candleManager = new CandleManager();
        candleManager.Sources.Add(new RangeHLCandleBuilder { Sources = { builderSource }});

        candleManager.Start(series);
        List<RangeHLCandle> candles1 = series.GetCandles<RangeHLCandle>().ToList();

        chartMain.Series[0].Points.DataBind(candles1, String.Empty, "LowPrice,HighPrice,OpenPrice,ClosePrice",
                                            "Tooltip = HighPrice");
    }

}

Вроде все делаю как в мануале и как во многих ветках форума тут, однако свечи упорно не формируются, список candles1 - пустой. Дело даже не доходит до методов CreateCandle, UpdateCandle, IsCandleFinishedBeforeChange в самой реализации RangeHLCandleBuilder : CandleBuilder<RangeHLCandle> , в метод GetSupportedRanges один раз заходит, судя по всему из candleManager.Start(series);

Помогите кто чем может!

Комментарии (16)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

Moadip
Moadip

Судя по коду вы пытаетесь прочитать сделки из txt файла, собрать из них свечки и вывести в чарт.

По пунктам:

  1. makeDealsFromHistory - это я так понимаю класс который берет сделки из txt и делает из них Trade. Так может сразу брать тики которые сохранены гидрой?

  2. DateTime from = trades.Min(trade => trade.Time).AddDays(-1); DateTime to = trades.Max(trade => trade.Time).AddDays(1);

Не понятен смысл этих строк. допустим есть сделки с 10 по 20 октября. Тогда в from будет 9 ноября а в to 21. Для чего?😳

  1. RangeHLCandle. Возможна есть проблемы в этом дочернем классе. Для начала думаю лучше добиться чтобы в чарт выводились свечки, взяв какой нибудь готовый класс свечек из S#. Потом уже делать со своими дочерними классами. Это надо, чтобы поэтапно исключить возможные места с ошибками.
Tauler
Tauler Автор

По пунктам 1 и 2 - они родились уже в процессе отладки

  1. Ну вот такой у меня источник :) Не факт ,что буду Гидру использовать. В итоге мы имеем список сделок.

2.Сделки в текстовом файле за 29 число, время не указано. Эти строки для того, чтобы гарантировано они попали в период времени.

  1. Да RangeHLCandle проще простого:

public class RangeHLCandle : Candle
    {
        public override object Arg
        {
            get { return Range; }
            set { Range = (decimal) value; }
        }

        public decimal Range { get; set; }
    }
Tauler
Tauler Автор

Проблема в том, что "Дело даже не доходит до методов CreateCandle, UpdateCandle, IsCandleFinishedBeforeChange"

Tauler
Tauler Автор

Попробую сейчас со стандартными свечками.

Я вот думаю - может в Trade я какое то значимое свойство пропускаю? Заполняю при создании Trade свойства Id, Price, Volume , перед созданием RawConvertableCandleBuilderSource<Trade> проставляю Security и OrderDirection. Security везде одинаковая

security = new Security
                           {
                               Id = "GAZP@EQNE",
                               MinStepSize = 0.01m,
                               Exchange = Exchange.Micex
                           };
Tauler
Tauler Автор

C RangeCandle тоже не катит. Ощущение, что до строителя свечей дело вообще не доходит

Moadip
Moadip

Пример сделок в txt


652116654;2012-10-26 10:00:00;145330;1;Sell
652116655;2012-10-26 10:00:00;145330;2;Sell
652116656;2012-10-26 10:00:00;145320;1;Sell
652116657;2012-10-26 10:00:00;145270;5;Sell
652116658;2012-10-26 10:00:00;145270;2;Sell
652116659;2012-10-26 10:00:00;145270;10;Sell
652116660;2012-10-26 10:00:00;145250;1;Sell
652116661;2012-10-26 10:00:00;145250;10;Sell
652116662;2012-10-26 10:00:00;145200;1;Sell
652116663;2012-10-26 10:00:00;145190;2;Sell
652116664;2012-10-26 10:00:00;145150;2;Sell
652116665;2012-10-26 10:00:00;145150;1;Sell
652116666;2012-10-26 10:00:00;145150;5;Sell
652116667;2012-10-26 10:00:00;145150;1;Sell
652116668;2012-10-26 10:00:00;145130;1;Sell
652116669;2012-10-26 10:00:00;145110;1;Sell
652116670;2012-10-26 10:00:00;145100;5;Sell
652116671;2012-10-26 10:00:00;145100;20;Sell
652116672;2012-10-26 10:00:00;145100;1;Sell
652116673;2012-10-26 10:00:00;145080;10;Sell
652116674;2012-10-26 10:00:00;145070;2;Sell
652116675;2012-10-26 10:00:00;145070;2;Sell
652116676;2012-10-26 10:00:00;145060;10;Sell
652116677;2012-10-26 10:00:00;145060;1;Sell
652116678;2012-10-26 10:00:00;145050;2;Sell
652116679;2012-10-26 10:00:00;145050;10;Sell
652116680;2012-10-26 10:00:00;145050;2;Sell

Класс для парсинга txt файла


	public class TradeFromTxt
	{
		private readonly string _path ;
		private readonly Security _security;

		public TradeFromTxt(string path, Security security)
		{
			_path = path;
			_security = security;
		}

		public IEnumerable<Trade> GetTrades()
		{
			var trades = CultureInfo.InvariantCulture.DoInCulture(() => File.ReadAllLines(_path).Select(line =>
			{
				var parts = line.Split(';');

				var time = DateTime.Parse(parts[1].To<string>());
				
				return new Trade
				{
					Security = _security,
					Time = time,
					Price = parts[2].To<decimal>(),
					Volume = parts[3].To<decimal>(),
					OrderDirection = parts[4].To<OrderDirections>()
				};
			}));

			return trades;
		}
	}

Tauler
Tauler
Tauler Автор

Магия какая-то ,у меня все точно так же переделано, свечей- 0. У Вас какая версия стокшарпа? у меня 4.1.1

Moadip
Moadip

Одна из последних сборок 4.1.5

Tauler
Tauler Автор

Ваш пример у меня работает, буду копать. Спасибо !

Tauler
Tauler Автор

Твою ж мать ! :) Знаете в чем бага была? А моем файле у сделок время 00:00:00, вот и за этого видимо по ним свечки не строились. С одной стороны - у Exchage.Rts есть четко указанные интервалы, с другой - ну для RangeCandle какая на фиг разница :)

Михаил, это бага, фича или known issue?

Tauler
Tauler Автор

Коллеги, осталось чуть чуть до полной победы разума над бездушной машиной :)

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

Делаю так:

IList<ICandleBuilderSourceValue> data = Container.GetValues(series, candle).ToList();

но в итоге в data пусто. С контейнерами я ничего не химичил,вот оба конструктора:

    ```csharp

public RangeHLCandleBuilder()

    public RangeHLCandleBuilder(ICandleBuilderContainer container) : base(container)
    {} 

Есть какие либо мысли?

Вручную нигде в этот контейнер не надо ничего совать?
Tauler
Tauler Автор

Отцы-основатели, ну вы хоть помогите :)

Tauler
Tauler Автор
protected override bool IsCandleFinishedBeforeChange(CandleSeries series, RangeHLCandle candle, ICandleBuilderSourceValue value)
        {
            Container.AddValue(series, candle, value);
            var data = Container.GetValues(series, candle);
            int i = data.Count();
         }

Даже тут i получается 0. В чем секрет, никто не знает? Версия стокшарпа 4.1.4

Tauler
Tauler Автор

Нашел секрет. Почему то по умолчанию свойство Container.ValuesKeepTime = 00:00:00. Хотя в документации Время хранения ICandleBuilderSourceValue в памяти. По-умолчанию равно 2-ум дням. Но заметил - если в конструкторе

    ```csharp

public RangeHLCandleBuilder()


то в коллекции IList<ICandleBuilderSourceValue> data = Container.GetValues(series, candle).ToList(); есть сделки.
Но сам процесс построения свечей гораздо дольше.
Mikhail Sukhov
Mikhail Sukhov

Tauler: Нашел секрет. Почему то по умолчанию свойство Container.ValuesKeepTime = 00:00:00. Хотя в документации Время хранения ICandleBuilderSourceValue в памяти. По-умолчанию равно 2-ум дням.

Спасибо, поправим.

Tauler
Tauler Автор

Михаил, хочу обратить внимание,что при Container.ValuesKeepTime = 00:00:00 свечки порезвей строятся. Ну или мне показалось.