← К каталогу
Исходный код · ID 979

Digital MarketProfile vPOC

digital marketprofile vpoc.mq5
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Индикатор для MetaTrader 5, отображающий в окне графика профиль рынка (Market Profile) за выбранные периоды. Поддерживает два режима расчёта: по количеству TPO (время на уровне цены) и по объёму. Профиль строится для дневного, недельного или месячного периода в зависимости от настройки ProfileTimeframe.

Настройки программы

НастройкаОписание
LookBack Глубина истории — Количество последних периодов профиля для отображения.
UseVolumeProfile Использовать объёмный профиль — Использовать объёмный профиль вместо профиля по TPO.
ProfileTimeframeInfo Подсказка по периоду профиля — Подсказка о допустимых значениях параметра периода профиля.
ProfileTimeframe Период профиля — Период построения профиля: D — день, W — неделя, M — месяц.
DayStartHour Час начала дня — Час начала торгового дня при построении дневного профиля.
VATPOPercent Процент зоны стоимости — Доля от общего объёма или TPO для расчёта зоны стоимости.
TickSize Размер тика — Размер шага цены в пунктах для расчёта профиля.
ExtendedPocLines Количество продлеваемых линий POC — Количество последних профилей, для которых линия POC продлевается вправо.
spr0 Разделитель группы отображения — Разделитель группы настроек включения и выключения отображения.
ShowPriceHistogram Показывать гистограмму цены — Показывать гистограмму распределения цены.
ShowValueArea Показывать зону стоимости — Показывать зону стоимости на профиле.
ShowVAHVALLines Показывать линии VAH и VAL — Показывать линии границ зоны стоимости VAH и VAL.
ShowOpenCloseArrow Показывать стрелки открытия и закрытия — Показывать стрелки открытия и закрытия периода профиля.
spr1 Разделитель группы оформления — Разделитель группы настроек оформления и цветов.
VolAmplitudePercent Амплитуда объёма — Масштаб отображения объёмной гистограммы в процентах.
HistoHeight Высота гистограммы — Высота шага гистограммы профиля в пунктах.
HistoColor1 Первый цвет гистограммы — Первый цвет заливки гистограммы профиля.
HistoColor2 Второй цвет гистограммы — Второй цвет заливки гистограммы профиля.
OpenColor Цвет открытия — Цвет стрелки, отмечающей цену открытия периода профиля.
CloseColor Цвет закрытия — Цвет стрелки, отмечающей цену закрытия периода профиля.
POCColor Цвет линии POC — Цвет линии POC (точки контроля) профиля.
VirginPOCColor Цвет неперекрытого POC — Цвет линии POC, не перекрытой последующим профилем.
VAColor Цвет зоны стоимости — Базовый цвет заливки зоны стоимости.
VALinesColor Цвет линий VAH и VAL — Цвет линий границ зоны стоимости VAH и VAL.
InfoColor Цвет информации — Цвет информационной метки на графике.
spr2 Разделитель группы данных профиля — Разделитель группы настроек исходных данных профиля.
DailyProfileDataTf Таймфрейм данных дневного профиля — Таймфрейм исходных данных для построения дневного профиля.
WeeklyProfileDataTf Таймфрейм данных недельного профиля — Таймфрейм исходных данных для построения недельного профиля.
MonthlyProfileDataTf Таймфрейм данных месячного профиля — Таймфрейм исходных данных для построения месячного профиля.
Получить полный код

Поиск по коду файла

#property indicator_chart_window
/*
v1.1        cleaning the code
            add ShowOpenCloseArrow
            add VATPOPercent
v1.2        use 1 pip for pricing step and tpo calculating      
v1.3        add Volume Profile feature
v1.31       add DayStartHour, ShowPriceHistogram, ShowValueArea, ShowVAHVALLines            
v1.31.rev1  add Ticksize, VolAmplitudePercent
            bug fix : 
            - Profile High and Low misscalculated when high or low of the day 
              occured at first m30 candle.
            - Open and Close Arrow Location
            - profile missing when DayStartHour not exist on the chart 
              like Hour 0 not exist on some days on #YMH1 chart (fxpro);

*/

#define PRICEIDX        0
#define TPOIDX          1
#define VOLIDX          2

extern int        LookBack                = 6;
extern bool       UseVolumeProfile        = true;
extern string     ProfileTimeframeInfo    = "use D, W, or M";
extern string     ProfileTimeframe        = "D";
extern int        DayStartHour            = 0;
extern double     VATPOPercent            = 70.0;
extern int        TickSize                = 1;
extern int        ExtendedPocLines        = 5;

extern string     spr0                    = "on/off settings..";
extern bool       ShowPriceHistogram      = true;
extern bool       ShowValueArea           = true;
extern bool       ShowVAHVALLines         = true;
extern bool       ShowOpenCloseArrow      = true;

extern string     spr1                    = "design & colors..";
extern double     VolAmplitudePercent     = 40.0;
extern int        HistoHeight             = 2;
extern color      HistoColor1             = C'55,100,135';
extern color      HistoColor2             = C'45,90,125';
extern color      OpenColor               = DarkGreen;
extern color      CloseColor              = Peru;
extern color      POCColor                = Peru;
extern color      VirginPOCColor          = Yellow;
extern color      VAColor                 = C'16,16,16';
extern color      VALinesColor            = C'64,64,64';
extern color      InfoColor               = Lime;

extern string     spr2                    = "Profile Data.............";
extern int        DailyProfileDataTf      = 30;
extern int        WeeklyProfileDataTf     = 60;
extern int        MonthlyProfileDataTf    = 240;

string            gsPref                  = "ay.mp.";
double            fpoint
                , gdOneTick
                , gdHistoRange;
int               fdigits
                , giStep
                , giProfileTf             = PERIOD_D1
                , giDataTf                = 0;

int init()
{
      // код доступен только после оплаты
   }

int deinit()
{
   delObjs();
   return(0);
}

int start()
{
      // код доступен только после оплаты
   }

bool isOK()
{   
   switch (Period())
   {
      case PERIOD_M1:         
      case PERIOD_M5:         
      case PERIOD_M15:
         if (giProfileTf == PERIOD_D1) return(true);
         break;      
      case PERIOD_M30: 
         if (giProfileTf <= PERIOD_W1) return(true);
         break;          
      case PERIOD_H1:   
         return(true);
         break;            
      case PERIOD_H4:
      case PERIOD_D1:
         if (giProfileTf >= PERIOD_W1) return(true);
         break;
      default:
         return(false);               
         break;
   }          

   return(false);
}

void getStartAndEndBar(int ibar_proftf, int &startbar, int &endbar)
{      

   int i, j;
   datetime dt_proftf;     
   datetime dt_proftf_next; 

   switch (giProfileTf)
   {
      case PERIOD_D1:
         int oneday = PERIOD_D1*60;
         int iday = -1;
         datetime dt;
         startbar = 0; endbar = 0;         

         if (DayStartHour == 0)
         {
           dt_proftf       = iTime( NULL, giProfileTf, ibar_proftf );
           dt_proftf_next  = iTime( NULL, giProfileTf, ibar_proftf - 1 );         
           startbar        = iBarShift ( NULL, giDataTf, dt_proftf);
           endbar          = iBarShift ( NULL, giDataTf, dt_proftf_next - (giDataTf * 60) );   

           if (dt_proftf_next < dt_proftf) endbar = 0;         

           if ( iTime(NULL, giDataTf, startbar) < dt_proftf ) startbar--; 

           if (TimeDayOfWeek(iTime( NULL, giDataTf, startbar )) == 0) startbar = -1;

           break;
         }         

         for (i=0; i<iBars(NULL, giDataTf); i++)
         {
            dt = iTime(NULL, giDataTf, i);
            if (TimeHour(dt) == DayStartHour && TimeMinute(dt) == 0 )
            {
               iday++;
               if (iday == ibar_proftf) 
               {
                  startbar = i;         
                  if (ibar_proftf !=0) 
                  {
                     endbar  = iBarShift( NULL, giDataTf, dt + oneday - (giDataTf * 60) );                
                     if ( iTime(NULL, giDataTf, endbar) < dt + oneday - (giDataTf * 60) ) 
                     {
                        endbar++;
                        for (j=endbar; j>=0; j--)
                        {
                           dt = iTime(NULL, giDataTf, j);
                           if (TimeHour(dt) == DayStartHour && TimeMinute(dt) == 0 )
                           {
                              endbar = j+1;
                              break;
                           }                            
                        }// end for j
                     }
                  }
                  else endbar = 0;

                  break;
               }
            }
         }// end for i

         if (iday == -1) {startbar = -1; endbar = -1;}

         break;

      default:
         dt_proftf      = iTime( NULL, giProfileTf, ibar_proftf );
         dt_proftf_next = iTime( NULL, giProfileTf, ibar_proftf - 1 );

         startbar  = iBarShift ( NULL, giDataTf, dt_proftf);
         endbar    = iBarShift ( NULL, giDataTf, dt_proftf_next - (giDataTf * 60) );

         if (dt_proftf_next < dt_proftf) endbar = 0;         

         if ( iTime(NULL, giDataTf, startbar) < dt_proftf ) startbar--;    

         break;
   }         
}

void getHHLL(int startbar, int endbar, double &hh, double &ll)
{
   hh = iHigh ( NULL, giDataTf, iHighest(NULL, giDataTf, MODE_HIGH, (startbar - endbar)+1, endbar) );
   ll = iLow  ( NULL, giDataTf, iLowest (NULL, giDataTf, MODE_LOW,  (startbar - endbar)+1, endbar) );
   hh = NormalizeDouble(hh, fdigits);
   ll = NormalizeDouble(ll, fdigits);
}

void drawInfo()
{

   string info = "Volume Profile";
   if (!UseVolumeProfile) info = "TPO Profile";

   if (ObjectFind(gsPref+"lblinfo1") == -1)
    ObjectCreate (gsPref+"lblinfo1", OBJ_LABEL,0,0,0);

   ObjectSet    (gsPref+"lblinfo1", OBJPROP_CORNER, 3);
   ObjectSetText(gsPref+"lblinfo1", info, 8, "Tahoma", InfoColor);
   ObjectSet    (gsPref+"lblinfo1", OBJPROP_XDISTANCE, 10);
   ObjectSet    (gsPref+"lblinfo1", OBJPROP_YDISTANCE, 20);

   if (giProfileTf == PERIOD_D1)
   {
      if (ObjectFind(gsPref+"lblinfo2") == -1)      
        ObjectCreate (gsPref+"lblinfo2", OBJ_LABEL,0,0,0);

      ObjectSet    (gsPref+"lblinfo2", OBJPROP_CORNER, 3);
      ObjectSetText(gsPref+"lblinfo2", "DayStartHour: " + DayStartHour, 8, "Tahoma", InfoColor);
      ObjectSet    (gsPref+"lblinfo2", OBJPROP_XDISTANCE, 10);
      ObjectSet    (gsPref+"lblinfo2", OBJPROP_YDISTANCE, 5);            
   }

}

void getPriceTPO
(
     int       startbar
   , int       endbar
   , double    hh
   , double    ll
   , double    &aprice_step[][3]
   , int       &countps
   , int       &maxtpo
   , int       &maxtpoidx
   , double    &totaltpo
   , double    &maxvol
   , int       &maxvolidx   
   , double    &totalvol
)
{

   maxtpo        = 0;
   maxtpoidx     = 0;
   totaltpo      = 0.0;
   maxvol        = 0.000001;
   maxvolidx     = 0; 
   totalvol      = 0.0;

   double     shh = hh; //start hh
   double     profile_range       = MathMax(hh - ll, gdOneTick)
            , mid_profile_price   = hh - (0.5 * profile_range);   

   countps  = 0;          
   while (shh >= ll)
   {   
      ArrayResize(aprice_step, countps+1);   
      aprice_step [countps][PRICEIDX] = shh;
      aprice_step [countps][TPOIDX]   = 0.0;
      aprice_step [countps][VOLIDX]   = 0.0;

      shh -= gdOneTick;
      countps  ++;

   } // while (shh >= ll)   

   int      i, j;
   double   price_step;

   for (i=0; i<countps; i++)
   {
      price_step = aprice_step[i][PRICEIDX];
      j = startbar;
      while ( j >= endbar)
      {            
         double hp        = iHigh  (NULL, giDataTf, j);
         double lp        = iLow   (NULL, giDataTf, j);         
         double bar_vol   = iVolume(NULL, giDataTf, j);
         double bar_range = MathMax( (hp - lp) / fpoint, gdOneTick );
         double pip_vol   = bar_vol / bar_range;         

         if (  price_step >= lp && price_step <= hp )   
         {
            aprice_step[i][TPOIDX] += 1;  
            aprice_step[i][VOLIDX] += pip_vol;
            totaltpo += 1; 
            totalvol += pip_vol;

            if (aprice_step[i][TPOIDX] > maxtpo) 
            {
               maxtpo    = aprice_step[i][TPOIDX];
               maxtpoidx = i;               
            }

            if (aprice_step[i][TPOIDX] == maxtpo) 
            {

               if (   MathAbs(mid_profile_price - aprice_step[i][PRICEIDX]) 
                    < MathAbs(mid_profile_price - aprice_step[maxtpoidx][PRICEIDX]) 
                   )
               {
                  maxtpo    = aprice_step[i][TPOIDX];
                  maxtpoidx = i;
               }
            }

            if (aprice_step[i][VOLIDX] > maxvol) 
            {
               maxvol    = aprice_step[i][VOLIDX];
               maxvolidx = i;               
            }

            if (aprice_step[i][VOLIDX] == maxvol) 
            {

               if (   MathAbs(mid_profile_price - aprice_step[i][PRICEIDX]) 
                    < MathAbs(mid_profile_price - aprice_step[maxvolidx][PRICEIDX]) 
                   )
               {
                  maxvol    = aprice_step[i][VOLIDX];
                  maxvolidx = i;
               }
            }

         } // end if (price-gdHistoRange <= High[j] && price >= Low[j])   

         j--;
      } // end while ( iBarShift(NULL, giProfileTf, Time[j]) == itfsource )

   }// end for (i=0; i<countps; i++)   

}

void drawPriceHistoAndPOCLines
(
     int    startbar
   , int    endbar  
   , int    ibar_proftf  
   , int    countps
   , double &aprice_step[][]
   , int    maxtpo
   , int    maxtpoidx
   , double maxvol
   , int    maxvolidx
)
{
   do

Показано первые 50% кода (символов: 17521)

Открыть по тарифу

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

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
1 752,10₽ ≈ $21.41