// Downloaded From https://www.WiseStockTrader.com
_SECTION_BEGIN("Accumulative Swing Index (ASI)");

// Define parameters
asiPeriod = Param("ASI Period", 14, 1, 100, 1);
maPeriod = Param("MA Period", 50, 1, 200, 1);
rsiPeriod = Param("RSI Period", 14, 1, 50, 1);
rsiOverbought = Param("RSI Overbought Level", 70, 50, 100, 1);
rsiOversold = Param("RSI Oversold Level", 30, 0, 50, 1);
volumeThreshold = Param("Volume Threshold", 100000, 1, 10000000, 10000);

// Calculate Swing Index
prevClose = Ref(Close, -1);
K = Max(H - prevClose, L - prevClose);
SwingIndex = IIf(H == L, 0, 
                IIf(Close > prevClose, (50 * (Close - prevClose + 0.5 * (Close - Open) + prevClose - Open) / K), 
                    (50 * (Close - prevClose + 0.5 * (Close - Open) + prevClose - Open) / K)));

// Calculate ASI
asi = Cum(SwingIndex);

// Calculate Moving Average (filter)
maValue = MA(Close, maPeriod);

// Calculate RSI (additional filter)
rsiValue = RSI(rsiPeriod);

// Buy and Sell Signals based on ASI and additional filters
buySignal = Cross(asi, MA(asi, asiPeriod)) AND Close > maValue AND Volume > volumeThreshold AND rsiValue < rsiOversold;
sellSignal = Cross(MA(asi, asiPeriod), asi) AND Close < maValue AND Volume > volumeThreshold AND rsiValue > rsiOverbought;

// Plot the price chart
Plot(Close, "Price", colorBlack, styleCandle);

// Plot ASI
Plot(asi, "Accumulative Swing Index (ASI)", colorBlue, styleLine);

// Plot Moving Average
Plot(maValue, "MA(" + maPeriod + ")", colorRed);

// Plot Buy and Sell signals on the price chart
Buy = buySignal;
Sell = sellSignal;

// Plot Buy and Sell arrows on the chart
PlotShapes(IIf(Buy, shapeUpArrow, shapeNone), colorGreen, 0, Low, Offset=-30);
PlotShapes(IIf(Sell, shapeDownArrow, shapeNone), colorRed, 0, High, Offset=30);

// Add additional indicators for better visualization
Plot(rsiValue, "RSI(" + rsiPeriod + ")", colorLightOrange, styleLine);
Plot(Volume, "Volume", colorBlue, styleHistogram | styleOwnScale);

// Plot buy and sell signals on the indicator chart for reference
PlotShapes(IIf(Buy, shapeStar, shapeNone), colorGreen, 0, Low, Offset=-10);
PlotShapes(IIf(Sell, shapeStar, shapeNone), colorRed, 0, High, Offset=10);

// Generate buy and sell signals
Buy = ExRem(Buy, Sell);
Sell = ExRem(Sell, Buy);

_SECTION_END();