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

autotrendlines_v2.01_alert.mq5

Вы автор или правообладатель?

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

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

О программе

Данный индикатор для MetaTrader 5 автоматически строит линии поддержки и сопротивления на графике цены. Он анализирует экстремумы (локальные минимумы и максимумы) и на их основе рассчитывает трендовые линии, отображая их в виде объектов OBJ_TREND на графике.

Индикатор поддерживает три набора линий с различными параметрами поиска экстремумов, что позволяет анализировать тренды на разных временных масштабах. Доступны два режима расчёта: по двум экстремумам или по экстремуму и дельте.

Встроена система уведомлений, которая срабатывает при приближении цены к одной из линий поддержки или сопротивления. На графике размещаются интерактивные кнопки для включения и отключения отображения линий, а также системы оповещений.

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

НастройкаОписание
InpLineType Определяет метод расчёта трендовых линий: по двум экстремумам или по экстремуму и дельте.
InpLeftExmSide1 Количество баров слева от экстремума для поиска локального минимума в первом наборе линий.
InpRightExmSide1 Количество баров справа от экстремума для поиска локального минимума в первом наборе линий.
InpFromCurrent1 Смещение от текущего бара для определения правой точки трендовой линии в первом наборе.
InpLeftExmSide2 Количество баров слева от экстремума для поиска локального минимума во втором наборе линий.
InpRightExmSide2 Количество баров справа от экстремума для поиска локального минимума во втором наборе линий.
InpFromCurrent2 Смещение от текущего бара для определения правой точки трендовой линии во втором наборе.
InpLeftExmSide3 Количество баров слева от экстремума для поиска локального минимума в третьем наборе линий.
InpRightExmSide3 Количество баров справа от экстремума для поиска локального минимума в третьем наборе линий.
InpFromCurrent3 Смещение от текущего бара для определения правой точки трендовой линии в третьем наборе.
InpPrevExmBar Если включено, при расчёте трендовых линий учитывается бар, расположенный непосредственно перед найденным экстремумом.
InpMaxLookback Максимальное количество баров назад, в пределах которых ищутся экстремумы для построения линий.
InpAlertOffset Процент от текущей цены, определяющий расстояние, на котором срабатывает уведомление при приближении цены к линии поддержки или сопротивления.
InpLinesWidth Толщина отображаемых трендовых линий на графике.
InpSupColor1 Цвет линий поддержки в первом наборе.
InpResColor1 Цвет линий сопротивления в первом наборе.
InpSupColor2 Цвет линий поддержки во втором наборе.
InpResColor2 Цвет линий сопротивления во втором наборе.
InpSupColor3 Цвет линий поддержки в третьем наборе.
InpResColor3 Цвет линий сопротивления в третьем наборе.
InpButtonXOffset Горизонтальное расстояние от правого края графика до кнопок управления.
InpButtonYOffset Вертикальное расстояние от нижнего края графика до кнопок управления.
InpButtonSpacing Вертикальный промежуток между кнопками управления, размещёнными в правом нижнем углу графика.
Получить полный код

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

#property version   "2.01"
#property description "Automatic trend lines - 3 sets (Alert Fixed)"
#property indicator_chart_window
#property indicator_plots 0

enum ENUM_LINE_TYPE {
   EXM_EXM,    // 1: By 2 extremums
   EXM_DELTA   // 2: Extremum and delta
};

class CPoint {
   private:
      double price;
      datetime time;
   public:
      CPoint();
      CPoint(const double p, const datetime t);
      ~CPoint() {};
      void setPoint(const double p, const datetime t);
      bool operator==(const CPoint &other) const;
      bool operator!=(const CPoint &other) const;
      void operator=(const CPoint &other);
      double getPrice() const;
      datetime getTime() const;
};

CPoint::CPoint(void) {
   price = 0;
   time = 0;
}

CPoint::CPoint(const double p, const datetime t) {
   price = p;
   time = t;
}

void CPoint::setPoint(const double p, const datetime t) {
   price = p;
   time = t;
}

bool CPoint::operator==(const CPoint &other) const {
   return price == other.price && time == other.time;
}

bool CPoint::operator!=(const CPoint &other) const {
   return !operator==(other);
}

void CPoint::operator=(const CPoint &other) {
   price = other.price;
   time = other.time;
}

double CPoint::getPrice(void) const {
   return(price);
}

datetime CPoint::getTime(void) const {
   return(time);
}

CPoint curLeftSup[3], curRightSup[3], curLeftRes[3], curRightRes[3], nullPoint;

input ENUM_LINE_TYPE InpLineType = EXM_DELTA;// Line type

input int            InpLeftExmSide1 = 10;    // Set1: Left extremum side
input int            InpRightExmSide1 = 3;    // Set1: Right extremum side
input int            InpFromCurrent1 = 3;     // Set1: Offset from current bar

input int            InpLeftExmSide2 = 50;    // Set2: Left extremum side
input int            InpRightExmSide2 = 3;   // Set2: Right extremum side
input int            InpFromCurrent2 = 3;    // Set2: Offset from current bar

