xixi_tz_1_10.mq5
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «xixi_tz_1_10.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Индикатор для MetaTrader 4, анализирующий ценовые бары и выделяющий три типа переходных зон (TZ): верхние (HTZ), нижние (LTZ) и средние (MTZ). Зоны отрисовываются в виде прямоугольников на графике, при этом для недавних баров отображаются потенциальные зоны (PTZ), а для остальных — подтверждённые.
Предусмотрена панель статистики с количеством и процентным соотношением каждого типа зон, настраиваемая по позиции и цвету. Система уведомлений может сигнализировать о появлении новых потенциальных зон.
Параметры позволяют задать глубину анализа, количество обрабатываемых баров, цвета зон и текстов, а также управлять отображением оставшегося количества баров в потенциальной зоне.
Настройки программы
| Настройка | Описание |
|---|---|
| bars_limit | Лимит баров — Максимальное количество баров для обработки индикатором |
| uneven_tz | Асимметричная зона — Переключает режим отрисовки зон: асимметричный (отдельные левая и правая части) или симметричный |
| show_stats | Показать статистику — Включает или отключает отображение панели статистики зон |
| do_alert | Включить уведомления — Включает или отключает уведомления при появлении новых потенциальных зон |
| show_remain_ptz_bars_num | Показать счётчик баров PTZ — Отображает или скрывает количество оставшихся баров в потенциальной зоне |
| remain_ptz_bars_num_color | Цвет счётчика баров PTZ — Цвет текста с количеством оставшихся баров в потенциальной зоне |
| h_value | Глубина анализа — Глубина анализа в барах вперёд и назад от текущего бара для расчёта зон |
| tz_left_clr | Цвет левой зоны — Цвет левых прямоугольников зон на графике |
| tz_right_clr | Цвет правой зоны — Цвет правых прямоугольников зон на графике |
| potential transient zone color (ptz_clr) | Цвет потенциальной зоны — Цвет потенциальных переходных зон (для недавних баров) |
| stats_pos_x | Позиция статистики по X — Горизонтальная позиция панели статистики на графике |
| stats_pos_y | Позиция статистики по Y — Вертикальная позиция панели статистики на графике |
| stats_color | Цвет статистики — Цвет текста на панели статистики |
Поиск по коду файла
#property version "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 3
input int bars_limit = 1000;
input bool uneven_tz = false;
input bool show_stats = true;
input bool do_alert = false;
input bool show_remain_ptz_bars_num = false;
input color remain_ptz_bars_num_color = clrAqua;
input int h_value = 10;
input color tz_left_clr = clrYellow;
input color tz_right_clr = clrRed;
input color ptz_clr = clrTan; // potential transient zone color
input int stats_pos_x = 10;
input int stats_pos_y = 15;
input color stats_color = clrWhite;
int total_tz, total_ptz, total_htz, total_mtz, total_ltz, total_bars;
double HTZBuffer[];
double LTZBuffer[];
double MTZBuffer[];
int OnInit()
{
// код доступен только после оплаты
}
void OnDeinit(const int reason)
{
DeleteZones();
}
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime& time[],
const double& open[],
const double& high[],
const double& low[],
const double& close[],
const long& tick_volume[],
const long& volume[],
const int& spread[])
{
// код доступен только после оплаты
}
void CalculateBuff(int rates_total,int prev_calculated,const datetime& time[],const double &open[],const double &high[],const double &low[],const double &close[])
{
int i,limit;
if(prev_calculated==0)
{
if (bars_limit == 0) {
limit=prev_calculated + h_value;
total_bars = rates_total;
}
else
limit = rates_total-1 - bars_limit;
total_bars = bars_limit;
}
else {
limit=prev_calculated+1;
total_bars = total_bars + rates_total-prev_calculated;
}
for(i=limit; i<rates_total-h_value-2 && !IsStopped(); i++) {
DrawTZ(i,rates_total,time,open,high,low,close,h_value,h_value);
}
for(i=rates_total-h_value-2; i<rates_total-1 && !IsStopped(); i++) {
DrawTZ(i,rates_total,time,open,high,low,close,h_value,h_value,true);
}
if (show_stats)
DrawStats(total_bars);
}
void DrawTZ(int i,
int rates_total,
const datetime& time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const int h_left,
const int h_right,
const bool redraw=false)
{
int j;
double max_left=0.0, max_right=0.0, min_left=999999999.0, min_right=999999999.0;
string rec_name_left,rec_name_right;
datetime t_left, t_right;
color left_clr, right_clr;
bool out_of_h_range = (i+h_right < rates_total-1);
int old_htz_state = HTZBuffer[i], old_ltz_state = LTZBuffer[i], old_mtz_state = MTZBuffer[i];
string remain_ptz_bars = IntegerToString(i+h_right+2 - rates_total);
string ptz_bars_name;
if (redraw == true) {
ObjectDelete(StringConcatenate("TZ_H_left_", i));
ObjectDelete(StringConcatenate("TZ_H_right_", i));
ObjectDelete(StringConcatenate("TZ_L_left_", i));
ObjectDelete(StringConcatenate("TZ_L_right_", i));
ObjectDelete(StringConcatenate("TZ_M_left_", i));
ObjectDelete(StringConcatenate("TZ_M_right_", i));
ObjectDelete(StringConcatenate("TZ_H_PTZ_bars_", i));
ObjectDelete(StringConcatenate("TZ_L_PTZ_bars_", i));
ObjectDelete(StringConcatenate("TZ_M_PTZ_bars_", i));
}
if (out_of_h_range) {// out of repaint range
left_clr = tz_left_clr;
right_clr = tz_right_clr;
}
else {
left_clr = ptz_clr;
right_clr = ptz_clr;
}
t_left = GetTime(i,-h_left,rates_total,time);
t_right = GetTime(i,h_right,rates_total,time);
for (j=MathMax(0,i-h_left); j<=i-1; j++) {
min_left = MathMin(min_left, low[j]);
max_left = MathMax(max_left, high[j]);
}
for (j=i+1; j<=MathMin(rates_total-1,i+h_right); j++) {
min_right = MathMin(min_right, low[j]);
max_right = MathMax(max_right, high[j]);
}
if (high[i] > max_left && high[i] > max_right) { // top TZ
rec_name_left = StringConcatenate("TZ_H_left_", i);
rec_name_right = StringConcatenate("TZ_H_right_", i);
ptz_bars_name = StringConcatenate("TZ_H_PTZ_bars_", i);
if (uneven_tz) {
RectangleCreate(0, rec_name_left, 0, t_left, high[i], time[i-1], max_left,left_clr,0,1,true);
RectangleCreate(0, rec_name_right, 0, time[i+1], high[i], t_right, max_right,right_clr,0,1,true);
}
else {
RectangleCreate(0, rec_name_left, 0, t_left, high[i], time[i], MathMax(max_left,max_right),left_clr,0,1,true);
RectangleCreate(0, rec_name_right, 0, time[i], high[i], t_right, MathMax(max_left,max_right),right_clr,0,1,true);
}
if (out_of_h_range) { // zones confirmed
HTZBuffer[i] = 1;
}
else {
HTZBuffer[i] = 2;
if (show_remain_ptz_bars_num)
TextCreate(0, ptz_bars_name, 0, t_right, MathMax(max_left,max_right), remain_ptz_bars, "Arial", 10, remain_ptz_bars_num_color);
}
}
else {
HTZBuffer[i] = 0;
}
if (low[i] < min_left && low[i] < min_right) { // bottom TZ
rec_name_left = StringConcatenate("TZ_L_left_", i);
rec_name_right = StringConcatenate("TZ_L_right_", i);
ptz_bars_name = StringConcatenate("TZ_L_PTZ_bars_", i);
if (uneven_tz) {
RectangleCreate(0, rec_name_left, 0, t_left, low[i], time[i-1], min_left,left_clr,0,1,true);
RectangleCreate(0, rec_name_right, 0, time[i+1], low[i], t_right, min_right,right_clr,0,1,true);
}
else {
RectangleCreate(0, rec_name_left, 0, t_left, low[i], time[i], MathMin(min_left,min_right),left_clr,0,1,true);
RectangleCreate(0, rec_name_right, 0, time[i], low[i], t_right, MathMin(min_left,min_right),right_clr,0,1,true);
}
if (out_of_h_range) { // zones confirmed
LTZBuffer[i] = 1;
}
else {
LTZBuffer[i] = 2;
if (show_remain_ptz_bars_num)
TextCreate(0, ptz_bars_name, 0, t_right, MathMin(min_left,min_right), remain_ptz_bars, "Arial", 10, remain_ptz_bars_num_color);
}
}
else {
LTZBuffer[i] = 0;
}
if (max_left < min_right) { // mid TZ
rec_name_left = StringConcatenate("TZ_M_left_", i);
rec_name_right = StringConcatenate("TZ_M_right_", i);
ptz_bars_name = StringConcatenate("TZ_M_PTZ_bars_", i);
if (uneven_tz) {
RectangleCreate(0, rec_name_left, 0, t_left, min_right, time[i-1], max_left,left_clr,0,1,true);
RectangleCreate(0, rec_name_right, 0, time[i+1], min_right, t_right, max_left,right_clr,0,1,true);
}
else {
RectangleCreate(0, rec_name_left, 0, t_left, min_right, time[i], max_left,left_clr,0,1,true);
RectangleCreate(0, rec_name_right, 0, time[i], min_right, t_right, max_left,right_clr,0,1,true);
}
if (out_of_h_range) { // zones confirmed
MTZBuffer[i] = 1;
}
else {
MTZBuffer[i] = 2;
if (show_remain_ptz_bars_num)
TextCreate(0, ptz_bars_name, 0, t_right, min_right, remain_ptz_bars, "Arial", 10, remain_ptz_bars_num_color);
}
}
else if (min_left > max_right) { // mid TZ
rec_name_left = StringConcatenate("TZ_M_left_", i);
rec_name_right = StringConcatenate("TZ_M_right_", i);
ptz_bars_name = StringConcatenate("TZ_M_PTZ_bars_", i);
if (uneven_tz) {
RectangleCreate(0, rec_name_left, 0, t_left, min_left, time[i-1], max_right,left_clr,0,1,true);
RectangleCreate(0, rec_name_right, 0, time[i+1], min_left, t_right, max_right,right_clr,0,1,true);
}
else {
RectangleCreate(0, rec_name_left, 0, t_left, min_left, time[i], max_right,left_clr,0,1,true);
RectangleCreate(0, rec_name_right, 0, time[i], min_left, t_right, max_right,right_clr,0,1,true);
}
if (out_of_h_range) { // zones confirmed
MTZBuffer[i] = 1;
}
else {
MTZBuffer[i] = 2;
if (show_remain_ptz_bars_num)
TextCreate(0, ptz_bars_name, 0, t_right, min_left, remain_ptz_bars, "Arial", 10, remain_ptz_bars_num_color);
}
}
else { // not TZ
MTZBuffer[i] = 0;
}
UpdateZoneStats(old_htz_state,HTZBuffer[i],total_htz,total_tz,total_ptz);
UpdateZoneStats(old_ltz_state,LTZBuffer[i],total_ltz,total_tz,total_ptz);
UpdateZoneStats(old_mtz_state,MTZBuffer[i],total_mtz,total_tz,total_ptz);
}
void UpdateZoneStats(int old_state, int new_state, int &stat, int &stat_confirm, int &stat_potential)
{
if (old_state == 0) {
if (new_state == 1) { // confirmed
stat++;
stat_confirm++;
}
else if (new_state == 2) { // potential appear
stat_potential++;
if (do_alert) {
Alert(Symbol() + ": new potential TZ appears");
}
}
}
else if (old_state == 1) {
}
else if (old_state == 2) {
if (new_state == 0) // potential cleared
stat_potential--;
Показано первые 50% кода (символов: 14807)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.