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

#MT TrendLine

#mt trendline.mq5
Вы автор или правообладатель?

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

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

О программе

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

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

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

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

НастройкаОписание
High_period Период для расчёта верхних пиков.
Low_period Период для расчёта нижних пиков.
Trigger_Sens Чувствительность триггера для определения нулевых пересечений.
ForecastHighTrendLine Включает или отключает построение прогнозной линии тренда для верхних пиков.
StayLinesAfterDelete Определяет, остаются ли линии на графике после удаления индикатора.
Note0 Текстовый разделитель для группы настроек отрисовки семафоров.
DrawHighPivotSemafor Включает или отключает отрисовку семафора для верхних пиков (high pivot).
DrawLowPivotSemafor Включает или отключает отрисовку семафора для нижних пиков (low pivot).
DrawLowestPivotSemafor Включает или отключает отрисовку семафора для самых низких пиков (lowest pivot).
Note1 Текстовый разделитель для группы настроек верхних линий тренда.
HTL_Draw Включает или отключает отрисовку линий тренда для верхних пиков.
HTL_ResColor Цвет линии сопротивления для верхних линий тренда.
HTL_SupColor Цвет линии поддержки для верхних линий тренда.
HTL_Style Стиль отрисовки верхних линий тренда.
HTL_Width Толщина верхних линий тренда.
HTL_Ext Коэффициент расширения линий тренда для верхних пиков.
HTL_InMemory Максимальное количество линий тренда для верхних пиков, сохраняемых в памяти.
HTL_MinPivotDifferentIgnore Минимальное различие между пиками для игнорирования при построении верхних линий тренда.
Note2 Текстовый разделитель для группы настроек нижних линий тренда.
LTL_Draw Включает или отключает отрисовку линий тренда для нижних пиков.
LTL_ResColor Цвет линии сопротивления для нижних линий тренда.
LTL_SupColor Цвет линии поддержки для нижних линий тренда.
LTL_Style Стиль отрисовки нижних линий тренда.
LTL_Width Толщина нижних линий тренда.
LTL_Ext Коэффициент расширения линий тренда для нижних пиков.
LTL_InMemory Максимальное количество линий тренда для нижних пиков, сохраняемых в памяти.
LTL_MinPivotDifferentIgnore Минимальное различие между пиками для игнорирования при построении нижних линий тренда.
Note3 Текстовый разделитель для группы настроек верхнего семафора.
HighPivotTextAlarm Включает или отключает текстовое оповещение о верхнем пике.
HighPivotSoundAlarm Имя звукового файла для оповещения о верхнем пике.
HighPivotSemaforDrawOffset Смещение отрисовки семафора для верхних пиков в пунктах.
HighSemaforSymbol Код символа для отрисовки семафора верхнего пика.
Note4 Текстовый разделитель для группы настроек нижнего семафора.
LowPivotTextAlarm Включает или отключает текстовое оповещение о нижнем пике.
LowPivotSoundAlarm Имя звукового файла для оповещения о нижнем пике.
LowPivotSemaforDrawOffset Смещение отрисовки семафора для нижних пиков в пунктах.
LowSemaforSymbol Код символа для отрисовки семафора нижнего пика.
Note5 Текстовый разделитель для группы настроек низшего семафора.
LowestSemaforSymbol Код символа для отрисовки семафора самого низкого пика.
Note6 Текстовый разделитель для группы настроек прогнозной линии тренда.
FTL_Color Цвет прогнозной линии тренда.
FTL_Style Стиль отрисовки прогнозной линии тренда.
FTL_Width Толщина прогнозной линии тренда.
FTL_Ext Коэффициент расширения прогнозной линии тренда.
Получить полный код

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

#property indicator_chart_window

#property indicator_buffers 3
#property indicator_color1 Crimson
#property indicator_width1 5
#property indicator_color2 Gold
#property indicator_width2 3
#property indicator_color3 BlueViolet

extern int High_period = 70;
extern int Low_period = 21;
extern int Trigger_Sens = 2;

extern bool ForecastHighTrendLine = TRUE;
extern bool StayLinesAfterDelete = FALSE;

extern string Note0 = "***** Semafor Drawing Adjustment";
extern bool DrawHighPivotSemafor = TRUE;
extern bool DrawLowPivotSemafor = TRUE;
extern bool DrawLowestPivotSemafor = false;

extern string Note1 = "***** High Trend Lines Adjustment";
extern bool HTL_Draw = false;
extern color HTL_ResColor = Crimson;
extern color HTL_SupColor = Blue;
extern int HTL_Style = 0;
extern int HTL_Width = 2;
extern double HTL_Ext = 1.5;
extern int HTL_InMemory = 30;
extern int HTL_MinPivotDifferentIgnore = 5;

