Имя:
MarketProfile [ en | cn ]
Автор:
Avals (23.03.2006 07:32)
Рейтинг:
6.3
Скачано:
5707
Скачать:
Рыночный профиль (Market Profile) — инструмент, которым пользуются многие фьючерсные трейдеры.
MarketProfile
Подробнее о профиле:
Э. Найман "Путь к финансовой свободе"
Д.Пайпер "Дорога к трейдингу".
Автор сделал разными цветами: желтым - азиатская
сессия, голубым - европейская, красным - американская. Показывает на
M30 и M15.
Параметры:
StartDate - для тестирования на истории (с какой даты начинать рисовать)
lastdayStart - если true - то рисует до последнего дня (StartDate игнорируется)
CountProfile - сколько дневных профилей рисовать.
Мода
рисуется белым. Volume не учитывает, есть где учитывает и он на 99%
совпадает с этим. ИМХО, особенно для Forex не имеет значения.
Хороший индюк только плохо что на 2 последних дня строит. Подскажите может есть у кого такой же чтоб строил на всех таймфреймах и все дни?
Жаль не рисует Value Area прошлого дня. Ни у кого случаем нет такой версии где рисует ?
sawa писал(а):
Когда ставишь несколько профилей, то потом другие исчезают почему-то, или не всегда выставляются, даже если передвигаешь начальный в другое место.
Вот сейчас устанавливается только один
Можно все это, но тогда появляется дополнительный параметр NumOfCopy - номер профиля, который надо задавать в ручную (по умолчанию=1). Второму профилю надо ставить 2 и т.д. Профили не смещаются при переключении TF, сохраняют положение после перезапуска терминала, новая копия автоматически смещается от предыдущей при создании. Есть не достаток - при удалении индикатора его вертикальные линии не удаляются. Их надо удалить в ручную или новый профиль автоматически присоединиться к ним. Код индикатора:
#property copyright "Viatcheslav Suvorov"
#property indicator_chart_window
#property show_inputs
extern int NumOfCopy= 1 ;
extern int smoothing= 5 ;
extern color Color= Blue ;
datetime t0, t1;
int profile[ ] ;
bool NeedInit= true ;
string leftLine;
string rightLine;
int init( )
{
t0= Time [ ( NumOfCopy- 1 ) * 20 ] ;
int i0= iBarShift ( Symbol ( ) , Period ( ) , t0) ;
int i1= i0+ 20 ;
t1= Time [ i1] ;
leftLine= "leftMP" + DoubleToStr ( NumOfCopy, 0 ) ;
rightLine= "rightMP" + DoubleToStr ( NumOfCopy, 0 ) ;
if ( ObjectFind ( leftLine) = = - 1 ) {
ObjectCreate ( leftLine, 0 , 0 , t1, 0 ) ;
ObjectSet ( leftLine, OBJPROP_COLOR, Color) ;
}
if ( ObjectFind ( rightLine) = = - 1 ) {
ObjectCreate ( rightLine, 0 , 0 , t0, 0 ) ;
ObjectSet ( rightLine, OBJPROP_COLOR, Color) ;
}
}
int start( )
{
NeedInit= true ;
if ( ObjectFind ( rightLine) ! = - 1 ) datetime cur_t0= ObjectGet ( rightLine, OBJPROP_TIME1) ; else {
cur_t0= t0;
Print ( "Не найду пр. грань" ) ;
}
if ( ObjectFind ( leftLine) ! = - 1 ) datetime cur_t1= ObjectGet ( leftLine, OBJPROP_TIME1) ; else {
cur_t1= t1;
Print ( "Не найду лев. грань" ) ;
}
if ( ( cur_t0! = t0) | | ( cur_t1! = t1) | | NeedInit) {
ObjectsDelete( ) ;
NeedInit= false ;
t0= cur_t0;
t1= cur_t1;
int i0= iBarShift ( NULL , 0 , t0) ;
int i1= iBarShift ( NULL , 0 , t1) ;
if ( i0> i1) {
int il= i0;
int ir= i1;
} else {
il= i1;
ir= i0;
}
double ProfMin= Low [ Lowest( NULL , 0 , MODE_LOW , il- ir, ir) ] ;
double ProfMax= High [ Highest( NULL , 0 , MODE_HIGH , il- ir, ir) ] ;
int TPO= ( ProfMax- ProfMin) / Point ;
ArrayResize ( profile, TPO) ;
ArrayInitialize ( profile, 0 ) ;
for ( int i= il; i> = ir; i- - ) {
for ( double j= Low [ i] ; j< = High [ i] ; j+ = Point ) {
int index= ( j- ProfMin) / Point - 1 ;
profile[ index] + + ;
}
}
int Summ= 0 ;
if ( smoothing> 0 ) {
for ( i= 0 ; i< = TPO- 1 ; i+ + ) {
profile[ i] = ( 2 * profile[ i] / ( smoothing+ 1 ) ) + ( ( smoothing- 1 ) * profile[ i- 1 ] / ( smoothing+ 1 ) ) ;
}
}
ObjectsDelete( ) ;
for ( i= 0 ; i< = TPO- 1 ; i+ + ) {
if ( ( ObjectFind ( NumOfCopy+ "rec" + i) = = - 1 ) & & ( profile[ i] > 0 ) ) {
ObjectCreate ( NumOfCopy+ "rec" + i, OBJ_RECTANGLE , 0 , Time [ il] , ProfMin+ i* Point , Time [ il- profile[ i] ] , ProfMin+ ( i+ 1 ) * Point ) ;
ObjectSet ( NumOfCopy+ "rec" + i, OBJPROP_COLOR, Color) ;
ObjectSet ( NumOfCopy+ "rec" + i, OBJPROP_BACK, false ) ;
}
}
WindowRedraw ( ) ;
}
return ( 0 ) ;
}
void deinit( )
{
ObjectsDelete( ) ;
}
void ObjectsDelete( )
{
bool needwork= true ;
while ( needwork) {
int obj_total= ObjectsTotal ( ) ;
for ( int i= 0 ; i< obj_total; i+ + ) {
needwork= false ;
string name= ObjectName ( i) ;
if ( StringFind ( name, NumOfCopy+ "rec" , 0 ) > - 1 ) {
needwork= true ;
ObjectDelete ( ObjectName ( i) ) ;
break ;
}
}
}
return ( 0 ) ;
}
Когда ставишь несколько профилей, то потом другие исчезают почему-то, или не всегда выставляются, даже если передвигаешь начальный в другое место.
Вот сейчас устанавливается только один
а возможно ли сделать в индикаторе, которых можно выставлять несколько (последнем), так чтобы можно было отображать на выбранных таймфреймах и чтобы они не срывались при переключения таймфрейма?
Отличные вещи создаете! Почти единственное что приносит реальную помощь при серьезной работе, спасибо Вам Avals
sawa писал(а):
и еще такой вопрос, можно ли сделать что-нибудь чтобы устанавливать несколько скриптов, чтобы просматривать активность за каждую сессию на одном графике?
Скриптом нельзя т.к. он только один на график. Можно индикатором:
#property indicator_chart_window
#property show_inputs
extern int smoothing= 5 ;
extern color Color= Blue ;
int NumOfCopy;
datetime t0, t1;
int profile[ ] ;
bool NeedInit= true ;
string leftLine;
string rightLine;
int init( )
{
NumOfCopy= MathRand ( ) ;
t0= Time [ 0 ] ;
int i0= iBarShift ( Symbol ( ) , Period ( ) , t0) ;
int i1= i0+ 20 ;
t1= Time [ i1] ;
leftLine= "leftMP" + DoubleToStr ( NumOfCopy, 0 ) ;
rightLine= "rightMP" + DoubleToStr ( NumOfCopy, 0 ) ;
ObjectCreate ( leftLine, 0 , 0 , t1, 0 ) ;
ObjectSet ( leftLine, OBJPROP_COLOR, Color) ;
ObjectCreate ( rightLine, 0 , 0 , t0, 0 ) ;
ObjectSet ( rightLine, OBJPROP_COLOR, Color) ;
}
int start( )
{
NeedInit= true ;
if ( ObjectFind ( rightLine) ! = - 1 ) datetime cur_t0= ObjectGet ( rightLine, OBJPROP_TIME1) ; else {
cur_t0= t0;
Print ( "Не найду пр. грань" ) ;
}
if ( ObjectFind ( leftLine) ! = - 1 ) datetime cur_t1= ObjectGet ( leftLine, OBJPROP_TIME1) ; else {
cur_t1= t1;
Print ( "Не найду лев. грань" ) ;
}
if ( ( cur_t0! = t0) | | ( cur_t1! = t1) | | NeedInit) {
ObjectsDelete( ) ;
NeedInit= false ;
t0= cur_t0;
t1= cur_t1;
int i0= iBarShift ( NULL , 0 , t0) ;
int i1= iBarShift ( NULL , 0 , t1) ;
if ( i0> i1) {
int il= i0;
int ir= i1;
} else {
il= i1;
ir= i0;
}
double ProfMin= Low [ Lowest( NULL , 0 , MODE_LOW , il- ir, ir) ] ;
double ProfMax= High [ Highest( NULL , 0 , MODE_HIGH , il- ir, ir) ] ;
int TPO= ( ProfMax- ProfMin) / Point ;
ArrayResize ( profile, TPO) ;
ArrayInitialize ( profile, 0 ) ;
for ( int i= il; i> = ir; i- - ) {
for ( double j= Low [ i] ; j< = High [ i] ; j+ = Point ) {
int index= ( j- ProfMin) / Point - 1 ;
profile[ index] + + ;
}
}
int Summ= 0 ;
if ( smoothing> 0 ) {
for ( i= 0 ; i< = TPO- 1 ; i+ + ) {
profile[ i] = ( 2 * profile[ i] / ( smoothing+ 1 ) ) + ( ( smoothing- 1 ) * profile[ i- 1 ] / ( smoothing+ 1 ) ) ;
}
}
ObjectsDelete( ) ;
for ( i= 0 ; i< = TPO- 1 ; i+ + ) {
if ( ( ObjectFind ( NumOfCopy+ "rec" + i) = = - 1 ) & & ( profile[ i] > 0 ) ) {
ObjectCreate ( NumOfCopy+ "rec" + i, OBJ_RECTANGLE , 0 , Time [ il] , ProfMin+ i* Point , Time [ il- profile[ i] ] , ProfMin+ ( i+ 1 ) * Point ) ;
ObjectSet ( NumOfCopy+ "rec" + i, OBJPROP_COLOR, Color) ;
ObjectSet ( NumOfCopy+ "rec" + i, OBJPROP_BACK, false ) ;
}
}
WindowRedraw ( ) ;
}
return ( 0 ) ;
}
void deinit( )
{
ObjectDelete ( leftLine) ;
ObjectDelete ( rightLine) ;
ObjectsDelete( ) ;
}
void ObjectsDelete( )
{
bool needwork= true ;
while ( needwork) {
int obj_total= ObjectsTotal ( ) ;
for ( int i= 0 ; i< obj_total; i+ + ) {
needwork= false ;
string name= ObjectName ( i) ;
if ( StringFind ( name, NumOfCopy+ "rec" , 0 ) > - 1 ) {
needwork= true ;
ObjectDelete ( ObjectName ( i) ) ;
break ;
}
}
}
return ( 0 ) ;
}
P.s. И в скрипте и в индикаторе можно менять цвет (переменная Color).
Новые копии индикатора создают профиль в одинаковых начальных границах. Поэтому лучше установить сначало в нужное место, а затем создавать новый профиль
Индикатор обновляется с приходом нового тика, поэтому если тиков нет, то приходится нажимать "Обновить"
sawa писал(а):
Скажите пожалуйста, можно ли сделать так, что бы скрипт при его нанесении на график не убирал другие построения?
У меня стоит индикатор разметки рыночных сессий и при нанесении рыночного профиль все разметки рыночных сессий удаляются
Вот скрипт не удаляющий другие прямоугольники
#property copyright "Viatcheslav Suvorov"
#property show_inputs
extern int smoothing= 5 ;
extern color Color= Blue ;
int NumOfCopy= 1 ;
datetime t0, t1;
int profile[ ] ;
bool NeedInit= true ;
string leftLine;
string rightLine;
int init( )
{
t0= TimeOnDropped( ) ;
int i0= iBarShift ( Symbol ( ) , Period ( ) , t0) ;
int i1= i0+ 20 ;
t1= Time [ i1] ;
leftLine= "leftMP" + DoubleToStr ( NumOfCopy, 0 ) ;
rightLine= "rightMP" + DoubleToStr ( NumOfCopy, 0 ) ;
ObjectCreate ( leftLine, 0 , 0 , t1, 0 ) ;
ObjectSet ( leftLine, OBJPROP_COLOR, Color) ;
ObjectCreate ( rightLine, 0 , 0 , t0, 0 ) ;
ObjectSet ( rightLine, OBJPROP_COLOR, Color) ;
}
int start( )
{
NeedInit= true ;
while ( IsStopped ( ) = = false )
{
if ( ObjectFind ( rightLine) ! = - 1 ) datetime cur_t0= ObjectGet ( rightLine, OBJPROP_TIME1) ; else {
cur_t0= t0;
Print ( "Не найду пр. грань" ) ;
}
if ( ObjectFind ( leftLine) ! = - 1 ) datetime cur_t1= ObjectGet ( leftLine, OBJPROP_TIME1) ; else {
cur_t1= t1;
Print ( "Не найду лев. грань" ) ;
}
if ( ( cur_t0! = t0) | | ( cur_t1! = t1) | | NeedInit) {
ObjectsDelete( ) ;
NeedInit= false ;
t0= cur_t0;
t1= cur_t1;
int i0= iBarShift ( NULL , 0 , t0) ;
int i1= iBarShift ( NULL , 0 , t1) ;
if ( i0> i1) {
int il= i0;
int ir= i1;
} else {
il= i1;
ir= i0;
}
double ProfMin= Low [ Lowest( NULL , 0 , MODE_LOW , il- ir, ir) ] ;
double ProfMax= High [ Highest( NULL , 0 , MODE_HIGH , il- ir, ir) ] ;
int TPO= ( ProfMax- ProfMin) / Point ;
ArrayResize ( profile, TPO) ;
ArrayInitialize ( profile, 0 ) ;
for ( int i= il; i> = ir; i- - ) {
for ( double j= Low [ i] ; j< = High [ i] ; j+ = Point ) {
int index= ( j- ProfMin) / Point - 1 ;
profile[ index] + + ;
}
}
int Summ= 0 ;
if ( smoothing> 0 ) {
for ( i= 0 ; i< = TPO- 1 ; i+ + ) {
profile[ i] = ( 2 * profile[ i] / ( smoothing+ 1 ) ) + ( ( smoothing- 1 ) * profile[ i- 1 ] / ( smoothing+ 1 ) ) ;
}
}
ObjectsDelete( ) ;
for ( i= 0 ; i< = TPO- 1 ; i+ + ) {
if ( ( ObjectFind ( NumOfCopy+ "rec" + i) = = - 1 ) & & ( profile[ i] > 0 ) ) {
ObjectCreate ( NumOfCopy+ "rec" + i, OBJ_RECTANGLE , 0 , Time [ il] , ProfMin+ i* Point , Time [ il- profile[ i] ] , ProfMin+ ( i+ 1 ) * Point ) ;
ObjectSet ( NumOfCopy+ "rec" + i, OBJPROP_COLOR, Color) ;
ObjectSet ( NumOfCopy+ "rec" + i, OBJPROP_BACK, false ) ;
}
}
WindowRedraw ( ) ;
}
}
return ( 0 ) ;
}
void deinit( )
{
ObjectDelete ( leftLine) ;
ObjectDelete ( rightLine) ;
ObjectsDelete( ) ;
}
void ObjectsDelete( )
{
bool needwork= true ;
while ( needwork) {
int obj_total= ObjectsTotal ( ) ;
for ( int i= 0 ; i< obj_total; i+ + ) {
needwork= false ;
string name= ObjectName ( i) ;
if ( StringFind ( name, NumOfCopy+ "rec" , 0 ) > - 1 ) {
needwork= true ;
ObjectDelete ( ObjectName ( i) ) ;
break ;
}
}
}
return ( 0 ) ;
}
и еще такой вопрос, можно ли сделать что-нибудь чтобы устанавливать несколько скриптов, чтобы просматривать активность за каждую сессию на одном графике?