[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [amibroker] AmiBroker 4.43.0 BETA released - CORRECTED URL



PureBytes Links

Trading Reference Links




Thanks Herman, it is time to go to bed for me its 00:49 AM 
here ...
much earlier than yesterday :-)
 
Best regards,Tomasz Janeczkoamibroker.com
<BLOCKQUOTE 
>
  ----- Original Message ----- 
  <DIV 
  >From: 
  Herman van den 
  Bergen 
  To: <A title=amibroker@xxxxxxxxxxxxxxx 
  href="">amibroker@xxxxxxxxxxxxxxx 
  Sent: Sunday, October 05, 2003 12:40 
  AM
  Subject: RE: [amibroker] AmiBroker 4.43.0 
  BETA released - CORRECTED URL
  
  <FONT face=Arial color=#0000ff 
  size=2>Thank you Tomasz, just tried the latest release: impressive new 
  additions and I love the expanded readme/example. It appears that the Regular 
  Portfolio Tester is what dreams are made of, for me :-) 
  <FONT face=Arial color=#0000ff 
  size=2> 
  Take 
  a break TJ, you deserve it!
  <FONT face=Arial color=#0000ff 
  size=2> 
  <FONT face=Arial color=#0000ff 
  size=2>herman.
  
    <FONT face=Tahoma 
    size=2>-----Original Message-----From: Tomasz Janeczko 
    [mailto:amibroker@xxxxxx]Sent: Saturday, October 04, 2003 4:40 
    PMTo: amibroker@xxxxxxxxxxxxxxxSubject: [amibroker] 
    AmiBroker 4.43.0 BETA released - CORRECTED URL
    
    
    Hello,
     
    
    A new beta version (4.43.0) of AmiBroker has just been 
    released.
     
    It is available for registered users only from the members 
    area at:
    <FONT 
    size=2>http://www.amibroker.com/members/bin/ab4430beta.exe
    and
    <FONT 
    size=2>http://www.amibroker.net/members/bin/ab4430beta.exe
     
    If you forgot your user name / password to the members 
    area
    you can use automatic reminder service at: <A 
    href=""><FONT 
    size=2>http://www.amibroker.com/login.html
     
    To discuss this beta please join amibroker-beta mailing list:
    <A 
    href="">http://www.egroups.com/messages/amibroker-beta/
     
    
    
    CHANGES FOR VERSION 4.43.0 (as compared to 4.42.0)
    
      
      
      
      
      Portfolio-level Optimization added 
      
      
      
      
      
      
      in regular backtest mode now it is possible to specify the score of 
      the symbol (on bar-by-bar basis) via PositionScore variable. In this mode 
      the score is used only at trade ENTRY to decide which securities should be 
      traded in case when there are more simultaneous entry signals than max. 
      allowable positions or available funds. AmiBroker will 'prefer' securities 
      with higher absolute value of the score. If PositionScore is not used then 
      it is assumed to be 1 for all securities.
      
      
      
      NOTE: regular mode must be used for all your backtesting except the 
      cases when you want rotational-trading (fund switching). Only regular mode 
      uses buy/sell/short/cover signals.
      
      
      
      
      
      
      
      
      rotational-trading mode must now be turned on by calling new 
      EnableRotationalTrading() function at the top of your 
      formula.
      
      
      
      
      
      
      AA / Settings / Portfolio:1. Max. Traded renamed to more 
      meaningfull "Max. Open Positions" - defines the maximum number of 
      positions (trades) that can be open simultaneously (at any time)2. 
      Max. Ranked renamed to more meaningfull "Worst Rank Held" (rotational 
      trading mode only) - must be equal or greater than max. open positions, if 
      it is greater than Max. open positions then once a position is taken in a 
      security it will not be exited until the ranking of that security drops 
      below "Worst Rank Held"
      
      
      
      
      "Allow same day exit (single bar trade)" now affects Portfolio test 
      too.
      
      
      
      
      SetOption() calls affect Portfolio backtest now 
      added:SetOption("MaxOpenPositions") 
      SetOption("WorstRankHeld")SetOption("MinShares")
      
      
      
      
      fixed Avg Profit/Loss figures in "all trades" section of portfolio 
      report
      
      
      
      
      added average PERCENT profit/loss figures
      
      
      
      
      internal accuracy of calculations of LinearReg, LinRegSlope, 
      LinRegIntercept, StdErr, TSF raised from 32 bit floating point to 64 bit 
      floating point
      
      
      
      
      fix: rotational trading mode does not enter position when score is 
      999999
      
      
      
      
      fixed column setup in AA
      
      
      
      
      other minor fixes
      
      
      
      
      as a temporary solution for people using Rx new version now uses 
      HTMLView2.exe (that is shipped with the beta) to display the portfolio 
      report.
    Best regards,Tomasz 
    Janeczkoamibroker.com
     
    
    AmiBroker 4.43.0 Beta Read Me
    October 4, 2003 22:06 

    THIS IS A BETA VERSION OF THE SOFTWARE. EXPECT BUGS !!!
    Backup your data files and entire AmiBroker folder 
    first!
    INSTALLATION INSTRUCTIONS
    IMPORTANT: This archive is update-only. You have to install full 
    version 4.40 first. 
    Just run the installer and follow the instructions. 
    Then run AmiBroker. You should see "AmiBroker 4.43.0 beta" written in the 
    About box.
    See CHANGE LOG below for detailed list of changes.
    HELP ON NEW FEATURES
    New backtest report
    New report is hugely enhanced compared to old one. It includes separate 
    statistics for all, long and short sides as well as large number of new 
    metrics. You can get short help on given figure by hovering your mouse over 
    given field name. You will see the description in the tooltip. Short 
    explanations are provided also below:
    Exposure % - modified since last 
    release -'Market exposure of the trading system calculated on bar 
    by bar basis. Sum of bar exposures divided by number of bars. Single bar 
    exposure is the value of open positions divided by portfolio equity.
    Net Risk Adjusted Return % - Net profit % divided by 
    Exposure %
    Annual Return % - Compounded Annual Return % (CAR)
    Risk Adjusted Return % - Annual return % divided by 
    Exposure %
    Avg. Profit/Loss - (Profit of winners + Loss of 
    losers)/(number of trades)
    Avg. Profit/Loss % - '(% Profit of winners + % Loss of 
    losers)/(number of trades)
    Avg. Bars Held - sum of bars in trades / number of 
    trades
    Max. trade drawdown - The largest peak to valley decline 
    experienced in any single trade
    Max. trade % drawdown - The largest peak to valley 
    percentage decline experienced in any single trade
    Max. system drawdown - The largest peak to valley 
    decline experienced in portfolio equity
    Max. system % drawdown - The largest peak to valley 
    percentage decline experienced in portfolio equityRecovery 
    Factor - Net profit divided by Max. system 
    drawdownCAR/MaxDD - Compound Annual % Return 
    divided by Max. system % drawdown
    RAR/MaxDD - Risk Adjusted Return divided by Max. system 
    % drawdown 
    Profit Factor - Profit of winners divided by loss of 
    losers
    Payoff Ratio - Ratio average win / average 
    lossStandard Error - Standard error measures 
    chopiness of equity line. The lower the better.
    Risk-Reward Ratio - Measure of the relation between the 
    risk inherent in a trading the system compared to its potential gain. Higher 
    is better. Calculated as slope of equity line (expected annual return) 
    divided by its standard error.
    Ulcer Index - Square root of sum of squared drawdowns 
    divided by number of bars
    Ulcer Performance Index - (Annual profit - Tresury notes 
    profit)/Ulcer Index'>Ulcer Performance Index. Currently tresury notes 
    profit is hardcoded at 5.4. In future version there will be user-setting for 
    this.
    Sharpe Ratio of trades - Measure of risk adjusted return 
    of investment. Above 1.0 is good, more than 2.0 is very good. More 
    information <A 
    href="">http://www.stanford.edu/~wfsharpe/art/sr/sr.htm 
    . Calculation: first average percentage return and standard deviation of 
    returns is calculated. Then these two figures are annualized by multipling 
    them by ratio (NumberOfBarsPerYear)/(AvgNumberOfBarsPerTrade). Then the risk 
    free rate of return is subtracted (currently hard-coded 5) from annualized 
    average return and then divided by annualized standard deviation of 
    returns.K-Ratio - Detects inconsistency in returns. 
    Should be 1.0 or more. The higher K ratio is the more consistent return you 
    may expect from the system. Linear regression slope of equity line 
    multiplied by square root of sum of squared deviations of bar number divided 
    by standard error of equity line multiplied by square root of number of 
    bars. More information: Stocks & Commodities V14:3 (115-118): Measuring 
    System Performance by Lars N. Kestner
    Optimization in new portfolio backtester
    From version 4.43.0 BETA AmiBroker is able to perform optimizations on 
    portfolio level in both signal-driven+scoring mode (regular, default one) 
    and rotational trading mode. The portfolio optimization uses familar 
    function Optimize and allows upto 10 variables to be optimized. You are able 
    not only to optimize parameters of indicators but you can also optimize 
    portfolio-level settings like maximum number of open positions, portfolio 
    level position sizing, worst rank held, etc. These settings are available 
    via SetOption() function. New fields accepted by SetOption include: 
    SetOption("MaxOpenPositions"), SetOption("WorstRankHeld"), 
    SetOption("MinShares"). More are on the way. 
    Also the portfolio optimizer gives much more statistics than old one 
    including metrics like Sharpe ratio, Risk Reward ratio, etc.
    New portfolio backtester
    IMPORTANT: Since the new backtester is not yet 
    complete and I am still working on it please accept that until it 
    is finished I will essentially provide no technical support for it. The only 
    exceptions are bugs you may find. If you think that there is a bug please 
    report it to bugs@xxxxxxxxxxxxx with 
    all details you can give including: the formula, HTML report generated by 
    AmiBroker, trade list or detailed log, etc. 
    From version 4.42.0 BETA through some future betas there will be TWO 
    backtesters. The OLD one that is triggered by pressing "Backtest" or 
    "Optimize" button in the Automatic Analysis window. And NEW one, 
    portfolio-level backtester that is triggered by pressing "Portfolio Test" or 
    "Portfolio Optimize" button in Automatic Analysis window. 
    Old backtester is untouched and it works exactly the same way as 
    in pre-4.42 versions. I have decided to leave it for a while so you 
    can continue using old your own formulas, results, etc while checking out 
    new backtester. 
    New backtester is NOT COMPLETE yet, but already provides substantial 
    amount of functionality to make it worthwhile to check it out.
    New backtester works in TWO modes:
    
      Regular mode: evaluates ordinary buy/sell/short/cover signals as the 
      old backester but on the PORTFOLIO level. If multiple signals for many 
      symbols occur at the same bar you can decide which security is preferred 
      using individual score of the security 
      Rotational trading mode: does not use buy/sell/short/cover signals. 
      Instead trades only top N ranked securities, once entered position is held 
      until rank drops below WorstRankHeld. You have to call 
      EnableRotationalTrading() to enable it. 
     
    Regular (signal-driven) mode
    This mode is default one. Works with ordinary buy/sell/short/cover 
    signals. Test is performed on PORTFOLIO LEVEL, it means 
    that there is single portfolio equity and position sizing refers to 
    portfolio equity. Portfolio equity is equal to available cash plus sum of 
    all simultaneously open positions at given time. 
    IMPORTANT: to enable more than one symbol to be traded 
    you have to add PositionSize variable to your formula, so less than 100% of 
    funds are invested in single security:
    PositionSize = -25; // invest 25% of portfolio equity in single 
    security
    or
    PositionSize = 5000; // invest $5000 into single security
    Regular mode now allows also to use PositionScore variable to 
    decide which trades should be entered if there are more entry signals on 
    different securities than maximum allowable number of open positions or 
    available funds. In such case AmiBroker will use the absolute value 
    of PositionScore variable to decide which trades are preferred. See the code 
    below. It implements simple MA crossover system, but with additional flavour 
    of preferring entering trades on symbols that have low RSI value. If more 
    buy signals occur than available cash/max. positions then the stock with 
    lower RSI will be preferred. You can watch selection process if you backtest 
    with "Detailed log" report mode turned on.
    The code below includes also the example how to find optimum number of 
    simultaneously open positions using new Optimization in Porfolio mode.
    /******* REGULAR PORTFOLIO mode ** This sample 
    optimization** finds what is optimum number of positions open 
    simultaneously** ****/
    SetOption("InitialEquity", 20000 
    );SetTradeDelays(1,1,1,1);RoundLotSize = 1; 
    posqty = Optimize("PosQty", 4, 1, 20, 1 
    );SetOption("MaxOpenPositions", posqty);
    // desired position size is 100% portfolio equity// divided by 
    PosQty positionsPositionSize = -100/posqty; 
    // The system is very simple...// MA parameters 
    could be optimized too...p1 = 10;p2 = 22;// simple MA 
    crossoverShort=Cross( MA(C,p1) , MA(C,p2) );Buy=Cross( MA(C,p2) , 
    MA(C,p1) );// always in the market Sell=Short; 
    Cover=Buy;
    // now additional score // that is used to rank equities // 
    when there are more ENTRY signals that available// 
    positions/cashPositionScore = 100-RSI(); // prefer stocks that have low 
    RSI;
    Rotational trading mode
    IMPORTANT NOTE: Unless you specifically want to implement 
    fund-switching/rotational trading system you should NOT use this mode. 
    Regular mode of portfolio backtester provides more control and it is better 
    suited for most applications
    Rotational trading is popular method for trading mutual funds. It is also 
    known as fund-switching or scoring&ranking. Its basic permise is to 
    rotate symbols all the time so only top N issues ranked 
    according to some user-definable score are traded. The number of positions 
    open depend on "Max. open positions" setting and available funds / position 
    size. Once position is entered in remains in place until security's rank 
    drops below WorstRankHeld (settable in settings). Regular 
    buy/sell/short/cover signals are not used at all (they are ignored). If you 
    want to use buy/sell/short/sell signals you MUST use regular mode.
    The method of using single score variable to rank and rotate securities 
    has been introduced by PortfolioTrader (PT) AFL formula written Fred Tonetti 
    with GUI of Dale Wingo, and for simplicity of porting already existing PT 
    systems, it is adopted by rotational trading mode in AmiBroker (with some 
    differencies see below). It is thought as a faster replacement of PT, not as 
    general-purpose backtester. For general purpose backtesting engine 
    use REGULAR mode.
    To enter this mode you have to call 
    EnableRotationalTrading() function at the very beginning of 
    your formula. From then on buy/sell/short/cover variables will have NO 
    EFFECT on results. Only PositionScore variable will be used to rank 
    securities and trade top N securities.. 
    A simple rotational trading formula (actually Fred's PT 'Sample' formula 
    ported to new backtester):
    EnableRotationalTrading();SOV1=21;
    BBandWid = 2;BBAvg = MA(Close, SOV1);UBBand = 
    BBandTop(Close, SOV1, BBandWid);LBBand = BBandBot(Close, SOV1, 
    BBandWid);rScore = 50 - 100 * (Close - LBBand) / (UBBand - 
    LBBand);
    PositionSize = -25; // invest 25% of equity in single 
    securityPositionScore = rScore; // PositionScore has the same meaning as 
    rScore in PT
    The score (PositionScore) for all securities is calculated first. Then 
    all scores are sorted according to absolute value of 
    PositionScore. Then top N are choosen to be traded. N depends on 
    available funds and "max. open positions" setting. Backtester successively 
    enters the trades starting from highest ranked security until the number of 
    positions open reaches "max. open positions" or there are 
    no more funds available. The score has the following meaning: the higher the 
    positive number the better the long candidate; the lower the negative number 
    the better the short candidate and zero is treated as having disqualified a 
    particular security for a particular bar. 
    Exits are generated automatically when security's rank drops 
    below "worst rank held". There is no real control over when exits 
    happen except of setting low score to force exits. You can also set the 
    score on any (at least one) security to 'magic' value of 999999 to prevent 
    rotation (so already open positions are kept). But this is global and does 
    not give you individual control.
    Generally speaking if you want to have individual control over 
    entries AND exits you have to use REGULAR mode instead (it now also 
    allows to choose securities by higher rank, but at the same time allows to 
    control exactly when trades happen)
    Things NOT IMPLEMENTED yet in new portfolio backtester, to be done 
    soon
    
      built-in stops in rotational trading mode. (stops in regular mode work 
      already) 
      futures support (point value, margin deposit, ticksize) 
      calculation of interest earnings 
      pyramiding 
      intra-bar detailed timing 
      OLE interface 
      etc... 
    Automatic Analysis Settings - Portfolio page
    - Max. Open Positions (previously known as "Max. traded") - the maximum 
    number of simultaneously open positions. .Settable also using 
    SetOption("MaxOpenPositions", number ) function.
    - Max. # of signals tracked per bar- (REGULAR mode only) the maximum 
    number of buy/sell/short/cover signals per single bar that AmiBroker will 
    track. Should be set to at least 2 * (Max. Open Positions) or more. Default 
    of 100 should be fine for most applications. May be removed in the future. 
    Settable also using SetOption("MaxTracked", number ) function.
    - Report mode - Trade list - shows regular trade list (as old 
    backtester), Detailed log - shows very detailed bar-by-bar log with scores, 
    each entry and exit separately reported, etc.
    - Min. shares - the minimum number of shares that are allowed to 
    buy/short. Backtester will not enter trades below that limit. Default = 1 is 
    good for stocks.
    ROTATIONAL TRADING MODE ONLY:
    - Worst Rank Held (previously called slightly misleading: "Max. ranked") 
    - the worst (the lowest) rank to continue to be hold once position is 
    opened. Settable also using SetOption("WorstRankHeld", number ) function. 
    Must be greater or equal to Max. Open Positions.
    Known differencies between statistics produced by 'old' and 'new' 
    (portfolio) backtester in regular mode
    
      
      
         
        Old backtester
        New (portfolio) backtester
      
        System and trade drawdown calculations based on
        Open/Close/H-L range (worst case) selectable in settings
        Close price only (regardless of settings) - subject to 
change
      
        Max. % trade drawdown
        Calculated based on total equity
        Calculated based on ACTUAL trade value at entry point.
      
        Stats available 
        for all trades only
        separately for long, short and all trades
      
        Futures backtesting (MarginDeposit, TickSize, PointValue)
        Supported
        Not yet available
      
        Interest earnings calculation
        Supported
        Not yet available
      
        PositionSizing
        Based on individual symbol equity 
        
          Based on portfolio equity.
          PositionSize = -25; 
          will enter 25% of current porfolio equity
      
        Trade statistics
        Include only closed trades, open trade is reported separately
        Include all trades (closed and those still open at the end of 
          analysis period)
      
        Positions taken
        Uses "Positions" selector in the Settings to include long, short 
          or both positions
        From version 4.43.0 portfolio backtest behaves the same (uses 
          "positions" selector)
      
        Exposure
        calculated regardless of position size (no matter on what is 
          position size if trade is taken for particular bar it assumes 100% 
          exposure at that bar)
        calculations include now (in 4.43.0) the total amount of open 
          positions compared to total portfolio equity. Exposure is calculated 
          on bar by bar basis so if only 50% funds are in open trade, then 
          exposure for this bar is 0.5. Then individual bar exposures are summed 
          up and divided by number of bars to produce exposure figure. This way 
          true market exposure is calculated.
      
        Multiple security testing
        N independent accounts (multiple single equity)
        Portfolio equity common to all symbols under 
    test
    Known differencies between Fred's PT and new portfolio backtester 
    working in rotational trading mode
    
      
      
         
        PT
        New (portfolio) backtester
      
        PositionSizing
        Common to all symbols, settable via PT GUI
        
          Settable individually from the formula level using PositionSize 
          variable. Examples:PositionSize =2000; // will enter positions 
          with equal size of 2000 and will grow the NUMBER of positions as 
          equity grows (similar to PT setting: Increase Position first)
          PositionSize = -25; // will enter positions with 25% of current 
          portfolio equity (similar to PT setting: increase position size 
          first)
          
      
        Calculation of initial position value
        
          PT subtracts NTraded * commission from the equity and by number of 
          symbols to calculate new position value.
          Example: Equity is 1000. MaxTraded is 4, Commission per trade is 
          1
          PT will enter 4 positions with value of (1000- 4 * 1)/4 = 
