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

autotrendlines_v2.01_alert@lifeindreamsworld.mq5

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

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

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

О программе

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

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

НастройкаОписание
Line type (InpLineType) Тип линии — Выбор метода построения линий: по двум экстремумам или по экстремуму и дельте
Set1: Left extremum side (InpLeftExmSide1) Набор 1: сторона левого экстремума — Количество баров для поиска левого экстремума в первом наборе
Set1: Right extremum side (InpRightExmSide1) Набор 1: сторона правого экстремума — Количество баров для поиска правого экстремума в первом наборе
Set1: Offset from current bar (InpFromCurrent1) Набор 1: смещение от текущего бара — Смещение правой точки линии от текущего бара в первом наборе
Set2: Left extremum side (InpLeftExmSide2) Набор 2: сторона левого экстремума — Количество баров для поиска левого экстремума во втором наборе
Set2: Right extremum side (InpRightExmSide2) Набор 2: сторона правого экстремума — Количество баров для поиска правого экстремума во втором наборе
Set2: Offset from current bar (InpFromCurrent2) Набор 2: смещение от текущего бара — Смещение правой точки линии от текущего бара во втором наборе
Set3: Left extremum side (InpLeftExmSide3) Набор 3: сторона левого экстремума — Количество баров для поиска левого экстремума в третьем наборе
Set3: Right extremum side (InpRightExmSide3) Набор 3: сторона правого экстремума — Количество баров для поиска правого экстремума в третьем наборе
Set3: Offset from current bar (InpFromCurrent3) Набор 3: смещение от текущего бара — Смещение правой точки линии от текущего бара в третьем наборе
Account for bar before extremum (InpPrevExmBar) Учёт бара перед экстремумом — Включает или отключает корректировку с учётом бара, предшествующего найденному экстремуму
Maximum bars to look back (InpMaxLookback) Максимальный откат — Максимальное количество баров назад для поиска экстремумов
Alert offset (% of price) (InpAlertOffset) Смещение оповещения — Процент от текущей цены, в пределах которого срабатывает уведомление при приближении к линии
Lines width (InpLinesWidth) Ширина линий — Толщина отображаемых трендовых линий
Set1: Support color (InpSupColor1) Набор 1: цвет поддержки — Цвет линии поддержки для первого набора
Set1: Resistance color (InpResColor1) Набор 1: цвет сопротивления — Цвет линии сопротивления для первого набора
Set2: Support color (InpSupColor2) Набор 2: цвет поддержки — Цвет линии поддержки для второго набора
Set2: Resistance color (InpResColor2) Набор 2: цвет сопротивления — Цвет линии сопротивления для второго набора
Set3: Support color (InpSupColor3) Набор 3: цвет поддержки — Цвет линии поддержки для третьего набора
Set3: Resistance color (InpResColor3) Набор 3: цвет сопротивления — Цвет линии сопротивления для третьего набора
Distance from right edge (InpButtonXOffset) Смещение кнопок по горизонтали — Расстояние кнопок управления от правого края графика
Distance from bottom edge (InpButtonYOffset) Смещение кнопок по вертикали — Расстояние кнопок управления от нижнего края графика
Space between buttons (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