autotrendlines_v2.01_alert.mq5
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.