Any idea when is the "Cross Hairs On/Off" feature will be implemented?
--- In amibroker@yahoogroups.com, "Tomasz Janeczko" <[EMAIL PROTECTED]> wrote: > > Hello, > A new beta version (5.05.1) of AmiBroker has just been released. > > http://www.amibroker.com/devlog/2008/02/12/amibroker-5051-beta-released/ > > HIGHLIGHTS of this version: > > 1.. automatic Walk-Forward Optimization, with IS and OOS equity charts > 2.. new functionality in GetCursor* AFL functions allowing interactive control (see sample in the read me) > 3.. automatic formula formatting - "Code Prettify" in the AFL Editor: Edit->Prettify selection > 4.. Improved scaling of semi-log charts > This version includes also features introduced earlier (in 5.03) such as new interval and symbol linking. > > BELOW you will find some additional information about walk-forward optimization introduced in this beta. > > Best regards, > Tomasz Janeczko > amibroker.com > > WALK FORWARD OPTIMIZATION > > The automatic Walk forward optimization is a system design and validation technique in which > you optimize the parameter values on a past segment of market data ("in-sample"), then test the system forward in time on data following the optimization segment ("out-of-sample"). You evaluate the system based on how well it performs on the test data ("out-of-sample"), not the data it was optimized on. > > To use Walk-Forward optimization please: > 1. Go to Tools->Automatic Analysis > 2. Click Settings button, then switch to "Walk-Forward tab" > 3. Here you can see Walk forward settings for In-sample optimization, out-of-sample backtest > "Start" and "End" dates mark initial period begin / end > This period will be moved forward by "Step" until the "End" reaches the "Last" date. > The "Start" date can move forward by "step" too, or can be anchored (constant) if "Anchored" check is on. > If you mark "Use today" then "Last" date entered will be ignored and TODAY (current date) will be used instead > > By default an "EASY MODE" is selected which simplifies the process of setting up WF parameters. > It assumes that: > a) Out-of-sample segment immediatelly follows in-sample segment > b) the length of out-of-sample segment equals to the walk-forward step > > Based on these two assumptions the "EASY" mode takes in-sample END date and sets > out-of-sample START date to the following day. Then adds in-sample STEP and this becomes out-of-sample END date. > In-sample and Out-of-sample step values are set to the same values. > > The "EASY" mode guarantees correctness of WF procedure settings. > > In the "ADVANCED" mode, the user has complete control over all values, to the extent that > they may not constitute valid WF procedure. > The interface allows to selectivelly disable in-sample and out-of-sample phases using checkboxes at top > (for special things like runnign sequential backtests without optimization). > > All settings are immediatelly reflected in the PREVIEW list that shows all generated IS/OOS segments > and their dates. > > The "Optimization target" field defines the optimization raport COLUMN NAME that > will be used for sorting results and finding the BEST one. Any built-in column can be used > (as appears in the optimization output), or you can use any custom metric that you define > in custom backtester. The default is CAR/MDD, you can however select any other built-in metric from the combo. > You can also TYPE-IN any custom metric that you have added via custom backtester interface. > > 4. Once you defined Walk-Forward settings, please go to Automatic Analysis and > 5. press the dropdown ARROW on the Optimize button and select "Walk Forward Optimization" > This will run sequence of optimizaitons and backtest and the results will be displayed in > the "Walk Forward" document that is open in the main application frame. > When optimization is running you can click "MINIMIZE" button on the Progress dialog > to minimize it - this allows to see the Walk Forward output during the optimization steps. > > IN-SAMPLE and OUT-OF-SAMPLE combined equity > > Combined in-sample and out-sample equities are available by > ~~~ISEQUITY and ~~~OSEQUITY composite tickers > (consecutive periods of IS and OOS are concatenated and scaled to > maintain continuity of equity line - this approach assumes that you > generally speaking are compounding profits) > To display IS and OOS equity you may use for example this: > > PlotForeign("~~~ISEQUITY","In-Sample Equity", colorRed, styleLine); > PlotForeign("~~~OSEQUITY","Out-Of-Sample Equity", colorGreen, styleLine); > Title = "{{NAME}} - {{INTERVAL}} {{DATE}} {{VALUES}}"; > > > > INTERACTIVE "BUTTONS" SAMPLE > > New functionality in GetCursor* functions: > GetCursorXPosition( mode = 0 ) > GetCursorYPosition( mode = 0 ) > > mode = -1 - (old compatibility mode) - x - value gives X-coordinate in DateTime format. y - value gives PRICE. Values are reported no matter where is the mouse (i.e. may refer to window different than current if mouse is outside current window). > mode = 0 - (default) x - value gives X-coordinate in DateTime format. y - value gives PRICE. Returns NULL if mouse is outside current window > mode = 1 - x, y - are mouse coordinates expressed in screen PIXELS. Returns NULL if mouse is outside current window > > GetCursorMouseButtons new output flag = 8 - means that current chart just received mouse click > > Code sample: > > ///////////////////////////////////////////////// > // Low-level graphic + Interactive GUI control sample > // This example shows: > // 1. how to draw "buttons" > // 2. how to handle mouse clicks > // 3. how to implement event call-backs > /////////////////////////////////////////////////// > > Version( 5.04 ); // requires 5.04 or higher > > //////////////////////////////////////////////////// > // Part 1: DRAWING TABLE OF BUTTONS > ////////////////////////////////////////////////// > GfxSetOverlayMode( 2 ); > // formatted text output sample via low-level gfx functions > > CellHeight = 20; > CellWidth = 100; > GfxSelectFont( "Tahoma", CellHeight/2 ); > > GfxSetBkMode( 1 ); > > function PrintInCell( string, row, Col ) > { > GfxDrawText( string, Col * CellWidth, row * CellHeight, (Col + 1 ) * CellWidth, (row + 1 ) * CellHeight, 0 ); > } > > GfxSelectPen( colorBlue ); > for( i = 0; i < 10 && i < BarCount; i++ ) > { > for( k = 0; k < 5; k++ ) > { > PrintInCell( "Button " + i + "," + k, i, k ); > } > GfxMoveTo( 0, i * CellHeight ); > GfxLineTo( 5 * CellWidth, i * CellHeight ); > } > GfxMoveTo( 0, i * CellHeight ); > GfxLineTo( 5 * CellWidth, i * CellHeight ); > > for( Col = 1; Col < 6; Col++ ) > { > GfxMoveTo( Col * CellWidth, 0); > GfxLineTo( Col * CellWidth, 10 * CellHeight ); > } > > > ///////////////////////////////////////////////////////// > // Part 2: MOUSE BUTTON CALL BACKS > ////////////////////////////////////////////////////////// > Title=""; > > function DrawButton( px, py, Clr1, Clr2, text ) > { > Col = floor( px / CellWidth ); > Row = floor( py / CellHeight ); > > > GfxGradientRect( Col * CellWidth, row * CellHeight, (Col + 1 ) * CellWidth, (row + 1 ) * CellHeight, > Clr1, Clr2 ); > > PrintInCell( text + " " + row + "," + Col, row, Col ); > > } > > function OnLMouseButton(x, y, px, py) > { > _TRACE("LButton x = " + DateTimeToStr( x ) + " y = " + y ); > > DrawButton( px, py, ColorHSB( 50, 255, 255 ), ColorHSB( 90, 255, 255 ), "just clicked" ); > } > > function OnRMouseButton(x, y, px, py) > { > _TRACE("RButton x = " + DateTimeToStr( x ) + " y = " + y ); > } > > function OnMMouseButton(x, y, px, py) > { > _TRACE("MButton x = " + DateTimeToStr( x ) + " y = " + y ); > } > > function OnHoverMouse(x, y, px, py) > { > _TRACE("LButton x = " + DateTimeToStr( x ) + " y = " + y ); > > DrawButton( px, py, ColorRGB( 230, 230, 230 ), ColorRGB( 255, 255, 255 ), "mouse over" ); > } > > function OnLButtonIsDown(x, y, px, py) > { > _TRACE("LButton x = " + DateTimeToStr( x ) + " y = " + y ); > > DrawButton( px, py, ColorHSB( 190, 255, 255 ), ColorHSB( 210, 255, 255 ), "down" ); > } > > ///////////////////////////////////////////////////////// > // Part 3: GENERAL PURPOSE EVENT HANDLER (reusable! - may be put into "include" file) > //////////////////////////////////////////////////////// > > function EventHandler() > { > local b, x, y, px, py; > b = GetCursorMouseButtons(); > > // retrieve co-ordinates in date/value units > x = GetCursorXPosition(0); > y = GetCursorYPosition(0); > > // retrieve co-ordinates in pixel units > px = GetCursorXPosition(1); > py = GetCursorYPosition(1); > > if( b & 8 ) // flag = 8 is set when window just received mouse click > { > // not-null means clicked in THIS (current) window > if( b & 1 ) OnLMouseButton( x, y, px, py ); > if( b & 2 ) OnRMouseButton( x, y, px, py ); > if( b & 4 ) OnMMouseButton( x, y, px, py ); > } > else > { > if( b == 0 ) OnHoverMouse( x, y, px, py ); // no button pressed > if( b == 1 ) OnLButtonIsDown( x, y, px, py ); // button pressed > } > } > > EventHandler(); > RequestTimedRefresh( 1 ); >