extern string Note2 = "***** Low Trend Lines Adjustment";
extern bool LTL_Draw = false;
extern color LTL_ResColor = FireBrick;
extern color LTL_SupColor = Blue;
extern int LTL_Style = 1;
extern int LTL_Width = 1;
extern double LTL_Ext = 1.5;
extern int LTL_InMemory = 30;
extern int LTL_MinPivotDifferentIgnore = 4;

extern string Note3 = "***** High Semafor Adjustment";
extern bool HighPivotTextAlarm = false;
extern string HighPivotSoundAlarm = "alert.wav";
extern int HighPivotSemaforDrawOffset = 10;
extern int HighSemaforSymbol = 82;

extern string Note4 = "***** High Semafor Adjustment";
extern bool LowPivotTextAlarm = false;
extern string LowPivotSoundAlarm = "news.wav";
extern int LowPivotSemaforDrawOffset = 10;
extern int LowSemaforSymbol = 169;

extern string Note5 = "***** Lowest Semafor Adjustment";
extern int LowestSemaforSymbol = 115;

extern string Note6 = "***** Forecast Trend Line Adjustment";
extern color FTL_Color = Magenta;
extern int FTL_Style = 1;
extern int FTL_Width = 5;
extern double FTL_Ext = 1.05;

double g_ibuf_300[];
double g_ibuf_304[];
double g_ibuf_308[];
string g_name_312 = "L1";
string g_name_320 = "L2";
string g_name_328 = "L3";
int gi_unused_336 = 5;
int gi_340;
int gi_344;
int gi_348;
int gi_352;
int g_time_356 = 0;
bool gi_unused_360 = FALSE;
int gi_364 = 0;
double gda_368[][6];
int gi_372 = 0;
int gi_376 = 0;
int gi_380 = -1;
int gi_384;
double gda_388[][6];
int gi_392 = 0;
int gi_396 = 0;
int gi_400 = -1;
int gi_404;
double gda_408[][6];
int gi_412 = 0;
int gi_416 = 0;
int gi_420 = -1;
int gi_424 = 0;
int gi_428 = 0;
int gi_432 = 0;
int gi_436 = -1;
string gsa_440[];
string gsa_444[];
color g_color_448;
color g_color_452;
int g_style_456;
int g_width_460 = 3;
double gd_464;
int gi_472 = 0;
string gs_476 = "";
int gi_484 = 0;
int gi_488 = 0;
string g_name_492 = "ForecastHighTrendLine";
bool gi_500 = FALSE;
int g_datetime_504 = 0;
double g_price_508 = 0.0;
int gi_unused_516 = 0;
double gd_unused_520 = 0.0;
int gi_528 = 0;
int g_bars_532;
double g_year_536 = 0.0;
double gd_unused_544 = 0.0;
double g_month_552 = 0.0;
double gd_unused_560 = 0.0;
double g_day_568 = 0.0;
double gd_unused_576 = 0.0;

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

void FTLMng_Main(int ai_0, int ai_4, double ad_8, int ai_16) {
   datetime l_time_28;
   if (ObjectFind(g_name_492) > -1) {
      ObjectDelete(g_name_492);
      gi_500 = FALSE;
      g_datetime_504 = FALSE;
      g_price_508 = 0;
      gi_unused_516 = 0;
      gd_unused_520 = 0;
   }
   double ld_20 = FTLMng_FindSecondpoint(ai_0, ai_4, ai_16);
   if (ld_20 != 0.0) {
      l_time_28 = Time[ai_0];
      if (FTLMng_DrawFirst(ai_4, ad_8, l_time_28, ld_20) != 0) {
         gi_528 = ai_16;
         FTLMng_ReDraw(ai_0);
         gi_500 = TRUE;
         return;
      }
   }
}

int FTLMng_DrawFirst(int a_datetime_0, double a_price_4, int a_datetime_12, double a_price_16) {
   if (ObjectCreate(g_name_492, OBJ_TREND, 0, a_datetime_0, a_price_4, a_datetime_12, a_price_16)) {
      ObjectSet(g_name_492, OBJPROP_RAY, FALSE);
      ObjectSet(g_name_492, OBJPROP_BACK, 1);
      ObjectSet(g_name_492, OBJPROP_COLOR, FTL_Color);
      ObjectSet(g_name_492, OBJPROP_STYLE, FTL_Style);
      ObjectSet(g_name_492, OBJPROP_WIDTH, FTL_Width);
      g_datetime_504 = a_datetime_0;
      g_price_508 = a_price_4;
      gi_unused_516 = a_datetime_12;
      gd_unused_520 = a_price_16;
      ObjectsRedraw();
      return (1);
   }
   GetLastError();
   return (0);
}

