marketprofile with trendlines & arrows.mq4
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «marketprofile with trendlines & arrows.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Индикатор для 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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.