/* GetPaneHeights: get heights in pixel of all panes in a window FOR WHAT: With the use of the built-in functions "WindowPriceMin/Max()" together, you can calculate appropriate spacing/margin to text/arrow objects (OBJ_TEXT/OBJ_ARROW), whatever size the window is. See the EXAMPLE section below. SYNOPSIS: #import "GetPaneHeights.ex4" int GetPaneHeights(int &height[]); #import height[i] = the height in pixel of pane "i" i = 0: main chart i = 1: indicator #1 i = 2: indicator #2 ... (in top-to-bottom order) The size of "height[]" must be large enough to contain all panes. This function returns the number of panes. If it fails, the return value is zero. NOTE: This function scans the device context (DC) of a window, so if (the leftmost piece of) the window is covered by another window, then this function will fail. EXAMPLE: #import "GetPaneHeights.ex4" int GetPaneHeights(int &height[]); #import int i, panes, height[10]; double spacing; string sign; panes = GetPaneHeights(height); for (i = 0; i < panes; i++) Print("height[", i, "] = ", height[i], " pixels"); // Analyzing the chart... Hmm... it's time to sell. if (panes == 0) { Alert("WARNING: cannot get the pane height!"); height[0] = 500; } sign = "sell sign"; spacing = 5 * (WindowPriceMax(0) - WindowPriceMin(0)) / height[0]; ObjectCreate(sign, OBJ_ARROW, 0, Time[0], High[0] + spacing); ObjectSet(sign, OBJPROP_ARROWCODE, ...); ObjectSet(sign, OBJPROP_COLOR, ...); // The sell sign will be located 5 pixels above the highest price // of the latest bar, whatever size the window is. Version 1.01, Copyright (c) 2009, kartz (Change Log) 1.00 -> 1.01: fix a bug of recognizing the date-and-time row as a pane on a machine which doesn't use font anti-aliasing. */ #property copyright "Copyright (c) 2009, kartz" #property library #import "user32.dll" int GetDC(int hwnd); // HDC int ReleaseDC(int hwnd, int hdc); int GetClientRect(int hwnd, int &rect[4]); // BOOL #import "gdi32.dll" int GetPixel(int hdc, int x, int y); // COLORREF #import #define CLR_INVALID 0xFFFFFFFF // Windows' constant #define TEST_XY_COORD 10 int GetPaneHeights(int &height[]) { int i, x, y, h, c, cc, frame, hwnd, hdc, rect[4]; hwnd = WindowHandle(Symbol(), Period()); if (hwnd == 0) return(0); if (!GetClientRect(hwnd, rect)) return(0); h = rect[3]; hdc = GetDC(hwnd); if (hdc == 0) return(0); i = 0; c = GetPixel(hdc, 0, TEST_XY_COORD); if (c != CLR_INVALID) { // scan horizontally. for (x = 1; x <= TEST_XY_COORD; x++) { frame = GetPixel(hdc, x, TEST_XY_COORD); if ((frame == CLR_INVALID) || (frame != c)) break; } // "x" must be 2, but scanned just in case. if (frame != CLR_INVALID) { // scan vertically along the frame. for (cc = CLR_INVALID, y = 0; y < h; y++, cc = c) { c = GetPixel(hdc, x, y); if (c == CLR_INVALID) { i = 0; break; } if (c == frame) { if (cc != frame) height[i] = y; } else if (cc == frame) { height[i] = y - height[i] - 1; i++; if (i == WindowsTotal()) break; } } } } ReleaseDC(hwnd, hdc); return(i); }
Sample
Analysis
Market Information Used:
Series array that contains the highest prices of each bar
Series array that contains open time of each bar
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
user32
GetPaneHeights
gdi32
Order Management characteristics:
Other Features:
It issuies visual alerts to the screen