Индикаторы: MarketProfile - страница 3

 
Avals:
med1um:
Avals:

Вот скрипт, позволяющий строить MP с динамическими границами:

А как он работает?

Автоматически создаются 2 вертикальные линии (желтые) и между ними строится профиль. Двигая их как обычные линии МТ4 (с помощью мышки), изменяется начальная и конечная дата прорисовки профиля и автоматически строится новый MP.


Отлично большое спасибо, а индикатором не получится ?

 
med1um:
Avals:
med1um:
Avals:

Вот скрипт, позволяющий строить MP с динамическими границами:

А как он работает?

Автоматически создаются 2 вертикальные линии (желтые) и между ними строится профиль. Двигая их как обычные линии МТ4 (с помощью мышки), изменяется начальная и конечная дата прорисовки профиля и автоматически строится новый MP.

Отлично большое спасибо, а индикатором не получится ?

Можно, только перерисовываться будет после прихода нового тика на интсрумент к которому прикреплен. Вот так будет индикатор:

#property copyright "Viatcheslav Suvorov"
#property indicator_chart_window
#property show_inputs
extern int smoothing=5;
//**************************************************************
datetime t0,t1;
int profile[];
bool NeedInit=true; 
int init()
{
   t0=Time[0];
   int i0=iBarShift(Symbol(),Period(),t0); 
   int i1=i0+20;
   t1=Time[i1];
  
     
   ObjectCreate("leftMP",0,0,t1,0);
   ObjectSet("leftMP",OBJPROP_COLOR,Yellow);
   
   ObjectCreate("rightMP",0,0,t0,0);
   ObjectSet("rightMP",OBJPROP_COLOR,Yellow);   
   
} 
//**************************************************************
int start()
{
//  NeedInit=true;
    if (ObjectFind("rightMP") != -1) datetime cur_t0=ObjectGet("rightMP",OBJPROP_TIME1); else {
      cur_t0=t0;
      Print("Не найду пр. грань");
      return(0);
    }  
    if (ObjectFind("leftMP") != -1) datetime cur_t1=ObjectGet("leftMP",OBJPROP_TIME1); else {
      cur_t1=t1;
      Print("Не найду лев. грань");
      return(0);
    }  
//    if ((cur_t0!=t0) || (cur_t1!=t1) || NeedInit){   
    if ((cur_t0!=t0) || (cur_t1!=t1)){   
      ObjectsDeleteAll(0,OBJ_RECTANGLE);
      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;        
      }//if else      
      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]++;
        }//for
      }//for
      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));          
        }//for
        
      }//if        
      ObjectsDeleteAll(0,OBJ_RECTANGLE);
      for (i=0;i<=TPO-1;i++){
       if ((ObjectFind("rec"+i) == -1) && (profile[i]>0)) {
           ObjectCreate("rec"+i, OBJ_RECTANGLE, 0, Time[il],ProfMin+i*Point,Time[il-profile[i]],ProfMin+(i+1)*Point);
           ObjectSet("rec"+i, OBJPROP_COLOR, Blue);
           ObjectSet("rec"+i, OBJPROP_BACK, false);
       }//if
      }//for
      ObjectsRedraw( );
    }//if
  
   return(0);
}
//***************************************************************
void deinit()
{
  ObjectDelete("rightMP");
  ObjectDelete("leftMP");  
  ObjectsDeleteAll(0,OBJ_RECTANGLE);
}
//***************************************************************
 
Avals:
med1um:
Avals:

Вот скрипт, позволяющий строить MP с динамическими границами:

А как он работает?

Автоматически создаются 2 вертикальные линии (желтые) и между ними строится профиль. Двигая их как обычные линии МТ4 (с помощью мышки), изменяется начальная и конечная дата прорисовки профиля и автоматически строится новый MP.


Скрипт не работает на Альпари

А как индикатор жаль что нельзя набросить несколько линий или индикаторов и фрейм менять нельзя - а как индюк работает отлично !!!

 
OZ0:
Avals:
med1um:
Avals:

Вот скрипт, позволяющий строить MP с динамическими границами:

А как он работает?

Автоматически создаются 2 вертикальные линии (желтые) и между ними строится профиль. Двигая их как обычные линии МТ4 (с помощью мышки), изменяется начальная и конечная дата прорисовки профиля и автоматически строится новый MP.

Скрипт не работает на Альпари

А как индикатор жаль что нельзя набросить несколько линий или индикаторов и фрейм менять нельзя - а как индюк работает отлично !!!

Желающие могут доработать. Достаточно создавать линии и прямоугольники с именем плюс например число, задаваемое как внешний параметр.

На счет Альпари не понял почему не работает. У меня счет не в Альпари поэтому проверить и отладить не могу :( Но если индюк работает, а скрипт нет, то скорее всего проблема в строчке

t0=TimeOnDropped( );

можно как в индюке заменить на

t0=Time[0];

 

Кстати на ютубе много обучающих роликов по MP в том числе и на русском https://www.youtube.com/watch?v=7e3rXhCsbyI

 


Avals:

Вот скрипт, позволяющий строить MP с динамическими границами:

А как он работает?

Автоматически создаются 2 вертикальные линии (желтые) и между ними строится профиль. Двигая их как обычные линии МТ4 (с помощью мышки), изменяется начальная и конечная дата прорисовки профиля и автоматически строится новый MP.

Скрипт не работает на Альпари

А как индикатор жаль что нельзя набросить несколько линий или индикаторов и фрейм менять нельзя - а как индюк работает отлично !!!

Желающие могут доработать. Достаточно создавать линии и прямоугольники с именем плюс например число, задаваемое как внешний параметр.

... если индюк работает, а скрипт нет, то скорее всего проблема в строчке

t0=TimeOnDropped( );

можно как в индюке заменить на

t0=Time[0];

если линии создаются, а профиля не видно, то может помочь замена строчки

ObjectSet("rec"+i, OBJPROP_BACK, false); на

ObjectSet("rec"+i, OBJPROP_BACK, true);

P.S. скрипт нужно перетаскивать на график с помощью мыши

Кстати на ютубе много обучающих роликов по MP в том числе и на русском https://www.youtube.com/watch?v=7e3rXhCsbyI

сппасибо, жаль времени на основную работу не хватает, а делать плохо важные вещи не хочется

 

Скажите пожалуйста, можно ли сделать так, что бы скрипт при его нанесении на график не убирал другие построения?

У меня стоит индикатор разметки рыночных сессий и при нанесении рыночного профиль все разметки рыночных сессий удаляются

 

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

 
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;        
      }//if else      
      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]++;
        }//for
      }//for
      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));          
        }//for
        
      }//if        
      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);
       }//if
      }//for
      WindowRedraw();
    }//if
  }//while 
   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;
       }//if  
    }//for
  }//while  
  return(0);
}//ObjectsDelete()
 
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;        
      }//if else      
      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]++;
        }//for
      }//for
      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));          
        }//for
        
      }//if        
      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);
       }//if
      }//for
      WindowRedraw();
    }//if
   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;
       }//if  
    }//for
  }//while  
  return(0);
}//ObjectsDelete()

P.s. И в скрипте и в индикаторе можно менять цвет (переменная Color).

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

Индикатор обновляется с приходом нового тика, поэтому если тиков нет, то приходится нажимать "Обновить"

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