Стакан - на половину полный или на половину пустой - как Вы анализируете стакан и применяете его в торговле? - страница 4

 
Alexey Kozitsyn:

И стратегию можно реализовать. Своеобразный "фронтраннинг" получается.

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

 
Alexey Kozitsyn:

Если получится сделать все до линий, то и линии можно будет.

Где бы найти ещё такого умельца...

 
Aleksey Vyazmikin:

Где бы найти ещё такого умельца...

Умельца найти можно, но зачем? Ради линии в стакане писать все остальное?

 
Alexey Kozitsyn:

Умельца найти можно, но зачем? Ради линии в стакане писать все остальное?

Маркировать уровни очень важно. Но, вполне возможно просто сделать индикацию, а сами линии наносить на чарт и от туда брать уровни.

 

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

https://www.mql5.com/ru/forum/231011

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

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1

#property indicator_label1 "Delta"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrBlack
#property indicator_width1 1

int iStart;
double iDelta[];

void OnDeinit(const int reason)
{
  string symbol = Symbol();

  MarketBookRelease(symbol);
}

void OnInit()
{
  string symbol = Symbol();

  SetIndexBuffer(0, iDelta, INDICATOR_DATA);
  ArraySetAsSeries(iDelta, true);

  IndicatorSetString(INDICATOR_SHORTNAME, "OrderBook");
  IndicatorSetInteger(INDICATOR_DIGITS, Digits());

  MarketBookAdd(symbol);
}

int OnCalculate(
  const int bars,
  const int counted,
  const datetime& time[],
  const double& open[],
  const double& high[],
  const double& low[],
  const double& close[],
  const long& ticks[],
  const long& volume[],
  const int& spread[]
)
{
  if (iStart == 0)
  {
    iStart = 1;
    ZeroMemory(iDelta);
  }
  else if (bars != counted)
  {
    iDelta[0] = iDelta[1];
  }

  string symbol = Symbol();

  double ask = SymbolInfoDouble(symbol, SYMBOL_ASK);
  double bid = SymbolInfoDouble(symbol, SYMBOL_BID);

  MqlBookInfo levels[];

  bool book = MarketBookGet(symbol, levels);

  int indexBuy = 1;
  int indexSell = 1;
  long volumeBuy = 0;
  long volumeSell = 0;

  if (book)
  {
    int size = ArraySize(levels);

    for (int k = 0; k < size; k++)
    {
      if (levels[k].price >= ask) 
      {
        volumeSell += indexSell * levels[k].volume;
        indexSell++;
      }
    }

    for (int k = size - 1; k >= 0; k--)
    {
      if (levels[k].price <= bid) 
      {
        volumeBuy += indexBuy * levels[k].volume;
        indexBuy++;
      }
    }
  }

  iDelta[0] = (double) (volumeBuy - volumeSell);
  
  return bars;
}
 
Andy Sanders:

Не очень хорошая реализация.

1. Буки лучше получать в специально предназначенной для этого функции, иначе получите пропуски.

2. Да, из циклов можно раньше выходить. Делаете лишних 20 проверок в каждом. 

По поводу идеи - поясните, пожалуйста, что это дает? Что делает Ваш индикатор? Как он поможет выделить "не фейковые" уровни?

 
Alexey Kozitsyn: По поводу идеи - поясните, пожалуйста, что это дает? Что делает Ваш индикатор? Как он поможет выделить "не фейковые" уровни?

спасибо за комментарий, позже оптимизирую
те стаканы, которые я видел выглядят примерно одинаково, две стенки с каждой стороны спреда, а между ними какие-то обьемы


1. жиденькие быстроменяющиеся уровни вокруг спреда
2. [#2 на рисунке] дальше идет стенка со средним обьемом, но который может удержать резкий выпад вверх, ордер за этой стенкой поставить нельзя, потому что если движение будет постепенным, то она начнет двигаться
3. [#1 на рисунке] на самых краях стоит какой-то драконовский обьем, который типа может выдержать любое движение, но по факту при постепенном движении и он начинает двигаться
4. между #1 и #2 скорей всего стоят обьемы роботов, которые эту стенку как-то пытаются использовать, при движении стенки эти уровни меняются синхронно

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

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

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

Цена | Обьем - Стандартный стакан

20    | 5
20.5  | 200
30    | 10
30.5  | 5
40    | 20
40.5  | 1         Итого: 241 контрактов на покупку

50

50.5  | 1
60    | 40
60.5  | 10
70    | 50
70.5  | 100
80    | 5         Итого: 206 контрактов на покупку
То есть, просто суммируя обьемы мы думаем, что ого как дофига продавцов, только вот те 200 продавцов сверху никогда ничего не продадут...
При этом при матчинге ордеров ДО стенок явно будет перевес покупателей.
Пробуем с весами.
Цена | Обьем - Реалистичный стакан

20    | 5     х 1
20.5  | 200   х 2
30    | 10    х 3
30.5  | 5     х 4
40    | 20    х 5
40.5  | 1     х 6         Итого: 561 контрактов на покупку

50

50.5  | 1     х 6
60    | 40    х 5
60.5  | 10    х 4
70    | 50    х 3
70.5  | 100   х 2
80    | 5     х 1        Итого: 601 контрактов на покупку
Уже реалистичней. Возможно веса стоит расставлять нелинейно, а в геометрической прогрессии, тогда будет еще виднее. Также, хотелось увидеть зависимость изменения цены от данных стакана, поэтому правильное суммирование уривней позволяет увидеть как менялась цена в зависимости от состояния стакана на опр. баре
 
Andy Sanders:


То есть, просто суммируя обьемы мы думаем, что ого как дофига продавцов, только вот те 200 продавцов сверху никогда ничего не продадут...
При этом при матчинге ордеров ДО стенок явно будет перевес покупателей.
Пробуем с весами.
Уже реалистичней. Возможно веса стоит расставлять нелинейно, а в геометрической прогрессии, тогда будет еще виднее. Также, хотелось увидеть зависимость изменения цены от данных стакана, поэтому правильное суммирование уривней позволяет увидеть как менялась цена в зависимости от состояния стакана на опр. баре

Интересная идея. Но, надо учитывать, что крупняк использует айсберг заявки, т.е. те, что сами доливаются, в случае, если их пытаются съесть. А на какую глубину стакана вешаются уровни - 6 по обе стороны?

 
Aleksey Vyazmikin:

Интересная идея. Но, надо учитывать, что крупняк использует айсберг заявки, т.е. те, что сами доливаются, в случае, если их пытаются съесть. А на какую глубину стакана вешаются уровни - 6 по обе стороны?

Только что понял, что сейчас немного неправильно сделано.
Сейчас идет цикл от края стакана к спреду, порядковый номер итерации - это и есть вес.
При таком раскладе, если обьемы маленькие, но уровней много, то получим гигантские веса возле спреда.

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

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

 
Andy Sanders:

Идея понятна, спасибо. А почему бы для поиска "стенок" просто не смотреть, с какого уровня не убирают большой объем (> X лотов) какой-то промежуток времени (> Y обновлений стакана)? И отмечать этот момент точкой на графике?

Это сразу же фильтрует роботов, которые таскают большие объемы взад и вперед, т.к. они долго не стоят на одном месте.

Выглядеть это может примерно так:

Каждая точка - уровень минимум 500 лотов с продолжительностью нахождения минимум 150 обновлений стакана.

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