input int            InpLeftExmSide3 = 100;   // Set3: Left extremum side
input int            InpRightExmSide3 = 6;   // Set3: Right extremum side
input int            InpFromCurrent3 = 6;    // Set3: Offset from current bar

input bool           InpPrevExmBar = false;   // Account for bar before extremum
input int            InpMaxLookback = 5000;    // Maximum bars to look back
input double         InpAlertOffset = 0.01;    // Alert offset (% of price)

input int            InpLinesWidth = 1;       // Lines width
input color          InpSupColor1 = clrRed;   // Set1: Support color
input color          InpResColor1 = clrBlue;  // Set1: Resistance color
input color          InpSupColor2 = clrOrangeRed;   // Set2: Support color
input color          InpResColor2 = clrDodgerBlue;  // Set2: Resistance color
input color          InpSupColor3 = clrDarkRed;     // Set3: Support color
input color          InpResColor3 = clrNavy;        // Set3: Resistance color

input int            InpButtonXOffset = 140;    // Distance from right edge
input int            InpButtonYOffset = 50;    // Distance from bottom edge
input int            InpButtonSpacing = 40;    // Space between buttons

int            minRequiredBars[3];
bool           showLines = true;
bool           alertsEnabled = false;
datetime       lastAlertTime = 0;

string btnShowLines = "btnShowLines";
string btnAlerts = "btnAlerts";

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

void OnDeinit(const int reason) {

   ObjectsDeleteAll(0, 0, OBJ_TREND);
   ObjectDelete(0, btnShowLines);
   ObjectDelete(0, btnAlerts);

}

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) {
   if(id == CHARTEVENT_OBJECT_CLICK) {
      if(sparam == btnShowLines) {
         showLines = !showLines;
         ObjectSetString(0, btnShowLines, OBJPROP_TEXT, showLines ? "Lines: ON" : "Lines: OFF");
         ObjectSetInteger(0, btnShowLines, OBJPROP_BGCOLOR, showLines ? clrGreen : clrRed);

         for(int i = 0; i < 3; i++) {
            ObjectSetInteger(0, "Current_Support_" + IntegerToString(i+1), OBJPROP_TIMEFRAMES, showLines ? OBJ_ALL_PERIODS : OBJ_NO_PERIODS);
            ObjectSetInteger(0, "Current_Resistance_" + IntegerToString(i+1), OBJPROP_TIMEFRAMES, showLines ? OBJ_ALL_PERIODS : OBJ_NO_PERIODS);
         }
         ObjectSetInteger(0, btnShowLines, OBJPROP_STATE, false);
         ChartRedraw();
      }
      else if(sparam == btnAlerts) {
         alertsEnabled = !alertsEnabled;
         ObjectSetString(0, btnAlerts, OBJPROP_TEXT, alertsEnabled ? "Alerts: ON" : "Alerts: OFF");
         ObjectSetInteger(0, btnAlerts, OBJPROP_BGCOLOR, alertsEnabled ? clrGreen : clrRed);
         ObjectSetInteger(0, btnAlerts, OBJPROP_STATE, false);
         ChartRedraw();
      }
   }
}

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[])
{
      // код доступен только после оплаты
   }

   int leftIndex, rightIndex;
   double delta, tmpDelta;
   int leftSides[3], rightSides[3], fromCurrents[3];

   leftSides[0] = InpLeftExmSide1;
   rightSides[0] = InpRightExmSide1;
   fromCurrents[0] = InpFromCurrent1;

   leftSides[1] = InpLeftExmSide2;
   rightSides[1] = InpRightExmSide2;
   fromCurrents[1] = InpFromCurrent2;

   leftSides[2] = InpLeftExmSide3;
   rightSides[2] = InpRightExmSide3;
   fromCurrents[2] = InpFromCurrent3;

   for(int set = 0; set < 3; set++) {
      if ( rates_total < minRequiredBars[set] ) {
         continue;
      }
   }

   if ( prev_calculated != rates_total ) {

      for(int set = 0; set < 3; set++) {
         if ( rates_total < minRequiredBars[set] ) continue;

         switch ( InpLineType ) {
            case EXM_DELTA: {

               leftIndex = rates_total - leftSides[set] - 2;
               int maxLeftIndex = MathMax(minRequiredBars[set], rates_total - InpMaxLookback);
               for ( ; !isLowestLow(leftIndex, leftSides[set], low) && leftIndex > maxLeftIndex; leftIndex-- );
               curLeftSup[set].setPoint(low[leftIndex], time[leftIndex]);

               rightIndex = rates_total - fromCurrents[set] - 2;
               delta = (low[rightIndex] - low[leftIndex]) / (rightIndex - leftIndex);
               int tmpLeftIndex = leftIndex;
               if ( !InpPrevExmBar ) {
                  tmpLeftIndex += 1;
               }
               for ( int tmpIndex = rightIndex - 1; tmpIndex > tmpLeftIndex; tmpIndex-- ) {
                  t

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

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

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

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

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

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

Стоимость полного кода
1 046,60₽ ≈ $12.79