Индикатор профайла рынка.

 
Индикатор показывает области скопления цены, им соответствуют максимумы.
Минимумам соответствуют области где цена бывает редко, т.е. это места для установки тейков и стопов.

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

Параметры:
- Первый задает длину истории по которой считается профайл (профиль).
- Второй задает сглаживание графика (экспоненциальной средней с коррекцией фазового сдвига).
= 1 - сглаживание отсутствует
> 1 - разная степень сглаживания.

Сглаживание нужно в первую очередь на М1,
на больших таймфреймах можно выключить.
//+------------------------------------------------------------------+
//|                                                     MProfile.mq4 |
//|                                  Copyright © 2005, Yuri Makarov. |
//|                                       http://mak.tradersmind.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Yuri Makarov."
#property link      "http://mak.tradersmind.com"

#property indicator_separate_window
#property indicator_color1  DarkTurquoise
#property indicator_buffers 1
#property indicator_minimum 0

extern int Length = 200;
extern int Smooth = 2;

double Profile[];
double MinV;
double MaxV;

string short_name;

int prevDate = 0;
int start()
{
   if (prevDate != Time[0])
   {
      NewBar();
      prevDate = Time[0];
   }
   int kPrice = Length * (Close[0] - MinV) / (MaxV - MinV);
   ObjectSet("CurentPrice", OBJPROP_TIME1, Time[Length - kPrice]);
}

void NewBar()
{
   CalcProfile();
}

void CalcProfile()
{
   int i;
   int Width = Length;
   
   MinV = Low[0];
   MaxV = High[0];
   for (i = 1; i < Length; i++)
   {
      if (MinV > Low[i] && Low[i] > 0) MinV = Low[i];
      if (MaxV < High[i]&& High[i]> 0) MaxV = High[i];
   }

   for (i = 0; i < Bars; i++) Profile[i] = 0;

   if (MaxV - MinV > 0)
   {
      for (i = 0; i < Length; i++) 
      {
         int kStart = Width * (Low[i]  - MinV) / (MaxV - MinV);
         int kStop  = Width * (High[i] - MinV) / (MaxV - MinV);
         for (int j = kStart; j <= kStop; j++)
            if (j >= 0) Profile[Width - j]++;
      }
      double F = 2. / (Smooth + 1);
      Print(F);
      for (i = 1; i < Width; i++) 
         Profile[i] = Profile[i-1] + (Profile[i] - Profile[i-1])*F;
      for (i = Width; i > 0; i--) 
      {
         Profile[i-1] = Profile[i] + (Profile[i-1] - Profile[i])*F;
      }
   }
   
   ObjectSet("MarginLeft",  OBJPROP_TIME1, Time[Width+1]);
   ObjectSet("MarginRight", OBJPROP_TIME1, Time[0]);
}

int init()
{
   SetIndexStyle(0, DRAW_HISTOGRAM);
   SetIndexBuffer(0, Profile);

   short_name = "Profile(" + Length + ")";
   IndicatorShortName(short_name);
   SetIndexLabel(0, short_name);
   
   ObjectCreate("MarginLeft", OBJ_VLINE,0,Time[Length+1],0);
   ObjectCreate("MarginRight",OBJ_VLINE,0,Time[0],0);
   ObjectCreate("CurentPrice",OBJ_VLINE,0,Time[0],0);
   ObjectSet("CurentPrice",OBJPROP_WIDTH,2);
   ObjectSet("CurentPrice",OBJPROP_COLOR,MediumBlue);
   
   for (int i = 0; i < Bars; i++) Profile[i] = 0;
   NewBar();
}

int deinit()
{
   ObjectDelete("MarginLeft");
   ObjectDelete("MarginRight");
}



Индикатор работает без глюков.
Но пользоваться им пока неудобно.
Непонятно как снять значение цены в разных точках графика.

Возможны 2 варианта:

1. Событие на клик мыши.
Тогда по событию можем вычислить и отобразить соответствующую цену.

2. Разместить график в окне с чартом и повернуть его на 90 градусов.
Тогда вертикальная ось будет соответствовать нужной цене.

Собственно про эти две фичи я и просил разработчиков.

Вообще индикатор интересный и очень полезный.
Его вообще хорошо бы включить в состав МТ как штатное средство.
В АмиБрокер он к примеру входит.

 
Mak, очень рад что вы затронули эту тему. Значит можно лоббировать :) !

Этот индикатор действительно очень и очень полезный.
Но делать его штатным думаю что не стоит, т.к. алгоритмы рассчета маркет профайла и способы применения очень различны. Для визуализации можно сделать следующие возможности:

