Hi Experts
I am a newbie, trying to learn AFL.I am stucked in coding and need your guidance. Please guide me to found error in my approach.
After completting the code when I run it, there is nothing drawn on my chart. Don't know what is lacking?
Below is what I am trying to achive.
I am trying to code a zigzag indicator which should be drawn between highest-high & lowest-low of Pivot-Trend.
Where pivot-trend is the trend of peaks-and-troughs.
The moment pivot-trend flips from upside to downside, then the highest-high between the range of uptrend's lifespan,
should be marked as peak for zigzag.
Similarly, the moment pivot-trend flips downside to upside, then the lowest-low between the range of downtrend's lifespan,
should be marked as trough for the zigzag.
As this zigzag needs pivots, I am using the pivots of Mr. Empottasch's zigzag and using his code as base for my zigzag. My code starts from line 236.
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
_SECTION_BEGIN( "Date-Time etc." );
TimeFrame = in1Minute * Interval() / 60 * 1;
_N( Title = StrFormat( "{{NAME}} - {{DATE}} Open %g, High %g, Low %g, Close %g (%.1f%%) " +
"TimeFrame: " + TimeFrame / 60 + " Minutes or " + TimeFrame / 3600 +
" Hours or " + TimeFrame / ( 3600 * 24 ) + " Days " + "TIME: " + Now( 2 ) +
" {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ) );
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
SetBarsRequired( -2, -2 );
bi = BarIndex();
xCum = Cum( 1 );
_SECTION_END();
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
_SECTION_BEGIN( "Chart Background Colors" );
SetChartBkColor( ParamColor( "Outer Panel Color ", colorGrey40 ) ); // color of outer border
SetChartBkGradientFill( ParamColor( "Inner Panel Color Upper-Half", colorGrey40 ), ParamColor( "Inner Panel Color Lower-Half", colorGrey40 ) ); // color of inner panel
SetChartBkColor( ParamColor( "background", colorGrey40 ) );
_SECTION_END();
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
_SECTION_BEGIN( "Price-Chart's Style" );
Plot_Price_Chart = ParamToggle( "Plot Price-Chart", "Off|On", 1 );
Price_Zorder = Param( "Price-Zorder", -1, -5, 5, 1 );
Price_Line_Width = Param( "Price-Line's Width", 2, 1, 5, 1 );
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Price_Bull_Color = ParamColor( "Price Bull Color", colorWhite );
Price_Bear_Color = ParamColor( "Price Bear Color", colorBlack );
Doji_Color = ParamColor( "Doji Color", colorBlue );
Price_Color = IIf( Close > Open, Price_Bull_Color, IIf( Close < Open, Price_Bear_Color, Doji_Color ) );
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
if (ParamToggle("Plot Price-Chart","Off|On",1))
{
Plot( Close, "Close", Price_Color, styleBar | styleThick, Null, Null, Null, Price_Zorder, Price_Line_Width );
}
_SECTION_END();
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
_SECTION_BEGIN( "Empottasch-ZigZag" );
nbar = Param( "Swing number of Bars", 10, 1, 50, 1 );
priceswitch = ParamToggle( "Use Close or High and Low price", "Use Close|Use High and Low", 1 );
// this toggle is for when in H/L mode the high is above res and the low below sup. There are 2 ways to handle this.
handleBothOutside = ParamToggle( "Long AND Short signal at the SAME bar", "Change Trend|Stay with current Trend", 0 );
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// bi = BarIndex();
fvb = FirstVisibleValue( bi );
lvb = LastVisibleValue( bi );
pk = tr = 0;
ZigZag = line1 = Null;
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// Price-Mode
if( priceswitch )
{
prch = H;
prcl = L;
mode = "High/Low price";
}
else
{
prch = C;
prcl = C;
mode = "Close price";
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
function calculateZigZag()
{
zigup = Flip( tr, pk );
zigupLow = ValueWhen( tr, prcl, 1 );
zigupHigh = ValueWhen( pk, prch, 0 );
zigupLowIndex = ValueWhen( tr, bi, 1 );
zigupHighIndex = ValueWhen( pk, bi, 0 );
slopeup = IIf( zigup, ( zigupHigh - zigupLow ) / ( zigupHighIndex - zigupLowIndex ) , Null );
zigupLine = IIf( zigup, zigupLow + slopeup * BarsSince( tr ), Null );
zigdn = Flip( pk, tr );
zigdnLow = ValueWhen( tr, prcl, 0 );
zigdnHigh = ValueWhen( pk, prch, 1 );
zigdnLowIndex = ValueWhen( tr, bi, 0 );
zigdnHighIndex = ValueWhen( pk, bi, 1 );
slopedn = IIf( zigdn, ( zigdnLow - zigdnHigh ) / ( zigdnLowIndex - zigdnHighIndex ) , Null );
zigdnLine = IIf( zigdn, zigdnHigh + slopedn * BarsSince( pk ), Null );
ZigZag = IIf( zigup, zigupLine, IIf( zigdn, zigdnLine, Null ) );
ZigZag = IIf( bi > Max( LastValue( ValueWhen( tr, bi ) ), LastValue( ValueWhen( pk, bi ) ) ), Null, ZigZag );
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
function calculateLastSegments()
{
lastidxpk = LastValue( ValueWhen( pk, bi ) );
lastidxtr = LastValue( ValueWhen( tr, bi ) );
lastvalpk = LastValue( ValueWhen( pk, prch ) );
lastvaltr = LastValue( ValueWhen( tr, prcl ) );
valpk = LastValue( HighestSince( Ref( tr, -1 ), prch , 1 ) );
idxpk = LastValue( ValueWhen( prch == valpk, bi ) );
valtr = LastValue( LowestSince( Ref( pk, -1 ), prcl, 1 ) );
idxtr = LastValue( ValueWhen( prcl == valtr, bi ) );
if( lastidxpk > lastidxtr )
{
x0 = lastidxpk;
y0 = lastvalpk;
x1 = idxtr;
y1 = valtr;
line1 = linedn = LineArray( x0, y0, x1, y1 );
tr[idxtr] = 1;
valpk = LastValue( HighestSince( Ref( tr, -1 ), prch, 1 ) );
idxpk = LastValue( ValueWhen( prch == valpk, bi ) );
}
if( lastidxpk < lastidxtr )
{
x0 = lastidxtr;
y0 = lastvaltr;
x1 = idxpk;
y1 = valpk;
line1 = lineup = LineArray( x0, y0, x1, y1 );
pk[idxpk] = 1;
valtr = LastValue( LowestSince( Ref( pk, -1 ), prcl, 1 ) );
idxtr = LastValue( ValueWhen( prcl == valtr, bi ) );
}
ZigZag = IIf( !IsEmpty( line1 ), line1, ZigZag );
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// find trend
res = HHV( prch, nbar );
sup = LLV( prcl, nbar );
crossup = prch > Ref( res, -1 );
crossdn = prcl < Ref( sup, -1 );
if( handleBothOutside )
{
// if in H/L mode both crossup and crossdn at the same bar may occur.
// if handleBothOutside is true then it will stay in the current trend
// if handleBothOutside is false it will change the trend.
crossup = IIf( ( crossup AND crossdn ) AND( BarsSince( Ref( crossup, -1 ) ) > BarsSince( Ref( crossdn, -1 ) ) ), 0, crossup );
crossdn = IIf( ( crossup AND crossdn ) AND( BarsSince( Ref( crossdn, -1 ) ) > BarsSince( Ref( crossup, -1 ) ) ), 0, crossdn );
}
crossup = ExRem( crossup, crossdn );
crossdn = ExRem( crossdn, crossup );
trendup = Flip( crossup, crossdn );
trenddn = Flip( crossdn, crossup );
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// find pivots
rtrenddn = Reverse( trenddn );
rtrendup = Reverse( trendup );
l1 = LowestSince( trenddn AND Ref( trendup, -1 ), prcl );
rL = Reverse( prcl );
l2 = LowestSince( rtrenddn AND Ref( rtrendup, -1 ), rL );
rl2 = Reverse( l2 );
h1 = HighestSince( trendup AND Ref( trenddn, -1 ), prch );
rH = Reverse( prch );
h2 = HighestSince( rtrendup AND Ref( rtrenddn, -1 ), rH );
rh2 = Reverse( h2 );
tr = l1 == rl2 AND trenddn;
pk = h1 == rh2 AND trendup;
rpk = Reverse( pk );
rtr = Reverse( tr );
rpk = ExRem( rpk, rtr );
rtr = ExRem( rtr, rpk );
pk = Reverse( rpk );
tr = Reverse( rtr );
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
calculateZigZag();
calculateLastSegments();
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Plot( zigzag, "ZigZag", colorYellow, styleLine | styleNoLabel | styleNoRescale, Null, Null, 0, 1, 1 );
PlotShapes( IIf( tr, shapeSmallCircle, shapeNone ), colorGreen, 0, L, -10 );
PlotShapes( IIf( pk, shapeSmallCircle, shapeNone ), colorRed, 0, H, 10 );
_SECTION_END();
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
_SECTION_BEGIN( "Shivoham-ZigZag" );
mZigZag_DisplaySwitch = ParamToggle( "Display Major-ZigZag", "Off|On", 0 );
mZigZag_Pivot_Shapes_DisplaySwitch = ParamToggle( "Display Major-ZigZag's Pivot-Shapes", "Off|On", 0 );
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// Peak & Trough
xPeak = pk;
xTrough =tr;
PeakHigh = ValueWhen( xPeak, High);
TroughLow = ValueWhen( xTrough, Low);
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// Determine Trend
// Letter 'x' is added before variable 'UpTrend' & 'DownTtrend' until its not decided which trend comes before and which trend comes after.
xDownTrend = Cross( TroughLow, Low );
xUpTrend = Cross( High, TroughLow );
xDownTrend_D = xDownTrend = ExRem( xDownTrend, xUpTrend );
xUpTrend_U = xUpTrend = ExRem( xUpTrend, xDownTrend );
xDownTrend = Flip( xDownTrend_D, xUpTrend_U );
xUpTrend = Flip( xUpTrend_U, xDownTrend_D );
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// Find highest-high after trend turns downside and find lowest-trough after trend turns upside.
UpTrendIndex = ValueWhen( xUpTrend, bi );
DownTrendIndex = ValueWhen( xDownTrend, bi );
UpTrend = IIf( DownTrendIndex > UpTrendIndex, xDownTrend, Null );
DownTrend = IIf( UpTrendIndex > DownTrendIndex, xUpTrend, Null );
UpTrend_Periods = UpTrendIndex -DownTrendIndex;
DownTrend_Periods = DownTrendIndex -UpTrendIndex;
UpTtrend_HighestHigh = HHV( High, UpTrend_Periods );
DownTrend_LowestLow = LLV( Low, DownTrend_Periods );
xPeak = IIf( DownTrend, UpTtrend_HighestHigh, Null );
xTrough = IIf( UpTrend, DownTrend_LowestLow, Null );
xPeakIndex = ValueWhen( xPeak, bi );
xTroughIndex = ValueWhen( xTrough, bi );
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// Setting Zigzag's up-line's top as xPeak and upline's bottom xTrough
UpLegTop = IIf( xPeak AND xPeakIndex > xTroughIndex, xPeak, Null ) ;
UpLegBottom = IIf( xPeak AND xPeakIndex > xTroughIndex, xTrough, Null ) ;
// Setting Zigzag's down-line's bottom as xTrough and down-line's top as xPeak
DownLegTop = IIf( xTrough AND xTroughIndex > xPeakIndex, xTrough, Null ) ;
DownLegBottom = IIf( xTrough AND xTroughIndex > xPeakIndex, xPeak, Null ) ;
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// Up-Leg's X-&-Y coordinates
UpBottom_x = ValueWhen( UpLegBottom, bi );
UpBottom_y = ValueWhen( UpLegBottom, Low );
UpTop_x = ValueWhen( UpLegTop, bi );
UpTop_y = ValueWhen( UpLegTop, High );
// Down-Leg's X-&-Y coordinates
DownBottom_x = ValueWhen( DownLegBottom, bi );
DownBottom_y = ValueWhen( DownLegBottom, Low );
DownTop_x = ValueWhen( DownLegTop, bi );
DownTop_y = ValueWhen( DownLegTop, High );
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// Empottasch's code to draw Lines
MajorZigZag = Null;
for( i = EndValue(bi); i >= BeginValue(bi); i-- )
//for( i = Last_Visible_Value; i > First_Visible_Value; i-- )
{
if( UpLegTop[i] )
{
Line = LineArray( UpBottom_x[i], UpBottom_y[i], UpTop_x[i], UpTop_y[i] );
MajorZigZag = IIf( Line, Line, MajorZigZag );
}
if( DownLegBottom[i] )
{
Line = LineArray( DownTop_x[i], DownTop_y[i], DownBottom_x[i], DownBottom_y[i] );
ZigZag = IIf( Line, Line, MajorZigZag );
}
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
MajorZigZag = IIf( MajorZigZag, MajorZigZag, zigzag );
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
if( mZigZag_DisplaySwitch )
{
mZigZag_UpLine_Color = ParamColor( "Major-ZigZag's UpLine-Color", colorBlue );
mZigZag_DownLine_Color = ParamColor( "Major-ZigZag DownLine-Color", colorBlue );
mZigZag_Color = IIf( (MajorZigZag > Ref( MajorZigZag, -1 )), Major_ZigZag_UpLine_Color,
IIf( (MajorZigZag < Ref( MajorZigZag, -1 )), Major_ZigZag_DownLine_Color, Null ) );
Plot( MajorZigZag, "", Major_ZigZag_Color, styleLine | styleNoLabel | styleNoRescale, Null, Null, 0, 0, 8 );
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
if( mZigZag_Pivot_Shapes_DisplaySwitch )
{
PlotShapes( IIf( DownLegTop, shapeCircle, shapeNone ), colorRed, 0, H, 50 );
PlotShapes( IIf( DownLegBottom, shapeCircle, shapeNone ), colorGreen, 0, L, -50 );
}
_SECTION_END();
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
![001|690x330](upload://1nCKBTJAuyPeF3FaNpgX4yLAwxt.png)
![002|690x330](upload://8KgfOjvOhMSdMf2re03rGf6zreo.png)