Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2683

 
lynxntech #:

Подскажите как получить время начала открытия дня на текущем символе

интересует например XAUUSD  у него должно быть открытие 01 час,


такая функция показывает

2025.11.27 00:00, должно быть 01 час

пытаюсь нарисовать трендовую линию от открытия дня, и не получается привязаться к символам которые открываются не в 00 часов,

т.е. если задать стартовую точку на трендовой линии 00 часов, а торговый день по символу начинается позже (MOEX например), то линия привязывается ко времени на один бар назад, выглядит это так:


datetime dayStartTime = iTime(_Symbol, PERIOD_D1, 0);
Print(TimeToString(dayStartTime));

Как вариант. Прибавить один час к dayStartTime (+3600). Чтоб рисовалось на бар позже.

 
lynxntech #:

Нужно по текущему символу.......... Не подстраивать инпутами под разные рынки

Есть несколько топорный вариант, но, пожалуй, он сработает.

1. Пишем индикатор, который на Д1 будет отслеживать число свеч на графике (это очень просто; см. ниже). В индикатор вставляем переменную глобального уровня терминала и в блоке инициализации её обнуляем. Если появилась новая свеча, то индикатор вносит в эту переменную положительное число. Он это делает  один раз в день.

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

Поскольку ранок того же Золота открывается не в ноль часов, а в час, то и свеча нового дня начнёт формироваться в час.

Код для отслеживания новой свечи:

int    myBars;

// ---------- В блоке инициализации пишем:
        
        myBars!=Bars;// Это если нужно, чтоб индикатор стартонул завтра

// ---------- В старте индикатора пишем:

if(isNewBar()==true){
        // Здесь присваиваем переменной глобального уровня терминала положительное значение
}


//+------------------------------------------------------------------+
//| функция isNewBar() - возвращает признак нового бара                                              |
//+------------------------------------------------------------------+
bool isNewBar(){

  bool res=false;

  if(myBars!=Bars){
    res=true;
    myBars=Bars;
  }   

  return(res);
}
 
Putnik #:

Как вариант. Прибавить один час к dayStartTime (+3600). Чтоб рисовалось на бар позже.

это не будет работать, нужно указывать не плюс бар, а конкретное время, а это и +7 часов и +9:50 к 00 часам, иначе опять привязка к прошлому ближайшему бару


Aleksandr Slavskii скинул подобное обсуждение, пока не смотрел эти решения

https://www.mql5.com/ru/forum/441593/page2#comment_44973956


пока вижу самый простой вариант - сравнивать значение OpenD1, если не равно, пройтись CopyTime по последним барам, найти меньшее время

Что такое PERIOD?
Что такое PERIOD?
  • 2023.02.13
  • www.mql5.com
что время открытия баров должны соответствовать таймфрейму M1. При попытке получения котировок первого часа по времени открытия дневного бара система возвращает данные последнего бара предыдущего дня. автоматическим торговым системам и тестированию торговых стратегий
 
lynxntech #:

это не будет работать, нужно указывать не плюс бар, а конкретное время, а это и +7 часов и +9:50 к 00 часам, иначе опять привязка к прошлому ближайшему бару


пока вижу самый простой вариант - сравнивать значение OpenD1, если не равно, пройтись CopyTime по последним барам, найти меньшее время

Может такой вариант подойдёт?

/*******************Script program start function********************/
void OnStart()
 {
  datetime tc=iTime(_Symbol,PERIOD_D1,0);
  int bar=iBarShift(_Symbol,PERIOD_CURRENT,tc,false);
  Print(iTime(_Symbol,PERIOD_CURRENT,bar-1));
 }/******************************************************************/

Можно и даже наверное нужно добавить условия проверки типа если полученное время … 

Вариант с проверкой

/*******************Script program start function********************/
void OnStart()
 {
  datetime tc=iTime(_Symbol,PERIOD_D1,0);
  int bar=iBarShift(_Symbol,PERIOD_CURRENT,tc,false);
  datetime td=iTime(_Symbol,PERIOD_CURRENT,bar);
  if(td < tc)
    bar--;
  Print(iTime(_Symbol,PERIOD_CURRENT,bar));
 }/******************************************************************/
 
