MQL4 - automated forex trading   /  

Code Base

Code Base  Индикаторы  MarketProfile Авторизуйтесь или зарегистрируйтесь, чтобы добавить новый код

Библиотека программ на новом MQL5
Готовься к Чемпионату -

Этот скрипт для
MetaTrader 4

Мобильный трейдинг!
Купите лицензию и торгуйте мобильно

Имя:
MarketProfile [ en | cn ]
Автор: Avals (23.03.2006 07:32)
Рейтинг: 6.3
Скачано: 5707
Скачать:
 marketprofile.mq4 (4.7 Kb) View

Рыночный профиль (Market Profile) — инструмент, которым пользуются многие фьючерсные трейдеры.

MarketProfile


Подробнее о профиле:

Э. Найман "Путь к финансовой свободе"

Д.Пайпер "Дорога к трейдингу".

Автор сделал разными цветами: желтым - азиатская сессия, голубым - европейская, красным - американская. Показывает на M30 и M15.

Параметры:

StartDate - для тестирования на истории (с какой даты начинать рисовать)

lastdayStart - если true - то рисует до последнего дня (StartDate игнорируется)

CountProfile - сколько дневных профилей рисовать.


Мода рисуется белым. Volume не учитывает, есть где учитывает и он на 99% совпадает с этим. ИМХО, особенно для Forex не имеет значения.

37 комментариев: 1 2 3 4   Авторизуйтесь или зарегистрируйтесь, чтобы добавить новый комментарий
как он расчитывается?
11.05.2010 00:44 eddy

Хороший индюк только плохо что на 2 последних дня строит. Подскажите может есть у кого такой же чтоб строил на всех таймфреймах и все дни?


22.03.2010 19:24 Ivan_

Жаль не рисует Value Area прошлого дня.  Ни у кого случаем нет такой версии где рисует ?

28.09.2009 10:59 SPF
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  
   if (ObjectFind(rightLine)== -1){  
     ObjectCreate(rightLine,0,0,t0,0);
     ObjectSet(rightLine,OBJPROP_COLOR,Color);   
   }//if  
} 
//**************************************************************
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()

01.08.2009 06:55 Avals

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

Вот сейчас устанавливается только один

31.07.2009 23:24 sawa

а возможно ли сделать в индикаторе, которых можно выставлять несколько (последнем), так чтобы можно было отображать на выбранных таймфреймах и чтобы они не срывались при переключения таймфрейма?


31.07.2009 23:18 sawa

Отличные вещи создаете! Почти единственное что приносит реальную помощь при серьезной работе, спасибо Вам Avals


31.07.2009 22:29 sawa
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).

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

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

31.07.2009 09:36 Avals
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()


31.07.2009 09:31 Avals

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


30.07.2009 16:11 sawa