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

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

Стоимость полного кода
1 480,70₽ ≈ $18.10