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

SS_SupportResistance

ss_supportresistance_v07.1.mq5
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Данный продукт представляет собой индикатор для MetaTrader 4 (MQL4), предназначенный для построения и отображения зон поддержки и сопротивления на ценовых графиках. Индикатор определяет потенциальные торговые уровни на основе быстрых и медленных фрактальных точек, формируя зоны различной силы — от возможных до подтверждённых.

Зоны классифицируются по степени подтверждения: возможные, непроверенные, проверённые, слабые и перевёрнутые. Пользователь может настраивать цвета, стили и отображение каждой категории зон, а также включать или отключать показ разрушенных уровней. Индикатор поддерживает работу с несколькими таймфреймами.

Встроенная система оповещений включает попап-уведомления, звуковые сигналы и push-уведомления при входе цены в зону. Доступен режим тестирования с кнопкой переключения, позволяющий просматривать историческое отображение зон при прокрутке графика назад. Зоны могут объединяться при перекрытии для наглядности.

Настройки программы

НастройкаОписание
BackLimit Глубина поиска зон в количестве баров от текущего бара
TimeFrame Таймфрейм для анализа уровней (0 — текущий график, 60 — H1, 240 — H4, 1440 — D1, 10080 — W1, 43200 — MN)
TimeString Строка с описанием доступных таймфреймов для справки
color_support_possible Цоль возможной зоны поддержки
color_support_untested Цвет непроверенной зоны поддержки
color_support_verified Цвет подтверждённой зоны поддержки
color_support_weak Цвет слабой зоны поддержки
color_support_turncoat Цоль перевёрнутой зоны поддержки
color_resist_possible Цоль возможной зоны сопротивления
color_resist_untested Цвет непроверенной зоны сопротивления
color_resist_verified Цвет подтверждённой зоны сопротивления
color_resist_weak Цвет слабой зоны сопротивления
color_resist_turncoat Цоль перевёрнутой зоны сопротивления
color_broken_weak Цвет слабых разрушенных зон
color_broken_verified Цвет подтверждённых разрушенных зон
color_broken_other Цвет прочих разрушенных зон
zone_show_possible Отображение зон категории «Возможные»
zone_fuzzfactor Коэффициент размытия для определения границ зон
zone_solid Сплошное залитие зоны вместо прозрачного прямоугольника
zone_linewidth Толщина линии границы зоны
zone_style Стиль линии границы зоны (0 — сплошная и др.)
zone_show_info Отображение текстовых меток с информацией о зоне и количестве касаний
zone_label_shift Смещение текстовой метки зоны по горизонтали
color_label Цвет текстовых меток зон
font_label Шрифт текстовых меток зон
size_label Размер шрифта текстовых меток зон
zone_show_alerts Включение системы оповещений при входе цены в зону
zone_alert_popups Включение всплывающих окон-оповещений при входе цены в зону
zone_alert_sounds Включение звуковых сигналов при входе цены в зону
use_push Включение отправки push-уведомлений при входе цены в зону
zone_alert_waitseconds Интервал ожидания в секундах между последовательными оповещениями
zone_merge Объединение перекрывающихся зон в одну для упрощения отображения
zone_extend Расширение границ зон на величину, рассчитанную через коэффициент размытия
zone_showbroken Отображение разрушенных зон на графике
zone_limit Максимальное количество отображаемых зон на графике
fractals_show Отображение фрактальных точек на графике в виде стрелок
fractal_fast_factor Множитель для расчёта быстрых фрактальных точек
fractal_slow_factor Множитель для расчёта медленных фрактальных точек
SetGlobals Включение сохранения данных зон в глобальные переменные терминала
ShiftEndRight Количество баров, на которое конец зоны сдвигается вправо за последний видимый бар
Testing Включение режима тестирования — при прокрутке графика назад отображается исторический вид зон
ShowTestingBtn Отображение кнопки для переключения режима тестирования
TestingBtnX Горизонтальная позиция кнопки тестирования на графике
TestingBtnY Вертикальная позиция кнопки тестирования на графике
Получить полный код

Поиск по коду файла

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 clrRed
#property indicator_color2 clrRed
#property indicator_color3 clrDodgerBlue
#property indicator_color4 clrDodgerBlue

extern int    BackLimit   = 10000;
extern int    TimeFrame   = 0;
extern string TimeString  = "0=Current, 60=H1, 240=H4, 1440=Day, 10080=Week, 43200=Month";

extern color color_support_possible  = clrDarkSlateGray;
extern color color_support_untested  = clrSeaGreen;
extern color color_support_verified  = clrGreen;
extern color color_support_weak      = clrLimeGreen;
extern color color_support_turncoat  = clrOliveDrab;
extern color color_resist_possible   = clrIndigo;
extern color color_resist_untested   = clrOrchid;
extern color color_resist_verified   = clrCrimson;
extern color color_resist_weak       = clrRed;
extern color color_resist_turncoat   = clrDarkOrange;
extern color color_broken_weak       = clrDarkGray;
extern color color_broken_verified   = clrGray;
extern color color_broken_other      = clrDimGray;

