Смотри, как бесплатно скачать роботов
Ищи нас в Facebook!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Индикаторы

Buffers for each hour (binary) and an hour buffer from 0-23 - for data collection purposes - индикатор для MetaTrader 5

Просмотров:
211
Рейтинг:
(5)
Опубликован:
MQL5 Фриланс Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Назначение

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

Если данные из других индикаторов собираются в CSV, например, с помощью функции CopyBuffer, этот индикатор позволяет использовать фиктивные столбцы для собираемого часа в качестве дополнительных данных.

  • Это простой код для тех, кто собирает данные, например, для целей ML, чтобы иметь готовую фиктивную переменную (буферы с 0 по 23) или переменную часа (буфер 24) для использования в моделировании.

Прохождение по коду

  • Начнем с объявления номера буфера и номера участка 25:

#property indicator_chart_window
#property indicator_buffers 25
#property indicator_plots 25

Маркировка буферов

  • Определите метки буферов для окна данных:

#property indicator_label1  "Hour 00"
#property indicator_label2  "Hour 01"
#property indicator_label3  "Hour 02"
#property indicator_label4  "Hour 03"
#property indicator_label5  "Hour 04"
#property indicator_label6  "Hour 05"
#property indicator_label7  "Hour 06"
#property indicator_label8  "Hour 07"
#property indicator_label9  "Hour 08"
#property indicator_label10 "Hour 09"
#property indicator_label11 "Hour 10"
#property indicator_label12 "Hour 11"
#property indicator_label13 "Hour 12"
#property indicator_label14 "Hour 13"
#property indicator_label15 "Hour 14"
#property indicator_label16 "Hour 15"
#property  indicator_label17 "Hour 16"
#property  indicator_label18 "Hour 17"
#property  indicator_label19 "Hour 18"
#property  indicator_label20 "Hour 19"
#property  indicator_label21 "Hour 20"
#property  indicator_label22 "Hour 21"
#property  indicator_label23 "Hour 22"
#property  indicator_label24 "Hour 23"
#property  indicator_label25 "Hour"

Объявление буферов

  • Приступили к объявлению буферов, а также целочисленной переменной для часа дня, который будет вычислен позже.

double hourBuffer0[];
double hourBuffer1[];
double hourBuffer2[];
double hourBuffer3[];
double hourBuffer4[];
double hourBuffer5[];
double hourBuffer6[];
double hourBuffer7[];
double hourBuffer8[];
double hourBuffer9[];
double hourBuffer10[];
double hourBuffer11[];
double hourBuffer12[];
double hourBuffer13[];
double hourBuffer14[];
double hourBuffer15[];
double hourBuffer16[];
double hourBuffer17[];
double hourBuffer18[];
double hourBuffer19[];
double hourBuffer20[];
double hourBuffer21[];
double hourBuffer22[];
double hourBuffer23[];
double hourBuffer[];

int bar_hour;

Индексация и построение графика

Установил индексы для всех буферов как данные и отключил построение графиков с помощью цикла (попытка выполнить индексацию с помощью цикла выдала ошибку, что нельзя передать, например, hourBuffer[q] через SetIndexBuffer, поэтому делали это по очереди; но зацикливание, похоже, работает для PlotIndexSetInteger, что полезно).

   // Присваиваем буферам индекс, скрываем от графика, показываем в окне данных
   SetIndexBuffer(0,  hourBuffer0,  INDICATOR_DATA); 
   SetIndexBuffer(1,  hourBuffer1,  INDICATOR_DATA); 
   SetIndexBuffer(2,  hourBuffer2,  INDICATOR_DATA); 
   SetIndexBuffer(3,  hourBuffer3,  INDICATOR_DATA); 
   SetIndexBuffer(4,  hourBuffer4,  INDICATOR_DATA); 
   SetIndexBuffer(5,  hourBuffer5,  INDICATOR_DATA); 
   SetIndexBuffer(6,  hourBuffer6,  INDICATOR_DATA); 
   SetIndexBuffer(7,  hourBuffer7,  INDICATOR_DATA); 
   SetIndexBuffer(8,  hourBuffer8,  INDICATOR_DATA); 
   SetIndexBuffer(9,  hourBuffer9,  INDICATOR_DATA); 
   SetIndexBuffer(10, hourBuffer10, INDICATOR_DATA); 
   SetIndexBuffer(11, hourBuffer11, INDICATOR_DATA); 
   SetIndexBuffer(12, hourBuffer12, INDICATOR_DATA); 
   SetIndexBuffer(13, hourBuffer13, INDICATOR_DATA); 
   SetIndexBuffer(14, hourBuffer14, INDICATOR_DATA); 
   SetIndexBuffer(15, hourBuffer15, INDICATOR_DATA); 
   SetIndexBuffer(16, hourBuffer16, INDICATOR_DATA); 
   SetIndexBuffer(17, hourBuffer17, INDICATOR_DATA); 
   SetIndexBuffer(18, hourBuffer18, INDICATOR_DATA); 
   SetIndexBuffer(19, hourBuffer19, INDICATOR_DATA); 
   SetIndexBuffer(20, hourBuffer20, INDICATOR_DATA); 
   SetIndexBuffer(21, hourBuffer21, INDICATOR_DATA); 
   SetIndexBuffer(22, hourBuffer22, INDICATOR_DATA); 
   SetIndexBuffer(23, hourBuffer23, INDICATOR_DATA);
   SetIndexBuffer(24, hourBuffer, INDICATOR_DATA);

   for(int i = 0; i < 24; i++)
   {
      PlotIndexSetInteger(i, PLOT_DRAW_TYPE, DRAW_NONE);
      PlotIndexSetInteger(i, PLOT_SHOW_DATA, true);
   }

   return(INIT_SUCCEEDED);
}

