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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.