Индикатор на MqlTick, подскажите пример кода.

 

Сразу сорри, за запрос халявы, блин времени нет, может у кого есть кусок кода.

Нужен индикатор в виде гистограммы, ну как индикатор объема, только значения его это кол-во сделок (тиков приведших к сделке) в баре, в зависимости от ТФ, интересует чтобы работал хотя бы на  М1. Никаких объемов, просто кол-во сделок прошедших за бар при выбранном ТФ.

Понятно, что MqlTick нужно использовать, но потом как-то перебирать этот массив чтобы сложить сделки по бару.. История интересна только с начала дня.

 

 

 

 
iuiu:

Сразу сорри, за запрос халявы, блин времени нет, может у кого есть кусок кода.

Нужен индикатор в виде гистограммы, ну как индикатор объема, только значения его это кол-во сделок (тиков приведших к сделке) в баре, в зависимости от ТФ, интересует чтобы работал хотя бы на  М1. Никаких объемов, просто кол-во сделок прошедших за бар при выбранном ТФ.

Понятно, что MqlTick нужно использовать, но потом как-то перебирать этот массив чтобы сложить сделки по бару.. История интересна только с начала дня.

 

 

 

При чем тут MqlTick? Нужно просто пройтись по сделкам и получать их время закрытия. Дальше смотреть попадание в нужный бар. Проще всего использовать СБ, класс CDealInfo
 
iuiu:

Сразу сорри, за запрос халявы, блин времени нет, может у кого есть кусок кода.

Нужен индикатор в виде гистограммы, ну как индикатор объема, только значения его это кол-во сделок (тиков приведших к сделке) в баре, в зависимости от ТФ, интересует чтобы работал хотя бы на  М1. Никаких объемов, просто кол-во сделок прошедших за бар при выбранном ТФ.

Понятно, что MqlTick нужно использовать, но потом как-то перебирать этот массив чтобы сложить сделки по бару.. История интересна только с начала дня.

 

 

 

Я кончено могу и ошибаться, но разве тиковый объем это не есть аналог количества сделок?  
 
Vitalii Ananev:
Я кончено могу и ошибаться, но разве тиковый объем это не есть аналог количества сделок?  
На фондовом рынке да, на Форекс не понятно что это за объем. По этому нужно более детальное описание чего вы хотите, желательно с картинками.
 

Alexey Volchanskiy:
При чем тут MqlTick? Нужно просто пройтись по сделкам и получать их время закрытия. Дальше смотреть попадание в нужный бар. Проще всего использовать СБ, класс CDealInfo 

Спасибо, попробую. СБ - стандартная библиотека? 

 
Vitalii Ananev:
Я кончено могу и ошибаться, но разве тиковый объем это не есть аналог количества сделок?  Мне для ФОРТС, я думал - тиковый объем, это кол-во контрактов за тик (сделку) прошло, а мне нужен сам факт сделки.
 
iuiu:Мне для ФОРТС, я думал - тиковый объем, это кол-во контрактов за тик (сделку) прошло, а мне нужен сам факт сделки.
Есть же реальный объем. CopyRealVolume()  для чего?
 

Vitalie Postolache:
Есть же реальный объем. CopyRealVolume()  для чего?


 Я не совсем понимаю, при чем тут объем, если мне нужно кол-во сделок, в сделке может быть какой угодно объем! я не совсем понимаю, что показывает CopyRealVolume Функция получает в массив volume_array исторические данные торговых объемов для указанной пары символ-период. Что такое торговый объем ?
 
iuiu:
 Я не совсем понимаю, при чем тут объем, если мне нужно кол-во сделок, в сделке может быть какой угодно объем! я не совсем понимаю, что показывает CopyRealVolume Функция получает в массив volume_array исторические данные торговых объемов для указанной пары символ-период. Что такое торговый объем ?
Объём торгов на фондовом рынке рассчитывается как число акций, переходящее от продавцов к покупателям, то есть как торговый оборот внутри дня (ну или выбранного ТФ).
 
iuiu:
 Я не совсем понимаю, при чем тут объем, если мне нужно кол-во сделок, в сделке может быть какой угодно объем! я не совсем понимаю, что показывает CopyRealVolume Функция получает в массив volume_array исторические данные торговых объемов для указанной пары символ-период. Что такое торговый объем ?

Я так думаю, что 1 тик это и есть 2 сделки. Один купил второй ему продал цена изменилась в результате генерируется тик и на клиентский терминал отправляется новая цена.

 Тиковый объем – отражает количество тиков в единицу времени, а сам «тик» — это ни что иное, как изменение цены инструмента на один базовый пункт. Фактически, данная разновидность объема представляет собой обычный счетчик колебаний и никак не привязана к объемам сделок.

 
iuiu:

