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

 

браво за проделанную работу.

администрации пора все же задуматься о прикручивании рейтинговой системы пользователей. любой управленец скажет,что человека надо поощерять за проделанную работу. хотя бы обычной спасибкой,а тут даже кнопки нет такой. к тому же, раз вы стремитесь к созданию сообщества трейдеров/программистов, то должна быть система поощерений самим сообществом пользователей,сделавшим что-то полезное для этого сообщества.

 
fxsaber:

1434 - проблему не решил.

Накосячил я - индикатор работает, как запрограммировал. Рабочая версия (без косяков)
// Индикатор в виде гистограммы показывает проторгованный оборот 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);
}
Тема закрыта - загадка решена.
Файлы:
TurnOver.mq5  5 kb
 
fxsaber:
Накосячил я - индикатор работает, как запрограммировал. Рабочая версия (без косяков)Тема закрыта - загадка решена.

Установил индикатор, он показывает до 11:35 гистограмму последнего торгового дня - к серверу подключен - это почему так?

И, не совсем понял, он показывает тики (рывки цены) или объемы (покупка/продажа)?

Причина обращения: