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

marketprofile with trendlines & arrows.mq4

Похожие материалы по тегам

ares_indicator.pineTradingView · 1 общих теговgold_trend_revers.mq5MQL5 / MetaTrader 5 · 1 общих тегов!!!-mt4 x-xardg-rsi.mq5MQL5 / MetaTrader 5 · 1 общих тегов! cycle-identifier.mq5MQL5 / MetaTrader 5 · 1 общих тегов!!! rsi ma simple+arrows 1.2 (mtf).mq5MQL5 / MetaTrader 5 · 1 общих теговprecisionflowea.mq5MQL5 / MetaTrader 5 · 1 общих тегов
Вы автор или правообладатель?

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

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

О программе

Индикатор для MetaTrader 4, отображающий профиль объёма (Volume Profile) или TPO-профиль на графике. Рассчитывает распределение цены по времени и объёму за ежедневные, недельные или месячные периоды, отображая Point of Control, Value Area, а также линии Value Area High/Low в виде графических объектов на графике.

Встроены фильтры на основе RSI и Stochastic, применяемые к сигналам стрелок покупки/продажи. Индикатор рисует трендовые линии между ключевыми ценовыми уровнями и отображает стрелки на максимумах/минимумах при совпадении сигнала с условиями фильтра. Также показываются маркеры открытия и закрытия профиля.

Поддерживаются различные настройки отображения: видимость гистограммы, зоны объёма, линий, цветовая палитра, выбор таймфрейма профиля и пауза для предотвращения повторных сигналов в заданные часы.

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

НастройкаОписание
Рисовать стрелки (DrawArrows) Рисовать стрелки — Переключатель отрисовки стрелок сигналов покупки и продажи на графике.
Отступ для стрелки в пунктах (ArrowGap) Отступ для стрелки в пунктах — Задаёт отступ стрелки от цены в пунктах при отрисовке сигналов на графике.
Пауза в торговле (начало) (BeginPauseHr) Пауза в торговле (начало) — Час начала периода паузы, в течение которого не формируются новые торговые сигналы-стрелки.
Пауза в торговле (начало) (EndPauseHr) Пауза в торговле (начало) — Час окончания периода паузы, после которого снова разрешается формирование сигналов.
Фильтр (Filter) Фильтр — Выбор типа фильтра для сигналов стрелок: без фильтра, RSI или Stochastic.
? (tlt1) Параметры RSI — Заголовок группы настроек RSI в интерфейсе.
Период RSI (rsiPeriod) Период RSI — Период расчёта индикатора RSI, используемого в качестве фильтра.
Тип цены (rsiPrice) Тип цены — Тип цены, используемой при расчёте RSI (Close, Open, High, Low и др.).
Уровень перекупленности (rsiOverboughtLevel) Уровень перекупленности — Уровень перекупленности RSI, при превышении которого сигналы продажи фильтруются.
Уровень перепроданности (rsiOversoldLevel) Уровень перепроданности — Уровень перепроданности RSI, при снижении которого сигналы покупки фильтруются.
? (tlt2) Параметры Stochastic — Заголовок группы настроек стохастика в интерфейсе.
период линии K (stKperiod) период линии K — Период расчёта линии K стохастика, используемого в качестве фильтра.
период линии D (stDperiod) период линии D — Период расчёта линии D стохастика, используемого в качестве фильтра.
замедление (stSlowing) замедление — Параметр замедления расчёта стохастика.
метод усреднения (stMethod) метод усреднения — Метод усреднения для расчёта стохастика (SMA, EMA, SMMA, LWMA).
Тип цены (0-Low/High или 1-Close/Close) (stPrice) Тип цены (0-Low/High или 1-Close/Close) — Тип цены для расчёта стохастика: Low/High или Close/Close.
Уровень перекупленности (stOverboughtLevel) Уровень перекупленности — Уровень перекупленности стохастика, при превышении которого сигналы продажи фильтруются.
Уровень перепроданности (stOversoldLevel) Уровень перепроданности — Уровень перепроданности стохастика, при снижении которого сигналы покупки фильтруются.
LookBack Количество баров для анализа — Количество баров назад, на которых рассчитываются профильные данные.
UseVolumeProfile Использовать Volume Profile — Переключатель между расчётом профиля по объёму (Volume Profile) или по количеству тиков (TPO Profile).
? (ProfileTimeframeInfo) Подсказка таймфрейма профиля — Информационная подсказка о допустимых значениях таймфрейма профиля.
ProfileTimeframe Таймфрейм профиля — Таймфрейм построения профиля: ежедневный (D), недельный (W) или месячный (M).
DayStartHour Час начала дня — Час начала нового торгового дня для корректного расчёта профильных данных.
VATPOPercent Процент VAPOC — Процент от общего объёма (или TPO), определяющий границы зоны Value Area.
TickSize Размер тика — Размер тика, используемый для расчёта шага ценовых уровней профиля.
ExtendedPocLines Продление POC линий — Количество дополнительных линий POC, продлеваемых во времени на графике.
trendcolor Цвет трендовых линий — Цвет дополнительных трендовых линий на графике.
? (spr0) Настройки вкл/выкл — Текстовый параметр-группировка для настроек включения/выключения.
ShowPriceHistogram Показывать гистограмму — Переключатель видимости гистограммы цены/объёма на графике.
ShowValueArea Показывать зону объёма — Переключатель видимости залитой области Value Area на графике.
ShowVAHVALLines Показывать линии VAH/VAL — Переключатель отображения горизонтальных линий Value Area High и Value Area Low.
ShowOpenCloseArrow Показывать стрелки открытия/закрытия — Переключатель отображения стрелок открытия и закрытия профиля на графике.
? (spr1) Настройки дизайна и цветов — Текстовый параметр-группировка для настроек дизайна и цветов.
VolAmplitudePercent Амплитуда объёма, % — Процент амплитуды объёма, используемый для масштабирования ширины столбцов гистограммы.
HistoHeight Высота гистограммы — Высота полосы гистограммы в пунктах, определяющая детализацию отображения.
HistoColor1 Цвет гистограммы 1 — Первый цвет гистограммы профиля (для чередующихся полос).
HistoColor2 Цвет гистограммы 2 — Второй цвет гистограммы профиля (для чередующихся полос).
OpenColor Цвет открытия — Цвет маркера открытия профиля на графике.
CloseColor Цвет закрытия — Цвет маркера закрытия профиля на графике.
POCColor Цвет POC — Цвет линии Point of Control (уровень с наибольшей частотой сделок).
VirginPOCColor Цвет VPOC — Цвет линии виртуального POC (для профилей, выходящих за текущий диапазон).
VAColor Цвет зоны объёма — Цвет залитой области Value Area на графике.
VALinesColor Цвет линий VAH/VAL — Цвет горизонтальных линий Value Area High и Value Area Low.
InfoColor Цвет информации — Цвет информационных меток на графике (заголовки профилей).
? (spr2) Настройки данных профиля — Текстовый параметр-группировка для настроек данных профиля.
DailyProfileDataTf Данные профиля D — Число баров дневного таймфрейма, используемых для расчёта профиля.
WeeklyProfileDataTf Данные профиля W — Число баров недельного таймфрейма, используемых для расчёта профиля.
MonthlyProfileDataTf Данные профиля M — Число баров месячного таймфрейма, используемых для расчёта профиля.
Получить полный код

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

#property strict

#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

#define POINT_POS_LEFT_TOP         0
#define POINT_POS_RIGHT_BOTTOM     1
#define POINT_POS_ON               2

enum filter
{
 flNone,       // нет
 flRSI,        // RSI
 flStochastic, // стохастик
};

extern bool               DrawArrows           = true;                               // Рисовать стрелки
extern int                ArrowGap             = 50;                                 // Отступ для стрелки в пунктах
extern int                BeginPauseHr         = 0;                                  // Пауза в торговле (начало)
extern int                EndPauseHr           = 9;                                  // Пауза в торговле (начало)
extern filter             Filter               = flNone;                             // Фильтр
extern string             tlt1                 = "Параметры RSI";                    //? 
extern int                rsiPeriod            = 14;                                 // Период RSI
extern ENUM_APPLIED_PRICE rsiPrice             = PRICE_CLOSE;                        // Тип цены
extern int                rsiOverboughtLevel   = 70;                                 // Уровень перекупленности
extern int                rsiOversoldLevel     = 30;                                 // Уровень перепроданности
extern string             tlt2                 = "Параметры Stochastic";             //?
extern int                stKperiod            = 5;                                  // период линии K 
extern int                stDperiod            = 3;                                  // период линии D 
extern int                stSlowing            = 3;                                  // замедление 
extern ENUM_MA_METHOD     stMethod             = MODE_SMA;                           // метод усреднения 
extern int                stPrice              = 0;                                  // Тип цены (0-Low/High или 1-Close/Close)
extern int                stOverboughtLevel    = 80;                                 // Уровень перекупленности
extern int                stOversoldLevel      = 20;                                 // Уровень перепроданности

extern int                LookBack             = 1;
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 color              trendcolor           = Silver;
extern string             spr0                 = "on/off settings..";                //?
extern bool               ShowPriceHistogram   = true;
extern bool               ShowValueArea        = false;
extern bool               ShowVAHVALLines      = false;
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                  = "mptrlea";
string            prefix_arrow            = "arrowsmp";
double            fpoint
                , gdOneTick
                , gdHistoRange;
int               fdigits
                , giStep
                , giProfileTf             = PERIOD_D1
                , giDataTf                = 0;

int accuracy;
bool IsOpen;
double resX1, resY1, resX2, resY2, supX1, supY1, supX2, supY2;

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

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

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

int GetSignal()
{
 int signal=EMPTY,ac=EMPTY;
 double arrow_price=EMPTY, up_line_price=EMPTY,dn_line_price=EMPTY;
 double dTime=double(iTime(NULL,0,0));
 string com;
 string bar_time=TimeToStr(iTime(NULL,0,0));

 if(GetPointPositionRelativeToLine(resX1,resY1,resX2,resY2,dTime,iHigh(NULL,0,0))>=0)
  {
   signal=OP_SELL;
   com="_s_";
   ac=234;
   arrow_price=iHigh(NULL,0,0)+ArrowGap*_Point;
   }

 if (signal==EMPTY && GetPointPositionRelativeToLine(supX1,supY1,supX2,supY2,dTime,iLow(NULL,0,0))<=0)
   {
    signal=OP_BUY;
    com="_b_";
    ac=233;
    arrow_price=iLow(NULL,0,0)-ArrowGap*_Point;
   }

 if(Filter==flRSI)
 {
  double rsi=iRSI(NULL,0,rsiPeriod,rsiPrice,0);
  if((signal==OP_BUY && rsi>=rsiOversoldLevel) || (signal==OP_SELL && rsi<=rsiOverboughtLevel)) signal=EMPTY;
 }
 else if(Filter==flStochastic)
 {
  double stoch=iStochastic(NULL,0,stKperiod,stDperiod,stSlowing,stMethod,stPrice,MODE_SIGNAL,0);
  if((signal==OP_BUY && stoch>=stOversoldLevel) || (signal==OP_SELL && stoch<=stOverboughtLevel)) signal=EMPTY;
 }

 if(signal>EMPTY)
 {
  string objname = prefix_arrow + com + bar_time;
  if(ObjectFind(objname) != 0)
  {
   ObjectCreate(objname, OBJ_ARROW,0,iTime(NULL,0,0),arrow_price);
   ObjectSet(objname, OBJPROP_ARROWCODE, ac);
   ObjectSet(objname, OBJPROP_COLOR, OrderColor(signal));  
  }
  else signal=EMPTY;
 }

  return(signal);
}

void CorrectArrow()
{
 string bar_time=TimeToStr(iTime(NULL,0,0));
 string nmb=prefix_arrow+"_b_"+bar_time;
 string nms=prefix_arrow+"_s_"+bar_time;
 if(ObjectFind(nmb) !=EMPTY) {ObjectSet(nmb,OBJPROP_PRICE1,iLow(NULL,0,0)-ArrowGap*_Point);}
 if(ObjectFind(nms) !=EMPTY) {ObjectSet(nms,OBJPROP_PRICE1,iHigh(NULL,0,0)+ArrowGap*_Point);} 
}

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; 
   int oneday;
   int iday;
   datetime dt;

   switch (giProfileTf)
   {
      case PERIOD_D1:
         oneday = PERIOD_D1*60;
         iday = -1;
         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: " + IntegerToString(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   = (double)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    = (int)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    = (int)aprice_step[i][TPOIDX];
                  maxtpoidx = i;
               }
            }

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

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

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

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

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

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

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

Стоимость полного кода
2 297,50₽ ≈ $28.08