Организация пакетной обработки задачи по снятию изображений с экрана графика - страница 2

 
Aleksey Vyazmikin:

Оказывается дело в этой функции - она врет иногда

И вот где-где же брать нормальную функцию, которая не врет и во всех условиях работает корректно!?!?!

Поменял на эту и все нормально работает 

Поторопился работает, но не на всех зумах - хрень.

 
Aleksey Vyazmikin:

Вы смотрели код? Из комментария очевидно - нет.

Затык показал визуально в чём. Есть идея, сейчас проверю.

Я не смотрел код из-за отсутствия времени и интереса, поэтому и попросил чётко сформулировать проблему. 

Из Вашей визуализации ничего не понял.

 
Nikolai Semko:

Эх, не хотите Вы внимательно читать мое первое сообщение. А я писал:
"Левый бар всегда рисуется от центра, правый как угодно. Поэтому начало координат в нуле (слева)."

Если Вы посчитаете пиксели, то поймете что ширина между барами в данном максимальном масштабе всегда 32, а левый бар начинается от центральной линии, а по сути это и есть временное начало. Т.е. размер тела свечи 23 (центральная линия + по 11 пикселей по бокам). У левого бара 11 пикселей - это как раз от центра, а значит от начала времени бара. Поэтому урезанным может быть только самый правый бар. О чем я и писал. С другими масштабами вся та же логика.
Поэтому всегда необходимо делать начало отсчета с левой свечи. Номер левого бара можно узнать с помощью идентификатора CHART_FIRST_VISIBLE_BAR
Что сложного? 
Ваша задача легко решается средствами MQL5. В чем затык? Можно поконкретней?

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

Т.е. на максимальном зумме, мы должны найти (32+23)*ЧИСЛО_НУЖНЫХ_БАРОВ+11+1?

 
Aleksey Vyazmikin:

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

Т.е. на максимальном зумме, мы должны найти (32+23)*ЧИСЛО_НУЖНЫХ_БАРОВ+11+1?

Да не надо ничего замерять. 

Я лишь этим подсчетом хотел вам показать, что следующее мое утверждение верно:

Ширина бара на каждом из 6 масштабов величина фиксированная (1,2,4,8,16,32). Узнать ее просто: 2 в степени "номер масштаба" (int от 0 до 5)

int WidthBar=int(1<<ChartGetInteger(0,CHART_SCALE));

Левый бар всегда рисуется от центра, правый как угодно. Поэтому начало счёта баров и пикселей необходимо вести с левого бара, который ВСЕГДА рисуется по центру свечи, что означает от времени бара.

Таким образом, зная номер первого левого бара (CHART_FIRST_VISIBLE_BAR) можно узнать с какого по какой пиксель находиться любой бар, находящийся правее.

ЗЫ:  Наверное правильнее было бы термин "ширина бара" заменить на "расстояние между барами"


 

Важное дополнение:

Это с точки зрения MQL5, и это совсем не очевидно. ))

Т.е. один бар на графике включает в себя две половинки соседних двух свечей.

это наглядно видно из этой гифки:


 
Nikolai Semko:

Да не надо ничего замерять. 

Я лишь этим подсчетом хотел вам показать, что следующее мое утверждение верно:

Ширина бара на каждом из 6 масштабов величина фиксированная (1,2,4,8,16,32). Узнать ее просто: 2 в степени "номер масштаба" (int от 0 до 5)

Левый бар всегда рисуется от центра, правый как угодно. Поэтому начало счёта баров и пикселей необходимо вести с левого бара, который ВСЕГДА рисуется по центру свечи, что означает от времени бара.

Таким образом, зная номер первого левого бара (CHART_FIRST_VISIBLE_BAR) можно узнать с какого по какой пиксель находиться любой бар, находящийся правее.

ЗЫ:  Наверное правильнее было бы термин "ширина бара" заменить на "расстояние между барами"


Я не понимаю, ширина бара что это есть? С учетом расстояния между барами или как?

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


Nikolai Semko:

