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

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 и перейдите к оплате.

Стоимость полного кода
1 091₽ ≈ $14