// Downloaded From https://www.WiseStockTrader.com _SECTION_BEGIN("Gann Swing Charts with text"); Version(5.60); GraphXSpace = 10; // Swing Charts // Main Formula designed by Tomasz Janeczko. Equal width swing and Text formulaby Marcin Gorzynski - Amibroker Support // Alterations by OzTraderGuy _SECTION_BEGIN("Price - Bars or Candles"); _N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) )); PriceStyle = ParamList("Price Style", "Candlesticks|Coloured Bars"); PriceStyle1 = PriceStyle == "Candlesticks"; PriceStyle2 = PriceStyle == "Coloured Bars"; _SECTION_END(); twobarmode = ParamToggle("Two bar mode","No|Yes",0); PlotType = ParamList("Plot type", "MODE1 - Equal swing|MODE2 - Low level GFX|MODE3 - Regular"); PlotType1 = PlotType == "MODE1 - Equal swing"; PlotType2 = PlotType == "MODE2 - Low level GFX"; PlotType3 = PlotType == "MODE3 - Regular"; swingColor = ParamColor("SwingColor", colorLightBlue ); UpTextColor = ParamColor("Swing High Text Color", colorGreen ); DnTextColor = ParamColor("Swing Low Text Color", colorRed ); SwingWidth = Param("Swing Thickness (px)", 2, 1, 20, 1); EMAWidth= Param("EMA Thickness (px)", 2, 1, 20, 1); DisplaySwing = ParamToggle("Display Swing ","No|Yes",1); displayText = ParamToggle("Display text","No|Yes",0); displayEMA = ParamToggle("Display EMA","No|Yes",0); ChartScale = ParamToggle("Chart scale", "Linear|Log",0); if( ChartScale == 0 ) SetChartOptions(1,chartShowArrows|chartShowDates); else SetChartOptions(1,chartShowArrows|chartShowDates|chartLogarithmic); if (PriceStyle1 AND PlotType2 OR PlotType3 ) Plot( C, "Close", colorBlack , styleNoTitle | styleCandle| ParamStyle("Style") ); if( PriceStyle2 AND PlotType2 OR PlotType3 ) Plot( C, "Close", IIf( C>O,colorDarkGreen , colorRed), styleNoTitle | styleBar| ParamStyle("Style") ); _SECTION_END(); _SECTION_BEGIN("Gann Swing"); /* Gann Swing chart v4 */ /* Last modified 24 Feb 2001 */ /* AFL implementation by */ /* (C)2001 Tomasz Janeczko */ /* one and two - bar reversal version */ /* Change this to 1 for two-bar mode */ outsidebar = Outside(); insidebar = H <= Ref( H, -1 ) AND L >= Ref( L, -1 ); upbar = H > Ref( H, -1 ) AND L >= Ref( L, -1 ); downbar = L < Ref( L, -1 ) AND H <= Ref( H, -1 ); upbar2 = upbar OR ( outsidebar AND Ref( downbar, 1 ) ) ; downbar2 = downbar OR ( outsidebar AND Ref( upbar, 1 ) ); Poi = outsidebar AND Ref( insidebar, 1 ); Poo = outsidebar AND Ref( outsidebar, 1 ); Pooi = Poo AND Ref( insidebar, 2 ); Poio = Poi AND Ref( outsidebar, 2 ); Poii = Poi AND Ref( insidebar, 2 ); Pooo = Poo AND Ref( outsidebar, 2 ); Poooi = Pooo AND Ref( insidebar, 3 ); Pooio = Pooi AND Ref( outsidebar, 3 ); Poioo = Poio AND Ref( outsidebar, 3 ); upbar3 = upbar2 OR ( Poi AND Ref( downbar, 2 ) ); downbar3 = downbar2 OR ( Poi AND Ref( upbar, 2 ) ); upbar4 = upbar3 OR ( Poo AND Ref( upbar, 2 ) ); downbar4 = downbar3 OR ( Poo AND Ref( downbar, 2 ) ); upbar5 = upbar4 OR ( Pooi AND Ref( upbar, 3 ) ); downbar5 = downbar4 OR ( Pooi AND Ref( downbar, 3 ) ); upbar6 = upbar5 OR ( Poio AND Ref( upbar, 3 ) ); downbar6 = downbar5 OR ( Poio AND Ref( downbar, 3 ) ); upbar7 = upbar6 OR ( Poii AND Ref( downbar, 3 ) ); downbar7 = downbar6 OR ( Poii AND Ref( upbar, 3 ) ); upbar8 = upbar7 OR ( Pooo AND Ref( downbar, 3 ) ); downbar8 = downbar7 OR ( Pooo AND Ref( upbar, 3 ) ); upbar9 = upbar8 OR ( Poooi AND Ref( downbar, 4 ) ); downbar9 = downbar8 OR (Poooi AND Ref( upbar, 4 ) ); upbar10 = upbar9 OR ( Pooio AND Ref( downbar, 4 ) ); downbar10 = downbar9 OR ( Pooio AND Ref( upbar, 4 ) ); upbar11 = upbar10 OR ( Poioo AND Ref( downbar, 4 ) ); downbar11 = downbar10 OR ( Poioo AND Ref( upbar, 4 ) ); fupbar = upbar11; fdownbar = downbar11; // Two-bar mode handling fupbar = IIf( twobarmode, fupbar AND Ref( fupbar, 1 ), fupbar ); fdownbar = IIf( twobarmode, fdownbar AND Ref( fdownbar, 1 ), fdownbar ); /* Barcount since most recent up and down swings */ Us = BarsSince( fupbar ); Ds = BarsSince( fdownbar ) ; Sd1 =IIf( Us==0, 1, IIf( Ds==0, -1, 0) ); Sd2 = IIf( Sd1 == 1, IIf( Ref( BarsSince(Sd1==1), -1) > Ref( BarsSince( Sd1 == -1), -1), 1, 0), IIf( Sd1 == -1, IIf( Ref( BarsSince(Sd1==1),-1) < Ref( BarsSince( Sd1 == -1),-1), -1, 0), 0 ) ); g0 = ValueWhen( Sd2, Sd2 ); /* sample and hold non-zero values */ /* shift back one bar, add one dummy swing at the end and shift forward */ /* to ensure proper handling of the last swing */ bi = BarIndex(); lastbar = bi == LastValue( bi ); swinglevel = IIf( g0 == -1, HighestSince( Sd2 == 1, H ), LowestSince( Sd2 == -1, L ) ); swinglevel = IIf( lastbar, IIf( g0 == -1, LowestSince( Sd2 == -1, L ), HighestSince( Sd2 == 1, H )), Ref( swinglevel, 1 ) ); /* Gann Swing chart drawn here */ myGraph1 = Ref( ValueWhen( Ref( Sd2 != 0, 1 ) OR lastbar, swinglevel , 0 ), -1 ); graphUPStartX = myGraph1 > Ref( MyGraph1, -1); GraphDNStartX = myGraph1 < Ref( MyGraph1, -1); myGraph2up = ValueWhen( GraphDNStartX, Ref(HighestSince(graphUPStartX , High),-1), 0); myGraph2dn = ValueWhen( graphUPStartX OR Lastbar, Ref(LowestSince(GraphDNStartX , Low),-1), 0); LastLeg = bi >= LastValue( ValueWhen(graphUPStartX OR GraphDNStartX, bi ) ); myGraph2up = IIf( LastLeg, mygraph1, mygraph2up); myGraph2dn = IIf( LastLeg, mygraph1, mygraph2dn); myGraph1 = IIf( g0 == -1, myGraph2dn , myGraph2up ); _SECTION_END(); _SECTION_BEGIN( "TEXT TO GANN SWING CHART" ); BarsOffset = Param("Shift Text Sideways", -1, -10, 0, 1); dist = Param("Shift Text Up or Down", 1.2, 0.1, 10, 0.1)*ATR(200); bi = BarIndex(); dt = DateTime(); textUPStartX = myGraph1 > Ref( MyGraph1, -1); textDNStartX = myGraph1 < Ref( MyGraph1, -1); UPsw = BarsSince( textUPStartX ) < BarsSince( textDNStartX ) ; textUpStartBI = ValueWhen( textUPStartX , bi ); textUpEndBI = ValueWhen( textDnStartX , bi,0 ); textDnStartBI = ValueWhen( textDnStartX , bi ); textDnEndBI = ValueWhen( textUPStartX , bi,0 ); upBarsCount = ValueWhen( textDnStartX OR Lastbar, ValueWhen( H == myGraph1, BarsSince(L == myGraph1) ),0 ); DnBarsCount = ValueWhen( textUPStartX OR Lastbar, ValueWhen( L == myGraph1, BarsSince(H == myGraph1) ),0 ); DateUp = ValueWhen( textDnStartX OR Lastbar, ValueWhen( H == myGraph1, dt ),0 ); DateDn = ValueWhen( textUPStartX OR Lastbar, ValueWhen( L == myGraph1, dt ),0 ); TextUpPosition = bi == floor( (textUpEndBI + textUpStartBI)/2) AND Upsw; TextDnPosition = bi == floor( (textDnEndBI + textDnStartBI)/2) AND NOT Upsw; TextUpPosition = Ref(TextUpPosition , -BarsOffset); TextDnPosition = Ref(TextDnPosition , -BarsOffset); CurrentSwing = ValueWhen( textUPStartX OR textDNStartX, myGraph1); PreviousSwing = ValueWhen( textUPStartX OR textDNStartX, Ref( myGraph1,-1) ); range = abs(CurrentSwing - PreviousSwing); CurrentSwingShifted = Ref( CurrentSwing , -BarsOffset); LevelUP = Ref( myGraph1, -BarsOffset) + dist; LevelDN = Ref( myGraph1, -BarsOffset) - (dist*0.5); // Adjusted Level down range = Ref( range , -BarsOffset); upBarsCount = Ref( upBarsCount , -BarsOffset); DnBarsCount = Ref( DnBarsCount , -BarsOffset); DateUp = Ref( DateUp , -BarsOffset); DateDn = Ref( DateDn , -BarsOffset); if ( ( PlotType2 OR Plottype3 ) AND displaytext ) { for ( i = 0; i < BarCount; i++ ) { if ( TextUpPosition[i] ) { textUp = NumToStr( CurrentSwingShifted [ i ], 1.2, 0 ) + "\n" + DateTimeToStr( DateUp [ i ] ) + "\n" + "R:" + NumToStr( range[ i ], 1.2, 0 ) + "\n" + "Bars:" + NumToStr( upBarsCount [ i ], 1 ) + "\n" ; PlotText( textUp , i, LevelUP[ i ], UpTextColor ); } if ( TextDnPosition [i] ) { textDn = NumToStr( CurrentSwingShifted [ i ], 1.2, 0 ) + "\n" + DateTimeToStr( DateDn [ i ] ) + "\n" + "R: " + NumToStr( range[ i ], 1.2, 0 ) + "\n" + "Bars: " + NumToStr( DnBarsCount [ i ], 1 ) + "\n"; PlotText( textDn , i, LevelDN[ i ], DnTextColor ); } } } if ( DisplaySwing AND PlotType2 ) { Plot( myGraph1, "Swing Chart", swingColor, styleStaircase, Null, Null, 0, 0, SwingWidth ); } if ( DisplaySwing AND PlotType3 ) { Plot( myGraph1, "Swing Chart", swingColor, styleStaircase | styleSwingDots, Null, Null, 0, Zorder = 1 ); } if ( displayEMA AND PlotType2 ) { Plot( EMA( Close, 200 ), "",colorTurquoise, styleLine|styleNoRescale, Null, Null, 0, 0, EMAWidth ); Plot( EMA( Close, 50 ), "",colorLime, styleLine|styleNoRescale, Null, Null, 0, 0, EMAWidth ); Plot( EMA( Close, 20 ), "",colorBlue, styleLine|styleNoRescale, Null, Null, 0, 0, EMAWidth ); } if ( displayEMA AND PlotType3 ) { Plot( EMA( Close, 200 ), "",colorTurquoise, styleLine|styleNoRescale ); Plot( EMA( Close, 50 ), "",colorLime, styleLine|styleNoRescale); Plot( EMA( Close, 20 ), "",colorBlue, styleLine|styleNoRescale ); } //equal width swings bars = Param( "MODE 1 - Equal bars swing width", 5, 3, 10, 1 ); Count = 2; myVal = LastValue( myGraph1 ); myNewChart = Null; myNewChart[ BarCount-1 ] = myVal; positionUp = IIf( LastValue( BarsSince( textUpStartX ) < BarsSince( textDnStartX ) ), 1, -1 );//-1 if ( PlotType1 ) { j = BarCount - 1; for ( i = BarCount - 1; i > 0; i-- ) { if ( Count == ceil( bars / 2 ) - BarsOffset ) { bar = Max( 0, Min( j + BarsOffset, BarCount - 1 ) ); bbarsCount = IIf( positionUp == 1, upBarsCount [ bar ], dnBarsCount [ bar ] ); bdate = IIf( positionUp == 1, DateUp[ bar ], DateDn[ bar ] ); dist2 = IIf( positionup == 1, dist, dist * 0.4 ); // Made up dist2 to raise the lower swing text textUp = NumToStr( CurrentSwingShifted [ bar ], 1.2, 0 ) + "\n" + DateTimeToStr( bdate [ bar ] ) + "\n" + "R:" + NumToStr( range[ bar ], 1.2, 0 ) + "\n" + "Bars:" + NumToStr( bbarsCount , 1 ) + "\n" ; PlotText( textUp , i, myVal + positionUp * dist2[ j ], IIf(positionUp == 1, UpTextColor, DnTextColor) ); } if ( Count < bars ) { myNewChart[ i ] = myVal; Count++; } else { while ( mygraph1[ j ] == myVal AND j > 0 ) { j--; } myNewChart[ i ] = myVal; myVal = myGraph1[ j ]; Count = 1; positionUp *= -1; } } Plot( myNewChart, "Swing Chart", ParamColor( "Equal Swing Color", colorBlack ), styleSwingDots | styleStaircase, Null, Null, 0, 0, EMAWidth ); } _SECTION_END();