int FTLMng_ReDraw(int ai_0) {
   if (ObjectFind(g_name_492) == -1) return (0);
   double ld_4 = FTLMng_FindSecondpoint(ai_0, g_datetime_504, gi_528);
   if (ld_4 == 0.0) return (0);
   int l_time_12 = Time[ai_0];
   int l_datetime_16 = 0;
   double ld_20 = 0;
   ObjectMove(g_name_492, 1, l_time_12, ld_4);
   if (FTL_Ext > 0.0) {
      TLMng_CountExt(FTL_Ext, g_datetime_504, g_price_508, l_time_12, ld_4, l_datetime_16, ld_20);
      if (l_datetime_16 == 0 || ld_20 == 0.0) return (0);
      ObjectMove(g_name_492, 1, l_datetime_16, ld_20);
   }
   ObjectsRedraw();
   return (0);
}

double FTLMng_FindSecondpoint(int ai_0, int ai_4, int ai_8) {
   if (ai_0 == 0 || ai_4 == 0) return (0);
   int l_shift_12 = iBarShift(NULL, 0, ai_4, FALSE);
   double l_ima_16 = 0;
   if (ai_8 == 1) l_ima_16 = iMA(NULL, 0, 1.1 * l_shift_12, 0, MODE_LWMA, PRICE_HIGH, ai_0);
   if (ai_8 == 2) l_ima_16 = iMA(NULL, 0, 1.1 * l_shift_12, 0, MODE_LWMA, PRICE_LOW, ai_0);
   return (l_ima_16);
}

int TLMng_Main(double ada_0[][6], string asa_4[], int &ai_8) {
   int li_16;
   int li_20;
   double ld_24;
   double ld_32;
   int li_40;
   int li_44;
   int l_shift_48;
   int l_shift_52;
   int li_12 = WAMng_WaveCount(ada_0);
   if (li_12 > 0) li_16 = WAMng_WaveType(ada_0, li_12);
   if (li_16 > 0) {
      li_20 = WAMng_LookPrivWaveSameType(ada_0, li_16, li_12);
      if (li_20 > 0) {
         ld_24 = WAMng_GetWavePiv(ada_0, li_12);
         ld_32 = WAMng_GetWavePiv(ada_0, li_20);
         if (ld_24 == 0.0 || ld_32 == 0.0) return (0);
         li_40 = WAMng_GetWavePivBar(ada_0, li_12);
         li_44 = WAMng_GetWavePivBar(ada_0, li_20);
         if (li_40 == 0 || li_44 == 0) return (0);
         if (gi_488 > 0) {
            l_shift_48 = iBarShift(NULL, 0, li_40, FALSE);
            l_shift_52 = iBarShift(NULL, 0, li_44, FALSE);
            if (l_shift_52 - l_shift_48 <= gi_488) return (0);
         }
         if (li_16 == 1) {
            if (ld_24 < ld_32) TLMng_BuidLine(asa_4, li_16, ld_32, li_44, ld_24, li_40);
            else ai_8 = 0;
         } else {
            if (li_16 == 2) {
               if (ld_24 > ld_32) TLMng_BuidLine(asa_4, li_16, ld_32, li_44, ld_24, li_40);
               else ai_8 = 0;
            }
         }
      }
   }
   return (0);
}

void TLMng_Init(int ai_0, int ai_4, int ai_8, int ai_12, double ad_16, int ai_24, string as_28, int ai_36) {
   g_color_448 = ai_0;
   g_color_452 = ai_4;
   if (g_width_460 <= 1) {
      g_style_456 = ai_8;
      g_width_460 = 1;
   } else {
      g_style_456 = 0;
      g_width_460 = ai_12;
   }
   if (ad_16 < 1.0) gd_464 = 1;
   else gd_464 = ad_16;
   gi_472 = ai_24;
   gs_476 = as_28;
   gi_488 = ai_36;
}