extern bool   zone_show_possible     = true;
extern double zone_fuzzfactor        = 0.5;
extern bool   zone_solid             = false;
extern int    zone_linewidth         = 1;
extern int    zone_style             = 0;
extern bool   zone_show_info         = true;
extern int    zone_label_shift       = 3;
extern color  color_label            = clrWhite; //Label color
extern string font_label             = "Courier New"; //Label Font
extern int    size_label             = 9; //Label size
extern bool   zone_show_alerts       = true;
extern bool   zone_alert_popups      = true;
extern bool   zone_alert_sounds      = true;
extern bool   use_push               = true;
extern int    zone_alert_waitseconds = 300; 
extern bool   zone_merge             = true;
extern bool   zone_extend            = false;
extern bool   zone_showbroken        = false;
extern int    zone_limit             = 1000;

extern bool   fractals_show          = false;
extern double fractal_fast_factor    = 3.0;
extern double fractal_slow_factor    = 6.0;
extern bool   SetGlobals             = true;
extern int    ShiftEndRight          = 3;//extend the end of zones 3 bars beyond last bar
extern bool   Testing                = false; //TRUE == scrolling back the chart shows PAST zone "look"
extern bool   ShowTestingBtn         = false; //Show button to switch Testing mode On/Off
extern int    TestingBtnX            = 10; //Position of this button
extern int    TestingBtnY            = 120;

string BtnSRTesting = "BtnSRTesting";

double FastDnPts[], FastUpPts[];
double SlowDnPts[], SlowUpPts[];

double zone_hi[], zone_lo[];
int    zone_start[], zone_hits[], zone_type[], zone_strength[], zone_end[], zone_count = 0;
bool   zone_turn[];

#define ZONE_SUPPORT 1
#define ZONE_RESIST  2
#define ZONE_BROKEN  3

#define ZONE_POSSIBLE  0
#define ZONE_TURNCOAT  1
#define ZONE_UNTESTED  2
#define ZONE_VERIFIED  3
#define ZONE_WEAK      4

#define UP_POINT 1
#define DN_POINT -1

int time_offset = 0;

int LastBar = 0; //Last visible bar on the chart - in Testing mode
bool Initialized = false; //Has the INIT function finished?
double PipSize = 0;

int init()
{
      // код доступен только после оплаты
   }

int deinit()
{
   DeleteZones();
   DeleteGlobalVars();

   ObjectDelete(0, BtnSRTesting);
   return(0);
}

int start()
{
      // код доступен только после оплаты
   }

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam){   
  if (id == CHARTEVENT_OBJECT_CLICK){
    if (sparam == BtnSRTesting){
      Testing = !Testing;
      if (Testing)
        ObjectSetInteger(0, BtnSRTesting, OBJPROP_BGCOLOR, C'236,233,216');   
      else
        ObjectSetInteger(0, BtnSRTesting, OBJPROP_BGCOLOR, clrSlateGray);
    }
  }
  if (Testing && Initialized && id == CHARTEVENT_CHART_CHANGE){
    int PrevLastBar = LastBar;
    if (LastBar > 0){

      LastBar = 0;
    }
    LastBar = GetNextBar(0);    

    if (Testing && PrevLastBar > 0 && LastBar >= 0 && PrevLastBar != LastBar)
      start();
  }
}

void CheckAlerts()
{
   static int lastalert = 0;

   if (zone_show_alerts == false)
      return;

   if (Time[0] - lastalert > zone_alert_waitseconds)
      if (CheckEntryAlerts() == true)
         lastalert = Time[0];
}

bool CheckEntryAlerts()
{

   for (int i=0; i<zone_count; i++)
   {
      if (Close[0] >= zone_lo[i] && Close[0] < zone_hi[i])
      {
         if (zone_show_alerts == true)
         {
            if (zone_alert_popups == true)
            {
               if (zone_type[i] == ZONE_SUPPORT)
                  Alert(Symbol() + TimeFrameToString(TimeFrame) + ": Support Zone Entered");
               else
                  Alert(Symbol() + TimeFrameToString(TimeFrame) + ": Resistance Zone Entered");
            }

            if (zone_alert_sounds == true)
               PlaySound("alert.wav");
         }

         if (use_push == true)
         {
            string dir = "";
            string msg = StringConcatenate(Symbol(), "-", TimeFrameToString(TimeFrame), " at ", TimeToStr(Time[0], TIME_DATE|TIME_SECONDS),
                                           " ", dir, " Zone Entered");
            if (zone_type[i] == ZONE_SUPPORT)
            {
               dir = "Support";
               SendNotification("SS_SupRes_v07.1 alert" + msg);
            }
            else
            {
               dir = "Resistance";
               SendNotification("SS_SupRes_v07.1 alert" + msg);
            }
         }
         return(true);
      }
   }

   return(false);
}

