PureBytes Links
Trading Reference Links
|
Hello,
Saving graphics in PNG (even smaller than GIF) is directly
supported by AmiBroker. Edit->Image->Export to file.
Best regards,Tomasz Janeczkoamibroker.com
<BLOCKQUOTE
>
----- Original Message -----
<DIV
>From:
Rik
Rasmussen
To: <A title=amibroker@xxxxxxxxxxxxxxx
href="">amibroker@xxxxxxxxxxxxxxx
Sent: Friday, May 23, 2003 2:28 AM
Subject: RE: [amibroker] Re: Image Copy
Problem even when copied to Word.
You
can't zip it until it is a file. It isn't a file until you save
it.
<FONT face=Arial color=#0000ff
size=2>
A
much better alternative is using a program like Irfanview to do whole screen
or window captures and save them as .png files which are much smaller and do
not need to be zipped.
Rik RasmussenStock Analyzer mailing list moderator<A
href=""
target=_blank>http://groups.yahoo.com/group/stockanalyzer/
<BLOCKQUOTE
>
<FONT face=Tahoma
size=2>-----Original Message-----From: mrdavis9
[mailto:mrdavis9@xxxxxxxxxx]Sent: Thursday, May 22, 2003 7:58
PMTo: amibroker@xxxxxxxxxxxxxxxCc: jeff
davisSubject: Re: [amibroker] Re: Image Copy Problem even when
copied to Word.
I have a question at the end of this wordy
dialog. In order to capture a chart image, someone taught me to press
Control and then PRINTSCREEN. Then I hit the start button, and
click on RUN, and PAINTBRUSH always shows up as the default choice the OPEN
window. I then click OK. Paintbrush then presents me with a blank
page. I then click EDIT at the top of the blank page of paintbrush,
and then click copy. The chart image then appears in the blank
page. I would like to be able to immediately zip the image
before I save it. As it is now, I click save, and then have to go get
the saved folder, and then zip it. Is it possible to zip it while it
is still in paintbrush, just before I save it? Also, is there an
easier way to capture and zip images? Any thoughts will be
appreciated. Ron D
<BLOCKQUOTE
>
----- Original Message -----
<DIV
>From:
<A title=salil_gangal@xxxxxxxxx
href="">salil_gangal
To: <A
title=amibroker@xxxxxxxxxxxxxxx
href="">amibroker@xxxxxxxxxxxxxxx
Sent: Thursday, May 22, 2003 11:00
AM
Subject: [amibroker] Re: Image Copy
Problem even when copied to Word.
Friends,Similar problem comes-up if the copied
image is pasted into Microsoft WORD. So I guess there is a bug
in AmiBroker. Are there any others who have noticed that there
is a bar at the bottom of the copied image copied using
'Edit->Image Copy' ?Regards,- Salil V
Gangal--- In <A
href="">amibroker@xxxxxxxxxxxxxxx,
Salil V Gangal <<A
href="">salil_gangal@x...> wrote:>
Tomasz,> > I am copying chart image using 'Edit->Copy As
Image'.> > But I noticed that copied image gets a black-band
at the bottom. Have you noticed> anything like this
? Is this a bug ? BTW, I import the image into XnView, and
I'm> not sure if this is AmiBroker issue or XnView issue.>
> Regards,> > - Salil V Gangal> >
> --- Tomasz Janeczko <amibroker@xxxx> wrote:> >
Hello,> > > > A new beta version (4.38.0) of AmiBroker
has just been released.> > > > It is available for
registered users only from the members area at:> > <A
href="">http://www.amibroker.com/members/bin/ab4380beta.exe>
> > > If you forgot your user name / password to the members
area> > you can use automatic reminder service at: <A
href="">http://www.amibroker.com/login.html>
> > > Short list of changes in this beta (read change log in
the "read me" below for the> > details)> >
> > a.. send e-mails with charts directly from AmiBroker:
Edit->Image->Send by email> > and File->Send chart
via e-mail > > a.. added export chart image to PNG (portable
network graphics) file:> > Edit->Image->Export to PNG
file > > > > a.. new setting for candlestick
appearance: Tools->Preferences->Charting, "Use> >
distinct color for" : "None, up candle hollow" - it plots entire
candle with one> > color but leaves interior of UP candle
body hollow.> > > > a.. fixed positioning of arrows in
image copies (Edit->Image->Copy)> > > > a..
fixed crash occurring when printer device context did not support bit
blit> > copies. added very simple arrow line drawing for that
case (will be improved in> > future releases)> >
> > a.. fixed bug in handling Null with new constructs: if,
while and for.> > > > a.. numbers (floats) are now
automatically 'upsized' to arrays on first use of> > l-value
array subscript operator without causing error. > > .>
> > > Best regards,> > Tomasz Janeczko> >
amibroker.com> > > > AmiBroker 4.38.0 Beta Read
Me> > May 20, 2003 1:11 > > > > 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.38.0 beta" written in the About> >
box.> > > > See CHANGE LOG below for detailed list of
changes.> > > > 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 depends 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.> > > > This default behaviour can be however
overriden using global and local keywords> > (introduced in
4.36) - see example 2.> > > > 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 );> > >
> > > Example 2: Using local and global keywords to override
default visibility rules:> > > > VariableA = 5; //
implict global variable> > > > function Test()>
> {> > local VariableA; // explicit local
variable with the same identifier as global > > global
VariableB; // explicit global variable not defined earlier>
>
// may be used to return more than one value from the function>
> > > VariableA = 99;> > VariableB =
333;> > } > > > > VariableB = 1; // global
variable> > > > "Before function call";> >
"VariableA = " + VariableA;> > "VariableB = " +
VariableB;> > > > Test(); > > > >
"After function call";> > "VariableA = " + VariableA + " (not
affected by function call )";> > "VariableB = " + VariableB + "
(affected by the function call )"> > > > 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)> > > > do-while Statement> >
> > The do-while statement lets you repeat a statement or
compound statement until a> > specified expression becomes
false. > > > > Syntax> > > > do
statement while ( expression ) ;> > > > The expression
in a do-while statement is evaluated after the body of the loop
is> > executed. Therefore, the body of the loop is always
executed at least once. > > > > The expression
must have numeric or boolean type. Execution proceeds as follows:
> > > > 1.. The statement body is
executed.> > > > > > 2.. Next,
expression is evaluated. If expression is false, the do-while>
> statement terminates and control passes to the next statement in
the program. If> > expression is true (nonzero), the process
is repeated, beginning with step 1. > > This is an example
of the do-while statement:> > > > x=100;> >
do > > {> > y = sin( x
);> > x--;> > } while ( x >
0 );> > In this do-while statement, the two statements y = sin(
x ); and x--; are> > executed, regardless of the initial
value of x. Then x > 0 is evaluated. If x is> > greater
than 0, the statement body is executed again and x > 0 is
reevaluated. The> > statement body is executed repeatedly as
long as x remains greater than 0.> > Execution of the
do-while statement terminates when x becomes 0 or negative.
The> > body of the loop is executed at least once. > >
> > > > 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.38.0 (as
compared to 4.37.0)> > > > a.. new setting
for candlestick appearance:> >
Tools->Preferences->Charting> > "Use distinct
color for" : "None, up candle hollow" - > > it plots
entire candle with one color but leaves interior of UP candle
body> > hollow.> > > > >
> b.. added export chart image to PNG (portable network
graphics) file> > Edit->Image->Export to
PNG file > > (Please don't ask me to add GIF
support. GIF is patented and requires $3500> > license fee
for Unisys. PNG is free, supported by all browsers, smaller and
better> > )> > > > > >
c.. added 'send chart by e-mail' feature > >
Edit->Image->Send by email> > and>
> File->Send chart via e-mail > > >
> > > d.. fixed positioning of arrows in image
copies (Edit->Image->Copy)> > >
> e.. fixed crash occurring when printer device context did
not support bit blit> > copies. added very simple arrow line
drawing for that case (will be improved in> > future
releases)> > > > f.. fixed bug in handling
Null with new constructs: if, while and for.> >
In pre-4.38 versions Null used in if, while for was treated as True,
which was> > wrong> > if( Null )
_TRACE("WRONG");> > else _TRACE("CORRECT");>
> Now Null in if, while, for is treated as False. >
> g.. numbers (floats) are now automatically 'upsized' to
arrays on first use of> > l-value array subscript operator
without causing error. > > Also r-value subscript
can be applied to numbers and return the number itself> >
without causing error, but the underlying variable remains just a
single number.> > > > This allows to
easily intialize arrays to any value without need to write
loops.> > > > Example 1:>
> in previous versions you would need to write:>
> > > for( i = 0; i < BarCount; i++ ) myarray[
i ] = 0 ; // fill with zeros> > myarray[ 5 ] =
6; // write value to 5th element of the array> > >
> now you can write simply:> > >
> myarray = 3; // initialize, at this moment myarray is
just a number> > myarray[ 5 ] = 6; // write
value to 5th element of the array, the variable is> >
automatically> > // upsized to array and all
elements are filled with a numeric value > > //
that was originally placed in myarray variable> > >
> /* myarray is holds now the array filled with values of 3
except element 5 that> > has value of 6 */> >
> > mynumber = 5;> > test =
mynumber[ 7 ]; // previous versions would give an error message
here> > // now subscript operator for r-value
numeric variable > > // is allowed and returns just
the number > > // and variable is not upsized to
array unless appears on left side> > // of
assignment (l-value)> > /* mynumber variable here is
still a number */> > WriteVal( test );> >
> > CHANGES FOR VERSION 4.37.0 (as compared to 4.36.0)>
> > > a.. printing improved, now all open
indicator panes are printed and resolution> > is increased
> > b.. Edit->Copy As Image and Edit->Copy As
Metafile now generate an image> > consisting of all
indicator panes (not just one) > > c.. fixed problem
with non-resetting sort arrows in AA window > > d..
fixed sometimes occuring crash Signal() function > >
e.. increased size of error message text buffer to prevent overflow
when> > reporting syntax errors in formulas having long
unwrapped lines. > > f.. grid lines are drawn with
fine dots instead of small dashes (screen output> > only)
> > g.. new AFL functions:> >
GetCategorySymbols( category, index ) > > -
retrieves comma-separated list of symbols belonging to given
category> > > > supported
categories:> > categoryMarket categoryGroup
categorySector categoryIndustry categoryWatchlist>
> categoryFavorite categoryIndex > > >
> index = (market/group/industry/sector/watchlist
number)> > 0..255 for categoryMarket, categoryGroup,
categoryIndustry> > 0..63 for categorySector,
categoryWatchlist> > ignored for categoryFavorite,
categoryIndex> > > > StrExtract( list,
item )> > - extracts given item (zero-based) from
comma-separated string.> > > >
Example:> > StrExtract( "MSFT,AAPL,AMD,INTC", 2 )
> > will return AMD > > >
> StrExtract( "MSFT,AAPL,AMD,INTC", 0 )>
> will return MSFT> > > >
StrExtract( "MSFT,AAPL,AMD,INTC", 200 ) > > will
return empty string ""> > > > + other
minor fixes> > > > Example code for
GetCategorySymbols and StrExtract:> > > >
/* note: if given watch list contains lots of symbols >
> ** performance may be poor > >
*/> > function CreateAverageForWatchList( listnum
)> > {> > // retrive
comma-separated list of symbols in watch list>
> list = GetCategorySymbols( categoryWatchlist,
listnum );> > > > Average = 0; //
just in case there are no watch list members> > >
> for( i = 0; ( sym = StrExtract( list, i ) ) != "";
i++ )> > {>
> f = Foreign( sym, "C" );>
> if( i == 0 ) Average = f;>
> else Average = Average + f;>
> }> > > >
return Average / i; // divide by number of components>
> }> > > > Plot(
CreateAverageForWatchList( 1 ), "Avg of WL 1", colorGreen ); >
> > > CHANGES FOR VERSION 4.36.0 (as compared to
4.35.0)> > > > a.. fixed problem with
affecting 2 or more identifiers referencing the same> >
array when using l-value subscript operator []. Thanks Herman for
pointing this> > out> > b.. global and
local keywords - for explicit visibility/scope declarations >
> Allow to override default scope rules that assume that
variables defined outside> > function are global, while
those identifiers that appear for the first time inside> >
functions are local.> > > >
Syntax:> > > > local var1 [, var2, ... ]
;> > global var1 [, var2, ... ] ;> >
> > (as you can see you can declare more than one
variable in one line.> > > > Note:
using these keywords outside function definition has no
meaning> > (global scope is used).> >
> > Example:> > > >
VariableA = 5; // implict global variable> > >
> function Test()> > {>
> local VariableA; // explicit local variable
with the same identifier as global> > >
> global VariableB; // explicit global variable not
defined earlier>
>
// may be used to return more than one value from the> >
function> > > > VariableA =
99;> > VariableB = 333;>
> } > > > > VariableB = 1;
// global variable> > > > "Before function
call";> > "VariableA = " + VariableA;>
> "VariableB = " + VariableB;> > >
> Test(); > > > > "After
function call";> > "VariableA = " + VariableA + "
(not affected by function call )";> > "VariableB
= " + VariableB + " (affected by the function call )";> >
> > c.. syntax highligting modified so keywords:
#include, if, else, while, do,> > function, procedure,
global, local, return are colorised differently than built-in>
> constants or functions. Corresponding color/style setting added
to> > Preferences->Editor> > > > >
> d.. #pragma nocache > >
pre-processor command added to switch off #include file caching
mechanism.> > Note: between '#pragma' and
'nocache' there must be exactly SINGLE space> >
Note 2: disabling caching may slow down execution of the formula
(especially> > in indicators)>
> Note 3: #pragma nocache must be placed before
#includes> > > > Example: >
> #pragma nocache> > #include
<myfile.afl>> > > > a.. single line
comments now work with #includes (and #pragma too) so you can>
> comment out include in regular way:> >
//#include <something> - will not include> > > >
> > b.. changed error message from "unknown
identifier" to "Variable 'name' used> > without having been
initialized." which better decribes the problem. > >
> > For example:> > >
> function Test( )> > {>
> global x;> > x =
3;> > }> > > >
WriteVal( x ); // variable used without having been initialized,>
> // although declared inside Test() function body>
> > > > > Test( ); // during function
call the value of 3 is assigned to variable x> > >
> WriteVal( x ); // and now no error is reported>
> > > a.. implemented shortcut evaluation of
logical operators > > The operands of logical-AND
and logical-OR expressions are evaluated from left> > to
right. Now if the value of the first operand is sufficient to
determine the> > result of the operation, the second operand
is not evaluated. This is called> > "short-circuit
evaluation." > > > > The left operand of
the logical-AND operator is completely evaluated and all> >
side effects complete before continuing. If the left operand evaluates
to false> > (0), the other operand is not evaluated.>
> > > The left operand of the logical-OR operator
is completely evaluated > > and all side effects
complete before continuing. > > If the left operand
evaluates to true (nonzero), the other operand is not> >
evaluated. > > > > (The above description
applies to operands that evaluate to single boolean> >
value, > > it does not apply to arrays. Operands
that evaluate to arrays are evaluated> > always )>
> > > Example:> > for( i =
-3; i < BarCount; i++ )> > {>
> // using old versions of AMiBroker you would get
subscipt out of range> > // but
now> > // the second operand (C[ i ] > C[ i
- 1 ]) is evaluated > > // ONLY if first
operand ( i >= 1 ) evaluates to TRUE> > >
> if( i >= 1 && C[ i ] > C[ i - 1
] )> > {>
> _TRACE("TEST " + i);
> > }> > }>
> > > > > > > CHANGES FOR VERSION 4.35.0
(as compared to 4.34.2)> > > > a..
do-while loop implemented:> > Syntax:> >
> > do statement while ( expression ) ;> >
> > The expression in a do-while statement is
evaluated after the body of the loop> > is executed.
> > Therefore, the body of the loop is always
executed at least once. > > > >
Example:> > > > i=0;>
> do> > {>
> i++;> > }>
> while( i < 100 );> > WriteVal( i
);> > > > > > b.. it is now
allowed to 'add' (or rather concatenate) string to a number />
> array. This saves quite a bit of typing. This works as in
JScript. The left-hand> > operand of '+' has to be a string.
The right-hand operand may be string, number or> > array.
Numbers are coerced to strings using %g sprintf formatting (prints
out> > decimal point only when necessary) and then concatenated.
In case of arrays> > SELECTED VALUE is coerced to string and
then concatenated.> > > > So now instead
of > > > > i = 100;>
> "Value is " + WriteVal( i );> >
"Close : " + WriteVal( Close ) + ", Open : " + WriteVal( Open ) + ",
High : " +> > WriteVal( High );> > >
> you can write:> > > > i =
100;> > "Value is " + i;> >
"Close : " + Close + ", Open : " + Open + ", High : " + High;> >
> > Note that> > > >
"Test " + 100 + 1;> > > > will give you
"Test 1001" because statements are parsed from left to right.>
> "Test " is added first to "100" giving "Test 100" and
then to "1" giving> > "Test 1001". If you want
to perform numeric adding first please use braces:> >
> > "Test " + ( 100 + 1 );> >
- this will give you "Test 101"> > > > >
> c.. additional tweaks in AFL engine & garbage
collection, futher speed up of> > execution of very long
loops > > > > d.. more error checking in
AFL engine - will report using uninitialized> > variables
that were accepted silently in 4.31.x - 4.34.x > >
e.. #include now accepts new way of specifying file names to
include:> > > > #include
<filename.afl>> > > > (note <
> braces instead of " " ) if you specify the file name this
way> > AmiBroker will look for> > the file
in "standard include path" that is definable using new prefs setting
in> > Tools->Preferences->AFL> > It
makes much shorter to write includes and you can move include folder
now> > without changing all AFL codes using #includes.>
> > > For example if you have set standard
include path to "C:\AFL\MyIncludes" and> > write in your
formula:> > > > #include
<common.afl>> > > > AmiBroker will
look for C:\AFL\MyIncludes\common.afl file> > >
> Also now #include reports file(s) not found in regular
error message box.> > > > >
> f.. IIf/Min/Max are now overloaded functions (have two
variants each)> > IIF( Condition_ARRAY,
True_Array, False_Array ) (old one)> > IIF(
BoolValue, TrueValue, FalseValue )> > > >
Min( array1, array2 ) (old one)> > Min( number1,
number2 ) > > > > Max( array1, array2 )
(old one)> > Max( number1, number2 ) > >
> > The second one is choosen when all arguments are
numbers and it is much much> > faster and returns number so
LastValue() call is not neccessary anymore.> > >
> Example:> > > > // much
faster and does not require LastValue()> > period =
IIF( name() == "MSFT", 5, 10 );> > result = Min( 7,
3 ); > > // (result is still a number not array as
in previous versions)> > > > > >
g.. added 'endless loop detection threshold' setting to Preferences
"AFL" tab.> > Recommended value 100000 or higher.> >
> > h.. fixed parameter counting in CallFunction
plugin callback in case of> > overloaded functions >
> i.. fixed problem with premature freeing of arrays passed
in default parameters> > fields (causing for example problem
with color exploration output - introduced in> > 4.32)
> > > > CHANGES FOR VERSION 4.34.2 (as compared to
4.34.0)> > > > a.. improved crash recovery
dialog to include AFL engine state information and> > (in
some cases) the source line of the formula that causes an exception
> > b.. added ability to catch all exceptions in
indicators and commentaries> > (switchabel via
Tools->Preferences->AFL, "catch system exceptions...", ON
by> > default) - allows you to continue to work even in case of
serious problem > > c.. loop break by
Shift+BREAK is now more sensitive > > d.. now you
can control how often Shift+BREAK key is checked during
formula> > execution (Tools->Preferences->AFL, "check
SHIFT+Break every" (1..100, default => > 50) (note that
specifying low values may degrade performance slightly) >
> e.. tweaked AFL memory allocator hash tables to get more
speed for large looping> > formulas >
> f.. although I never reproduced this problem I made some
changes so 'TAB' key> > should not wipe the contents of AFL
editor anymore > > 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 <A
href="">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 > > > > >
__________________________________> Do you Yahoo!?> The New
Yahoo! Search - Faster. Easier. Bingo.> <A
href="">http://search.yahoo.comSend
BUG REPORTS to bugs@xxxxxxxxxxxxxSend SUGGESTIONS to
suggest@xxxxxxxxxxxxx-----------------------------------------Post
AmiQuote-related messages ONLY to: amiquote@xxxxxxxxxxxxxxx (Web page:
<A
href="">http://groups.yahoo.com/group/amiquote/messages/)--------------------------------------------Check
group FAQ at: <A
href="">http://groups.yahoo.com/group/amibroker/files/groupfaq.html
Your use of Yahoo! Groups is subject to the <A
href="">Yahoo! Terms of Service.
Send BUG REPORTS to bugs@xxxxxxxxxxxxxSend
SUGGESTIONS to
suggest@xxxxxxxxxxxxx-----------------------------------------Post
AmiQuote-related messages ONLY to: amiquote@xxxxxxxxxxxxxxx (Web page:
<A
href="">http://groups.yahoo.com/group/amiquote/messages/)--------------------------------------------Check
group FAQ at: <A
href="">http://groups.yahoo.com/group/amibroker/files/groupfaq.html
Your use of Yahoo! Groups is subject to the <A
href="">Yahoo! Terms of Service.
Send
BUG REPORTS to bugs@xxxxxxxxxxxxxSend SUGGESTIONS to
suggest@xxxxxxxxxxxxx-----------------------------------------Post
AmiQuote-related messages ONLY to: amiquote@xxxxxxxxxxxxxxx (Web page: <A
href="">http://groups.yahoo.com/group/amiquote/messages/)--------------------------------------------Check
group FAQ at: <A
href="">http://groups.yahoo.com/group/amibroker/files/groupfaq.html
Your use of Yahoo! Groups is subject to the <A
href="">Yahoo! Terms of Service.
Yahoo! Groups Sponsor
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.
|