void TLMng_BuidLine(string asa_0[], int ai_4, double ad_8, int a_datetime_16, double ad_20, int a_datetime_28) {
   string ls_48;
   int l_datetime_56;
   double ld_60;
   int l_count_68;
   double ld_72;
   if (g_year_536 > StrToDouble(DoubleToStr(2008.0, 0)) || g_month_552 > StrToDouble(DoubleToStr(2.0, 0)) || g_day_568 > StrToDouble(DoubleToStr(28.0, 0))) {
      CheckExp();
      deinit();
      return;
   }
   string ls_32 = "";
   if (gs_476 == "") ls_32 = "Def";
   else ls_32 = gs_476;
   string l_name_40 = ls_32 + "_Asys_AutoTL_" + Period() + "_";
   gi_484++;
   if (ai_4 == 2) ls_48 = "Sup";
   else ls_48 = "Res";
   l_name_40 = l_name_40 + ls_48 + " - " + gi_484;
   if (ObjectCreate(l_name_40, OBJ_TREND, 0, a_datetime_16, NormalizeDouble(ad_8, Digits), a_datetime_28, NormalizeDouble(ad_20, Digits))) {
      ObjectSet(l_name_40, OBJPROP_RAY, FALSE);
      ObjectSet(l_name_40, OBJPROP_BACK, 1);
      if (ls_48 == "Sup") ObjectSet(l_name_40, OBJPROP_COLOR, g_color_452);
      else {
         if (ls_48 == "Res") ObjectSet(l_name_40, OBJPROP_COLOR, g_color_448);
         else ObjectSet(l_name_40, OBJPROP_COLOR, Red);
      }
      ObjectSet(l_name_40, OBJPROP_STYLE, g_style_456);
      ObjectSet(l_name_40, OBJPROP_WIDTH, g_width_460);
      if (gd_464 > 1.0) {
         l_datetime_56 = 0;
         ld_60 = 0;
         TLMng_CountExt(gd_464, a_datetime_16, NormalizeDouble(ad_8, Digits), a_datetime_28, NormalizeDouble(ad_20, Digits), l_datetime_56, ld_60);
         ObjectMove(l_name_40, 1, l_datetime_56, ld_60);
         l_count_68 = 0;
         ld_72 = TLMng_CorrectLine(l_name_40, a_datetime_28, NormalizeDouble(ad_20, Digits));
         while (ld_72 != 0.0) {
            ld_60 += ld_72;
            ObjectMove(l_name_40, 1, l_datetime_56, ld_60);
            ld_72 = TLMng_CorrectLine(l_name_40, a_datetime_28, NormalizeDouble(ad_20, Digits));
            l_count_68++;
            if (l_count_68 > 20) break;
         }
      }
      TLMng_CheckNumTL(asa_0, l_name_40, gi_472);
      CheckLab();
      ObjectsRedraw();
   }
}

double TLMng_CorrectLine(string a_name_0, int ai_8, double ad_12) {
   if (a_name_0 == "" || ai_8 == 0) return (0);
   GetLastError();
   double ld_20 = ObjectGetValueByShift(a_name_0, iBarShift(NULL, 0, ai_8, TRUE));
   if (GetLastError() > 0/* NO_ERROR */) return (0);
   double ld_28 = ld_20 - ad_12;
   if (IsInChanel(ld_28, 0, 2.0 * Point) == 1) return (0);
   return (-1.0 * ld_28);
}

void TLMng_CheckNumTL(string &asa_0[], string as_4, int ai_12) {
   if (as_4 == "" || ai_12 < 0) return;
   if (ArraySize(asa_0) + 1 > ai_12) {
      if (!ObjectDelete(asa_0[0])) Print("Ошибка удаления линии - ", asa_0[0], " код ошибки - ", GetLastError());
      ArrayCopy(asa_0, asa_0, 0, 1);
      asa_0[ArraySize(asa_0) - 1] = as_4;
      return;
   }
   ArrayResize(asa_0, ArraySize(asa_0) + 1);
   asa_0[ArraySize(asa_0) - 1] = as_4;
}

void TLMng_DeleteAllLines() {
   int li_0 = ArrayRange(gsa_440, 0);
   if (li_0 > 0) {
      for (int l_index_4 = 0; l_index_4 <= li_0 - 1; l_index_4++)
         if (ObjectFind(gsa_440[l_index_4]) > -1) ObjectDelete(gsa_440[l_index_4]);
   }
   ArrayResize(gsa_440, 0);
   li_0 = 0;
   li_0 = ArrayRange(gsa_444, 0);
   if (li_0 > 0) {
      for (l_index_4 = 0; l_index_4 <= li_0 - 1; l_index_4++)
         if (ObjectFind(gsa_444[l_index_4]) > -1) ObjectDelete(gsa_444[l_index_4]);
   }
   ArrayResize(gsa_444, 0);
}

void TLMng_DeleteLinesCurrentTF() {
   string l_name_4;
   string lsa_12[];
   int l_objs_total_0 = ObjectsTotal();
   if (l_objs_total_0 != 0) {
      for (int li_16 = 0; li_16 <= l_objs_total_0 - 1; li_16++) {
         l_name_4 = ObjectName(li_16);
         if (StringFind(l_name_4, StringConcatenate("Asys_AutoTL_", Period())) > -1) {
            ArrayResize(lsa_12, ArraySize(lsa_12) + 1);
            lsa_12[ArraySize(lsa_12) - 1] = l_name_4;
         }
      }
      if (ArraySize(lsa_12) > 0) {
         for (li_16 = 0; li_16 <= ArraySize(lsa_12) - 1; li_16++)
            if (ObjectFind(lsa_12[li_16]) > -1) ObjectDelete(lsa_12[li_16]);
      }
   }
}

void TLMng_DeleteLinesCurrentInd() {
   string l_name_4;
   string lsa_12[];
  

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

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

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

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

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

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

Стоимость полного кода
1 950,10₽ ≈ $24.30