0
Answered

Агрегация данных онлайн-сделок по свечам графика

Project Center PSU 1 year ago updated by Андрей Ринас2 (ATAS developer) 1 year ago 2

Добрый день, при работе с данными онлайн-тиков (статья https://support.orderflowtrading.ru/knowledge-bases/46/articles/24942-poluchenie-onlajn-tikov-i-agregirovannyih-sdelok) был переопределен метод OnNewTrade в теле которого идет подсчет объема сделок по свечам (аналог стандартного индикатора Volume - с той лишь разницей, что стандартный индикатор берет данные из свечей на графике, а разрабатываемый - данные онлайн-тиков)

int _startBar = CurrentBar - 1; //берем текущий торгуемый бар
bool _search = true; //флаг того, что нужная свеча найдена
while (_search)
{
var curCandle = GetCandle(_startBar); //берем свечу по индексу бара
if (curCandle.Time >= arg.Time) //если текущая свеча началась позже сделки, то смотрим предыдущую свечу
{
_startBar--;
}
//если текущая свеча началась раньше сделки (т.е. сделка вероятно в пределах свечи)
else
{
//если текущая свеча закончилась раньше сделки, то сделка не оказалась ни в одной свече правее рассматриваемой, но она была уже позже текущей свечи - добавлено для проверки того, что сделки не теряются "между" свечами
if (arg.Time > curCandle.LastTime)
{
this.LogWarn("We lost trade between candles"); //вывод сообщения в лог
_search = false; //прекращаем поиск
}
//если текущая свеча закончилась позже сделки
else
{
_cumulativeDeltaAll[_startBar] += arg.Volume;
_search = false;
}
}
}

При проверке работы этого метода на временных графиках (минутный, секундный) любого таймфрейма (1,5,10,15..) - все работает, данные совпадают с данными индикатора Volume

НО при подключении данного индикатора к графику типа Delta - данные начинают расходиться

Прошу пояснить, с чем это может быть связано, а также как в таком случае необходимо агрегировать сделки (для дальнейших вычислений нужны именно одиночные trade а не cumulative) по свечам

Примечание:

В строчке "bool _search = true; //флаг того, что нужная свеча найдена" неверный комментарий - данная логическая переменная - флаг продолжения поиска свечи, как только нужная свеча находится - он становится false и поиск прекращается

+1
Answered

Здравствуйте.

Здесь дело в том, что из торгового подключения тики приходят пачками и обрабатываются сначала для построения свечек, далее для передачи в OnNewTrade.

Т.е. может быть такая ситуация:

1)из коннектора приходит 10 тиков с одним timestamp

2)эти тики обрабатываем и строим свечки. Допустим, у нас тиковый ТФ: 5 ticks. В результате обработки тиков, получим 2 свечки с одним начальным timestamp

3)в момент появления новых свечек в индикаторах вызывается OnCalculate

4)после того, как свечки будут построены, 10 раз вызовется OnNewTrade

В этом кейсе по времени свечек нельзя определить какой тик к какой свечке относится.

Это можно решить, сравнивая объем уже сформированных свечек с рассчетным объемом.

Вот пример индикатора, который определяет к какой свечке относится тот или иной тик и передает этот тик с номером бара в свой метод ProcessTrade

public class BarForTickDetectionSample : Indicator
    {
        public BarForTickDetectionSample()
        {
            var series=(ValueDataSeries)DataSeries[0];
            series.VisualType = VisualMode.Hide;
        }

        protected override void OnCalculate(int bar, decimal value)
        {
            
        }

        protected override void OnNewTrade(MarketDataArg trade)
        {
            var bar = CurrentBar;
            
            while (bar>0)
            {
                bar--;

                var candle = GetCandle(bar);

                if (this[bar] < candle.Volume)
                {
                    this[bar] += trade.Volume;
                    ProcessTrade(trade, bar);
                }
            }
        }

        private void ProcessTrade(MarketDataArg trade, int bar)
        {
            //Here you can process this trade for specific bar number
        }
    }