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

[amibroker] Re: AmiBroker 4.44.1 BETA released



PureBytes Links

Trading Reference Links

Tomasz,

--- In amibroker@xxxxxxxxxxxxxxx, "Tomasz Janeczko" <amibroker@xxxx> 
wrote:
>   
> Hello,
> 
> A new beta version (4.44.1) of AmiBroker has just been released.
> 
> It is available for registered users only from the members area at:
> http://www.amibroker.com/members/bin/ab4441beta.exe
> and
> http://www.amibroker.net/members/bin/ab4441beta.exe
> 
> If you forgot your user name / password to the members area
> you can use automatic reminder service at: 
http://www.amibroker.com/login.html
> 
> To discuss this beta please join amibroker-beta mailing list:
> http://www.egroups.com/messages/amibroker-beta/
> 
> CHANGES FOR VERSION 4.44.1 (as compared to 4.44.0)
> 
>   a.. fixed problem with rotational trading, trade price set to open
> CHANGES FOR VERSION 4.44.0 (as compared to 4.43.2)
> 
>   a.. fixed crash with 'detail mode' and large number of open 
positions/ranks used
> 
>   b.. max. in-memory cache size can be set now to 20000 (please 
note that this large cache requires lots of RAM (more than 512MB))
> 
>   c.. listview copy to clipboard feature now copies also column 
header names
> 
>   d.. SetForeign( ticker, fixup = True, tradeprices = False) and 
>   RestorePriceArrays( tradeprices = False ) 
>   have new flag now: tradeprices (False by default)
>   when tradeprices is set to TRUE, then not only OHLC, V, OI, Avg 
arrays are set to foreign symbol values, but also BuyPrice, 
SellPrice, ShortPrice, CoverPrice, PointValue, TickSize, 
RoundLotSize, MarginDeposit variables are set to correspond to 
foreign security.
>   This allows Equity() to work well with SetForeign.
>   Example:
>   // your rules
>   buy = ...
>   sel = ...
>   SetForeign("MSFT", True, True );
>   e = Equity(); // backtest on MSFT
>   RestorePriceArrays( True ); // <- should match parameter used in 
SetForeign

It works just fine !!
Many thanks for the fast upgrade.
I think now I will choose, at the Inspection Points, not only the 
highest individual Equity but also the top5 stocks ...
BTW, the two lines
global buy;
global sell;
are still needed when SetForeign(sym, True, True ); is used and sym 
belongs to a Group/WL
Dimitris Tsokakis

>   e.. Name(), FullName(), GetExtraData() work well with SetForeign
() (i.e. give foreign name/data instead of currently selected)
> 
>   f.. SetOption("PriceBoundChecking", False ); - disables checking 
and adjusting buyprice/sellprice/coverprice/shortprice arrays to 
current symbol High-Low range.
> 
>   g.. % profit added to detailed log mode
> 
>   h.. fixed bug in portfolio backtester occuring when 'allow same 
bar exit' was turned off and 'immediate stops' was turned on 2 buys 
and 2 sells occurred the in 2 bars in row
> 
>   i.. Auto Analysis/Settings,setting modified "portfolio report 
mode: trade list/detailed log" moved to "report" tab
> 
>   j.. Auto Analysis/Settings, rotational mode: added selection of 
trade price and trade delay to portfolio settings page
> 
>   k.. Auto Analysis/Settings, portfolio backtester (both regular 
and rotational modes): added ability to pad and align all symbols to 
reference symbol. Note: by default this setting is OFF. Use 
responsibly. It may slow down backtest and introduce some slight 
changes to indicator values when your data has holes and holes are 
filled with previous bar data. The feature is intended to be used 
ONLY when your system uses general market timing (generates global 
signals based on data and/or indicators calculated using Foreign 
from 'reference' symbol). Note 2: if reference symbol does not exist, 
data won't be padded.
> 
>   l.. Auto Analysis/Settings, report tab: added ability to define 
risk-free rates for Sharpe and Ulcer Performance Index calculations.
> 
> Best regards,
> Tomasz Janeczko
> amibroker.com
> 
> AmiBroker 4.44.0 Beta Read Me
> October 12, 2003 16:34 
> 
> 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.44.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 equity
> 
> Recovery Factor - Net profit divided by Max. system drawdown
> 
> CAR/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 loss
> 
> Standard 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 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@xxxx 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:
> 
>   a.. 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 
>   b.. 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 positions
> 
> PositionSize = -100/posqty; 
> 
> // The system is very simple...
> // MA parameters could be optimized too...
> p1 = 10;
> p2 = 22;
> // simple MA crossover
> Short=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/cash
> PositionScore = 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 using of 
buy/sell/short/cover variables is not allowed. Only PositionScore 
variable will be used to rank securities and trade top N securities.. 
> 
> A simple rotational trading formula (stocks with high RSI are best 
candidates for shorting while stocks with low RSI are best candidates 
for long positions):
> 
> 
> EnableRotationalTrading();
> 
> PositionSize = -25; // invest 25% of equity in single security
> PositionScore = 50 - RSI(); // 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
>   a.. built-in stops in rotational trading mode. (stops in regular 
mode work already) 
>   b.. futures support (point value, margin deposit, ticksize) 
>   c.. calculation of interest earnings 
>   d.. pyramiding 
>   e.. intra-bar detailed timing 
>   f.. OLE interface 
>   g.. 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 formula 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 = 247
>       4. 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 
Open or Close, delays set from Settings page
>      
>       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 
>       Padding to reference symbol Always pads all data to reference 
symbol User-selectable in Settings: portfolio 
>       K-Ratio 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: 
> 
>   1.. switching time frame of build-in O, H, L, C, V, OI, Avg 
arrays: TimeFrameSet, TimeFrameRestore 
>   2.. compressing/expanding single arrays to/from specified 
interval: TimeFrameCompress, TimeFrameExpand 
>   3.. 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 interval
> compressOpen - open value of the array within interval
> compressHigh - highest value of the array within interval
> compressLow - lowest value of the array within interval
> compressVolume - 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 price
> TimeFrameGetPrice( "C", inWeekly, -3 ) - gives you weekly Close 
price 3 weeks ago
> TimeFrameGetPrice( "H", inWeekly, -2 ) - gives you weekly High 
price 2 weeks ago
> TimeFrameGetPrice( "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 functions
> TimeFrameExpand( 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 frame
> 
>   TimeFrameGetPrice( "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 data
> TimeFrameRestore();
> 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 histogram
> TimeFrameRestore();
> /* 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 */
> AND
> bearpower < 0 and bearpower > Ref( bearpower, -1 ) /* 2nd screen 
bear power negative but rising */
> AND
> H > Ref( H, -1 ); /* 3rd screen, if prices make a new high */
> BuyPrice = Ref( H, -1 ); // buy stop level;
> Sell = 0 ; // exit only by stops
> ApplyStop( stopTypeProfit, stopModePercent, 30, True );
> ApplyStop( stopTypeTrailing, stopModePercent, 20, True );
> 
> CHANGE LOG
> 
> CHANGES FOR VERSION 4.44.1 (as compared to 4.44.0)
> 
>   a.. fixed problem with rotational trading, trade price set to open
> 
> CHANGES FOR VERSION 4.44.0 (as compared to 4.43.2)
> 
>   a.. fixed crash with 'detail mode' and large number of open 
positions/ranks used
> 
>   b.. max. in-memory cache size can be set now to 20000 (please 
note that this large cache requires lots of RAM (more than 512MB))
> 
>   c.. listview copy to clipboard feature now copies also column 
header names
> 
>   d.. SetForeign( ticker, fixup = True, tradeprices = False) and 
>   RestorePriceArrays( tradeprices = False ) 
>   have new flag now: tradeprices (False by default)
>   when tradeprices is set to TRUE, then not only OHLC, V, OI, Avg 
arrays are set to foreign symbol values, but also BuyPrice, 
SellPrice, ShortPrice, CoverPrice, PointValue, TickSize, 
RoundLotSize, MarginDeposit variables are set to correspond to 
foreign security.
>   This allows Equity() to work well with SetForeign.
>   Example:
>   // your rules
>   buy = ...
>   sel = ...
>   SetForeign("MSFT", True, True );
>   e = Equity(); // backtest on MSFT
>   RestorePriceArrays( True ); // <- should match parameter used in 
SetForeign
> 
>   e.. Name(), FullName(), GetExtraData() work well with SetForeign
() (i.e. give foreign name/data instead of currently selected)
> 
>   f.. SetOption("PriceBoundChecking", False ); - disables checking 
and adjusting buyprice/sellprice/coverprice/shortprice arrays to 
current symbol High-Low range.
> 
>   g.. % profit added to detailed log mode
> 
>   h.. fixed bug in portfolio backtester occuring when 'allow same 
bar exit' was turned off and 'immediate stops' was turned on 2 buys 
and 2 sells occurred the in 2 bars in row
> 
>   i.. Auto Analysis/Settings,setting modified "portfolio report 
mode: trade list/detailed log" moved to "report" tab
> 
>   j.. Auto Analysis/Settings, rotational mode: added selection of 
trade price and trade delay to portfolio settings page
> 
>   k.. Auto Analysis/Settings, portfolio backtester (both regular 
and rotational modes): added ability to pad and align all symbols to 
reference symbol. Note: by default this setting is OFF. Use 
responsibly. It may slow down backtest and introduce some slight 
changes to indicator values when your data has holes and holes are 
filled with previous bar data. The feature is intended to be used 
ONLY when your system uses general market timing (generates global 
signals based on data and/or indicators calculated using Foreign 
from 'reference' symbol). Note 2: if reference symbol does not exist, 
data won't be padded.
> 
>   l.. Auto Analysis/Settings, report tab: added ability to define 
risk-free rates for Sharpe and Ulcer Performance Index calculations.
> 
> CHANGES FOR VERSION 4.43.2 (as compared to 4.43.0)
>   a.. backtester generates now error message when someone attempts 
to use buy/sell/short/cover signals in rotational mode
>   b.. column headings fixed in AA porfolio backtest report 
> CHANGES FOR VERSION 4.43.0 (as compared to 4.42.0)
> 
>   a.. Portfolio Optimize mode added 
>   b.. 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.
> 
>   c.. 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"
> 
>   d.. "Allow same day exit (single bar trade)" now affects 
Portfolio test too.
> 
>   e.. SetOption() calls affect Portfolio backtest now added:
>   SetOption("MaxOpenPositions") 
>   SetOption("WorstRankHeld")
>   SetOption("MinShares")
> 
>   f.. fixed Avg Profit/Loss figures in "all trades" section of 
portfolio report
> 
>   g.. added average PERCENT profit/loss figures
> 
>   h.. internal accuracy of calculations of LinearReg, LinRegSlope, 
LinRegIntercept, StdErr, TSF raised from 32 bit floating point to 64 
bit floating point
> 
>   i.. fix: rotational trading mode does not enter position when 
score is 999999
> 
>   j.. fixed column setup in AA
> 
>   k.. other minor fixes
> 
>   l.. 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)
>   a.. first (incomplete) early beta version of the portfolio 
backtester
>   b.. fixed plot of Null arrays using styleArea 
>   c.. fixed display problem with % progress in single-stock 
optimization 
>   d.. other minor fixes
> 
> CHANGES FOR VERSION 4.41.2 (as compared to 4.41.1)
> 
>   a.. now Sum produces values for periods upto and including 
BarCount, so Sum( array, BarCount ) gives the value instead of Null 
>   b.. fixed problem with saving parameters on exit when the user 
did not specify default value for string parameter using ParamStr
("name", "")
>   c.. fixed 38-byte memory leak when returning values from user-
defined functions
>   d.. real-time mode: after AFL syntax error commentary AFL editor 
is not refreshed until error is fixed and user presses 'apply'
> 
>   e.. eSignal 1.6.0 plugin 
>   (available separately from 
http://www.amibroker.com/bin/eSignal160.exe):
>     a.. much quicker backfills
>     b.. implemented force-reconnect feature in eSignal plugin
>     c.. fixed minor timing issue in eSignal plugin 
>     d.. 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)
>   a.. fixed chart refresh locking that happened when user was 
drawing some object and abandonend it by pressing ESC key.
>   b.. View->Refresh and View->Refresh All menus now reset internal 
chart refresh lock flag just in case.
>   c.. plugin status is refreshed more often
> 
>   d.. 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)
>   e.. TimeFrameSet() now affects result of Interval() AFL function. 
TimeFrameRestore() resets it back.
>   f.. Plot() makes copies of OHL arrays when styleCandle or 
styleBar is used so statements like
>   SetForeign("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()
> 
>   g.. 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)
> 
>   a.. legacy 'stoch()' function removed. Use StochK and StochD 
instead.
>   b.. 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. 
>   c.. Pref: Misc: auto-hide timeout field: added check for allowed 
values from 1...32
> 
> 
>   d.. 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.
> 
>   e.. 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
> 
>   f.. TimeFrameCompress( array, interval, mode = compressLast )
>   - compresses single array to given interval using given mode, 
available modes:
>   compressLast - last (close) value of the array within interval
>   compressOpen - open value of the array within interval
>   compressHigh - highest value of the array within interval
>   compressLow - lowest value of the array within interval
>   compressVolume - sum values of the array within interval
> 
>   g.. 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:
> 
>     a.. 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)
>     b.. expandFirst - the compressed value is expanded starting 
from first bar within given period
>     (so for example weekly open is available from Monday's bar)
> 
>     c.. 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 );
> 
>   h.. TimeFrameGetPrice( pricefield, interval, shift = 0, mode = 
expandFirst );
>   - references OHLCV fields from other time frames.
>   This works immediatelly without need to call TimeFrameSet
> 
>   TimeFrameGetPrice( "O", inWeekly, -1 ) - gives you previous week 
OPEN price
>   TimeFrameGetPrice( "C", inWeekly, -3 ) - gives you weekly Close 
price 3 weeks ago
>   TimeFrameGetPrice( "H", inWeekly, -2 ) - gives you weekly High 
price 2 weeks ago
>   TimeFrameGetPrice( "O", inWeekly, 0 ) - gives you this week open 
price.
>   TimeFrameGetPrice( "H", inDaily, -1 ) - gives previous day high 
when working on intraday data
> 
>   Price 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 functions
>   TimeFrameExpand( 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.
> 
>   i.. new interval / timeframe constants:
>   in1Minute = 60
>   in5Minute = 5 * 60 
>   in15Minute = 15 * 60 
>   inHourly = 3600 
>   inDaily = 24 * 3600
>   inWeekly = 5 * 24 * 3600 
>   inMonthly = 25 * 24 * 3600 
> 
>   compressLast = 0 
>   compressOpen = 1 
>   compressHigh = 2 
>   compressLow = 3 
>   compressVolume = 4 
> 
>   expandLast = 0 
>   expandFirst = 1 
>   expandPoint = 2 
> 
>   j.. 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 call
>   RestorePriceArrays();
> 
>   EXAMPLE:
>   SetForeign( "MSFT" );
>   dm = MACD(); // dm holds MACD of MSFT regardless of currently 
selected symbol
>   RestorePriceArrays();
>   Plot( dm, "MACD of MSFT", colorRed );
>   Plot( MACD(), "MACD of " + Name(), colorBlue );
> 
>   k.. 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@xxxx


------------------------ Yahoo! Groups Sponsor ---------------------~-->
Rent DVDs Online - Over 14,500 titles.
No Late Fees & Free Shipping.
Try Netflix for FREE!
http://us.click.yahoo.com/JYdFFC/XP.FAA/3jkFAA/GHeqlB/TM
---------------------------------------------------------------------~->

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 http://docs.yahoo.com/info/terms/