Хочу поставить точку на чарт - страница 2

 
Сейчас не проверял, nen, но с чем-то подобным сталкивался раньше: если трендовые линии идут в будущее, то потом они довольно сильно "съезжают". Возможно, это связано с несоответствием барового и реального времени, особенно на самых мелких ТФ. Ну если точнее, то линейная экстраполяция баров не работает...

Может быть, их надо просто почаще перерисовывать?

P.S. Линии, начинающиеся непосредственно в этих точках, вряд ли можно, так как опорные точки линий всегда жестко привязаны к барам. Надо эти опорные точки вычислять.
 

Вопрос на засыпку для Quod Licet: если все это нарисовать крестиками, то на какие из пересечений линий надо обращать взгляд?


Иронию Вашу полагаю неуместной, поскольку отдельно написал, что ситуации детально не знаю, а потому настаивать не могу. Это была всего лишь идея, мелькнувшая при взгляде на Ваш изначальный пост (сам я предпочитаю меньшие масштабы, и нецелое смещение не использую). Пользоваться или не пользоваться ею - Ваше право.

Не вижу, в чем Вы усматриваете проблему при программном вычислении зума (обсужденных в данном треде возможностей достаточно, и практически все шаги для написания такой функции Вы проделали, осталось лишь оформить это в три строчки кода - во всяком случае, в моей аналогичной функции три строчки), однако используемые Вами тонны сарказма делают общение малопродуктивным, засим откланиваюсь.
 
Согласен, Quod Licet, моя ирония была неуместной. Фактически это была даже не ирония, а легкое перевозбуждение от частного успеха. А еще точнее - просто подтрунивание (Ваш совет в первом посте о крестиках я вначале воспринял как шутку).

Кстати, когда как следует подумал, у меня тут же получились функции вычисления или установки зума (скрипт). Правда, не в 3 строки:

// в файл введены две строчки, указанные ранее
#include <WinUser32.mqh>

void zoomIn()
{
   int hwnd = WindowHandle( Symbol(), 0 );
   PostMessageA(hwnd, WM_KEYDOWN, VK_ADD, 0); 
   return;
}

void zoomOut()
{
   int hwnd = WindowHandle( Symbol(), 0 );
   PostMessageA(hwnd, WM_KEYDOWN, VK_SUBTRACT, 0); 
   return;
}

// zoom = 0 при минимальном расстоянии между барами, и zoom = 5 при максимальном.
// Правда, экран мигает - не очень красиво...
int WindowGetZoom()
{
   int step = 0;
   int barsNow;
   int barsBefore = WindowBarsPerChart(); 
   while ( true ) 
   {
      zoomIn();
      barsNow = WindowBarsPerChart();
      if ( barsNow == barsBefore ) break; 
      else
      {
         barsBefore = barsNow;
         step++;
      }   
   }
   if ( step > 0 ) 
      for( int j = 0; j < step; j++ ) zoomOut();
   return ( 5 - step );
}

void WindowSetZoom( int zoom )
{
   int curZoom = WindowGetZoom();
   int j;
   if ( curZoom < zoom )
      for( j = 0; j < zoom - curZoom; j++ ) zoomIn();
   else
      for( j = 0; j < curZoom - zoom; j++ ) zoomOut();   
   return;
}
 
int start()
{
   Print( "Zoom = ", WindowGetZoom() );
   WindowSetZoom( 2 );
   return(0);
}



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


 
Признайтесь, разговор о margins вы восприняли также как шутку, что, определенно, сыграло шутку с вами ).

return(MathLog((GetClientWidth(hwnd)-3-41)/WindowBarsPerChart())/MathLog(2)) возвращает искомый вами масштаб. Ровно одна строчка. И еще две строчки - в dll, которая оборачивает GetClientRect в GetClientWidth.
 
Да, изячно, ничего не скажешь. Ну у меня же нет dll, которая "оборачивает GetClientRect в GetClientWidth". И я не планирую пользовать никаких dll, кроме kernel32. А Вы не подскажете, как эту функцию (GetClientRect()) импортировать в WinUser32.mqh?
 
К слову, имеет смысл импортировать новые api-функции уже в Ваш mqh-файл, поскольку WinUser32 - стандартный модуль, который изменять из общих соображений не рекомендуется.

В общем же, есть одна особенность - GetClientRect возвращает LPRECТ - это структура (а структур в mql нет), поэтому проще именно обернуть (wrapping - общепринятый термин) ее своей функцией, возвращающей int. На каком-то этапе становится удобней таки иметь свою dll с утилитами, некоторые вещи без нее не сделаешь, а добавление функции-враппера в уже имеющийся код в этом случае элементарно.

Если все же нужно обойтись - то попробуйте int& buf[].

GetClientRect описано следующим образом

BOOL GetClientRect(
HWND hWnd,
LPRECT lpRect
);

опишите ее в импорте как int GetClientRect(int hwnd, int& buf[]), передайте туда буфер достаточного размера, и посмотрите на результат. Если мне не изменяет память, int в mql 32-битный, так что, возможно, придется посмотреть на четные элементы массива, поскольку long длиннее в два раза. Короче, немного экспериментирования, и у вас должно получиться. В конце концов, передавайте string (предварительно инициализированный длинной строкой-константой) - его тоже можно рассматривать как массив.
 
Большое спасибо! Наконец-то я знаю ширину окна в пикселах. Вопрос к Quod Licet: в Вашей однострочной функции зума есть константы 3 и 41. Как я понял, это и есть пиксельные "довески" слева и справа к доступной пользователю области (собственно чарту). Вы уверены, что эти константы вообще ни от чего не зависят - ни от разрешения экрана, ни от метрики системных шрифтов, ни от размера окна, изменяемого юзверем, и т.п.?

И еще: Ваша функция зума все время возвращает целые значения с точностью до 8 знаков (я ради прикола специально объявил результат как double). Вы об этом не задумывались? Мистика какая-то... Это ж по сути означает, что независимо от ширины окна (Width-44)/BarsPerChart - всегда точная степень двойки. Но это не так на самом деле, я проверил вручную. Где у меня шарики за ролики заехали?

P.S. Да уж, бывает... Внутри логарифма - целочисленное деление с округлением в сторону MathFloor()!
 
Полную уверенность дает только Госстрах. Понаблюдайте в разных условиях, подергайте туда-сюда окна, размеры шрифтов и пр. - проявите самостоятельный дух исследования, короче )). Вы же так придирчиво смотрите в зубы дареному коню, что оторопь берет )). В тех условиях, что наблюдал я, разницы не обнаруживалось (во всяком случае, на разных разрешениях и в разных размерах окна).

По поводу P.S. MathFloor - ага.
Причина обращения: