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

Re: [amibroker] AmiBroker 4.34.0 BETA released - now with user-definablefunctions with arguments and local variables



PureBytes Links

Trading Reference Links

Tomasz,

chapeau! AmiBroker is now the Ferrari of TA software. Thrills the driver!

Franco

Tomasz Janeczko wrote:
>  
> Hello,
>  
> A new beta version (4.34.0) of AmiBroker has just been released.
>  
> It is available for registered users only from the members area at:
> http://www.amibroker.com/members/bin/ab4340beta.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
>  
> The highlight of this release are user definable functions / procedures
> allowing passing parameters and supporting local variables.
>  
> Please read "HELP ON NEW FEATURES" section below for the details.
> The description of remaining additions is included in the CHANGE LOG
> later in this document.
>  
> Best regards,
> Tomasz Janeczko
> amibroker.com
>  
> 
> 
>     *AmiBroker 4.34.0 Beta Read Me*
> 
> April 30, 2003 13:42
> 
> *_THIS IS AN EARLY BETA VERSION OF THE SOFTWARE. EXPECT BUGS !!!_*
> 
> *AGAIN: _THIS IS AN EARLY 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.30 first.*_
> 
> Just run the installer and follow the instructions.
> 
> Then run AmiBroker. You should see "AmiBroker 4.34.0 beta" written in 
> the About box.
> 
> 
>       *HELP ON NEW FEATURES*
> 
> *USER-DEFINABLE FUNCTIONS, PROCEDURES, LOCAL/GLOBAL VARIABLES (4.34 or 
> higher)*
> 
> Here is a sample code showing user-defined function:
> 
> |// the following function is 2nd order smoother|
> 
> |function IIR2( input, f0, f1, f2 )
> {
>   result[ 0 ] = input[ 0 ];
>   result[ 1 ] = input[ 1 ]; |
> 
> |  for( i = 2; i < BarCount; i++ )
>   {
>     result[ i ] = f0 * input[ i ] +
>     f1 * result[ i - 1 ] +
>     f2 * result[ i - 2 ];
>   }|
> 
> |  return result;
> }|
> 
> |Plot( Close, "Price", colorBlack, styleCandle );
> Plot( IIR2( Close, 0.2, 1.4, -0.6 ), "function example", colorRed ); |
> 
> 
> In this code *IIR2* is a user-defined function. *input, f0, f1, f2* are 
> formal parameters of the functions.
> At the time of function call the values of arguments are passed in these 
> variables. Formal parameters behave like local variables.
> Later we have *result* and *i* which are local variables. Local 
> variables are visible inside function only. If any other function uses 
> the same variable name they won't interfere between each other.
> 
> Due to the fact that AFL does not require to declare variables the 
> decision whenever given variable is treated as local or global is taken 
> depending on where it is FIRST USED.
> 
> If given identifier appears first INSIDE function definition - then it 
> is treated as LOCAL variable.
> If given identifier appears first OUTSIDE function definition - then it 
> is treated as GLOBAL variable.
> 
> Example (commentary):
> 
> |k = 4; // this is GLOBAL variable|
> 
> |function f( x )
> {
>   z = 3; // this is LOCAL variable|
> |  return z * x * k; // 'k' here references global variable k (first 
> used above outside function)
> ||}|
> 
> |z = 5; // this is GLOBAL variable with the same name as local variable 
> in function f|
> 
> |"The value of z before function call :" + WriteVal( z );|
> 
> |// Now even if we call function
> // the value of our global variable z
> // is not affected by function call because
> // global variable z and local variable z are separate and
> // arguments are passed by value (not by reference)|
> 
> |"The result of f( z ) = " + WriteVal( f( z ) );|
> 
> |"The value of z after function call is unchanged : " + WriteVal( z );|
> 
> At the end of the function we can see 'return' statement that is used to 
> return the result to the caller. Note that currently return statement 
> must be placed at the very end of the function.
> 
> It is also possible to write a procedure (a function that returns 
> nothing (void))
> 
> |procedure SinePlotter( Freq, ColorIndex )
> {
>   pname = "Line"+WriteVal(ColorIndex,1.0);
>   array = sin( Cum( Freq * 0.01 ) );
>   Plot( array, pname , colorRed + ColorIndex, styleThick );
> }|
> 
> |for( n = 1; n < 10; n++ )
> {
>   SinePlotter( n/2+Cum(0.01), n );
> }|
> 
> Note that although there are two separate keywords 'function' and 
> 'procedure' AmiBroker currently treats them the same (they both accept 
> return values but not require them), but in the future the rules maight 
> get enforced to use
> return statement ONLY in conjunction with function keyword. So it is 
> advised to use function keyword in case when your function returns any 
> value and procedure keyword otherwise.
> 
> Note also that recursion (having a function call itself from within 
> itself) is NOT supported as for now.
> 
> *FLOW CONTROL AND LOOPING (4.31 or higher)*
> 
> 
>   while Statement
> 
> The while statement lets you repeat a statement until a specified 
> expression becomes false.
> 
> *Syntax*
> 
> *while (* /expression/ *)* /statement/
> 
> The /expression/ must have arithmetic (numeric/boolean) type. Execution 
> proceeds as follows:
> 
>    1. The /expression/ is evaluated.
> 
>    2. If /expression/ is initially false, the body of the *while*
>       statement is never executed, and control passes from the *while*
>       statement to the next statement in the program.
> 
>       If /expression/ is true (nonzero), the body of the statement is
>       executed and the process is repeated beginning at step 1.
> 
> This is an example of the *while* statement:
> 
> |i = 10;
> while( i < 20 )
> {
>   Plot( MA( Close, i ), "MA" + WriteVal( i, 0 ), colorBlack + i );
>   i = i + 1;
> }|
> 
> The example plots 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 - bar moving 
> averages.
> 
>  
> 
> 
>   for Statement
> 
> **
> 
> The *for* statement lets you repeat a statement or compound statement a 
> specified number of times. The body of a *for* statement is executed 
> zero or more times until an optional condition becomes false. 
> 
> *Syntax*
> 
> *for (* /init-expression/ *;* /cond-expression/ *;* /loop-expression/ 
> *)* /statement/
> 
> Execution of a *for* statement proceeds as follows:
> 
>    1. The /init-expression/, is evaluated. This specifies the
>       initialization for the loop. There is no restriction on the type
>       of /init-expression/.
> 
>    2. The /cond-expression/,  is evaluated. This expression must have
>       arithmetic type. It is evaluated before each iteration. Three
>       results are possible:
>           * If /cond-expression/ is true (nonzero), /statement/ is
>             executed; then /loop-expression/, if any, is evaluated. The
>             /loop-expression/ is evaluated after each iteration. There
>             is no restriction on its type. Side effects will execute in
>             order. The process then begins again with the evaluation of
>             /cond-expression/.
> 
>           * If /cond-expression/ is false (0), execution of the *for*
>             statement terminates and control passes to the next
>             statement in the program. 
> 
> This example illustrates the *for* statement:
> 
> |
>  |
> 
> |myema[ 0 ] = Close[ 0 ];|
> 
> |for( i = 1; i < BarCount; i++ )
> {
> myema[ i ] = 0.1 * Close[ i ] + 0.9 * myema[ i - 1 ];
> }|
> 
> ||
> 
> |||This example iterates all bars of close array to calculate exponential moving average|||
> 
> 
>   if, else Statements
> 
> *if(* /expression /*)*
> /statement1/
> [*else*
> /statement2/]
> 
> The *if* keyword executes /statement1/ if /expression/ is true 
> (nonzero); if *else* is present and /expression/ is false (zero), it 
> executes /statement2/. After executing /statement1/ or /statement2/, 
> control passes to the next statement.
> 
> *Example 1*
> 
> |if ( i > 0 )
>     y = x / i;
> else 
> {
>     x = i;
>     y = abs( x );
> }|
> 
> In this example, the statement |y = x/i;| is executed if |i| is greater 
> than 0. If |i| is less than or equal to 0, |i| is assigned to |x| and 
> abs|( x )| is assigned to |y|. Note that the statement forming the *if* 
> clause ends with a semicolon.
> 
> When nesting *if* statements and *else* clauses, use braces to group the 
> statements and clauses into compound statements that clarify your 
> intent. If no braces are present, the compiler resolves ambiguities by 
> associating each *else* with the closest *if* that lacks an *else*.
> 
> *Example 2*
> 
> |if ( i > 0 )           /* Without braces */
>     if ( j > i )
>         x = j;
>     else
>         x = i;|
> 
> The *else* clause is associated with the inner *if* statement in this 
> example. If |i| is less than or equal to 0, no value is assigned to |x|.
> 
> *Example 3*
> 
> |if ( i > 0 ) 
> {                      /* With braces */
>     if ( j > i )
>         x = j;
> }
> else
>     x = i;|
> 
> The braces surrounding the inner *if* statement in this example make the 
> *else* clause part of the outer *if* statement. If |i| is less than or 
> equal to 0, |i| is assigned to |x|.
> 
> 
>       CHANGE LOG
> 
> *CHANGES FOR VERSION 4.34.0 (as compared to 4.33.0)*
> 
>     * user-definable functions and procedures with parameters and local
>       variables
>     * 'A' is NO LONGER predefined symbol. I decided to remove it because
>       people tend to use A as user-variable forgetting the fact that it
>       was build-in array holding typical price (H+L+C)/3. *Use 'Avg'
>       instead.*
>     * indicator list column width increased in Indicator Builder
>     * DayOfYear - returns the calendar day number counting from
>       beginning of the year January 1st is 1. Maximum number returned is
>       366 
> 
> *CHANGES FOR VERSION 4.33.0 (as compared to 4.32.2)*
> 
>     * Database purify tool implemented (available via Tools->Database
>       Purify)
>       allows to detect missing/extra quotes, possible splits, invalid
>       OHLC relationship
> 
>       Apply to/range settings similar to AA window. You can also right
>       click over result list to add symbols to watch list and copy the
>       list to the clipboard (and paste it later to any other program for
>       futher use)
> 
>     * further improvements to AFL garbage collector, now looping
>       regardless of loop count requires the same amount of memory as
>       just single pass of the code (no growing allocated memory during
>       loops).
>       This enormously lowered memory consumption for some formulas and
>       increased the speed of some loops 3..4 times.
> 
>     * added variable period support to the following functions:
>       LinRegSlope,
>       LinearReg,
>       LinRegIntercept,
>       StdErr,
>       TSF
> 
>       Sample code:
> 
>       Plot( Close, "Test", colorBlack );
> 
>       range = 15 * MA( ATR( 15 ), 50 ) / ATR( 15 );
> 
>       //Plot( range, "range", colorBlue, styleOwnScale );
>       Plot( LinearReg( Close, range ), "Test", colorRed );
> 
>     *
> 
>       fixed sometimes incorrect output of variable-period version of LLV/HHV
> 
>     *
> 
>       fixed crash occuring when bad arguments were passed to the
>       function (bug introduced in 4.32.x).
> 
> *CHANGES FOR VERSION 4.32.2 (as compared to 4.32.1)*
> 
>     * second bug in experimental garbage collector fixed. 
> 
> *CHANGES FOR VERSION 4.32.1 (as compared to 4.32.0)*
> 
>     * garbage collector was releasing memory too soon in some cases, now
>       fixed. 
> 
> *CHANGES FOR VERSION 4.32.0 (as compared to 4.31.1)*
> 
>     * added type check in IF/ELSE statements
>     * added type check in array element assignment
>     * error messages now numbered and display changed slightly
>     * you can break running loop by pressing Shift+BREAK (Pause) key
>       combination
>     * calling COM objects works again (was broken in 4.31.x)
>     * changed slightly the way TAB works in editor, if TAB is pressed
>       any selection is deselected to avoid accidential deletion of text
>     * /experimental:/ added 'agressive garbage collector' that extremely
>       decreases the amount
>       of memory required to run AFL formula by releasing the memory
>       used for temporary variables as soon as possible (previously
>       temporary memory was released at the end of formula execution).
>       A side-effect of new garbage collector is some speed up in formula
>       execution.
>     * new tab in preferences for AFL engine settings
>     * /experimental feature, NOT for beginners, may be removed/modified
>       in future releases/:
>       new _TRACE( "string" ) AFL function added
>       that allows to write debug messages from AFL code to system debug
>       viewer.
>       (it calls internally OutputDebugString Win API function).
>       To view debug messages you have to run DebugView freeware program
>       from http://www.sysinternals.com/ 
> 
> *CHANGES FOR VERSION 4.31.1 (as compared to 4.31.0)*
> 
>     * fixed bug introduced in 4.31.0 causing no text output in
>       commentary/interpretation** 
> 
> *CHANGES FOR VERSION 4.31.0 (as compared to 4.30.0)*
> 
>     * Workspace window uses "icon font" set in the Windows settings
>       instead of hard coded Tahoma 8
>     * for better readability and ClearType(tm) compatibility on WinXP,
>       all dialog windows use now 'MS Shell Dlg' face name that maps to
>       standard MS Sans Serif on Win 9x/Me/NT and Tahoma on Win 2K and XP.
>     * rewritten AFL parser, now formula is parsed and coverted to syntax
>       tree and then interpreted. This would allow further improvements
>       including compilation. This allowed also to add loops/if-else
>       statements.
>     * implemented IF/ELSE statement, WHILE and FOR loops:
>       The same basic 'for' loop in AFL is 2..3 times faster than in JScript
>       Syntax follows C++/JScript style:
> 
>       /while( conditional_expression ) statement;/
> 
>       /for( initializer_part; conditional_expression; iterator_part )
>       statement;/
> 
>       /if( conditional_expression ) statement;/
> 
>       /if( conditional_expression )
>       statement;
>       else
>       statement;/
> 
>     *
> 
>       implemented compound statements: these are blocks of statements
>       enclosed
>       in opening and closing curly brace
> 
>       /{
>       statement1;
>       statement2;
>       ...
>       statementN;
>       }/
> 
>       compound statement can appear anywhere when simple statement can.
> 
>       For example:
> 
>       |i = 10;
>       while( i < 20 )
>       {
>       Plot( MA( Close, i ), "MA" + WriteVal( i, 0 ), colorBlack + i );
>       i = i + 1;
>       }|
> 
>     *
> 
>       implemented C-style postfix and prefix increment/decrement operators
> 
>       |i = 10;
>       WriteIf( i++ );
>       WriteIf( ++i );
>       WriteIf( i );|
> 
>     *
> 
>       implemented array element access (subscript) operator []:
> 
>       |WriteVal( Close[ 0 ] ); // prints the first bar of close array|
> 
>       |/* a sample low-level implementation of exponential moving
>       average in AFL */|
> 
>       |myema[ 0 ] = Close[ 0 ];|
> 
>       |for( i = 1; i < BarCount; i++ )
>       {
>       myema[ i ] = 0.1 * Close[ i ] + 0.9 * myema[ i - 1 ];
>       }|
> 
>     *
> 
>       added built-in constant 'BarCount' that returns number of bars
>       available in arrays (the number of elements of array)
>       When QuickAFL is turned on it may be less than true number of bars
>       because QuickAFL feature attempts to use only visible bars (and
>       few before). You can control how many bars the formula requires
>       using SetBarsRequired() function
> 
>     *
> 
>       implemented infinite-loop protection. Nice if you forgot to
>       increment counter variable in 'for' loop :-)
> 
>     *
> 
>       tab key now works without need to press ALT/CTRL in AFL editors
> 
>     *
> 
>       added C-like synonyms for logical ADD/OR/NOT: &&, ||, !
> 
> 
>       |/* a sample low-level implementation of Profit-target stop in
>       AFL: */|
> 
>       |Buy = Cross( MACD(), Signal() );|
> 
>       |priceatbuy=0;|
> 
>       |for( i = 0; i < BarCount; i++ )
>       {
>            if( priceatbuy == 0 && Buy[ i ] )
>            priceatbuy = BuyPrice[ i ];|
> 
>       |     if( priceatbuy > 0 && SellPrice[ i ] > 1.1 * priceatbuy )
>            {
>              Sell[ i ] = 1;
>              SellPrice[ i ] = 1.1 * priceatbuy;
>              priceatbuy = 0;
>            }
>            else
>              Sell[ i ] = 0;
>       }|
> 
>       |/* sample EMA rainbow */|
> 
>       |Plot( Close, "Price", colorBlack, styleCandle );
>       for( Range = 15; Range < 100; Range++ )
>          Plot( EMA( Close, Range ), "MA"+WriteVal(Range,0), colorRose +
>       Range % 8, styleNoLabel );|
> 
> *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 <mailto:bugs@xxxxxxxxxxxxx>
> 
> 
> *Yahoo! Groups Sponsor*
> <http://rd.yahoo.com/M=249982.3179269.4495679.2595810/D=egroupweb/S=1705632198:HM/A=1524963/R=0/*http://hits.411web.com/cgi-bin/autoredir?camp=556&lineid=3179269&prop=egroupweb&pos=HM> 
> 
> 
> 
> 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 
> <http://docs.yahoo.com/info/terms/>.


------------------------ Yahoo! Groups Sponsor ---------------------~-->
Get Home Early - Access Your work PC
http://us.click.yahoo.com/usvdqB/Yq8FAA/AG3JAA/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/