Однако, у меня есть подозрение, что эта функция будет искажать действительность из-за округления (да я понимаю, что пиксели - целая величина, но количество баров может быть не целым на графике).
Внимательно еще раз прочтите это мое сообщение.
Ваше подозрение необоснованно. Посмотрите увеличенный до пикселей скриншот окна и просто посчитаете ручками.
Мне нужно сделать скрин от даты А до даты Б включительно. При этом отработка функции должна быть корректна на любом зуме.
А Вам дату (время наверное имеется ввиду) нужно округлять до бара или до пикселя?
Внимательно еще раз прочтите это мое сообщение.
Ваше подозрение необоснованно. Посмотрите увеличенный до пикселей скриншот окна и просто посчитаете ручками.
Что посчитать? На скрине отчетливо видно, что на нём 4 целых бара и 2 урезанных...
А Вам дату (время наверное имеется ввиду) нужно округлять до бара или до пикселя?
Имеется ввиду точную дату и время. Как можно округлять дату и время до пикселя? Мне нужно округлять до бара. Вообще выше скрины показывают, что нужно, и что иногда происходит.
Все таки надо запустить пиксельную линейку, мерять в пикселях на экране.
Потом смотреть что показывает скрипт буквально на каждом шаге, и сверяться с линейкой на экране, и понять где лажа при вашем 125% увеличении в свойсвах экрана.
(я пользуюсь mySize)
Все таки надо запустить пиксельную линейку, мерять в пикселях на экране.
Потом смотреть что показывает скрипт буквально на каждом шаге, и сверяться с линейкой на экране, и понять где лажа при вашем 125% увеличении в свойсвах экрана.
По идеи лажа она есть или её нет :) А тут редкие кадры несовпадения бывают... может что-то ещё надо учесть в самом коде...
При 100% разве там нет такой же лажи?Если добавить выведение без шкалы
if (ZOOM==Zoom_notShkala) { pp=(double)ChartGetInteger(handle,CHART_WIDTH_IN_PIXELS)/(double)ChartGetInteger(handle,CHART_WIDTH_IN_BARS)*((Shift_Start-Shift_Stop)*(-1)+3); ChartSetInteger(0,CHART_SHOW_PRICE_SCALE ,0);//Показывать или нет ценовую шкалу }
То пришлось добавить уже 3 бара, вместо двух к дельте дат начала и окончания скриншота (1 - для начала чуть правей, другой 1 - что б включительно скриншотился бар, а вот что за ещё 1?)
И Видим, что так же большинство уместилось за небольшим исключением - та же дата:
значит дело не в шкале... тогда в чём?
На графиках число баров и разрешение одинаковое, это так, информация к размышлению....
Что посчитать? На скрине отчетливо видно, что на нём не 4 целых бара и 2 урезанных...
Имеется ввиду точную дату и время. Как можно округлять дату и время до пикселя? Мне нужно округлять до бара. Вообще выше скрины показывают, что нужно, и что иногда происходит.
Эх, не хотите Вы внимательно читать мое первое сообщение. А я писал:
"Левый бар всегда рисуется от центра, правый как угодно. Поэтому начало координат в нуле (слева)."
Если Вы посчитаете пиксели, то поймете что ширина между барами в данном максимальном масштабе всегда 32, а левый бар начинается от центральной линии, а по сути это и есть временное начало. Т.е. размер тела свечи 23 (центральная линия + по 11 пикселей по бокам). У левого бара 11 пикселей - это как раз от центра, а значит от начала времени бара. Поэтому урезанным может быть только самый правый бар. О чем я и писал. С другими масштабами вся та же логика.
Поэтому всегда необходимо делать начало отсчета с левой свечи. Номер левого бара можно узнать с помощью идентификатора CHART_FIRST_VISIBLE_BAR.
Что сложного?
Ваша задача легко решается средствами MQL5. В чем затык? Можно поконкретней?
Эх, не хотите Вы внимательно читать мое первое сообщение. А я писал:
"Левый бар всегда рисуется от центра, правый как угодно. Поэтому начало координат в нуле (слева)."
Если Вы посчитаете пиксели, то поймете что ширина между барами в данном максимальном масштабе всегда 32, а левый бар начинается от центральной линии, а по сути это и есть временное начало. Т.е. размер тела свечи 23 (центральная линия + по 11 пикселей по бокам). У левого бара 11 пикселей - это как раз от центра, а значит от начала времени бара. Поэтому урезанным может быть только самый правый бар. О чем я и писал. С другими масштабами вся та же логика.
Поэтому всегда необходимо делать начало отсчета с левой свечи. Номер левого бара можно узнать с помощью идентификатора CHART_FIRST_VISIBLE_BAR.
Что сложного?
Ваша задача легко решается средствами MQL5. В чем затык? Можно поконкретней?
Вы смотрели код? Из комментария очевидно - нет.
Затык показал визуально в чём. Есть идея, сейчас проверю.Оказывается дело в этой функции - она врет иногда
//+------------------------------------------------------------------+ //| Получим iBarShift для заданного номера бара | //+------------------------------------------------------------------+ int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,const bool Exact=false) { static int Res=-1; static string LastSymb=NULL; static ENUM_TIMEFRAMES LastTimeFrame=0; static datetime LastTime=0; static bool LastExact=false; static int PerSec=::PeriodSeconds(LastTimeFrame); if (LastTimeFrame!=TimeFrame) PerSec=::PeriodSeconds(TimeFrame); time-=time%PerSec; if((time!=LastTime) || (Symb!=LastSymb) || (TimeFrame!=LastTimeFrame) || (Exact!=LastExact)) { Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1; if(Res<0) Res=0; LastTime = time; LastSymb = Symb; LastTimeFrame=TimeFrame; LastExact=Exact; } return(Res); }
И вот где-где же брать нормальную функцию, которая не врет и во всех условиях работает корректно!?!?!
Поменял на эту и все нормально работает
int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false) { int Res=Bars(Symb,TimeFrame,time+1,UINT_MAX); if(exact) if((TimeFrame!=PERIOD_MN1 || time>TimeCurrent()) && Res==Bars(Symb,TimeFrame,time-PeriodSeconds(TimeFrame)+1,UINT_MAX)) return(-1); return(Res); }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Встала у меня задача доработать скрипт https://www.mql5.com/ru/code/936 , который делает скрины.
Моя цель сделать пакетную обработку изображений, согласно известным диапазонам дат - даты нужно брать из файла, но в промежуточном варианте из массива.
Самой сложной задачей оказалось определить ширину скриншота, что б туда помещались все бары за указанный диапазон. Методом перебора, я определил, количество баров за шкалой в зависимости от настроек Windows и силы приближения графика, но я не учел, что ширина ценовой шкалы графика может меняться и в зависимости от цен, поэтому метод оказался не универсальным, но я его оставил в коде.
Уважаемый fxsaber предлагает такой вариант для определения ширины ценовой шкалы:
А для получения размера 1 бара в пикселях был предложен такой вариант
Однако, у меня есть подозрение, что эта функция будет искажать действительность из-за округления (да я понимаю, что пиксели - целая величина, но количество баров может быть не целым на графике).
Пробовал разные варианты, и где-то один вариант лучше другого, а где-то нет.
Такой вариант показал себя, как более точный
Ниже выкладываю черновой код, который делает группу скриншотов, согласно датам из массива, можно настроить коэффициент для отступа цены от верхней/нижней границе скриншота, а так же выбрать вариант расчета в зависимости от настройки Windows и по методу определения ширины шкалы fxsaber
Прошу помощи в поиске универсального решения задачи - поиск верной ширины скриншота.
Улучшения и оптимизация текущего кода так же приветствуется!