Индикатор профайла рынка.
Этот индикатор действительно очень и очень полезный.
Но делать его штатным думаю что не стоит, т.к. алгоритмы рассчета маркет профайла и способы применения очень различны. Для визуализации можно сделать следующие возможности:
1. В режиме перекрестия имеется вертикальная линия. Можно рисовать распределение цены прямо на ней слева. Естественно должна быть возможность настройки этого режима. А лучше всего дать возможность писать скрипты на вход которым подается расположение вертикальной линии. Т.е. номер бара.
2. Как писал Мак сделать новый тип окна, который прилепляется к графику сбоку (справа) потипу окна "навигатор" или "обзор рынка" но в этом окне осью Х является цена. И пересчет происходит по последнему видимому бару на графике или по позиции мышки на графике.
3. Сделать специальный обьект который фиксированно привязывается на графике. Это должна быть
вертикальная линия, но только с особыми свойствами. Потипу варианта 1 (с перекрестием), но только
фиксированный. Лучше всего, если будет возможность привязывать к этому обьекту свой способ рассчета
распределения.
Renat, Slava ... Что скажете ?
Сейчас разновидности Market Profile очень популярны во всем мире.
Думаю стоит рассмотреть возможность его удобной визуализации ?
Уважаемый Mak, посмотрел Ваш индикатор. Может у меня что-то с головой сегодня, а может "что-то" ни при чём :) Расскажите поподробней, как можно (или нужно) интерпретировать то, что этот индюк рисует.
Можно не делать штатным (хотя так его можно сделать компактнее и удобнее).
Конечно всегда лучше дать средства для работы, чтобы народ сам мог сделать.
И еще, неправильно создавать отдельную фичу под отдельную задачу (ИМХО :)).
Мне кажется разработчики уже пошли на поводу у тестеров, и нагородили много деталей, вместо механизмов (ИМХО).
В данном случае делать окно сбоку - это лишняя сущьность (имхо).
Лучше всего иметь механизм для рисования на графике, но с абсолютной привязкой объектов, или возможность рисовать графики типа (цена - значение).
Но это выглядят довольно сложно и затрагивает многие существующие детали МТ (нарушает старую логику работы), а надобность в таком рисовании бывает не часто.
1. В режиме перекрестия имеется вертикальная линия. ...
Этот вариант мог бы быть, если бы профайл был встроен в МТ.
Если это делать через скрипт на MQL, то (имхо) терминал повесится.
2. Как писал Мак сделать новый тип окна, который прилепляется к графику сбоку (справа) ...
Это ваше предложение .. :)
ИМХО, это пожалуй будет лишнее усложнение (новая сущьность).
(сорри за коменты).
На мой взгляд есть три способа, и лучше реализовать все.
(у них много и других применений)
1. Событие на клик мышкой.
2. Функция получения номера первого отображаемого бара.
3. Два варианта привязки объектов - к экрану и к графику (тут нужно еще инфо по мин/макс осей).
----------------------------------------------------
Представте, что этот индик находится на чарте рядом графиком цены и повернут на 90 град. Лучше всего справа от графика и против часовой стрелки.
Т.е. ось Х того, что изображается сейчас - это на самом деле Цена.
А вверх показана Вероятность того, что цена примет это значение.
Чем выше, тем больше вероятность.
Синяя вертикальная линия соответствует текущей цене.
Не компилируется твой индикатор, выдает кучу ошибок. Билд 154 полный.
у меня компилируется, и в 154, и в 155 билде.
Специально взял сейчас текст из этой ветки и проверил.
Ошибок нет в индикаторе, это я так криво его вставил в свой существующий, один пустяк не стерся, а я с ходу не стал разбираться. Так что - извини. :(
Смысл то какой нибудь виден?
Смысл виден. Я вспомнил, такую штучку в AGet'e видел. Только совсем давно. Потому и "затерлась" информация. А таким индикатором народ пользовался бы. Только присутствует тут некоторая неопределённость - в смысле пользования - что для многих не жизненно важно. И поэтому пользователей будет не подавляющее большинство. И в этом свете разработчикам напрягаться и делать это штатным, и чтоб "справа" была, скорее всего будет в лом. Хотя я бы пользовался... Прямо сейчас мысль пришла - надо какую-то альтернативу придумать. Может, чтобы "области" на ценовом графике отображались?..
Минимумам соответствуют области где цена бывает редко, т.е. это места для установки тейков и стопов.
Если взять от этого графика производную (не совсем просто, с некоторыми хитростями), то увидим области скопления ордеров - тейков и стопов, которые были на прошедшей истории (и возможно будут и в ближайшем будущем). Опять же это инфо для размещения стопов и тейков.
Параметры:
- Первый задает длину истории по которой считается профайл (профиль).
- Второй задает сглаживание графика (экспоненциальной средней с коррекцией фазового сдвига).
= 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 градусов.
Тогда вертикальная ось будет соответствовать нужной цене.
Собственно про эти две фичи я и просил разработчиков.
Вообще индикатор интересный и очень полезный.
Его вообще хорошо бы включить в состав МТ как штатное средство.
В АмиБрокер он к примеру входит.