249
        
          AB enters the position with the value specified by positionsize 
          variable if there are enough funds and adds commission on top of it, 
          otherwise shinks desired position.Example: Equity is 1000. 
          PositionSize = -25 (25% of equity available), Commission per trade is 
          1.
          AmiBroker will enter 4 positions:
          1. 1000 * 25% = 250. Commission $1. Available cash = 749. 2. 
          1000 * 25% = 250. Commission $1. Available cash = 548.3. 1000 * 
          25% = 250. Commission $1. Available cash = 2474. 1000 * 25% = 250 
          -> not enough cash -> shrinking position to $246. Commission $1. 
          Available cash = 0.
           
      
        Trade price/delays
        Open or Close, Delays set from the GUI
        
          Close always. No delays. This will be changed.
          In the meantime: if you want to delay trading by one bar in 
          rotational mode it is very easy just use Ref function:
          PositionScore = Ref( PositionScore, -1 );
      
        Exits by Stops, Trade delays
        Available
        Not yet available
      
        Trade listing
        Sorted by entry date
        Sorted by EXIT date. Can be re-sorted by any other column 
          available in report by clicking on column header.
      
        Ulcer Index (UI) and Ulcer Performance Index (UPI)
        incorrectly calculated in PT 3.8.1 and all prior versions
        Correct
      
        K-Ratio
        
          for some reason calculated from log10( Equity ) instead of just 
          equity as in original publication Stocks & Commodities V14:3 
          (115-118): Measuring System Performance by Lars N. Kestner
        calculated from equity exactly as described in Stocks & 
          Commodities V14:3 (115-118): Measuring System Performance by Lars N. 
          Kestner
     
     
    Multiple time frame support
    Release 4.41 brings ability to use multiple time frames (bar intervals) 
    in single formula. The time frame functions can be divided into 3 functional 
    groups: 
    
      switching time frame of build-in O, H, L, C, V, OI, Avg arrays: 
      TimeFrameSet, TimeFrameRestore 
      compressing/expanding single arrays to/from specified interval: 
      TimeFrameCompress, TimeFrameExpand 
      immediate access to price/volume arrays in different time frame: 
      TimeFrameGetPrice 
    First group is used when your formula needs to perform 
    some calculations on indicators in different time frame than currently 
    selected one. For example if you need to calculate 13-bar moving average on 
    5 minute data and 9 bar exponential avarage from hourly data while current 
    interval is 1 minute you would write:
    TimeFrameSet( in5Minute ); // switch to 5 minute 
    frame
    /* MA now operates on 5 minute data, ma5_13 holds time-compressed 
    13 bar MA of 5min bars */
    ma5_13 = MA( C, 13 ); 
    TimeFrameSet( inHourly ); // switch 
    now to hourly
    mah_9 = EMA( C, 9 ); // 9 bar moving average from hourly 
    data
    TimeFrameRestore(); // restore time frame to 
    original
    Plot( Close, "Price", colorWhite, styleCandle );
    // plot expanded average
    Plot( TimeFrameExpand( ma5_13, in5Minute), "13 bar 
    moving average from 5 min bars", colorRed );Plot( 
    TimeFrameExpand( mah_9, inHourly), "9 bar moving average 
    from hourly bars", colorRed );
    TimeFrameSet( interval ) - replaces 
    current built-in price/volume arrays: open, high, low, close, volume, 
    openint, avg with time-compressed bars of specified interval once you 
    switched to a different time frame all calculations and built-in indicators 
    operate on selected time frame. To get back to original interval call 
    TimeFrameRestore() funciton. Interval is time frame interval in seconds. For 
    example: 60 is one minute bar. You should use convenient constants for 
    common intervals: in1Minute, in5Minute, in15Minute, inHourly, inDaily, 
    inWeekly, inMonthly.
    TimeFrameRestore() - restores price arrays replaced by 
    SetTimeFrame.Note that only OHLC, V, OI and Avg built-in variables are 
    restored to original time frame when you call TimeFrameRestore().All other 
    variables created when being in different time frame remain compressed. To 
    de-compress them to original interval you have to use TimeFrameExpand.
    Once you switch the time frame using TimeFrameSet, all AFL functions 
    operate on this time frame until you switch back the time frame to original 
    interval using TimeFrameRestore or set to different interval again using 
    TimeFrameSet. It is good idea to ALWAYS call TimeFrameRestore when you are 
    done with processing in other time frames.
    When time frame is switched to other than original interval the results 
    of all functions called since TimeFrameSet are time-compressed too. If you 
    want to display them in original time frame you would need to 'expand' them 
    as described later. Variables created and assigned before call to 
    TimeFrameSet() remain in the time frame they were created. This behaviour 
    allows mixing unlimited different time frames in single formula.
    Please note that you can only compress data from shorter interval to 
    longer interval. So when working with 1-minute data you can compress to 2, 
    3, 4, 5, 6, ....N-minute data. But when working with 15 minute data you can 
    not get 1-minute data bars. In a similar way if you have only EOD data you 
    can not access intraday time frames.
    Second group: TimeFrameCompress/TimeFrameExpand allow to 
    compress and expand single arrays to / from different time frames. 
    Especially worth mentioning is TimeFrameExpand that is used to decompress 
    array variables that were created in different time frame. Decompressing is 
    required to properly display the array created in different time frame. For 
    example if you want to display weekly moving average it must be 'expanded' 
    so the data of one weekly bar covers five daily bars (Monday-Friday) of 
    corresponding week.
    
    
    TimeFrameExpand( array, interval, mode = expandLast ) 
    - expands time-compressed array from 'interval' time frame to base time 
    frame ('interval' must match the value used in TimeFrameCompress or 
    TimeFrameSet)Available modes:expandLast - the compressed value is 
    expanded starting from last bar within given period (so for example weekly 
    close/high/low is available on Friday's bar)expandFirst - the compressed 
    value is expanded starting from first bar within given period (so for 
    example weekly open is available from Monday's bar)expandPoint - the 
    resulting array gets not empty values only for the last bar within given 
    period (all remaining bars are Null (empty)).
    
    Caveat: expandFirst used on price different than open may look into the 
    future. For example if you create weekly HIGH series, expanding it to daily 
    interval using expandFirst will enable you to know on MONDAY what was the 
    high for entire week.
    TimeFrameCompress is provided for completeness and it can be used when 
    you want to compress single array without affecting built-in OHLC,V arrays. 
    If you call TimeFrameCompress it does not affect results of other 
    functions.
    wc = TimeFrameCompress( Close, inWeekly );
    /* now the time frame is still unchanged (say daily) and our MA 
    will operate on daily data */
    dailyma = MA( C, 14 );
    /* but if we call MA on compressed array, it will give MA from 
    other time frame */
    weeklyma = MA( wc, 14 ); // note that argument is time-compressed 
    array
    Plot( dailyma, "DailyMA", colorRed );
    weeklyma = TimeFrameExpand( weeklyma, inWeekly ); // expand for 
    display
    Plot( weeklyma, "WeeklyMA", colorBlue );
    During this formula the time frame remained at original setting we only 
    compressed single array.
    TimeFrameCompress( array, interval, mode = compressLast 
    )- compresses single array to given interval using given compression 
    mode available modes:compressLast - last (close) value of the array 
    within intervalcompressOpen - open value of the array within 
    intervalcompressHigh - highest value of the array within 
    intervalcompressLow - lowest value of the array within 
    intervalcompressVolume - sum of values of the array within 
    interval
    graph0 = TimeFrameExpand( TimeFrameCompress( Close, inWeekly, 
    compressLast ), inWeekly, expandLast );graph1 = TimeFrameExpand( 
    TimeFrameCompress( Open, inWeekly, compressOpen ), inWeekly, expandFirst 
    );
    
    Third group consist of just one useful function: 
    TimeFrameGetPrice which allows to reference price and volume from other time 
    frames without switching /compressing/expanding time frames. Just one 
    function call to retrieve price from higher time frame. It allows also to 
    reference not only current but past bars from different time frames.
    TimeFrameGetPrice( pricefield, interval, shift = 0, mode 
    = expandFirst );- references OHLCV fields from other time frames. This 
    works immediatelly without need to call TimeFrameSet at all.Price field 
    is one of the following: "O", "H", "L", "C", "V", "I" (open interest). 
    Interval is bar interval in seconds. shift allows to reference past 
    (negative values) and future (positive values) data in higher time frame. 
    For example -1 gives previous bar's data (like in Ref function but this 
    works in higher time frame).
    Examples:
    TimeFrameGetPrice( "O", inWeekly, -1 ) - gives you 
    previous week OPEN priceTimeFrameGetPrice( "C", inWeekly, -3 
    ) - gives you weekly Close price 3 weeks 
    agoTimeFrameGetPrice( "H", inWeekly, -2 ) - gives you 
    weekly High price 2 weeks agoTimeFrameGetPrice( "O", inWeekly, 0 
    ) - gives you this week open price.
    TimeFrameGetPrice( "H", inDaily, -1 ) - gives previous day 
    high when working on intraday data
    
    Shift works as in Ref() function but it is applied to compressed time 
    frame.
    
    Note these functions work like these 3 nested 
    functionsTimeFrameExpand( Ref( TimeFrameCompress( array, interval, 
    compress(depending on field used) ), shift ), interval, expandFirst 
    )therefore if shift = 0 compressed data may look into the future 
    ( weekly high can be known on monday ). If you want to write a trading 
    system using this function please make sure to reference PAST data by using 
    negative shift value.The only difference is that TimeFrameGetPrice 
    is 2x faster than nested Expand/Compress.
    
      Note on performance of TimeFrame 
      functions:a) Measurements done on Athlon 1.46GHz, 18500 
      daily bars compressed to weekly time frameTimeFrameGetPrice( "C", 
      inWeekly, 0 ) - 0.0098 sec (9.8 milliseconds)TimeFrameSet( inWeekly ) 
      - 0.012 sec (12 milliseconds)TimeFrameRestore( ) - 0.006 sec (6 
      milliseconds)TimeFrameCompress( Close, inWeekly, compressLast ); - 
      0.0097 sec (9.7 milliseconds)TimeFrameExpand( array, inWeekly, 
      expandLast ); - 0.0098 sec (9.8 milliseconds)
      
      b) Measurements done on Athlon 1.46GHz, 1000 daily bars compressed to 
      weekly time frameall functions below 0.0007 sec (0.7 
    millisecond)
    
    EXAMPLES
    EXAMPLE 1: Plotting weekly MACD and cross arrows from daily data 
    
    TimeFrameSet( inWeekly );m = MACD(12, 26 ); // MACD from 
    WEEKLY dataTimeFrameRestore();
    m1 = TimeFrameExpand( m, inWeekly );
    Plot( m1, "Weekly MACD", colorRed );PlotShapes( Cross( m1, 0 
    ) * shapeUpArrow, colorGreen );PlotShapes( Cross( 0, m1 ) * 
    shapeDownArrow, colorGreen );
    EXAMPLE 2: weekly candlestick chart overlaid on line daily price 
    chart
    wo = TimeFrameGetPrice( "O", inWeekly, 0, expandPoint 
    );wh = TimeFrameGetPrice( "H", inWeekly, 0, expandPoint );wl = 
    TimeFrameGetPrice( "L", inWeekly, 0, expandPoint );wc = 
    TimeFrameGetPrice( "C", inWeekly, 0, expandPoint );
    PlotOHLC( wo, wh, wl, wc, "Weekly Close", colorWhite, styleCandle 
    );Plot( Close, "Daily Close", colorBlue ); 
    
    EXAMPLE 3: Simplified Triple screen system 
    /* switch to weekly time frame */TimeFrameSet( inWeekly 
    );whist = MACD( 12, 26 ) - Signal( 12, 26, 9 );wtrend = ROC( whist, 
    1 ); // weekly trend - one week change of weekly macd 
    histogramTimeFrameRestore();
    /* expand calculated MACD to daily so we can use it with daily 
    signals */wtrend = TimeFrameExpand( wtrend, inWeekly );
    /* elder ray */bullpower= High - 
    ema(Close,13);bearpower= Low - ema(Close,13);
    Buy = wtrend > 0 /* 1st screen: positive weekly trend 
    */ANDbearpower < 0 and bearpower > Ref( bearpower, -1 ) /* 2nd 
    screen bear power negative but rising */ANDH > Ref( H, -1 ); /* 
    3rd screen, if prices make a new high */
    BuyPrice = Ref( H, -1 ); // buy stop level;
    
    Sell = 0 ; // exit only by stopsApplyStop( stopTypeProfit, 
    stopModePercent, 30, True );ApplyStop( stopTypeTrailing, 
    stopModePercent, 20, True );
    CHANGE LOG
    
    
    
    
    CHANGES FOR VERSION 4.43.0 (as compared to 
    4.42.0)
    
      
      
      
      
      Portfolio Optimize mode added 
      
      
      
      
      
      
      in regular backtest mode now it is possible to specify the score of 
      the symbol (on bar-by-bar basis) via PositionScore variable. In this mode 
      the score is used only at trade ENTRY to decide which securities should be 
      traded in case when there are more simultaneous entry signals than max. 
      allowable positions or available funds. AmiBroker will 'prefer' securities 
      with higher absolute value of the score. If PositionScore is not used then 
      it is assumed to be 1 for all securities.
      
      
      
      NOTE: regular mode must be used for all your backtesting except the 
      cases when you want rotational-trading (fund switching). Only regular mode 
      uses buy/sell/short/cover signals.
      
      
      
      
      
      
      
      
      rotational-trading mode must now be turned on by calling new 
      EnableRotationalTrading() function at the top of your 
      formula.
      
      
      
      
      
      
      AA / Settings / Portfolio:1. Max. Traded renamed to more 
      meaningfull "Max. Open Positions" - defines the maximum number of 
      positions (trades) that can be open simultaneously (at any time)2. 
      Max. Ranked renamed to more meaningfull "Worst Rank Held" (rotational 
      trading mode only) - must be equal or greater than max. open positions, if 
      it is greater than Max. open positions then once a position is taken in a 
      security it will not be exited until the ranking of that security drops 
      below "Worst Rank Held"
      
      
      
      
      "Allow same day exit (single bar trade)" now affects Portfolio test 
      too.
      
      
      
      
      SetOption() calls affect Portfolio backtest now 
      added:SetOption("MaxOpenPositions") 
      SetOption("WorstRankHeld")SetOption("MinShares")
      
      
      
      
      fixed Avg Profit/Loss figures in "all trades" section of portfolio 
      report
      
      
      
      
      added average PERCENT profit/loss figures
      
      
      
      
      internal accuracy of calculations of LinearReg, LinRegSlope, 
      LinRegIntercept, StdErr, TSF raised from 32 bit floating point to 64 bit 
      floating point
      
      
      
      
      fix: rotational trading mode does not enter position when score is 
      999999
      
      
      
      
      fixed column setup in AA
      
      
      
      
      other minor fixes
      
      
      
      
      as a temporary solution for people using Rx new version now uses 
      HTMLView2.exe (that is shipped with the beta) to display the portfolio 
      report.
    
    
    
    CHANGES FOR VERSION 4.42.0 (as compared to 
    4.41.2)
    
      
      
      
      
      first (incomplete) early beta version of the portfolio 
      backtester
      fixed plot of Null arrays using styleArea 
      fixed display problem with % progress in single-stock optimization 
      other minor fixes
    
    
    
    
    CHANGES FOR VERSION 4.41.2 (as compared to 4.41.1)
    
      
      now Sum produces values for periods upto and including BarCount, so 
      Sum( array, BarCount ) gives the value instead of Null 
      
      fixed problem with saving parameters on exit when the user did not 
      specify default value for string parameter using ParamStr("name", 
"")
      
      fixed 38-byte memory leak when returning values from user-defined 
      functions
      
      real-time mode: after AFL syntax error commentary AFL editor is not 
      refreshed until error is fixed and user presses 'apply'
      
      eSignal 1.6.0 plugin (available separately from<A 
      href=""> 
      http://www.amibroker.com/bin/eSignal160.exe):
      
        
        much quicker backfills
        
        implemented force-reconnect feature in eSignal plugin
        
        fixed minor timing issue in eSignal plugin 
        implemented workaround to invalid tick numbers sent sometimes by 
        eSignal's data manager. 
    
      
      
      thanks to all users for reporting errors and helping ironing out 
      outstanding issues.
    
    CHANGES FOR VERSION 4.41.1 (as compared to 4.41.0)
    
      
      fixed chart refresh locking that happened when user was drawing some 
      object and abandonend it by pressing ESC key.
      
      View->Refresh and View->Refresh All menus now reset internal 
      chart refresh lock flag just in case.
      
      plugin status is refreshed more often
      
      maximum number of chart sheets increased to 60 (Caveat: when you 
      increase the number of sheets you would not be able to use the layouts 
      with OLDER versions of the software)
      
      TimeFrameSet() now affects result of Interval() AFL function. 
      TimeFrameRestore() resets it back.
      
      Plot() makes copies of OHL arrays when styleCandle or styleBar is 
      used so statements likeSetForeign("AAPL");Plot( C, "Price", 
      colorYellow, styleCandle );SetForeign("MSFT");Plot( C, "Price 2", 
      colorBlue, styleCandle );plot correctly. Previously one would 
      need to use PlotOHLC() or PlotForeign()
      
      separate heap for syntax tree walker implemented, so larger AFL 
      programs like PortfolioTrader should execute faster while retaining the 
      speed improvement gained in 4.40.4 for small formulas.
    
    
    CHANGES FOR VERSION 4.41.0 (as compared to 4.40.4)
    
      
      legacy 'stoch()' function removed. Use StochK and StochD 
      instead.
      
      weekly / monthly charts are not affected by intraday compression 
      settingsin preferences any more and always use last available day date for 
      time stamp of time-compressed bar. 
      
      
      Pref: Misc: auto-hide timeout field: added check for allowed values 
      from 1...32
      
      
      TimeFrameSet( interval ) function implemented- 
      replaces current price/volume arrays: open, high, low, close, volume, 
      openint, avg with time-compressed bars of specified interval once you 
      switched to a different time frame all calculations and built-in 
      indicators operate on selected time frame. To get back to original 
      interval call TimeFrameRestore() funciton.
      
      TimeFrameRestore()- restores price arrays 
      replaced by SetTimeFrame. 
      Note that only OHLC, V, OI and Avg built-in variables are restored to 
      original time frame when you call TimeFrameRestore(). All other variables 
      created when being in different time frame remain compressed. To 
      de-compress them to original interval use TimeFrameExpand
      
      TimeFrameCompress( array, interval, mode = 
      compressLast )- compresses single array to given interval using given 
      mode, available modes:compressLast - last (close) value of the array 
      within intervalcompressOpen - open value of the array within 
      intervalcompressHigh - highest value of the array within 
      intervalcompressLow - lowest value of the array within 
      intervalcompressVolume - sum values of the array within 
      interval
      
      TimeFrameExpand( array, interval, mode = expandLast 
      )- expands time-compressed array from 'interval' time 
      frame('interval' must match the value used in TimeFrameCompress or 
      TimeFrameSet)Available modes:
      
        
        expandLast - the compressed value is expanded starting from last 
        bar within given period (so for example weekly close/high/low is 
        available on Friday's bar)
        
        expandFirst - the compressed value is expanded starting from first 
        bar within given period(so for example weekly open is available from 
        Monday's bar)
        expandPoint - the resulting array gets not empty values only for the 
        last bar within given period (all remaining bars are Null 
        (empty))Caveat: expandFirst used on price different than open may 
        look into the future.For example if you create weekly HIGH series, 
        expanding it to daily interval using expandFirst will enable you to know 
        on MONDAY what was the high for entire week.graph0 = 
        TimeFrameExpand( TimeFrameCompress( Close, inWeekly, compressLast ), 
        inWeekly, expandLast );graph1 = TimeFrameExpand( TimeFrameCompress( 
        Open, inWeekly, compressOpen ), inWeekly, expandFirst 
      );
      
      TimeFrameGetPrice( pricefield, interval, shift = 0, 
      mode = expandFirst );- references OHLCV fields from other time 
      frames.This works immediatelly without need to call 
      TimeFrameSetTimeFrameGetPrice( "O", inWeekly, -1 
      ) - gives you previous week OPEN priceTimeFrameGetPrice( 
      "C", inWeekly, -3 ) - gives you weekly Close price 3 weeks 
      agoTimeFrameGetPrice( "H", inWeekly, -2 ) - gives you 
      weekly High price 2 weeks agoTimeFrameGetPrice( "O", inWeekly, 0 
      ) - gives you this week open price.TimeFrameGetPrice( 
      "H", inDaily, -1 ) - gives previous day high when working on 
      intraday dataPrice field is one of the following"O", "H", 
      "L", "C", "V", "I" (open interest)Shift works as in Ref() function 
      but it is applied to compressed time frame.Note these functions work 
      like these 3 nested functionsTimeFrameExpand( Ref( 
      TimeFrameCompress( array, interval, compress(depending on field used) ), 
      shift ), interval, expandFirst )therefore if shift = 0 
      compressed data may look into the future ( weekly high can be known on 
      monday ). If you want to write a trading system using this function please 
      make sure to reference PAST data by using negative shift value.The 
      only difference is that TimeFrameGetPrice is 2x faster than nested 
      Expand/Compress.
      
      new interval / timeframe constants:in1Minute = 
      60in5Minute = 5 * 60 in15Minute 
      = 15 * 60 inHourly = 3600 
      inDaily = 24 * 3600inWeekly = 5 
      * 24 * 3600 inMonthly = 25 * 24 * 3600 
      compressLast = 0 
      compressOpen = 1 compressHigh = 
      2 compressLow = 3 compressVolume 
      = 4 expandLast = 0 
      expandFirst = 1 expandPoint = 2 
      
      
      SetForeign( 'ticker' )- replaces current 
      price/volume arrays with those of foreign security, returns True if ticker 
      exists, False otherwise.If ticker does not exist (and function returns 
      false) price arrays are not changed at all.Equivalent to the 
      following sequence:C = Foreign( "ticker", "C" );O = Foreign( 
      "ticker", "O" );H = Foreign( "ticker", "H" );L = Foreign( 
      "ticker", "L" );V = Foreign( "ticker", "V" );OI = Foreign( 
      "ticker", "I" );Avg = ( C + H + L )/3;but 6x faster 
      (SetForeign takes about the same time as single foreign). To restore 
      original prices 
      callRestorePriceArrays();EXAMPLE:SetForeign( "MSFT" 
      );dm = MACD(); // dm holds MACD of MSFT regardless of currently 
      selected symbolRestorePriceArrays();Plot( dm, "MACD of MSFT", 
      colorRed );Plot( MACD(), "MACD of " + Name(), colorBlue );
      
      RestorePriceArrays();restores arrays overwritten 
      by SetForeign/TimeFrameSet
    HOW TO REPORT BUGS
    If you experience any problem with this beta version please send detailed 
    description of the problem (especially the steps needed to reproduce it) to 
    bugs@xxxxxxxxxxxxx 
     Send BUG REPORTS to 
    bugs@xxxxxxxxxxxxxSend SUGGESTIONS to 
    suggest@xxxxxxxxxxxxx-----------------------------------------Post 
    AmiQuote-related messages ONLY to: amiquote@xxxxxxxxxxxxxxx (Web page: 
    <A 
    href="">http://groups.yahoo.com/group/amiquote/messages/)--------------------------------------------Check 
    group FAQ at: <A 
    href="">http://groups.yahoo.com/group/amibroker/files/groupfaq.html 
    Your use of Yahoo! Groups is subject to the <A 
    href="">Yahoo! Terms of Service. 
    Send 
  BUG REPORTS to bugs@xxxxxxxxxxxxxSend SUGGESTIONS to 
  suggest@xxxxxxxxxxxxx-----------------------------------------Post 
  AmiQuote-related messages ONLY to: amiquote@xxxxxxxxxxxxxxx (Web page: <A 
  href="">http://groups.yahoo.com/group/amiquote/messages/)--------------------------------------------Check 
  group FAQ at: <A 
  href="">http://groups.yahoo.com/group/amibroker/files/groupfaq.html 
  Your use of Yahoo! Groups is subject to the <A 
  href="">Yahoo! Terms of Service. 







Yahoo! Groups Sponsor


  ADVERTISEMENT<img
src="" width=300 height=250 border=0>  









Send BUG REPORTS to bugs@xxxxxxxxxxxxx
Send SUGGESTIONS to suggest@xxxxxxxxxxxxx
-----------------------------------------
Post AmiQuote-related messages ONLY to: amiquote@xxxxxxxxxxxxxxx 
(Web page: http://groups.yahoo.com/group/amiquote/messages/)
--------------------------------------------
Check group FAQ at: http://groups.yahoo.com/group/amibroker/files/groupfaq.html



Your use of Yahoo! Groups is subject to the Yahoo! Terms of Service.