PureBytes Links
Trading Reference Links
|
AB is
a lot like my car in that when it and I are alone I see stuff that doesn't show
up after I report it to the mechanic. IOW - it seems to be ok, now.
It nothing was "running" that I saw what I
reported.
<SPAN
class=249575320-07072003>
<SPAN
class=249575320-07072003>d
<SPAN
class=249575320-07072003>
<SPAN
class=249575320-07072003> -----Original
Message-----From: Tomasz Janeczko [mailto:amibroker@xxxxxx]
Sent: Monday, July 07, 2003 3:53 PMTo:
amibroker@xxxxxxxxxxxxxxxSubject: Re: [amibroker] AmiBroker 4.40.1
BETA released
Dale,
I have checked it and it works as follows:
1. if AA is in normal state scanning and we minimize AB and
restore AB then AA is restored correctly.
2. if AA is hidden (progress window minimized) and we
minimize AB and restore AB then AA is still hidden but progress
window
is restored.
So this is actualy expected behaviour except the fact than
in case 2) progress bar should remain minimized.
Best regards,Tomasz Janeczkoamibroker.com
<BLOCKQUOTE
>
----- Original Message -----
<DIV
>From:
dingo
To: <A title=amibroker@xxxxxxxxxxxxxxx
href="">amibroker@xxxxxxxxxxxxxxx
Sent: Monday, July 07, 2003 7:47
PM
Subject: RE: [amibroker] AmiBroker
4.40.1 BETA released
<FONT face=Arial color=#0000ff
size=2>TJ:
<FONT face=Arial color=#0000ff
size=2>
If
I manually minimize the AB window it minimizes the AA window (as expected)
but when I restore the AB window it doesn't restore the AA window as it used
to (I think it did anyway). Is this by design?
<FONT face=Arial color=#0000ff
size=2>
<FONT face=Arial color=#0000ff
size=2>d
<FONT
face=Tahoma size=2>-----Original Message-----From: Tomasz
Janeczko [mailto:amibroker@xxxxxx] Sent: Monday, July 07, 2003
1:07 PMTo: <A
href="">amibroker@xxxxxxxxxxxxxxxSubject:
[amibroker] AmiBroker 4.40.1 BETA released
Hello,
A new beta version (4.40.1) of AmiBroker has just been
released.
It is available for registered users only from the
members area at:
<FONT
size=2>http://www.amibroker.com/members/bin/ab4401beta.exe
If you forgot your user name / password to the members
area
you can use automatic reminder service at: <A
href=""><FONT
size=2>http://www.amibroker.com/login.html
List of changes in this
beta (read change log in the "read me" below for the
details)
added ability to minimize progress window. If progress window is
minized then the window 'owning' it is HIDDEN. So for example if you
minimize AA scan progress window then Automatic analysis window will be
HIDDEN. To re-show simply maximize progress
added Volume-At-Price (VAP) histogram chart overlay to price chart
added new settings for VAP to Tools->Preferences->Main price (to
turn it off go to Tools->Preferences : Main chart,and set "Volume
At Price overlay" to "None"
added new AFL function PlotVAPOverlay( lines = 300, width = 5,
color = colorGreen, rightside = False);that plots Volume-At-Price
(VAP) overlay chart. Please note that there must be at least one
regular Plot function in your formula for this to work, and there can be
only one PlotVAPOverlay in one indicator
Example:Plot( Close, "Price", colorBlack, styleCandle
);PlotVAPOverlay( 350, 4, colorYellow, True );
Example 2:Plot( Close, "Price", colorBlack, styleCandle
);PlotVAPOverlay( Param("lines",300,10,1000,1),
Param("width",10,1,99,1), ParamColor("color", colorYellow),
Param("mode",0,0,1,1) );
fixed 'X' close button in Param window.
Parameters window now shows parameter list in alphabetical
order
fixed problem with plotting zero values at log scale. Note that
Log( 0 ) is minus inifinity and it really can not be plotted, however
many people attempted to plot zero data in log scale, so AMiBroker now
adjusts zero to 0.0001 when log scale is used to allow
plotting.Example faulty code that did not work in 4.40, but works
now:Plot(IIf(Month() != Ref(Month(),-1),1,0),"", color,
styleHistogram | styleOwnScale | styleNoLabel)
added new setting to Tools->Preferences : Charting "draw
vertical line between months"
Best regards,Tomasz
Janeczkoamibroker.com
AmiBroker 4.40.1 Beta Read Me
July 7, 2003 19:00
THIS IS A BETA VERSION OF THE SOFTWARE. EXPECT BUGS
!!!
AGAIN: 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.30 first.
Just run the installer and follow the instructions.
Then run AmiBroker. You should see "AmiBroker 4.40.1 beta" written in
the About box.
See CHANGE LOG below for detailed list of changes.
HELP ON NEW FEATURES
'WAIT FOR BACKFILL' FEATURE
The users of eSignal, myTrack and IQFeed real-time plugins may
now check "wait for backfill" box in the Automatic analysis window and all
scans, explorations and backfills will wait for completion of backfill
process for given symbol. This flag has no effect on databases that do not
use plugins (external data sources) or use end-of-day plugins (like
FastTrack, QP2, TC2000/TCNet, etc). This flag has also no effect when
using QT plugin due to the fact that QuoteTracker manages backfills by
itself and does not provide any control of backfill process to 3rd party
applications.
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 variablefunction
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 usereturn 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:
The statement body is executed.
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. <FONT
size=2>
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:
The expression is evaluated.
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:
The init-expression, is evaluated. This specifies the
initialization for the loop. There is no restriction on the type of
init-expression.
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 1if ( 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 <FONT
face="Courier New">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 2if ( 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 3if ( 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.40.1 (as compared to 4.40.0)
added ability to minimize progress window. If progress window is
minized then the window 'owning' it is HIDDEN. So for example if you
minimize AA scan progress window then Automatic analysis window will be
HIDDEN. To re-show simply maximize progress
added Volume-At-Price (VAP) histogram chart overlay to price chart
added new settings for VAP to Tools->Preferences->Main price (to
turn it off go to Tools->Preferences : Main chart,and set "Volume
At Price overlay" to "None"
added new AFL function PlotVAPOverlay( lines = 300, width = 5,
color = colorGreen, rightside = False);that plots Volume-At-Price
(VAP) overlay chart. Please note that there must be at least one
regular Plot function in your formula for this to work, and there can be
only one PlotVAPOverlay in one indicator
Example:Plot( Close, "Price", colorBlack, styleCandle
);PlotVAPOverlay( 350, 4, colorYellow, True );
Example 2:Plot( Close, "Price", colorBlack, styleCandle
);PlotVAPOverlay( Param("lines",300,10,1000,1),
Param("width",10,1,99,1), ParamColor("color", colorYellow),
Param("mode",0,0,1,1) );
fixed 'X' close button in Param window.
Parameters window now shows parameter list in alphabetical
order
fixed problem with plotting zero values at log scale. Note that
Log( 0 ) is minus inifinity and it really can not be plotted, however
many people attempted to plot zero data in log scale, so AMiBroker now
adjusts zero to 0.0001 when log scale is used to allow
plotting.Example faulty code that did not work in 4.40, but works
now:Plot(IIf(Month() != Ref(Month(),-1),1,0),"", color,
styleHistogram | styleOwnScale | styleNoLabel)
added new setting to Tools->Preferences : Charting "draw
vertical line between months"
CHANGES FOR
VERSION 4.40.0 (as compared to 4.39.0)
fixed crash when global or local keyword was used elsewhere than on
top of the function definition
fixed crash that occurred when interpretation code part required
more bars than indicator code part
fixed handling of 1st hour after midnight in Metastock plugin /
intraday data
fixed problem with calling the same user-defined function multiple
times in single simple arithmetic expression.
memory allocated by Equity(0) was freed at the end of the formula
execution, now it is freed immediatelly, making possible to create large
loops with Equity(0) without memory problems. Note that Equity(1) and
Equity(2) released memory immediatelly already.
when Y-axis grid spacing is lower than or equal to 0.02 then Y axis
is displayed with 4 decimal digits (usefull for currencies)
logarithmic scaling improved, Y-scale shifting and zooming in log
scale works better too.
fixed date column formatting when SetOption("nodefaultcolumns",
flag) is switched off and back on
Param()s in Indicator Builder are set back to defaults only when
formula is edited, setting grid line/scalling options do not reset
params.
time compression algorithm modified, now alignment is available in
two options:1. align to midnight (00:00:00) 2. align to trading
hours START time and four time stamp display modes:1. display
time of first tick in bar, 2. display time of last tick in bar3.
display start time of interval bar, 4. display end time of interval
barThese settings are available in
Tools->Preferences->IntradayFixed also problems with alignment
occurred in some cases in previous versions.
CHANGES FOR
VERSION 4.39.0 (as compared to 4.38.0)
added Param dialog to AA window. Note that AA-defined parameters are
reset back to defaults only when you LOAD the formula from the file or
when you click on 'Reset' button in Parameter dialog.
colorAqua now has correct value of 36
when Printing charts (or using Print Preview ) in Real Time mode,
auto-refresh is temporarily disabled to avoid problems with
printing
fixed problem with non-updating last bar of trade arrays by
Equity(1) applied in exploration when built-in trade delays where
greater than zero
operands of arithmetic expressions are evaluated from left to right
again (as it was in 4.30) so statements like this (y = 7)*1000 +
y;(note assignment within expression) do not cause error messages
about uninitialized variable
new feature "Wait for Backfill" in Auto-Analysis window. Causes
scans/explorations/backteststo wait for the plugin to finish data
backfill.The setting applies to real-time plugins only, and only to
those that supportthis feature.
three new versions of plugins that support 'wait for backfill'
feature are included in the beta archive:eSignal plugin
1.5.0myTrack plugin 1.5.3IQFeed plugin 1.3.1'Wait for
backfill' feature is not supported by QT plugin, and it won't be
supported becauseQuoteTracker has no interface to allow forcing
backfills from 3rd party applications.
other minor fixes
CHANGES FOR
VERSION 4.38.0 (as compared to 4.37.0)
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.
added export chart image to PNG (portable network graphics)
fileEdit->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
)
added 'send chart by e-mail' feature Edit->Image->Send by
emailandFile->Send chart via e-mail
fixed positioning of arrows in image copies
(Edit->Image->Copy)
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)
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 wrongif( Null ) _TRACE("WRONG");else
_TRACE("CORRECT");Now Null in if, while, for is treated as
False.
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 zerosmyarray[ 5 ] = 6; // write
value to 5th element of the arraynow you can write
simply:myarray = 3; // initialize, at this moment myarray
is just a numbermyarray[ 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)
printing improved, now all open indicator panes are printed and
resolution is increased
Edit->Copy As Image and Edit->Copy As Metafile now generate an
image consisting of all indicator panes (not just one)
fixed problem with non-resetting sort arrows in AA window
fixed sometimes occuring crash Signal() function
increased size of error message text buffer to prevent overflow when
reporting syntax errors in formulas having long unwrapped lines.
grid lines are drawn with fine dots instead of small dashes (screen
output only)
new AFL functions:GetCategorySymbols( category, index ) -
retrieves comma-separated list of symbols belonging to given
categorysupported categories:categoryMarket categoryGroup
categorySector categoryIndustry categoryWatchlistcategoryFavorite
categoryIndex index = (market/group/industry/sector/watchlist
number)0..255 for categoryMarket, categoryGroup,
categoryIndustry0..63 for categorySector,
categoryWatchlistignored for categoryFavorite,
categoryIndexStrExtract( 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 MSFTStrExtract(
"MSFT,AAPL,AMD,INTC", 200 ) will return empty string ""+
other minor fixesExample 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)
fixed problem with affecting 2 or more identifiers referencing the
same array when using l-value subscript operator []. Thanks Herman for
pointing this out
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 variablefunction
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 )";
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
#pragma nocache pre-processor command added to switch off
#include file caching mechanism.Note: between '#pragma' and
'nocache' there must be exactly SINGLE spaceNote 2: disabling
caching may slow down execution of the formula (especiallyin
indicators)Note 3: #pragma nocache must be placed before
#includesExample:
#pragma nocache#include
<myfile.afl>
single line comments now work with #includes (and #pragma too) so
you can comment out include in regular way://#include
<something> - will not include
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
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)
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 );
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"
additional tweaks in AFL engine & garbage collection, futher
speed up of execution of very long loops
more error checking in AFL engine - will report using uninitialized
variables that were accepted silently in 4.31.x - 4.34.x
#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 forthe file in "standard include path" that is
definable using new prefs setting in Tools->Preferences->AFLIt
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 fileAlso now #include
reports file(s) not found in regular error message box.
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)
added 'endless loop detection threshold' setting to Preferences
"AFL" tab. Recommended value 100000 or higher.
fixed parameter counting in CallFunction plugin callback in case of
overloaded functions
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)
improved crash recovery dialog to include AFL engine state
information and (in some cases) the source line of the formula that
causes an exception
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
loop break by Shift+BREAK is now more sensitive
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)
tweaked AFL memory allocator hash tables to get more speed for large
looping formulas
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)
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 relationshipApply 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 amountof memory required to run AFL formula
by releasing the memoryused for temporary variables as soon as
possible (previouslytemporary 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
addedthat 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 JScriptSyntax
follows C++/JScript style:
while( conditional_expression ) statement;
for( initializer_part; conditional_expression; iterator_part )
statement;
if( conditional_expression ) statement;
if( conditional_expression )
statement;elsestatement;
implemented compound statements: these are blocks of statements
enclosedin 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 <A
href="">bugs@xxxxxxxxxxxxx
Send BUG REPORTS to
bugs@xxxxxxxxxxxxxSend SUGGESTIONS to
suggest@xxxxxxxxxxxxx-----------------------------------------Post
AmiQuote-related messages ONLY to: amiquote@xxxxxxxxxxxxxxx (Web page:
<A
href="">http://groups.yahoo.com/group/amiquote/messages/)--------------------------------------------Check
group FAQ at: <A
href="">http://groups.yahoo.com/group/amibroker/files/groupfaq.html
Your use of Yahoo! Groups is subject to the <A
href="">Yahoo! Terms of Service.
Send BUG REPORTS to bugs@xxxxxxxxxxxxxSend
SUGGESTIONS to
suggest@xxxxxxxxxxxxx-----------------------------------------Post
AmiQuote-related messages ONLY to: amiquote@xxxxxxxxxxxxxxx (Web page:
<A
href="">http://groups.yahoo.com/group/amiquote/messages/)--------------------------------------------Check
group FAQ at: <A
href="">http://groups.yahoo.com/group/amibroker/files/groupfaq.html
Your use of Yahoo! Groups is subject to the <A
href="">Yahoo! Terms of Service.
Send
BUG REPORTS to bugs@xxxxxxxxxxxxxSend SUGGESTIONS to
suggest@xxxxxxxxxxxxx-----------------------------------------Post
AmiQuote-related messages ONLY to: amiquote@xxxxxxxxxxxxxxx (Web page: <A
href="">http://groups.yahoo.com/group/amiquote/messages/)--------------------------------------------Check
group FAQ at: <A
href="">http://groups.yahoo.com/group/amibroker/files/groupfaq.html
Your use of Yahoo! Groups is subject to the <A
href="">Yahoo! Terms of Service.
Yahoo! Groups Sponsor
ADVERTISEMENT
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.
|