void DeleteGlobalVars()
{
   if (SetGlobals == false)
      return;

   GlobalVariableDel("SSSR_Count_"+Symbol()+TimeFrame);
   GlobalVariableDel("SSSR_Updated_"+Symbol()+TimeFrame);

   int old_count = zone_count;
   zone_count = 0;
   DeleteOldGlobalVars(old_count);
}

void DeleteOldGlobalVars(int old_count)
{
   if (SetGlobals == false)
      return;

   for (int i=zone_count; i<old_count; i++)
   {
      GlobalVariableDel("SSSR_HI_"+Symbol()+TimeFrame+i);
      GlobalVariableDel("SSSR_LO_"+Symbol()+TimeFrame+i);
      GlobalVariableDel("SSSR_HITS_"+Symbol()+TimeFrame+i);
      GlobalVariableDel("SSSR_STRENGTH_"+Symbol()+TimeFrame+i);
      GlobalVariableDel("SSSR_AGE_"+Symbol()+TimeFrame+i);
   }
}

void FindZones()
{
   int i, j, shift, bustcount=0, testcount = 0, brokebar;
   double hival, loval;
   bool turned = false, hasturned = false;

   double temp_hi[1000], temp_lo[1000];
   int    temp_start[1000], temp_hits[1000], temp_strength[1000], temp_count = 0;
   bool   temp_turn[1000], temp_merge[1000];
   double bust_hi[1000], bust_lo[1000];
   int    bust_start[1000], bust_hits[1000], bust_strength[1000], bust_end[1000], bust_count = 0;
   bool   bust_turn[1000], bust_merge[1000];
   int merge1[1000], merge2[1000], merge_count = 0;
   int berge1[1000], berge2[1000], berge_count = 0;

   for (shift=MathMin(Bars(NULL, TimeFrame)-1, LastBar + BackLimit); shift> LastBar + 5; shift--)
   {
      double atr = iATR(NULL, TimeFrame, 7, shift);
      double fu = atr/2 * zone_fuzzfactor;
      bool isPossible;
      bool touchOk = false;
      bool isBust = false;
      double close = iClose(NULL, TimeFrame, shift);
      double high  = iHigh(NULL, TimeFrame, shift);
      double low   = iLow(NULL, TimeFrame, shift);
      double hi_i;
      double lo_i;

      if (FastUpPts[shift] > 0.001)
      {

         isPossible = true;
         if (SlowUpPts[shift] > 0.001)
            isPossible = false;

         hival = high;
         if (zone_extend == true)
            hival += fu;

         loval = MathMax(MathMin(close, high-fu), high-fu*2);
         turned = false;
         hasturned = false;
         isBust = false;

         bustcount = 0;
         testcount = 0;
         brokebar = 0;

         for (i=shift-1; i>=LastBar + 0; i--)
         {
            hi_i = iHigh(NULL, TimeFrame, i);
            lo_i = iLow(NULL, TimeFrame, i);

            if ((turned == false && FastUpPts[i] >= loval && FastUpPts[i] <= hival) ||
                (turned == true && FastDnPts[i] <= hival && FastDnPts[i] >= loval))
            {

               touchOk = true;
               for (j=i+1; j<i+11; j++)
               {
                  if ((turned == false && FastUpPts[j] >= loval && FastUpPts[j] <= hival) ||
                      (turned == true && FastDnPts[j] <= hival && FastDnPts[j] >= loval))
                  {
                     touchOk = false;
                     break;
                  }
               }

               if (touchOk == true)
               {

                  bustcount = 0;
                  testcount++;
               }
            }

            if ((turned == false && hi_i > hival) ||
                (turned == true && lo_i < loval))
            {

               bustcount++;
               brokebar = MathMax(brokebar, i);

               if (bustcount > 1 || isPossible == true)
               {

                  isBust = true;
                  break;
               }

               if (turned == true)
                  turned = false;
               else if (turned == false)
                  turned = true;

               hasturned = true;

               testcount = 0;
            }
         }

         if (isBust == false)
         {

            temp_hi[temp_count] = hival;
            temp_lo[temp_count] = loval;
            temp_turn[temp_count] = hasturned;
            temp_hits[temp_count] = testcount;
            temp_start[temp_count] = shift;
            temp_merge[temp_count] = false;

            if (testcount > 3)
               temp_strength[temp_count] = ZONE_WEAK;
            else if (testcount > 0)
               temp_strength[temp_count] = ZONE_VERIFIED;
            else if (hasturned == true)
               temp_strength[temp_count] = ZONE_TURNCOAT;
            else if (isPossible == false)
               temp_strength[temp_count] = ZONE_UNTESTED;
            else
               temp_strength[temp_count] = ZONE_POSSIBLE;

            temp_count++;
         }
         else if (zone_showbroken)
         {

            bust_hi[bust_count] = hival;
            bust_lo[bust_count] = loval;
            bust_turn[bust_count] = hasturned;
            bust_hits[bust_count] = testcount;
            bust_start[bust_count] = shift;
            bust_end[bust_count] = brokebar;
            bust_merge[bust_count] = false;

            if (testcount > 3)
               bust_strength[bust_count] = ZONE_WEAK;
            else if (testcount > 0)
               bust_strength[bust_count] = ZONE_VERIFIED;
            else if (hasturned == true)
               bust_strength[bust_count] = ZONE_TURNCOAT;
            else if (isPossible == false)
               bust_strength[bust_count] = ZONE_UNTESTED;
            else
               bust_strength[bust_count] = ZONE_POSSIBLE;

            bust_count++;
         }
      }
      else if (FastDnPts[shift] > 0.001)
      {

         isPossible = true;
         if (SlowDnPts[shift] > 0.001)
            isPossible = false;

         loval = low;
         if (zone_extend == true)
            loval -= fu;

         hival = MathMin(MathMax(close, low+fu), low+fu*2);
         turned = false;
         hasturned = false;

         bustcount = 0;
         testcount = 0;
         brokebar  = 0;
         isBust = false;

         for (i=shift-1; i>=LastBar + 0; i--)
         {
            hi_i = iHigh(NULL, TimeFrame, i);
            lo_i = iLow(NULL, TimeFrame, i);

            if ((turned == true && FastUpPts[i] >= loval && FastUpPts[i] <= hival) ||
                (turned == false && FastDnPts[i] <= hival && FastDnPts[i] >= loval))
            {

               touchOk = true;
               for (j=i+1; j<i+11; j++)
               {
                  if ((turned == true && FastUpPts[j] >= loval && FastUpPts[j] <= hival) ||
                      (turned == false && FastDnPts[j] <= hival && FastDnPts[j] >= loval))
                  {
                     touchOk = false;
                     break;
                  }
               }

               if (touchOk == true)
               {

                  bustcount = 0;
                  testcount++;
               }
            }

            if ((turned == true && hi_i > hival) ||
                (turned == false && lo_i < loval))
            {

               bustcount++;
               brokebar = MathMax(brokebar, i);

               if (bustcount > 1 || isPossible == true)
               {

                  isBust = true;
                  break;
               }

               if (turned == true)
                  turned = false;
               else if (turned == false)
                  turned = true;

               hasturned = true;

               testcount = 0;
            }
         }

         if (isBust == false)
         {

            temp_hi[temp_count] = hival;
            temp_lo[temp_count] = loval;
            temp_turn[temp_count] = hasturned;
            temp_hits[temp_count] = testcount;
            temp_start[temp_count] = shift;
            temp_merge[temp_count] = false;

            if (testcount > 3)
               temp_strength[temp_count] = ZONE_WEAK;
            else if (testcount > 0)
               temp_strength[temp_count] = ZONE_VERIFIED;
            else if (hasturned == true)
               temp_strength[temp_count] = ZONE_TURNCOAT;
            else if (isPossible == false)
               temp_strength[temp_count] = ZONE_UNTESTED;
            else
               temp_strength[temp_count] = ZONE_POSSIBLE;

            temp_count++;
         }
         else if (zone_showbroken)
         {

            bust_hi[bust_count] = hival;
            bust_lo[bust_count] = loval;
            bust_turn[bust_count] = hasturned;
            bust_hits[bust_count] = testcount;
            bust_start[bust_count] = shift;
            bust_end[bust_count] = brokebar;
            bust_merge[bust_count] = false;

            if (testcount > 3)
               bust_strength[bust_count] = ZONE_WEAK;
            else if (testcount > 0)
               bust_strength[bust_count] = ZONE_VERIFIED;
            else if (hasturned == true)
               bust_strength[bust_count] = ZONE_TURNCOAT;
            else if (isPossible == false)
               bust_strength[bust_count] = ZONE_UNTESTED;
            else
               bust_strength[bust_count] = ZONE_POSSIBLE;

            bust_count++;
         }
      }
   }

   if (zone_merge == true)
   {
      merge_count = 1;
      int iterations = 0, target, source;
      while (merge_count > 0 && iterations < 3)
      {
         merge_count = 0;
         iterations++;

         for (i = 0; i < temp_count; i++

Показано первые 50% кода (символов: 24523)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
2 452,30₽ ≈ $29.97