Циклы и программа функции OnCalculate

  • Затем мы переходим к функции OnCalculate:
  • Здесь мы устанавливаем все буферы обратно в ноль, и только тот, который соответствует текущему часу, меняем на единицу. Возможно, здесь можно получить выигрыш в эффективности, но об этом позже.

    if(rates_total <= 0)
        return(0);

    // Мы будем пересчитывать с первого необработанного бара
    int start = (prev_calculated > 0 ? prev_calculated - 1 : 0);

    for(int i = start; i < rates_total; i++)
    {
       // Вычислите час (0..23) для бара i
       bar_hour = (int)((time[i] % 86400) / 3600);
      

       // 1) Установите ВСЕ 24 буфера для бара i в 0
       hourBuffer0[i]  = 0.0;
       hourBuffer1[i]  = 0.0;
       hourBuffer2[i]  = 0.0;
       hourBuffer3[i]  = 0.0;
       hourBuffer4[i]  = 0.0;
       hourBuffer5[i]  = 0.0;
       hourBuffer6[i]  = 0.0;
       hourBuffer7[i]  = 0.0;
       hourBuffer8[i]  = 0.0;
       hourBuffer9[i]  = 0.0;
       hourBuffer10[i] = 0.0;
       hourBuffer11[i] = 0.0;
       hourBuffer12[i] = 0.0;
       hourBuffer13[i] = 0.0;
       hourBuffer14[i] = 0.0;
       hourBuffer15[i] = 0.0;
       hourBuffer16[i] = 0.0;
       hourBuffer17[i] = 0.0;
       hourBuffer18[i] = 0.0;
       hourBuffer19[i] = 0.0;
       hourBuffer20[i] = 0.0;
       hourBuffer21[i] = 0.0;
       hourBuffer22[i] = 0.0;
       hourBuffer23[i] = 0.0;
       hourBuffer[i] = EMPTY_VALUE;

       // 2) Теперь установите только буфер совпадения на 1
       switch (bar_hour)
       {
         case 0:  hourBuffer0[i]  = 1.0; hourBuffer[i] = bar_hour; break;
         case 1:  hourBuffer1[i]  = 1.0; hourBuffer[i] = bar_hour; break;
         case 2:  hourBuffer2[i]  = 1.0; hourBuffer[i] = bar_hour; break;
         case 3:  hourBuffer3[i]  = 1.0; hourBuffer[i] = bar_hour; break;
         case 4:  hourBuffer4[i]  = 1.0; hourBuffer[i] = bar_hour; break;
         case 5:  hourBuffer5[i]  = 1.0; hourBuffer[i] = bar_hour; break;
         case 6:  hourBuffer6[i]  = 1.0; hourBuffer[i] = bar_hour; break;
         case 7:  hourBuffer7[i]  = 1.0; hourBuffer[i] = bar_hour; break;
         case 8:  hourBuffer8[i]  = 1.0; hourBuffer[i] = bar_hour; break;
         case 9:  hourBuffer9[i]  = 1.0; hourBuffer[i] = bar_hour; break;
         case 10: hourBuffer10[i] = 1.0; hourBuffer[i] = bar_hour; break;
         case 11: hourBuffer11[i] = 1.0; hourBuffer[i] = bar_hour; break;
         case 12: hourBuffer12[i] = 1.0; hourBuffer[i] = bar_hour; break;
         case 13: hourBuffer13[i] = 1.0; hourBuffer[i] = bar_hour; break;
         case 14: hourBuffer14[i] = 1.0; hourBuffer[i] = bar_hour; break;
         case 15: hourBuffer15[i] = 1.0; hourBuffer[i] = bar_hour; break;
         case 16: hourBuffer16[i] = 1.0; hourBuffer[i] = bar_hour; break;
         case 17: hourBuffer17[i] = 1.0; hourBuffer[i] = bar_hour; break;
         case 18: hourBuffer18[i] = 1.0; hourBuffer[i] = bar_hour; break;
         case 19: hourBuffer19[i] = 1.0; hourBuffer[i] = bar_hour; break;
         case 20: hourBuffer20[i] = 1.0; hourBuffer[i] = bar_hour; break;
         case 21: hourBuffer21[i] = 1.0; hourBuffer[i] = bar_hour; break;
         case 22: hourBuffer22[i] = 1.0; hourBuffer[i] = bar_hour; break;
         case 23: hourBuffer23[i] = 1.0; hourBuffer[i] = bar_hour; break;
       }
       
      string localHourText = HourToText(bar_hour);
      Comment("The hour is: ", localHourText);
    }

    // Возвращаем количество обработанных баров
    return(rates_total);

