Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
- Просмотров:
- 120
- Рейтинг:
- Опубликован:
-
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Вместо того чтобы нормализовать значения, мы просто присваиваем им балл. Я не могу полностью объяснить, почему, но в моем личном использовании это удивительно эффективно, особенно для обнаружения дивергенций.
//+------------------------------------------------------------------+ //|MultiConfluence_Index.mq5 | //|Индекс Конфлюэнса Stoch+RSI+MACD | //+------------------------------------------------------------------+ #property copyright "Multi-Confluence Index" #property version "1.00" #property indicator_separate_window #property indicator_buffers 6 #property indicator_plots 4 // Ligne principale de l'indice #property indicator_label1 "Confluence Index" #property indicator_type1 DRAW_LINE #property indicator_color1 clrDodgerBlue #property indicator_width1 3 // Ligne zéro #property indicator_label2 "Zero Line" #property indicator_type2 DRAW_LINE #property indicator_color2 clrGray #property indicator_width2 1 #property indicator_style2 STYLE_DOT // Зона бычьего экстрима #property indicator_label3 "Zone Bullish" #property indicator_type3 DRAW_FILLING #property indicator_color3 clrDarkGreen // Зона медвежьего экстрима #property indicator_label4 "Zone Bearish" #property indicator_type4 DRAW_FILLING #property indicator_color4 clrDarkRed //+------------------------------------------------------------------+ //| Входные параметры| //+------------------------------------------------------------------+ input group "=== TIMEFRAMES ===" input ENUM_TIMEFRAMES TF1 = PERIOD_CURRENT; // Таймфрейм 1 (быстрый) input ENUM_TIMEFRAMES TF2 = PERIOD_H1; // Таймфрейм 2 (средний) input ENUM_TIMEFRAMES TF3 = PERIOD_H4; // Таймфрейм 3 (медленный) input group "=== PARAMETRES ===" input int Stoch_K = 14; // Стохастический K input int Stoch_D = 3; // Стохастик D input int Stoch_Slowing = 3; // Стохастик замедляется input int RSI_Period = 14; // Период RSI input int MACD_Fast = 12; // MACD EMA Fast input int MACD_Slow = 26; // MACD EMA Slow input int MACD_Signal = 9; // Сигнал MACD //+------------------------------------------------------------------+ //| Буферы| //+------------------------------------------------------------------+ double IndexBuffer[]; double ZeroBuffer[]; double BullishZoneTop[]; double BullishZoneBottom[]; double BearishZoneTop[]; double BearishZoneBottom[]; // Ручки для индикаторов int handle_stoch_tf1, handle_stoch_tf2, handle_stoch_tf3; int handle_rsi_tf1, handle_rsi_tf2, handle_rsi_tf3; int handle_macd_tf1, handle_macd_tf2, handle_macd_tf3; //+------------------------------------------------------------------+ //| Инициализация| //+------------------------------------------------------------------+ int OnInit() { // Буферы SetIndexBuffer(0, IndexBuffer, INDICATOR_DATA); SetIndexBuffer(1, ZeroBuffer, INDICATOR_DATA); SetIndexBuffer(2, BullishZoneTop, INDICATOR_DATA); SetIndexBuffer(3, BullishZoneBottom, INDICATOR_DATA); SetIndexBuffer(4, BearishZoneTop, INDICATOR_DATA); SetIndexBuffer(5, BearishZoneBottom, INDICATOR_DATA); // Конфигурация ArraySetAsSeries(IndexBuffer, true); ArraySetAsSeries(ZeroBuffer, true); ArraySetAsSeries(BullishZoneTop, true); ArraySetAsSeries(BullishZoneBottom, true); ArraySetAsSeries(BearishZoneTop, true); ArraySetAsSeries(BearishZoneBottom, true); // Ligne zéro ArrayInitialize(ZeroBuffer, 0.0); // Конфигурация зон заполнения PlotIndexSetInteger(2, PLOT_DRAW_BEGIN, 0); PlotIndexSetInteger(3, PLOT_DRAW_BEGIN, 0); // Создание ручек - STOCHASTIC handle_stoch_tf1 = iStochastic(_Symbol, TF1, Stoch_K, Stoch_D, Stoch_Slowing, MODE_SMA, STO_LOWHIGH); handle_stoch_tf2 = iStochastic(_Symbol, TF2, Stoch_K, Stoch_D, Stoch_Slowing, MODE_SMA, STO_LOWHIGH); handle_stoch_tf3 = iStochastic(_Symbol, TF3, Stoch_K, Stoch_D, Stoch_Slowing, MODE_SMA, STO_LOWHIGH); // Создание ручек - RSI handle_rsi_tf1 = iRSI(_Symbol, TF1, RSI_Period, PRICE_CLOSE); handle_rsi_tf2 = iRSI(_Symbol, TF2, RSI_Period, PRICE_CLOSE); handle_rsi_tf3 = iRSI(_Symbol, TF3, RSI_Period, PRICE_CLOSE); // Создание ручек - MACD handle_macd_tf1 = iMACD(_Symbol, TF1, MACD_Fast, MACD_Slow, MACD_Signal, PRICE_CLOSE); handle_macd_tf2 = iMACD(_Symbol, TF2, MACD_Fast, MACD_Slow, MACD_Signal, PRICE_CLOSE); handle_macd_tf3 = iMACD(_Symbol, TF3, MACD_Fast, MACD_Slow, MACD_Signal, PRICE_CLOSE); // Проверка ручек if(handle_stoch_tf1 == INVALID_HANDLE || handle_stoch_tf2 == INVALID_HANDLE || handle_stoch_tf3 == INVALID_HANDLE || handle_rsi_tf1 == INVALID_HANDLE || handle_rsi_tf2 == INVALID_HANDLE || handle_rsi_tf3 == INVALID_HANDLE || handle_macd_tf1 == INVALID_HANDLE || handle_macd_tf2 == INVALID_HANDLE || handle_macd_tf3 == INVALID_HANDLE) { Print("ERROR: Impossible to create handles"); return(INIT_FAILED); } // Название и масштаб IndicatorSetString(INDICATOR_SHORTNAME, "Multi-Confluence Index"); IndicatorSetInteger(INDICATOR_DIGITS, 1); IndicatorSetDouble(INDICATOR_MINIMUM, -100); IndicatorSetDouble(INDICATOR_MAXIMUM, 100); // Уровни IndicatorSetInteger(INDICATOR_LEVELS, 3); IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, 0); IndicatorSetDouble(INDICATOR_LEVELVALUE, 1, 50); IndicatorSetDouble(INDICATOR_LEVELVALUE, 2, -50); IndicatorSetInteger(INDICATOR_LEVELCOLOR, 0, clrGray); IndicatorSetInteger(INDICATOR_LEVELCOLOR, 1, clrGreen); IndicatorSetInteger(INDICATOR_LEVELCOLOR, 2, clrRed); IndicatorSetInteger(INDICATOR_LEVELSTYLE, 0, STYLE_SOLID); IndicatorSetInteger(INDICATOR_LEVELSTYLE, 1, STYLE_DOT); IndicatorSetInteger(INDICATOR_LEVELSTYLE, 2, STYLE_DOT); Print("Multi-Confluence Index initialized - TF:", EnumToString(TF1), "/", EnumToString(TF2), "/", EnumToString(TF3)); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Деинициализация| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { if(handle_stoch_tf1 != INVALID_HANDLE) IndicatorRelease(handle_stoch_tf1); if(handle_stoch_tf2 != INVALID_HANDLE) IndicatorRelease(handle_stoch_tf2); if(handle_stoch_tf3 != INVALID_HANDLE) IndicatorRelease(handle_stoch_tf3); if(handle_rsi_tf1 != INVALID_HANDLE) IndicatorRelease(handle_rsi_tf1); if(handle_rsi_tf2 != INVALID_HANDLE) IndicatorRelease(handle_rsi_tf2); if(handle_rsi_tf3 != INVALID_HANDLE) IndicatorRelease(handle_rsi_tf3); if(handle_macd_tf1 != INVALID_HANDLE) IndicatorRelease(handle_macd_tf1); if(handle_macd_tf2 != INVALID_HANDLE) IndicatorRelease(handle_macd_tf2); if(handle_macd_tf3 != INVALID_HANDLE) IndicatorRelease(handle_macd_tf3); Comment(""); } //+------------------------------------------------------------------+ //| Основной расчет| //+------------------------------------------------------------------+ 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[]) { if(rates_total < 100) return(0); int limit = rates_total - prev_calculated; if(limit == 0) limit = 1; if(prev_calculated == 0) limit = rates_total - 100; // Массивы для данных (в виде серии, чтобы соответствовать индексации буфера) double stoch_k1[], stoch_d1[], stoch_k2[], stoch_d2[], stoch_k3[], stoch_d3[]; double rsi1[], rsi2[], rsi3[]; double macd_main1[], macd_sig1[], macd_main2[], macd_sig2[], macd_main3[], macd_sig3[]; ArraySetAsSeries(stoch_k1, true); ArraySetAsSeries(stoch_d1, true); ArraySetAsSeries(stoch_k2, true); ArraySetAsSeries(stoch_d2, true); ArraySetAsSeries(stoch_k3, true); ArraySetAsSeries(stoch_d3, true); ArraySetAsSeries(rsi1, true); ArraySetAsSeries(rsi2, true); ArraySetAsSeries(rsi3, true); ArraySetAsSeries(macd_main1, true); ArraySetAsSeries(macd_sig1, true); ArraySetAsSeries(macd_main2, true); ArraySetAsSeries(macd_sig2, true); ArraySetAsSeries(macd_main3, true); ArraySetAsSeries(macd_sig3, true); // Копирование данных - копирование достаточного количества баров int bars_to_copy = limit + 50; int copied = 0; copied = CopyBuffer(handle_stoch_tf1, 0, 0, bars_to_copy, stoch_k1); if(copied <= 0) { Print("ERROR: Failed to copy stoch_k1, code:", GetLastError()); return(prev_calculated); } if(CopyBuffer(handle_stoch_tf1, 1, 0, bars_to_copy, stoch_d1) <= 0) { Print("ERROR: Failed to copy stoch_d1"); return(prev_calculated); } if(CopyBuffer(handle_stoch_tf2, 0, 0, bars_to_copy, stoch_k2) <= 0) { Print("ERROR: Failed to copy stoch_k2"); return(prev_calculated); } if(CopyBuffer(handle_stoch_tf2, 1, 0, bars_to_copy, stoch_d2) <= 0) { Print("ERROR: Failed to copy stoch_d2"); return(prev_calculated); } if(CopyBuffer(handle_stoch_tf3, 0, 0, bars_to_copy, stoch_k3) <= 0) { Print("ERROR: Failed to copy stoch_k3"); return(prev_calculated); } if(CopyBuffer(handle_stoch_tf3, 1, 0, bars_to_copy, stoch_d3) <= 0) { Print("ERROR: Failed to copy stoch_d3"); return(prev_calculated); } if(CopyBuffer(handle_rsi_tf1, 0, 0, bars_to_copy, rsi1) <= 0) { Print("ERROR: Failed to copy rsi1"); return(prev_calculated); } if(CopyBuffer(handle_rsi_tf2, 0, 0, bars_to_copy, rsi2) <= 0) { Print("ERROR: Failed to copy rsi2"); return(prev_calculated); } if(CopyBuffer(handle_rsi_tf3, 0, 0, bars_to_copy, rsi3) <= 0) { Print("ERROR: Failed to copy rsi3"); return(prev_calculated); } if(CopyBuffer(handle_macd_tf1, 0, 0, bars_to_copy, macd_main1) <= 0) { Print("ERROR: Failed to copy macd_main1"); return(prev_calculated); } if(CopyBuffer(handle_macd_tf1, 1, 0, bars_to_copy, macd_sig1) <= 0) { Print("ERROR: Failed to copy macd_sig1"); return(prev_calculated); } if(CopyBuffer(handle_macd_tf2, 0, 0, bars_to_copy, macd_main2) <= 0) { Print("ERROR: Failed to copy macd_main2"); return(prev_calculated); } if(CopyBuffer(handle_macd_tf2, 1, 0, bars_to_copy, macd_sig2) <= 0) { Print("ERROR: Failed to copy macd_sig2"); return(prev_calculated); } if(CopyBuffer(handle_macd_tf3, 0, 0, bars_to_copy, macd_main3) <= 0) { Print("ERROR: Failed to copy macd_main3"); return(prev_calculated); } if(CopyBuffer(handle_macd_tf3, 1, 0, bars_to_copy, macd_sig3) <= 0) { Print("ERROR: Failed to copy macd_sig3"); return(prev_calculated); } Print("DEBUG: Copied ", copied, " bars, limit=", limit, " rates_total=", rates_total); // Вычисление индекса - теперь i=0 - это самый последний бар int calculated = 0; for(int i = 0; i < limit; i++) { // Проверка безопасности доступа к массиву if(i >= ArraySize(stoch_k1) || i >= ArraySize(stoch_k2) || i >= ArraySize(stoch_k3)) { Print("DEBUG: Skipping i=", i, " - stoch arrays too small"); continue; } if(i >= ArraySize(rsi1) || i >= ArraySize(rsi2) || i >= ArraySize(rsi3)) { Print("DEBUG: Skipping i=", i, " - rsi arrays too small"); continue; } if(i >= ArraySize(macd_main1) || i >= ArraySize(macd_main2) || i >= ArraySize(macd_main3)) { Print("DEBUG: Skipping i=", i, " - macd arrays too small"); continue; } double score = 0.0; //=== STOCHASTIQUE === // TF1 if(stoch_k1[i] > stoch_d1[i]) score += 11.0; else score -= 11.0; // TF2 if(stoch_k2[i] > stoch_d2[i]) score += 17.0; else score -= 17.0; // TF3 if(stoch_k3[i] > stoch_d3[i]) score += 17.0; else score -= 17.0; //=== RSI === // TF1 if(rsi1[i] > 50) score += 7.0; else score -= 7.0; // TF2 if(rsi2[i] > 50) score += 11.0; else score -= 11.0; // TF3 if(rsi3[i] > 50) score += 11.0; else score -= 11.0; //=== MACD === // TF1 if(macd_main1[i] > macd_sig1[i]) score += 6.0; else score -= 6.0; // TF2 if(macd_main2[i] > macd_sig2[i]) score += 10.0; else score -= 10.0; // TF3 if(macd_main3[i] > macd_sig3[i]) score += 10.0; else score -= 10.0; // Сток - i=0 - это текущий бар IndexBuffer[i] = score; calculated++; if(i < 3) // Отладка для 3 первых полос { Print("DEBUG: Bar[", i, "] score=", score, " stoch1=", stoch_k1[i], " rsi1=", rsi1[i], " macd1=", macd_main1[i]); } // Цветные зоны if(score > 50) { BullishZoneTop[i] = 100; BullishZoneBottom[i] = 50; } else { BullishZoneTop[i] = EMPTY_VALUE; BullishZoneBottom[i] = EMPTY_VALUE; } if(score < -50) { BearishZoneTop[i] = -50; BearishZoneBottom[i] = -100; } else { BearishZoneTop[i] = EMPTY_VALUE; BearishZoneBottom[i] = EMPTY_VALUE; } } Print("DEBUG: Calculated ", calculated, " bars out of ", limit); // Отладочная информация при первом вычислении if(prev_calculated == 0) { string info = StringFormat("Calculation completed | Current index: %.1f", IndexBuffer[0]); Print(info); Comment(info); } return(rates_total); } //+------------------------------------------------------------------+
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная публикация: https://www.mql5.com/en/code/66295
OBJ_BITMAP.mq5 — Скрипт для создания и управления изображениями на графике
Скрипт демонстрирует создание графического объекта "Рисунок" (OBJ_BITMAP) на графике с заданными параметрами (путь к файлу изображения, координаты, размер, смещение, цвет рамки и т.д.), динамически размещает изображения на графике в соответствии с видимыми барами, а затем удаляет их после завершения работы.
OBJ_ARROWED_LINE.mq5 — Скрипт для создания и управления линией со стрелкой на графике
Скрипт демонстрирует создание линии со стрелкой (OBJ_ARROWED_LINE) на графике с заданными параметрами (координаты, цвет, стиль линии, толщина и т.д.), динамически изменяет положение её точек по времени и цене, а затем удаляет объект после завершения работы.
wd.Range_BB
Обеспечивает расчет полосы Боллинджера как разницы в пунктах между верхней и нижней полосами. Внешний вид и поведение полос Боллинджера можно настраивать, изменяя период, сдвиг, отклонение и применяемую цену, а также цвет и стиль линий. Метка "Информация о диапазоне/полосе" может быть размещена в указанном под-окне, что позволяет настраивать положение метки. В целом, этот индикатор помогает трейдерам визуализировать гибкость и волатильность рынка на основе ширины полос Боллинджера.
OBJ_BUTTON.mq5 — Скрипт для создания и управления графической кнопкой на графике
Скрипт демонстрирует создание графического объекта "Кнопка" (OBJ_BUTTON) на графике с заданными параметрами (имя, положение, размер, угол привязки, шрифт, цвет текста, цвет фона, цвет границы, состояние, порядок отображения и др.), размещает кнопку в окне графика, динамически изменяет её размеры и положение, а затем удаляет после завершения работы.