Важное дополнение:

Это с точки зрения MQL5, и это совсем не очевидно. ))

Т.е. один бар на графике включает в себя две половинки соседних двух свечей.

это наглядно видно из этой гифки:


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

 
Aleksey Vyazmikin:

Я не понимаю, ширина бара что это есть? С учетом расстояния между барами или как?

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


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

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

   int TotalPixel=(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);   // Ширина графика в пикселях
   int WidthBar=int(1<<ChartGetInteger(0,CHART_SCALE));            // сколько пикселей между барами
   int FirstBar=(int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);   // номер первого (левого) бара на экране
   int VisibleBars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);     // количество видимых баров на экране
   int BarNr= FirstBar-12;                                         // номер искомого бара, допустим на 12 баров правее самого левого бара 
   int LeftPixelOfBar=((FirstBar-BarNr)>=VisibleBars || FirstBar<BarNr)?(-1):((FirstBar-BarNr)*WidthBar);  // левый пиксель искомого бара, если бара нет на экране тогда -1
   int RightPixelOfBar =(LeftPixelOfBar<0)?(-1):LeftPixelOfBar+WidthBar-1;                                 //правый пиксель искомого бара, если бара нет на экране тогда -1
   if (RightPixelOfBar>=TotalPixel) RightPixelOfBar=TotalPixel-1;  // проверяем не за пределами ли экрана 
Катапультируюсь с этой темы.
 
Nikolai Semko:

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

Катапультируюсь с этой темы.

Не торопитесь катапультироваться - куда лучше получить удовольствие от помощи другому, чем считать всех идиотами.

Вы такую конструкцию предлагаете, я правильно понял?

   int TotalPixel=(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);   // Ширина графика в пикселях
   int WidthBar=int(1<<ChartGetInteger(0,CHART_SCALE));            // сколько пикселей между барами
   int FirstBar=(int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);   // номер первого (левого) бара на экране
   int VisibleBars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);     // номер самого последнего(правого) видимого на экране бара
   int BarNr= FirstBar-(Shift_Start-Shift_Stop)*(-1);              // номер искомого бара, допустим на 12 баров правее самого левого бара 
   int LeftPixelOfBar=((FirstBar-BarNr)>=VisibleBars || FirstBar<BarNr)?(-1):((FirstBar-BarNr)*WidthBar);  // левый пиксель искомого бара, если бара нет на экране тогда -1
   int RightPixelOfBar =(LeftPixelOfBar<0)?(-1):LeftPixelOfBar+WidthBar-1;                                 //правый пиксель искомого бара, если бара нет на экране тогда -1
   if (RightPixelOfBar>=TotalPixel) RightPixelOfBar=TotalPixel-1;  // проверяем не за пределами ли экрана 
   pp=LeftPixelOfBar+RightPixelOfBar+GetBarSize(0)*((Shift_Start-Shift_Stop)*(-1)+2);
 
Aleksey Vyazmikin:

Не торопитесь катапультироваться - куда лучше получить удовольствие от помощи другому, чем считать всех идиотами.

Вы такую конструкцию предлагаете, я правильно понял?

А Вы можете расшифровать pp, Shift_Start,Shift_Stop, GetBarSize(0)?

 
Nikolai Semko:

А Вы можете расшифровать pp, Shift_Start,Shift_Stop?

pp - ширина для скрина

Shift_Start - номер бара начала скриншота  по функции iBarShift умноженная на -1

Shift_Stop - номер бара окончания скриншота по функции iBarShift умноженная на -1


Принтанул вот эти переменные:

Print("номер первого (левого) бара на экране - ",FirstBar, " номер самого последнего(правого) видимого на экране бара - ",VisibleBars);

получил такую строчку

номер первого (левого) бара на экране - 400755 номер самого последнего(правого) видимого на экране бара - 171

Смущает столь огромный номер первого бара - это от правой части (нулевого индекса) графика или как? Просто Вы пишите, что это номер видимого бара, и это не понятно...

Причина обращения: