← Zurück

Как в 4.1 формировать свечки из тиков в реал тайме?

Как теперь формировать свечки из тиков в реальном времени? Мне нужно самому генерировать тики (сделки), без ITrader.

в 3 версии, я делал так:

определял источник свечек, с методом AddNewTrade() и через него скармливал тики. CandleManager соответственно строил свечки, а теперь?


public abstract class MyCandleSource : Disposable, ICandleSource

public class ParallelMyTraderCandleSource : MyCandleSource
    {
        private readonly SynchronizedList<Trade> _newTrades = new SynchronizedList<Trade>();

        private bool _isInProcess;
        private readonly Timer _timer;

        /// <summary>
        /// Создать <see cref="ParallelTraderCandleSource"/>.
        /// </summary>
        /// <param name="trader">Торговый шлюз, у которого используется событие <see cref="ITrader.NewTrades"/>.</param>
        public ParallelMyCandleSource()
            : this(TimeSpan.FromMilliseconds(300))
        {        }

        /// <summary>
        /// Создать <see cref="ParallelTraderCandleSource"/>.
        /// </summary>
        /// <param name="trader">Торговый шлюз, у которого используется событие <see cref="ITrader.NewTrades"/>.</param>
        /// <param name="interval">Интервал отправки новых сделок.</param>
        public ParallelMyCandleSource(TimeSpan interval)
            : base(int.MaxValue, int.MaxValue)
        {         

            _timer = interval.CreateTimer(OnProcessTrades);
        }

        /// <summary>
        /// Обработчик события <see cref="ITrader.NewTrades"/>.
        /// </summary>
        /// <param name="trades">Новые сделки.</param>
        protected override void OnNewTrades(IEnumerable<Trade> trades)
        {
            base.OnNewTrades(trades);

            _newTrades.AddRange(trades);
        }


        public override void AddNewTrades(Trade trade)
        {
            base.AddNewTrades(trade);

            _newTrades.Add(trade);
        }

        private void OnProcessTrades()
        {
            if (_isInProcess)
                return;

            _isInProcess = true;

            try
            {
                var newTrades = _newTrades.SyncGet(c =>
                {
                    var retVal = c.ToArray();
                    c.Clear();
                    return retVal;
                });

                if (newTrades.Length > 0)
                    base.RaiseNewTrades(newTrades);
            }
            finally
            {
                _isInProcess = false;
            }
        }        
    }

War dieses Thema hilfreich?

Thema teilen

Kommentare (2)

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

Alexander
Alexander

Теперь необходимо конвертировать данные в ICandleBuilderSourceValue. Смотрите в сторону класса ConvertableCandleBuilderSource.

Alexander
Alexander

TraderHelper.ToCandles в последней версии на codeplex