Функция для добавления вкуса к комментарию

  • И, наконец, программа для комментария:
  • По сути, это отладочная проверка, но я оставил комментирование.

string HourToText(int bh) {
string TextHour;

switch(bh)
{
   case 0:
      TextHour = "12 am"; // полночный час в 12-часовом формате
      break;

   case 1:
      TextHour = "1 am";
      break;

   case 2:
      TextHour = "2 am";
      break;

   case 3:
      TextHour = "3 am";
      break;

   case 4:
      TextHour = "4 am";
      break;

   case 5:
      TextHour = "5 am";
      break;

   case 6:
      TextHour = "6 am";
      break;

   case 7:
      TextHour = "7 am";
      break;

   case 8:
      TextHour = "8 am";
      break;

   case 9:
      TextHour = "9 am";
      break;

   case 10:
      TextHour = "10 am";
      break;

   case 11:
      TextHour = "11 am";
      break;

   case 12:
      TextHour = "12 pm"; // полуденный час в 12-часовом формате
      break;

   case 13:
      TextHour = "1 pm";
      break;

   case 14:
      TextHour = "2 pm";
      break;

   case 15:
      TextHour = "3 pm";
      break;

   case 16:
      TextHour = "4 pm";
      break;

   case 17:
      TextHour = "5 pm";
      break;

   case 18:
      TextHour = "6 pm";
      break;

   case 19:
      TextHour = "7 pm";
      break;

   case 20:
      TextHour = "8 pm";
      break;

   case 21:
      TextHour = "9 pm";
      break;

   case 22:
      TextHour = "10 pm";
      break;

   case 23:
      TextHour = "11 pm";
      break;

   default:
      // На случай, если 'bh' выходит за пределы диапазона (0..23)
      TextHour = "Unknown";
      break;
}

return TextHour;

Обратите внимание, что в настоящее время она отображается только в окне данных.


Всем счастливого Рождества и Нового 2025 года.

Перевод с английского произведен MetaQuotes Ltd.
Оригинальная публикация: https://www.mql5.com/en/code/54446

2 Moving Averages with Bollinger Bands 2 Moving Averages with Bollinger Bands

"2 Moving Averages with Bollinger Bands" - это пользовательский индикатор MT5, который сочетает в себе две настраиваемые скользящие средние и дополнительные полосы Боллинджера. Он генерирует стрелки на покупку и продажу в реальном времени, когда происходят пересечения, с дополнительными оповещениями, звуком и уведомлениями по электронной почте. Подходит для всех таймфреймов и символов

Perfect Trailing StopLoss Perfect Trailing StopLoss

Скопируйте их в любой советник, которым вы занимаетесь, и у вас появится трейлинг sl. Единственное, что вам нужно будет изменить, это InpMagic для вашего магического числа, или вы можете просто скопировать мой код как есть, не забудьте добавить COrderinfo ord; и CPositionInfo pos;

Максимизатор прибыли Максимизатор прибыли

Индикатор Profit Maximiser (PMax) - это индикатор, созданный путем интеграции скользящей средней индикатора Supertrend.

Profit labels for closed trades (deals) Profit labels for closed trades (deals)

Создание меток прибыли на сделках (закрытых сделках), которые также отображаются в тестере стратегий