TPO
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «+tpo ntk.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Индикатор TPO (Time Price Opportunity) для MetaTrader 4 строит гистограммы распределения цен на основе данных тиков и отображает моды — уровни с наибольшей концентрацией цены. Пользователь может задавать период и количество анализируемых диапазонов, шаг цены и шаг поиска мод, а также выбирать метод симуляции тиков.
Гистограмма рисуется на графике в виде линий или прямоугольников с возможностью градиентной раскраски. Максимальная мода выделяется отдельным цветом. Вертикальная линия показывает границу исторических данных.
Индикатор обновляет расчёты при появлении нового бара и не чаще заданного интервала в секундах. Поддерживается сглаживание гистограммы. Все графические объекты управляются через префикс, заданный в настройках.
Настройки программы
| Настройка | Описание |
|---|---|
| HideHistogram | Переключатель видимости гистограммы на графике |
| RangePeriod | Период диапазона для анализа, задаётся стандартным таймфреймом |
| RangeCount | Количество диапазонов и гистограмм для отображения на графике |
| ModeStep | Шаг поиска мод, определяет размер участка для поиска максимумов |
| PriceStep | Шаг цены для построения гистограммы; 0 — автоматический расчёт |
| DataPeriod | Период данных для расчётов, задаётся в минутах; чем меньше значение, тем точнее расчёт |
| HGColor | Цвет гистограммы распределения цен |
| HGStyle | Стиль гистограммы: 0 — линии, 1 — пустые прямоугольники, 2 — заполненные прямоугольники |
| ModeColor | Цвет обычных мод — уровней с высокой концентрацией цены |
| MaxModeColor | Цвет выделения максимальной моды |
| HGLineWidth | Ширина линий столбцов гистограммы |
| ModeWidth | Толщина линий мод на графике |
| Id | Префикс имён графических объектов на графике |
| WaitSeconds | Минимальное время в секундах между обновлениями индикатора |
| TickMethod | Метод симуляции тиков: 0 — равная вероятность всех цен бара, 1 — имитация тиков через Open, Low, High, Close, 2 — только цены бара (O, H, L, C), 3 — только хай и лоу, 4 — СТПО |
| hgUseRectangles | Переключатель отображения модов в виде прямоугольников вместо линий |
Поиск по коду файла
#property indicator_chart_window
extern bool HideHistogram = true;
extern int RangePeriod = PERIOD_D1; //Th range should be one of the standard
extern int RangeCount = 10; // number of ranges/histograms
extern int ModeStep = 10; // mod search step, actually 2 times more + 1
int Smooth = 0; // The work is being said to be the following
extern int PriceStep = 10; //price step, 0 - auto (see #1)
extern int DataPeriod = 1; // period for data, minutes - the most accurate
bool ShowHorizon = true; // show data horizon
extern color HGColor = C'160,192,224'; // histogram color
extern int HGStyle = 1; // histogram style: 0 - lines, 1 - empty rectangles, 2 - filled rectangle
extern color ModeColor = Blue; // color mod
extern color MaxModeColor = clrBisque; // highlight the maximum
extern int HGLineWidth = 0; // bar graph line width
double Zoom = 0; // histogram scale, 0 - auto scale
extern int ModeWidth = 3; // mod thickness
int ModeStyle = STYLE_SOLID; // fashion style
extern string Id = "+tpo"; // префикс имен линий
extern int WaitSeconds = 1000; // minimum time, in seconds, between updates
extern int TickMethod = 1; // Tick simulation method: 0 - Low >> High, 1 - Open > Low(High) > High(Low) > Close, 2 - HLC, 3 - HL, 4 - Medium volume
string onp;
datetime drawHistory[]; // история рисования
datetime lastTime = 0; // последнее времся запуска
bool lastOK = false;
double hgPoint; // минимальное изменение цены
int modeStep = 0;
int smooth = 0;
bool showHG, showModes, showMaxMode;
bool hgBack = true;
extern bool hgUseRectangles = false;
#define ERR_HISTORY_WILL_UPDATED 4066
int init()
{
// код доступен только после оплаты
}
int start()
{
// код доступен только после оплаты
}
int deinit()
{
clearChart(onp);
return(0);
}
bool checkDrawHistory(datetime time)
{
int count = ArraySize(drawHistory);
bool r = false;
for (int i = 0; i < count; i++)
{
if (drawHistory[i] == time)
{
r = true;
break;
}
}
return(r);
}
void addDrawHistory(datetime time)
{
if (!checkDrawHistory(time))
{
int count = ArraySize(drawHistory);
ArrayResize(drawHistory, count + 1);
drawHistory[count] = time;
}
}
void drawModes(double& vh[], double hLow, int barFrom, double zoom, double point)
{
int modes[], modeCount, j;
double price;
modeCount = getModesIndexes(vh, modeStep, modes);
double max = 0;
if (showMaxMode)
{
for (j = 0; j < modeCount; j++)
if (vh[modes[j]] > max)
max = vh[modes[j]];
}
datetime timeFrom = getBarTime(barFrom);
clearChart(onp + "mode " + TimeToStr(timeFrom) + " ");
bool back = false;
if (hgUseRectangles)
back = true;
string on;
for (j = 0; j < modeCount; j++)
{
double v = zoom * vh[modes[j]];
if (MathAbs(v) > 0)
{
price = hLow + modes[j]*point;
datetime timeTo = getBarTime(barFrom - v);
on = onp + "mode " + TimeToStr(timeFrom) + " " + DoubleToStr(price, Digits);
if (showMaxMode && (MathAbs(vh[modes[j]] - max) < point)) // максимальная мода
{
drawTrend(on, timeFrom, price, timeTo, price, MaxModeColor, ModeWidth, ModeStyle, back, false, 0, hgUseRectangles);
if (hgUseRectangles && back)
drawTrend(on + "+", timeFrom, price, timeTo, price, MaxModeColor, ModeWidth, ModeStyle, false, false, 0, false);
}
else if (showModes) // обычная мода
{
drawTrend(on, timeFrom, price, timeTo, price, ModeColor, ModeWidth, ModeStyle, back, false, 0, hgUseRectangles);
if (hgUseRectangles && back)
drawTrend(on + "+", timeFrom, price, timeTo, price, ModeColor, ModeWidth, ModeStyle, false, false, 0, false);
}
}
}
}
datetime getBarTime(int shift, int period = 0)
{
if (period == 0)
period = Period();
if (shift >= 0)
return(iTime(Symbol(), period, shift));
else
return(iTime(Symbol(), period, 0) - shift*period*60);
}
int clearChart(string prefix)
{
int obj_total = ObjectsTotal();
string name;
int count = 0;
for (int i = obj_total - 1; i >= 0; i--)
{
name = ObjectName(i);
if (StringFind(name, prefix) == 0)
{
ObjectDelete(name);
count++;
}
}
return(count);
}
void drawVLine(string name, datetime time1, color lineColor = Gray, int width = 1, int style = STYLE_SOLID, bool back = true)
{
if (ObjectFind(name) >= 0)
ObjectDelete(name);
ObjectCreate(name, OBJ_VLINE, 0, time1, 0);
ObjectSet(name, OBJPROP_COLOR, lineColor);
ObjectSet(name, OBJPROP_BACK, back);
ObjectSet(name, OBJPROP_STYLE, style);
ObjectSet(name, OBJPROP_WIDTH, width);
}
void drawTrend(string name, datetime time1, double price1, datetime timeTo, double price2,
color lineColor, int width, int style, bool back, bool ray, int window, bool useRectangle)
{
if (ObjectFind(name) >= 0)
ObjectDelete(name);
if (useRectangle)
{ if (HideHistogram==false)
ObjectCreate(name, OBJ_RECTANGLE, window, time1, price1 - hgPoint / 2.0, timeTo, price2 + hgPoint / 2.0);
}
else
ObjectCreate(name, OBJ_TRENПоказано первые 50% кода (символов: 10895)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.