1. В режиме перекрестия имеется вертикальная линия. Можно рисовать распределение цены прямо на ней слева. Естественно должна быть возможность настройки этого режима. А лучше всего дать возможность писать скрипты на вход которым подается расположение вертикальной линии. Т.е. номер бара.

2. Как писал Мак сделать новый тип окна, который прилепляется к графику сбоку (справа) потипу окна "навигатор" или "обзор рынка" но в этом окне осью Х является цена. И пересчет происходит по последнему видимому бару на графике или по позиции мышки на графике.

3. Сделать специальный обьект который фиксированно привязывается на графике. Это должна быть
вертикальная линия, но только с особыми свойствами. Потипу варианта 1 (с перекрестием), но только
фиксированный. Лучше всего, если будет возможность привязывать к этому обьекту свой способ рассчета
распределения.


Renat, Slava ... Что скажете ?

Сейчас разновидности Market Profile очень популярны во всем мире.
Думаю стоит рассмотреть возможность его удобной визуализации ?
 
2 Mak
...Вообще индикатор интересный и очень полезный...

Уважаемый Mak, посмотрел Ваш индикатор. Может у меня что-то с головой сегодня, а может "что-то" ни при чём :) Расскажите поподробней, как можно (или нужно) интерпретировать то, что этот индюк рисует.
 
Begun,
Можно не делать штатным (хотя так его можно сделать компактнее и удобнее).
Конечно всегда лучше дать средства для работы, чтобы народ сам мог сделать.

И еще, неправильно создавать отдельную фичу под отдельную задачу (ИМХО :)).
Мне кажется разработчики уже пошли на поводу у тестеров, и нагородили много деталей, вместо механизмов (ИМХО).

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

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


Этот вариант мог бы быть, если бы профайл был встроен в МТ.
Если это делать через скрипт на MQL, то (имхо) терминал повесится.

2. Как писал Мак сделать новый тип окна, который прилепляется к графику сбоку (справа) ...


Это ваше предложение .. :)
ИМХО, это пожалуй будет лишнее усложнение (новая сущьность).
(сорри за коменты).

На мой взгляд есть три способа, и лучше реализовать все.
(у них много и других применений)

1. Событие на клик мышкой.
2. Функция получения номера первого отображаемого бара.
3. Два варианта привязки объектов - к экрану и к графику (тут нужно еще инфо по мин/макс осей).
----------------------------------------------------

Может у меня что-то с головой сегодня, а может "что-то" ни при чём :) Расскажите поподробней, как можно (или нужно) интерпретировать то, что этот индюк рисует.

Представте, что этот индик находится на чарте рядом графиком цены и повернут на 90 град. Лучше всего справа от графика и против часовой стрелки.

Т.е. ось Х того, что изображается сейчас - это на самом деле Цена.
А вверх показана Вероятность того, что цена примет это значение.
Чем выше, тем больше вероятность.

Синяя вертикальная линия соответствует текущей цене.

 
Обновил скрипт.
 
to MAk
Не компилируется твой индикатор, выдает кучу ошибок. Билд 154 полный.
 
Rosh,
у меня компилируется, и в 154, и в 155 билде.
Специально взял сейчас текст из этой ветки и проверил.
 
to Mak
Ошибок нет в индикаторе, это я так криво его вставил в свой существующий, один пустяк не стерся, а я с ходу не стал разбираться. Так что - извини. :(
 
Rosh, ничего ...
Смысл то какой нибудь виден?
 
Смысл то какой нибудь виден?

Смысл виден. Я вспомнил, такую штучку в AGet'e видел. Только совсем давно. Потому и "затерлась" информация. А таким индикатором народ пользовался бы. Только присутствует тут некоторая неопределённость - в смысле пользования - что для многих не жизненно важно. И поэтому пользователей будет не подавляющее большинство. И в этом свете разработчикам напрягаться и делать это штатным, и чтоб "справа" была, скорее всего будет в лом. Хотя я бы пользовался... Прямо сейчас мысль пришла - надо какую-то альтернативу придумать. Может, чтобы "области" на ценовом графике отображались?..
 
Думаю пользовались бы не меньше, чем отображением объемов (они зачем-то даже в менюшку включены). У профайла смысла больше и он проще в интерпретации, чем объемы. По размерам было бы достаточно полоски в 1-2 см справа графика. Большая точность этому индикатору не нужна, только общий вид, и знание в каком месте сейчас цена находится.
Причина обращения: