Stock Portfolio Organizer
The ultimate porfolio management solution.
Shares, Margin, CFD's, Futures and Forex
EOD and Realtime
Dividends and Trust Distributions
And Much More ....
WiseTrader Toolbox
#1 Selling Amibroker Plugin featuring:
Advanced Adaptive Indicators
Advanced Pattern Exploration
Neural Networks
And Much More ....
meenakshibose for Amibroker (AFL)
Copy & Paste Friendly
Back
_SECTION_BEGIN("Price");
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) Vol " +WriteVal( V, 1.0 ) +" {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 )) ));
Plot( C, "Close", ParamColor("Color", colorBlack ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() );
if( ParamToggle("Tooltip shows", "All Values|Only Prices" ) )
{
ToolTip=StrFormat("Open: %g\nHigh: %g\nLow: %g\nClose: %g (%.1f%%)\nVolume: "+NumToStr( V, 1 ), O, H, L, C, SelectedValue( ROC( C, 1 )));
}
_SECTION_END();
_SECTION_BEGIN("Mid MA");
P = ParamField("Price field",-1);
Periods = Param("Periods", 45, 2, 300, 1 );
Plot( MA( P, Periods ), _DEFAULT_NAME(), ParamColor( "Color", colorCycle ), ParamStyle("Style") | styleNoRescale );
_SECTION_END();
_SECTION_BEGIN("Long MA");
P = ParamField("Price field",-1);
Periods = Param("Periods", 100, 2, 400, 1 );
Plot( MA( P, Periods ), _DEFAULT_NAME(), ParamColor( "Color", colorCycle ), ParamStyle("Style") | styleNoRescale );
_SECTION_END();
_SECTION_BEGIN("BBands");
P = ParamField("Price field",-1);
Periods = Param("Periods", 15, 2, 300, 1 );
Width = Param("Width", 2, 0, 10, 0.05 );
Color = ParamColor("Color", colorLightGrey );
Style = ParamStyle("Style") | styleNoRescale | styleNoRescale;
Plot( BBandTop( P, Periods, Width ), "BBTop" + _PARAM_VALUES(), Color, Style );
Plot( BBandBot( P, Periods, Width ), "BBBot" + _PARAM_VALUES(), Color, Style );
_SECTION_END();
_SECTION_BEGIN("Price Interpretation");
movshort = ParamField("Short Time MA", 8 );
movmed = ParamField("Mid Time MA", 9 );
movlong = ParamField("Long Time MA", 10 );
btop = ParamField("BBTop", 11 );
bbot = ParamField("BBBottom", 12 );
if( Status("action") == actionCommentary )
{
width = btop - bbot;
lslop = LinRegSlope( C, 30 ) + 100;
lslo = LLV( lslop, 90 );
lshi = HHV( lslop, 90 );
lswidth = lshi - lslo;
trend = 100*( lslop - lslo )/lswidth;
mawidth = MA( width, 100 );
relwidth = 100*(width - mawidth)/mawidth;
_N( tname = Name()+"("+FullName()+")" );
printf("Price and moving averages:\n");
printf( tname + " has closed " + WriteIf( C > movshort, "above" , "below" ) + " its Short time moving average. ");
printf("\nShort time moving average is currently " + WriteIf( movshort > movmed, "above", "below") + " mid-time, AND " + WriteIf( movshort > movlong, "above", "below" ) + " long time moving averages.");
printf("\nThe relationship between price and moving averages is: "+
WriteIf( C > movshort AND movshort > movmed, "bullish",
WriteIf( C < movshort AND movshort < movmed, "bearish", "neutral" ) ) + " in short-term, and "+
WriteIf( movshort > movmed AND movmed > movlong , "bullish",
WriteIf( movshort < movmed AND movmed < movlong, "bearish", "neutral" ) ) + " in mid-long term. ");
printf("\n\nBollinger Bands:\n");
printf(tname+ " has closed " +
WriteIf( C < bbot, "below the lower band by " +
WriteVal( 100 *( bbot-C )/ width, 1.1 ) + "%%. " +
WriteIf( trend < 30, " This combined with the steep downtrend can suggest that the downward trend in prices has a good chance of continuing. However, a short-term pull-back inside the bands is likely.",
WriteIf( trend > 30 AND trend < 70, "Although prices have broken the lower band and a downside breakout is possible, the most likely scenario for "+tname+" is to continue within current trading range.", "" ) ), "" ) +
WriteIf( C > btop, "above the upper band by " +
WriteVal( 100 *( C- btop )/ width, 1.1 ) + "%%. " +
WriteIf( trend > 70, " This combined with the steep uptrend suggests that the upward trend in prices has a good chance of continuing. However, a short-term pull-back inside the bands is likely.",
WriteIf( trend > 30 AND trend < 70, "Although prices have broken the upper band and a upside breakout is possible, the most likely scenario for "+tname+" is to continue within current trading range.", "" ) ), "" ) +
WriteIf( C < btop AND ( ( btop - C ) / width ) < 0.5,
"below upper band by " +
WriteVal( 100 *( btop - C )/ width, 1.1 ) + "%%. ",
WriteIf( C < btop AND C > bbot , "above bottom band by " +
WriteVal( 100 *( C - bbot )/ width, 1.1 ) + "%%. ", "" ) ));
printf("\n"+
WriteIf( ( trend > 30 AND trend < 70 AND ( C > btop OR C < bbot ) ) AND abs(relwidth) > 40,
"This picture becomes somewhat unclear due to the fact that Bollinger Bands are currently",
"Bollinger Bands are " )+
WriteVal( abs( relwidth ), 1.1 ) + "%% " +
WriteIf( relwidth > 0, "wider" , "narrower" ) +
" than normal.");
printf("\n");
printf(
WriteIf( abs( relwidth ) < 40, "The current width of the bands (alone) does not suggest anything conclusive about the future volatility or movement of prices.","")+
WriteIf( relwidth < -40, "The narrow width of the bands suggests low volatility as compared to " + tname + "'s normal range. Therefore, the probability of volatility increasing with a sharp price move has increased for the near-term. "+
"The bands have been in this narrow range for " + WriteVal(BarsSince(Cross(-40,relwidth)),1.0) + " bars. The probability of a significant price move increases the longer the bands remain in this narrow range." ,"")+
WriteIf( relwidth > 40, "The large width of the bands suggest high volatility as compared to " + tname + "'s normal range. Therefore, the probability of volatility decreasing and prices entering (or remaining in) a trading range has increased for the near-term. "+
"The bands have been in this wide range for " + WriteVal(BarsSince(Cross(relwidth,40)),1.0) + " bars.The probability of prices consolidating into a less volatile trading range increases the longer the bands remain in this wide range." ,""));
printf("\n\nThis commentary is not a recommendation to buy or sell. Use at your own risk.");
}
_SECTION_END();
_SECTION_BEGIN("EMA");
P = ParamField("Price field",-1);
Periods = Param("Periods", 15, 2, 300, 1, 10 );
Plot( EMA( P, Periods ), _DEFAULT_NAME(), ParamColor( "Color", colorCycle ), ParamStyle("Style") );
_SECTION_END();
_SECTION_BEGIN("EMA1");
P = ParamField("Price field",-1);
Periods = Param("Periods", 15, 2, 300, 1, 10 );
Plot( EMA( P, Periods ), _DEFAULT_NAME(), ParamColor( "Color", colorCycle ), ParamStyle("Style") );
_SECTION_END();
_SECTION_BEGIN("Pivot Finder for Amibroker");
// /* **********************************
//
// Code to automatically identify pivots
//
// ********************************** */
//
// // -- what will be our lookback range for the hh and ll?
//
// farback=Param("How Far back to go",100,50,5000,10);
//
// nBars = Param("Number of bars", 12, 5, 40);
//
// // -- Title.
//
// Title = Name() + " (" + StrLeft(FullName(), 15) + ") O: " + Open + ",
//
// H: " + High + ", L: " + Low + ", C: " + Close;
//
// // -- Plot basic candle chart
//
// PlotOHLC(Open, High, Low, Close,
//
// "BIdx = " + BarIndex() +
//
// "\n" + "O = " + O + "\n"+"H = "+ H + "\n"+"L = " + L
//
// + "\n"+"C ",
//
// colorYellow, styleCandle);
//
// GraphXSpace=7;
//
// // -- Create 0-initialized arrays the size of barcount
//
// aHPivs = H - H;
//
// aLPivs = L - L;
//
// // -- More for future use, not necessary for basic plotting
//
// aHPivHighs = H - H;
//
// aLPivLows = L - L;
//
// aHPivIdxs = H - H;
//
// aLPivIdxs = L - L;
//
// nHPivs = 0;
//
// nLPivs = 0;
//
// lastHPIdx = 0;
//
// lastLPIdx = 0;
//
// lastHPH = 0;
//
// lastLPL = 0;
//
// curPivBarIdx = 0;
//
// // -- looking back from the current bar, how many bars
//
// // back were the hhv and llv values of the previous
//
// // n bars, etc.?
//
// aHHVBars = HHVBars(H, nBars);
//
// aLLVBars = LLVBars(L, nBars);
//
// aHHV = HHV(H, nBars);
//
// aLLV = LLV(L, nBars);
//
// // -- Would like to set this up so pivots are calculated back from
//
// // last visible bar to make it easy to "go back" and see the pivots
//
// // this code would find. However, the first instance of
//
// // _Trace output will show a value of 0
//
// aVisBars = Status("barvisible");
//
// nLastVisBar = LastValue(Highest(IIf(aVisBars, BarIndex(), 0)));
//
// _TRACE("Last visible bar: " + nLastVisBar);
//
// // -- Initialize value of curTrend
//
// curBar = (BarCount-1);
//
// curTrend = "";
//
// if (aLLVBars[curBar] <
//
// aHHVBars[curBar]) {
//
// curTrend = "D";
//
// }
//
// else {
//
// curTrend = "U";
//
// }
//
// // -- Loop through bars. Search for
//
// // entirely array-based approach
//
// // in future version
//
// for (i=0; i<farback; i++) {
//
// curBar = (BarCount - 1) - i;
//
// // -- Have we identified a pivot? If trend is down...
//
// if (aLLVBars[curBar] < aHHVBars[curBar]) {
//
// // ... and had been up, this is a trend change
//
// if (curTrend == "U") {
//
// curTrend = "D";
//
// // -- Capture pivot information
//
// curPivBarIdx = curBar - aLLVBars[curBar];
//
// aLPivs[curPivBarIdx] = 1;
//
// aLPivLows[nLPivs] = L[curPivBarIdx];
//
// aLPivIdxs[nLPivs] = curPivBarIdx;
//
// nLPivs++;
//
// }
//
// // -- or current trend is up
//
// } else {
//
// if (curTrend == "D") {
//
// curTrend = "U";
//
// curPivBarIdx = curBar - aHHVBars[curBar];
//
// aHPivs[curPivBarIdx] = 1;
//
// aHPivHighs[nHPivs] = H[curPivBarIdx];
//
// aHPivIdxs[nHPivs] = curPivBarIdx;
//
// nHPivs++;
//
// }
//
// // -- If curTrend is up...else...
//
// }
//
// // -- loop through bars
//
// }
//
// // -- Basic attempt to add a pivot this logic may have missed
//
// // -- OK, now I want to look at last two pivots. If the most
//
// // recent low pivot is after the last high, I could
//
// // still have a high pivot that I didn't catch
//
// // -- Start at last bar
//
// curBar = (BarCount-1);
//
// candIdx = 0;
//
// candPrc = 0;
//
// lastLPIdx = aLPivIdxs[0];
//
// lastLPL = aLPivLows[0];
//
// lastHPIdx = aHPivIdxs[0];
//
// lastHPH = aHPivHighs[0];
//
// if (lastLPIdx > lastHPIdx) {
//
// // -- Bar and price info for candidate pivot
//
// candIdx = curBar - aHHVBars[curBar];
//
// candPrc = aHHV[curBar];
//
// if (
//
// lastHPH < candPrc AND
//
// candIdx > lastLPIdx AND
//
// candIdx < curBar) {
//
// // -- OK, we'll add this as a pivot...
//
// aHPivs[candIdx] = 1;
//
// // ...and then rearrange elements in the
//
// // pivot information arrays
//
// for (j=0; j<nHPivs; j++) {
//
// aHPivHighs[nHPivs-j] = aHPivHighs[nHPivs-
//
// (j+1)];
//
// aHPivIdxs[nHPivs-j] = aHPivIdxs[nHPivs-(j+1)];
//
// }
//
// aHPivHighs[0] = candPrc ;
//
// aHPivIdxs[0] = candIdx;
//
// nHPivs++;
//
// }
//
// } else {
//
// // -- Bar and price info for candidate pivot
//
// candIdx = curBar - aLLVBars[curBar];
//
// candPrc = aLLV[curBar];
//
// if (
//
// lastLPL > candPrc AND
//
// candIdx > lastHPIdx AND
//
// candIdx < curBar) {
//
// // -- OK, we'll add this as a pivot...
//
// aLPivs[candIdx] = 1;
//
// // ...and then rearrange elements in the
//
// // pivot information arrays
//
// for (j=0; j<nLPivs; j++) {
//
// aLPivLows[nLPivs-j] = aLPivLows[nLPivs-(j+1)];
//
// aLPivIdxs[nLPivs-j] = aLPivIdxs[nLPivs-(j+1)];
//
// }
//
// aLPivLows[0] = candPrc;
//
// aLPivIdxs[0] = candIdx;
//
// nLPivs++;
//
// }
//
// }
//
// // -- Dump inventory of high pivots for debugging
//
// /*
//
// for (k=0; k<nHPivs; k++) {
//
// _TRACE("High pivot no. " + k
//
// + " at barindex: " + aHPivIdxs[k] + ", "
//
// + WriteVal(ValueWhen(BarIndex()==aHPivIdxs[k],
//
// DateTime(), 1), formatDateTime)
//
// + ", " + aHPivHighs[k]);
//
// }
//
// */
//
// // -- OK, let's plot the pivots using arrows
//
// PlotShapes(
//
// IIf(aHPivs==1, shapeDownArrow, shapeNone), colorRed, 0,
//
// High, Offset=-15);
//
// PlotShapes(
//
// IIf(aLPivs==1, shapeUpArrow , shapeNone), colorGreen, 0,
//
// Low, Offset=-15);
//
//------------------------------------------------------------------------------
/* **********************************
Code to automatically identify pivots
********************************** */
// -- what will be our lookback range for the hh and ll?
farback=Param("How Far back to go",100,50,5000,10);
nBars = Param("Number of bars", 12, 5, 40);
// -- Title.
Title = Name() + " (" + StrLeft(FullName(), 15) + ") O: " + Open + ",
H: " + High + ", L: " + Low + ", C: " + Close;
// -- Plot basic candle chart
PlotOHLC(Open, High, Low, Close,
"BIdx = " + BarIndex() +
"\n" + "O = " + O + "\n"+"H = "+ H + "\n"+"L = " + L
+ "\n"+"C ",
colorBlack, styleCandle);
GraphXSpace=7;
// -- Create 0-initialized arrays the size of barcount
aHPivs = H - H;
aLPivs = L - L;
// -- More for future use, not necessary for basic plotting
aHPivHighs = H - H;
aLPivLows = L - L;
aHPivIdxs = H - H;
aLPivIdxs = L - L;
nHPivs = 0;
nLPivs = 0;
lastHPIdx = 0;
lastLPIdx = 0;
lastHPH = 0;
lastLPL = 0;
curPivBarIdx = 0;
// -- looking back from the current bar, how many bars
// back were the hhv and llv values of the previous
// n bars, etc.?
aHHVBars = HHVBars(H, nBars);
aLLVBars = LLVBars(L, nBars);
aHHV = HHV(H, nBars);
aLLV = LLV(L, nBars);
// -- Would like to set this up so pivots are calculated back from
// last visible bar to make it easy to "go back" and see the pivots
// this code would find. However, the first instance of
// _Trace output will show a value of 0
aVisBars = Status("barvisible");
nLastVisBar = LastValue(Highest(IIf(aVisBars, BarIndex(), 0)));
_TRACE("Last visible bar: " + nLastVisBar);
// -- Initialize value of curTrend
curBar = (BarCount-1);
curTrend = "";
if (aLLVBars[curBar] <
aHHVBars[curBar]) {
curTrend = "D";
}
else {
curTrend = "U";
}
// -- Loop through bars. Search for
// entirely array-based approach
// in future version
for (i=0; i<farback; i++) {
curBar = (BarCount - 1) - i;
// -- Have we identified a pivot? If trend is down...
if (aLLVBars[curBar] < aHHVBars[curBar]) {
// ... and had been up, this is a trend change
if (curTrend == "U") {
curTrend = "D";
// -- Capture pivot information
curPivBarIdx = curBar - aLLVBars[curBar];
aLPivs[curPivBarIdx] = 1;
aLPivLows[nLPivs] = L[curPivBarIdx];
aLPivIdxs[nLPivs] = curPivBarIdx;
nLPivs++;
}
// -- or current trend is up
} else {
if (curTrend == "D") {
curTrend = "U";
curPivBarIdx = curBar - aHHVBars[curBar];
aHPivs[curPivBarIdx] = 1;
aHPivHighs[nHPivs] = H[curPivBarIdx];
aHPivIdxs[nHPivs] = curPivBarIdx;
nHPivs++;
}
// -- If curTrend is up...else...
}
// -- loop through bars
}
// -- Basic attempt to add a pivot this logic may have missed
// -- OK, now I want to look at last two pivots. If the most
// recent low pivot is after the last high, I could
// still have a high pivot that I didn't catch
// -- Start at last bar
curBar = (BarCount-1);
candIdx = 0;
candPrc = 0;
lastLPIdx = aLPivIdxs[0];
lastLPL = aLPivLows[0];
lastHPIdx = aHPivIdxs[0];
lastHPH = aHPivHighs[0];
if (lastLPIdx > lastHPIdx) {
// -- Bar and price info for candidate pivot
candIdx = curBar - aHHVBars[curBar];
candPrc = aHHV[curBar];
if (
lastHPH < candPrc AND
candIdx > lastLPIdx AND
candIdx < curBar) {
// -- OK, we'll add this as a pivot...
aHPivs[candIdx] = 1;
// ...and then rearrange elements in the
// pivot information arrays
for (j=0; j<nHPivs; j++) {
aHPivHighs[nHPivs-j] = aHPivHighs[nHPivs-
(j+1)];
aHPivIdxs[nHPivs-j] = aHPivIdxs[nHPivs-(j+1)];
}
aHPivHighs[0] = candPrc ;
aHPivIdxs[0] = candIdx;
nHPivs++;
}
} else {
// -- Bar and price info for candidate pivot
candIdx = curBar - aLLVBars[curBar];
candPrc = aLLV[curBar];
if (
lastLPL > candPrc AND
candIdx > lastHPIdx AND
candIdx < curBar) {
// -- OK, we'll add this as a pivot...
aLPivs[candIdx] = 1;
// ...and then rearrange elements in the
// pivot information arrays
for (j=0; j<nLPivs; j++) {
aLPivLows[nLPivs-j] = aLPivLows[nLPivs-(j+1)];
aLPivIdxs[nLPivs-j] = aLPivIdxs[nLPivs-(j+1)];
}
aLPivLows[0] = candPrc;
aLPivIdxs[0] = candIdx;
nLPivs++;
}
}
// -- Dump inventory of high pivots for debugging
/*
for (k=0; k<nHPivs; k++) {
_TRACE("High pivot no. " + k
+ " at barindex: " + aHPivIdxs[k] + ", "
+ WriteVal(ValueWhen(BarIndex()==aHPivIdxs[k],
DateTime(), 1), formatDateTime)
+ ", " + aHPivHighs[k]);
}
*/
// -- OK, let's plot the pivots using arrows
PlotShapes(
IIf(aHPivs==1, shapeDownArrow, shapeNone), colorRed, 0,
High, Offset=-15);
PlotShapes(
IIf(aLPivs==1, shapeUpArrow , shapeNone), colorYellow, 0,
Low, Offset=-15);
_SECTION_END();
_SECTION_BEGIN("ZIG - Zig");
P = ParamField( "Price field" );
change = Param("% change",5,0.1,25,0.1);
Plot( Zig(P, change), _DEFAULT_NAME(), ParamColor( "Color", colorCycle ), ParamStyle("Style") );
_SECTION_END();