← 返回

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

Коллеги!

Никак не соображу в чем проблема, вот код (версия 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 свечки порезвей строятся. Ну или мне показалось.