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

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



PureBytes Links

Trading Reference Links

Rick,

If you mean functions : then yes you can nest function calls.

You can call one function from within second function
and you can call function that takes another function as argument:

function f(x)
{
 return 2*x;
}

function g(x)
{
 return 2*f(x);
}

function h(x)
{
 return 2*g(x);
}

WriteVal( h( x ) );
WriteVal( f( f( f( x ) ) ) );

What you can NOT do (as in C) 
is to define function inside other function definition:

function outsidef( x )
{ 
   function insidef( x )   // SYNTAX ERROR - definition inside definition
   {

   }
}

Best regards,
Tomasz Janeczko
amibroker.com
----- Original Message ----- 
From: "ricko8294_98" <ricko@xxxxxxxxxx>
To: <amibroker@xxxxxxxxxxxxxxx>
Sent: Thursday, May 01, 2003 2:04 AM
Subject: [amibroker] Re: AmiBroker 4.34.0 BETA released - now with user-definable functions with arguments and local variables


> Tomasz
> Can you nest them?
> Rick
> 
> --- In amibroker@xxxxxxxxxxxxxxx, "Tomasz Janeczko" <amibroker@xxxx> 
> wrote:
> > Fred,
> > 
> > I am glad that you like it.
> > 
> > Best regards,
> > Tomasz Janeczko
> > amibroker.com
> > ----- Original Message ----- 
> > From: "Fred" <fctonetti@xxxx>
> > To: <amibroker@xxxxxxxxxxxxxxx>
> > Sent: Wednesday, April 30, 2003 4:44 PM
> > Subject: [amibroker] Re: AmiBroker 4.34.0 BETA released - now with 
> user-definable functions with arguments and local variables
> > 
> > 
> > > Tomasz,
> > > 
> > > Excellent.  Thank you.
> > > 
> > > >From initial testing it appears that performance is identical 
> > > regardless of whether one writes inline code, inline functions or 
> > > external functions and then #INCLUDE's them.
> > > 
> > > =========================
> > > For example this code ...
> > > =========================
> > > 
> > > /* @f_DEMA.AFL */
> > > 
> > > function f_DEMA(iparray, ipvariable)
> > > {
> > >     oparray = DEMA(iparray, ipvariable);
> > >     return oparray;
> > > }
> > > 
> > > #include "c:\Program Files\AmiBroker\AFL\@f_DEMA.afl" 
> > > 
> > > Len1 = Optimize("Len1", 11, 1, 50, 1);
> > > Len2 = Optimize("Len2", 21, 1, 50, 1);
> > > 
> > > DEMAx = f_DEMA(C, Len1);
> > > DEMAy = f_DEMA(C, Len2);
> > > 
> > > Buy = DEMAx > DEMAy;
> > > Sell = DEMAx < DEMAy;
> > > Short = Sell;
> > > Cover = Buy;
> > > 
> > > =================================================
> > > Appears to run at the same speed as this code ...
> > > =================================================
> > > 
> > > Len1 = Optimize("Len1", 11, 1, 50, 1);
> > > Len2 = Optimize("Len2", 21, 1, 50, 1);
> > > 
> > > DEMAx = DEMA(C, Len1);
> > > DEMAy = DEMA(C, Len2);
> > > 
> > > Buy = DEMAx > DEMAy;
> > > Sell = DEMAx < DEMAy;
> > > Short = Sell;
> > > Cover = Buy;
> > > 
> > > ===========
> > > 
> > > Great work.
> > > 
> > > Fred
> > > 
> > > --- In amibroker@xxxxxxxxxxxxxxx, "Tomasz Janeczko" 
> <amibroker@xxxx> 
> > > wrote:
> > > > Fred,
> > > > 
> > > > 1. Yes you can save functions in a separate file(s).
> > > > Then use #include to include the definitions in your formula
> > > > 
> > > > 2. You can pass any type of the variable. Strings, arrays 
> numbers.
> > > > Also you can return numbers, arrays and strings.
> > > > 
> > > > 3. You can use both. There are no restrictions.
> > > > 
> > > > Best regards,
> > > > Tomasz Janeczko
> > > > amibroker.com
> > > > ----- Original Message ----- 
> > > > From: "Fred" <fctonetti@xxxx>
> > > > To: <amibroker@xxxxxxxxxxxxxxx>
> > > > Sent: Wednesday, April 30, 2003 2:46 PM
> > > > Subject: [amibroker] Re: AmiBroker 4.34.0 BETA released - now 
> with 
> > > user-definable functions with arguments and local variables
> > > > 
> > > > 
> > > > > Tomasz,
> > > > > 
> > > > > This looks interesting.
> > > > > 
> > > > > A couple of questions tho ...
> > > > > 
> > > > > 1.  Do the functions have to be inline in whatever code is 
> > > calling 
> > > > > them or can they be seperately saved some how and referenced 
> > > elsewhere
> > > > > 
> > > > > 2.  Can arrays be passed as input and returned or only 
> variables ?
> > > > > 
> > > > > 3.  Can one use array oriented statements inside the 
> functions or 
> > > are 
> > > > > functions assumed to require looping.
> > > > > 
> > > > > Thanks in advance,
> > > > > 
> > > > > Fred
> > > > > 
> > > > > --- In amibroker@xxxxxxxxxxxxxxx, "Tomasz Janeczko" <tj@xxxx> 
> > > 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: 
> > > > > >     a.. 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.
> > > > > > 
> > > > > > 
> > > > > >     b.. 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 
> > > averageif, 
> > > > > 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)
> > > > > > 
> > > > > >   a.. user-definable functions and procedures with 
> parameters 
> > > and 
> > > > > local variables 
> > > > > > 
> > > > > >   b.. '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.
> > > > > > 
> > > > > >   c.. indicator list column width increased in Indicator 
> > > Builder 
> > > > > >   d.. 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)
> > > > > > 
> > > > > >   a.. 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)
> > > > > > 
> > > > > > 
> > > > > >   b.. 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.
> > > > > > 
> > > > > > 
> > > > > >   c.. 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 );
> > > > > > 
> > > > > >   d.. fixed sometimes incorrect output of variable-period 
> > > version 
> > > > > of LLV/HHV
> > > > > > 
> > > > > >   e.. 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)
> > > > > > 
> > > > > >   a.. second bug in experimental garbage collector fixed. 
> > > > > > CHANGES FOR VERSION 4.32.1 (as compared to 4.32.0)
> > > > > > 
> > > > > >   a.. garbage collector was releasing memory too soon in 
> some 
> > > > > cases, now fixed. 
> > > > > > CHANGES FOR VERSION 4.32.0 (as compared to 4.31.1)
> > > > > > 
> > > > > >   a.. added type check in IF/ELSE statements 
> > > > > >   b.. added type check in array element assignment 
> > > > > >   c.. error messages now numbered and display changed 
> slightly 
> > > > > >   d.. you can break running loop by pressing Shift+BREAK 
> > > (Pause) 
> > > > > key combination 
> > > > > >   e.. calling COM objects works again (was broken in 
> 4.31.x) 
> > > > > >   f.. changed slightly the way TAB works in editor, if TAB 
> is 
> > > > > pressed any selection is deselected to avoid accidential 
> deletion 
> > > of 
> > > > > text 
> > > > > >   g.. 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. 
> > > > > >   h.. new tab in preferences for AFL engine settings 
> > > > > >   i.. 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)
> > > > > > 
> > > > > >   a.. 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)
> > > > > > 
> > > > > >   a.. Workspace window uses "icon font" set in the Windows 
> > > settings 
> > > > > instead of hard coded Tahoma 8 
> > > > > >   b.. 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. 
> > > > > >   c.. 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. 
> > > > > >   d.. 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;
> > > > > > 
> > > > > >   e.. 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;
> > > > > >   }
> > > > > > 
> > > > > >   f.. implemented C-style postfix and prefix 
> > > increment/decrement 
> > > > > operators
> > > > > > 
> > > > > >   i = 10;
> > > > > >   WriteIf( i++ );
> > > > > >   WriteIf( ++i );
> > > > > >   WriteIf( i );
> > > > > > 
> > > > > >   g.. 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 ];
> > > > > >   }
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > >   h.. 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
> > > > > > 
> > > > > >   i.. implemented infinite-loop protection. Nice if you 
> forgot 
> > > to 
> > > > > increment counter variable in 'for' loop :-)
> > > > > > 
> > > > > >   j.. tab key now works without need to press ALT/CTRL in 
> AFL 
> > > > > editors
> > > > > > 
> > > > > >   k.. 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@xxxx
> > > > > 
> > > > > 
> > > > > 
> > > > > Send BUG REPORTS to bugs@xxxx
> > > > > Send SUGGESTIONS to suggest@xxxx
> > > > > -----------------------------------------
> > > > > 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/ 
> > > > > 
> > > > > 
> > > > >
> > > 
> > > 
> > > 
> > > Send BUG REPORTS to bugs@xxxx
> > > Send SUGGESTIONS to suggest@xxxx
> > > -----------------------------------------
> > > 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/ 
> > > 
> > > 
> > >
> 
> 
> 
> 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/ 
> 
> 
> 

------------------------ Yahoo! Groups Sponsor ---------------------~-->
Get A Free Psychic Reading!
Your Online Answer To Life's Important Questions.
http://us.click.yahoo.com/cjB9SD/od7FAA/uetFAA/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/