Нужен индикатор в виде гистограммы, ну как индикатор объема, только значения его это кол-во сделок (тиков приведших к сделке) в баре, в зависимости от ТФ, интересует чтобы работал хотя бы на  М1. Никаких объемов, просто кол-во сделок прошедших за бар при выбранном ТФ.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Загадочный биржевой индикатор

fxsaber, 2016.10.04 11:28

// Индикатор в виде гистограммы показывает проторгованный оборот BUY и SELL

#property indicator_separate_window

#property indicator_buffers 2
#property indicator_plots 2

#property indicator_label1  "TurnOver_BUY"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_style1 STYLE_SOLID
#property indicator_color1 clrYellow

#property indicator_label2  "TurnOver_SELL"
#property indicator_type2 DRAW_HISTOGRAM
#property indicator_style2 STYLE_SOLID
#property indicator_color2 clrRed

long LastTime = 0; // time_msc-время последнего тика (самого свежего), полученного из истории
int Count = 0;     // Количество тиков в последенем запросе, у которых time_msc == LastTime

double Buffer0[];
double Buffer1[];

// Возвращает свежие тики, пришедшие после предыдущего вызова
int GetFreshTicks( MqlTick &Ticks[], const uint flags = COPY_TICKS_TRADE, const uint count = 100000 )
{
  int Res = 0;

  MqlTick NewTicks[];
  const int NewAmount = CopyTicks(Symbol(), NewTicks, flags, LastTime, count);

  if ((NewAmount > 0) && (Count < NewAmount))
  {
    Res = ArrayCopy(Ticks, NewTicks, 0, Count);

    // Взяли крайнее время из текущей истории
    LastTime = NewTicks[NewAmount - 1].time_msc;
    Count = 1;

    // Находим (Count) в текущей истории количество тиков со временем LastTime
    for (int i = NewAmount - 2; i >= 0; i--)
    {
      if (NewTicks[i].time_msc < LastTime)
        break;

      Count++;
    }
  }

  return(Res);
}

// Ширина гистограммы
void SetScale()
{
  const int Width = 9 / (1 << (5 - (int)ChartGetInteger(0, CHART_SCALE)));

  if (Width != PlotIndexGetInteger(0, PLOT_LINE_WIDTH))
  {
    PlotIndexSetInteger(0, PLOT_LINE_WIDTH, Width);
    PlotIndexSetInteger(1, PLOT_LINE_WIDTH, Width);

    ChartRedraw();
  }
}

void OnInit()
{
  SetIndexBuffer(0, Buffer0);
  SetIndexBuffer(1, Buffer1);
}

void OnChartEvent( const int id, const long &lparam, const double &dparam, const string &sparam )
{
  if (id == CHARTEVENT_CHART_CHANGE)
    SetScale();
}

// Заполняет бар соответствующими ему тиками
void SetBarData( const datetime TimeBar, const MqlTick &Ticks[], int &Pos, double &TurnOverBuy, double &TurnOverSell )
{
  const datetime NextTime = TimeBar + PeriodSeconds();
  const int Amount = ArraySize(Ticks);

  while (Pos < Amount)
  {
    const MqlTick Tick = Ticks[Pos];

    if (Tick.time >= NextTime)
      break;

    if ((bool)(Tick.flags & TICK_FLAG_BUY))
      TurnOverBuy += (double)Tick.volume;
    else if ((bool)(Tick.flags & TICK_FLAG_SELL))
      TurnOverSell -= (double)Tick.volume;

    Pos++;
  }

  return;
}

int OnCalculate( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[] )
{
  if (prev_calculated == 0)
  {
    // возьмем тики с начала утренней сессии
    LastTime = (TimeCurrent() - (TimeCurrent() % (24 * 3600))) * 1000;

    Count = 0;
  }

  // Зануляем новые бары
  if (rates_total > prev_calculated)
  {
    ArrayFill(Buffer0, prev_calculated, rates_total - prev_calculated, 0);
    ArrayFill(Buffer1, prev_calculated, rates_total - prev_calculated, 0);
  }

  MqlTick Ticks[];

  // Взяли свеженькие тики
  const int Amount = GetFreshTicks(Ticks);

  if (Amount > 0)
  {
    int Pos;

    const datetime LastTime2 = Ticks[0].time - (Ticks[0].time % PeriodSeconds());

    // Находим бар (Pos), включающий первый свежий тик
    for (Pos = rates_total - 1; Pos >= 0; Pos--)
      if (time[Pos] == LastTime2)
        break;

    if (Pos >= 0)
    {
      int i = 0;

      // Заполняем бары своими тиками
      while ((Pos < rates_total) && (i < Amount))
      {
        SetBarData(time[Pos], Ticks, i, Buffer0[Pos], Buffer1[Pos]);

        Pos++;
      }
    }
  }

  return(rates_total);
}
Заменить выделенное в коде на
    if ((bool)(Tick.flags & TICK_FLAG_BUY))
      TurnOverBuy += 1;
    else if ((bool)(Tick.flags & TICK_FLAG_SELL))
      TurnOverSell -= 1;