Logo

Вход

Войти с помощью соц. сетей
X
 
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения
  • #1 Свернуть

    Задача с подсчетом времени

    Будьте добры, подскажите!

    Есть такая задача.
    Известно количество времени в минутах Min.
    Задача: подсчитать дату Data, где Data = Текущее время + Min. Без учета нерабочих дней.
  • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
  • #2 Свернуть

    Сообщение от MOPEXOD Посмотреть сообщение
    Будьте добры, подскажите!

    Есть такая задача.
    Известно количество времени в минутах Min.
    Задача: подсчитать дату Data, где Data = Текущее время + Min. Без учета нерабочих дней.
    наверное такой код:


    PHP код:
    //+------------------------------------------------------------------+
    //|                                                     datatime.mq4 |
    //|                        Copyright 2018, MetaQuotes Software Corp. |
    //|                                             https://www.mql5.com |
    //+------------------------------------------------------------------+
    #property copyright "Copyright 2018, MetaQuotes Software Corp."
    #property link      "https://www.mql5.com"
    #property version   "1.00"
    #property strict
    #property script_show_inputs
    //--- input parameters
    input int Date_min 14400;
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
          
    datetime Date TimeCurrent() - Date_min*60;
          
    string s "dataline" TimeToStr(Date);
          
    ObjectCreate(s,OBJ_VLINE,0,Date,High[1],Date,High[1]);
          
    int numbar iBarShift(NULL,PERIOD_D1,Date);
          
    Comment("numbar = ",numbar);
       
      } 

    это скрипт
     

    Комментарий

    • #3 Свернуть

      Спасибо! Мысль понятна.

      Сообщение от IgorM Посмотреть сообщение
      datetime Date = TimeCurrent() - Date_min*60;
      Здесь будет +. Нужно же посчитать будущую дату.
      Только результат получается с учетом всех дней: и рабочих и нерабочих.
      Как исключить выходные?
       

      Комментарий

      • #4 Свернуть

        Нашел такое решение, может кому будет полезно:



        for(int n=1; n<520; n++) // диапазон 10 лет
        {
        Week=NormalizeDouble(Date_min/7200,0); // кол-во полных рабочих недель
        if (n>Week) break;
        if ( ((Week+1)*10080-(Date_min+2*1440*(Week+1))) <= 2*1440) // если остаток неполной недели попадает на выходные
        {
        DateMin=Date_min+2*1440*(Week+1); // + еще 2 выходных
        }
        else DateMin=Date_min+2*1440*Week; // + по 2 выходных на неделю
        }

           
        Последний раз редактировалось MOPEXOD; 25.02.2018, 10:00.

        Комментарий

        • #5 Свернуть

          Сообщение от MOPEXOD Посмотреть сообщение
          Нашел такое решение, может кому будет полезно:



          for(int n=1; n<520; n++) // диапазон 10 лет
          {
          Week=NormalizeDouble(Date_min/7200,0); // кол-во полных рабочих недель
          if (n>Week) break;
          if ( ((Week+1)*10080-(Date_min+2*1440*(Week+1))) <= 2*1440) // если остаток неполной недели попадает на выходные
          {
          DateMin=Date_min+2*1440*(Week+1); // + еще 2 выходных
          }
          else DateMin=Date_min+2*1440*Week; // + по 2 выходных на неделю
          }

          ну если это и есть решение Вашей задачи, тогда отлично!
          ЗЫ: я думал над Вашей задачей - если искать в прошлом заданное время, то код я уже предложил, оказалось, что Вам нужно искать время в будущем - тут уже нет дневного ТФ на котором нужно посчитать бары... Пока вижу несколько решений данной задачи:
          1. создаем ф-цию для перевода даты в день недели и затем считаем и проверяем дни
          2. можно взять мой готовый пример для расчета глубины дневных баров и выявить закономерность отсчета дней при вычитании от текущего и при сложении с текущим днем - т.е. сегодня вск, через 4 дня будет чт, а если 4 дня назад, то будет среда
          3. можно решить задачу "в лоб" - узнаем текущий день недели и прибавляем по одному дню и вычитаем по 1440 минут из Ваших начальных данных до тех пор пока Ваши "минуты" не закончатся, в ходе вычитания проверяем полученный день недели и отбрасываем будущие выходные дни.

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

          Комментарий

          • #6 Свернуть

            Мне помог Ваш первый вариант и... Эврика! Нужное решение пришло само. Проще не придумаешь.
            Спасибо за конструктивную подсказку
               

            Комментарий

            • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
            • #7 Свернуть

              В найденном решении все-таки обнаружилась неточность подсчета.
              Нашел другой вариант.


              CurMinWeekHour()+1)*60+Minute()+(DayOfWeek()-1)*1440; // минут прошло с начала текущей недели
              DoSB=7200-CurMinWeek; // минут осталось до СБ
              WeekRab=MathFloor(MinLeft/7200); // кол-во целых рабочих недель до дня расчета
              Ostatok=MinLeft-WeekRab*7200; // остаток минут
              Dob=MinLeft-((10080-CurMinWeek)+(WeekRab-1)*7200); // остаток до дня рассчета
              DateMin10080-CurMinWeek)+(WeekRab-1)*10080+Dob+2*1440;
              if ( (Dob+2*1440)>=7200) DateMin=DateMin+2*1440;
              Data=TimeToString(DateMin*60+TimeCur);
               

              Комментарий

              Сейчас онлайн

              working...
              X