Yuriy Bykov #:
Ваш код, во-первых, не с индикатора, а для советника. Во-вторых, он должен компилироваться с ошибкой. В-третьих, этот код не отвечает на поставленный вопрос. Где у вас в коде можно увидеть время начала дня в любое время суток? Поэтому, либо исправляйте и выкладывайте рабочий код, либо не выкладывайте вовсе. 
Тут главное идея и подход к проблеме.
 
Alexey Viktorov #:

Может такой вариант подойдёт?

Можно и даже наверное нужно добавить условия проверки типа если полученное время … 

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

 
lynxntech #:

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

Ничего не повиснет. В коде нет ни одного цикла которые вешают выполнение кодов. В индикаторе даже проще, там имеется массив текущего времени.

Я подсказал вариант поиска и проверки полученного результата. А вы сами по этому примеру можете править свои мысли или просто забыть об этом.

 
Alexey Viktorov #:

Ничего не повиснет. В коде нет ни одного цикла которые вешают выполнение кодов. В индикаторе даже проще, там имеется массив текущего времени.

Я подсказал вариант поиска и проверки полученного результата. А вы сами по этому примеру можете править свои мысли или просто забыть об этом.

в общем в индикаторе опять не работает)

привязка опять не к 1:00 по xauusd, правильно начинают день рисовать индикаторные буфера, но они не могут в будущее рисовать, т.е. сразу до конца дня, вот пытаюсь такую простую функцию реализовать в виде "ПАЛОК" от начала дня до конца, оказалось не так и просто

т.е. они по факту нужны только на последнем дне, для визуального просмотра, и не участвовать в расчетах по всему графику


можно дорисовать от текущего часа палку, но находясь на одной ценовой шкале с индикаторными линиями не совпадают))) некрасиво. 

 
lynxntech #:

в общем в индикаторе опять не работает)

привязка опять не к 1:00 по xauusd, правильно начинают день рисовать индикаторные буфера, но они не могут в будущее рисовать, т.е. сразу до конца дня, вот пытаюсь такую простую функцию реализовать в виде "ПАЛОК" от начала дня до конца, оказалось не так и просто

т.е. они по факту нужны только на последнем дне, для визуального просмотра, и не участвовать в расчетах по всему графику


можно дорисовать от текущего часа палку, но находясь на одной ценовой шкале с индикаторными линиями не совпадают))) некрасиво.

Всё работает

/****************Custom indicator iteration function*****************/
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[])

 {
  datetime tc=iTime(_Symbol,PERIOD_D1,0);
  int bar=Bars(_Symbol,PERIOD_CURRENT,time[rates_total-1],tc);
  datetime td=time[rates_total-bar];
  if(td < tc)
    bar--;
  Comment("\n",time[rates_total-bar]);
  return rates_total;
 }/******************************************************************/



Я отвечал только на этот вопрос

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам

lynxntech, 2025.11.27 17:40

Подскажите как получить время начала открытия дня на текущем символе

интересует например XAUUSD  у него должно быть открытие 01 час,


такая функция показывает

2025.11.27 00:00, должно быть 01 час

datetime dayStartTime = iTime(_Symbol, PERIOD_D1, 0);
Print(TimeToString(dayStartTime));

пытаюсь нарисовать трендовую линию от открытия дня, и не получается привязаться к символам которые открываются не в 00 часов,

т.е. если задать стартовую точку на трендовой линии 00 часов, а торговый день по символу начинается позже (MOEX например), то линия привязывается ко времени на один бар назад, выглядит это так:


Начало дня определяется элементарно и достаточно точно. Что не получается дальше, это уже другой вопрос.
 
lynxntech #:

не работает, вот скрипт линию рисует,

Вот почему у меня такая плохая память? Я уже зарекался вам что либо подсказывать и опять попал на те-же грабли.

Вы хоть чуток думать умеете??? Где определяется переменная td? И какое время распечатывается? Какое время вы ставите в создание трендовой???

Бесплатный вам совет: Бросьте заниматься программированием. Это не ваше. Не царское дело в … ковыряться.