====== AmiBroker ======
All base con **AmiBroker 5.7**
refer:
* https://www.amibroker.com/kb/toc/
* http://www.marketcalls.in/category/amibroker
===== AmiBroker Formula(AFL file) =====
refer:
* AFL Functions Tutorials:
* http://www.amibroker.com/guide/h_understandafl.html
* https://www.amibroker.com/guide/a_funref.html
* http://jbmarwood.com/amibroker-afl-collection/
* http://www.asxmarketwatch.com/
* AFL files:
* http://www.wisestocktrader.com/
* https://algoji.com/latest-amibroker-afl/
* http://www.inditraders.com/amibroker/129-amibroker-simple-useful-codes.html
==== Understanding how AFL works ====
=== Introduce AFL ===
One of **most important aspects** of AFL is that it is **an array processing language**. It operates on arrays (or rows/vectors) of data. This way of operation is quite** similar to the way how popular spreadsheets work (like Microsoft Excel)**. Anyone familiar with MS Excel should have no trouble quickly picking up AFL. - In fact all the examples in this article were all created using MS Excel.
=== Array in AFL ===
Arrays in AFL: An array is simply a list (or row) of values. In some books it may be referred to as a vector. Each numbered row of values in the example represents an individual array. Amibroker has stored in its database **6 arrays for each symbol**. One for **opening price**, one for the **low price**, one for the **high price**, one for the **closing price** and one for **volume** (see the rows labelled 1-5 below) and one for **open interest**. These can be referenced in AFL as **open, low, high, close, volume, openint or o, l, h, c, v, oi**.
| ^Bar^1^2^3^4^5^6^7^8^9^10^
|1|Open|1,23|1,24|1,21|1,26|1,24|1,29|1,33|1,32|1,35|1,37|
* **Sum 2 arrays**:
MyVariable = ( High + Low )/2;
| ^Bar^1^2^3^4^5^6^7^8^9^10^
|1^High (built-in array) |1,24|1,27|1,25|1,29|1,25|1,29|1,35|1,35|1,37|1,29|
|2^Low (built-in array) |1,20|1,21|1,19|1,20|1,21|1,24|1,30|1,28|1,31|1,27|
|3^High+Low (temporary array created during evaluation)|2,44|2,48|2,44|2,49|2,46|2,53|2,65|2,63|2,68|2,46|
|4^( High+Low ) /2 (gets assigned to MyVariable) |1,22|1,24|1,22|1,245|1,23|1,265|1,325|1,315|1,34|1,23|
* **Moving averages, conditional statements**: Let us now consider the following code:
Cond1 = Close > MA( Close, 3 );
Cond2 = Volume > Ref( Volume, -1 );
Buy = Cond1 AND Cond2;
Sell = High > 1.30;
| ^Day^1^2^3^4^5^6^7^8^9^10^
|1^Open|1,23|1,24|1,21|1,26|1,24|1,29|1,33|1,32|1,35|1,37|
|2^High|1,24|1,27|1,25|1,29|1,25|1,29|1,35|1,35|1,37|1,29|
|3^Low|1,20|1,21|1,19|1,20|1,21|1,24|1,30|1,28|1,31|1,27|
|4^Close|1,23|1,26|1,24|1,28|1,25|1,25|1,31|1,30|1,32|1,28|
|5^Volume|8310|3021|5325|2834|1432|5666|7847|555|6749|3456|
|6^Ref( Volume, -1 ) (temporary array created during eval)|Null|8310|3021|5325|2834|1432|5666|7847|555|6749|
|7^MA( Close, 3 ) (temporary array created during eval)|Null|Null|1,243|1,260|1,257|1,260|1,270|1,287|1,310|1,300|
|8^Cond1 = Close < MA(close,3) (gives 1 (or true) if condition met, zero otherwise)|Null|Null|1|0|1|1|0|0|0|1|
|9^Cond2 = Volume > Ref(volume,-1)|Null|0|1|0|0|1|1|0|1|0|
|10^Buy = Cond1 AND Cond2|Null|Null|1|0|0|1|0|0|0|0|
|11^Sell = High > 1.30|0|0|0|0|0|0|1|1|1|0|
=== Conditional Funcion and Loop ===
Conditional Function:
IIF(condition, truepart, falsepart)
Loop:
Period = ... some calculation
vaexp[ 0 ] = Close[ 0 ]; // initialize first value
for( i = 1; i < BarCount; i++ )
{
// calculate the value of smoothing factor
Factor = 2/(Period[ i ] + 1 );
// calculate the value of i-th element of array
// using this bar close ( close[ i ] ) and previous average value ( vaexp[ i - 1 ] )
vaexp[ i ] = Factor * Close[ i ] + ( 1 - Factor ) * vaexp[ i - 1 ];
}
=== Add Condition to scaning stocks ===
Edit 1443-double-top-and-bottom-detection.afl to add condition for scanning:
change original code
doubletop = PK AND abs( peakdiff - 1 ) < validdiff AND (Xpk1 -Xpk2)>mindistance AND High > HHV( Ref( H, fwdcheck ), fwdcheck - 1 );
doubleBot=tr AND abs( troughdiff - 1 ) < validdiff AND (Xtr1 -Xtr2)>mindistance AND Low < LLV( Ref( L, fwdcheck ), fwdcheck - 1 );
to add condition **Volume > 100000** for scanning
doubletop = PK AND abs( peakdiff - 1 ) < validdiff AND (Xpk1 -Xpk2)>mindistance AND High > HHV( Ref( H, fwdcheck ), fwdcheck - 1 ) AND Volume > 100000;
doubleBot=tr AND abs( troughdiff - 1 ) < validdiff AND (Xtr1 -Xtr2)>mindistance AND Low < LLV( Ref( L, fwdcheck ), fwdcheck - 1 ) AND Volume > 100000;
=== Exploration stocks with Filter in AFL ===
refer: https://www.amibroker.com/guide/h_exploration.html
One of the most useful features of the **Analysis window is called "Exploration"**. Basically, an exploration works in a similar way to scan but instead of **looking for and reporting just buy/sell signals** it allows you to generate customizable screening (or exploration) report that can give you **much more information than simple scan**.
* **Volume** >= 100000:
Filter = Volume >= 100000;
* **Close** <= 5:
Filter = Close <= 5;
* Both conditions above
Filter = Volume >= 100000 AND Close <= 5;
==== Run Analysic ====
Basic steps:
- Step1: Goto Amibroker **Analysis->New Analysis** and select Apply to **All Symbols** and Range **From-To dates**
- Step2: Select Formula from **AmiBroker\Formulas\Exploration\**
- Step3: Click **Scan** or **Explore** or **Backtest** to see results
* **Scan** -> run from date to dates in form
* **Explore** -> run from date to dates in form
* **Backtest** -> run from begin time of market to current date
- Step4: click button **Report** to see summary of Analysic
Configure **Filter** for stocks which you want to run analysic:
- Step1: click icon below to display filter window: {{:my:amibroker-filter-select.png|}}
- Step2: select List stocks was included in filter, in below case was list **MyStocks**: {{:my:amibroker-filter-window.png|}}
==== Favorite Analysics ====
* 1443-double-top-and-bottom-detection.afl
* 2464-bollinger-band-squeeze-highlighter-and-exploration.afl