#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime // Colore della freccia di buy
#property indicator_color2 Red // Colore della freccia di sell

// Input parameters
extern int EmaPeriod = 10;
extern int BollingerPeriod = 20;
extern double BollingerDeviations = 2.0;
extern int RsiPeriod = 14;
extern int MacdFastEmaPeriod = 12;
extern int MacdSlowEmaPeriod = 26;
extern int MacdSignalSmoothing = 9;
extern double RsiUpperLevel = 70;
extern double RsiLowerLevel = 30;

// Buffer per i segnali di buy e sell
double BuySignalBuffer[];
double SellSignalBuffer[];

// Identifica il codice simbolo di Wingdings per le frecce
enum arrow_codes {
UP_ARROW = 233, // Freccia verde verso l’alto
DOWN_ARROW = 234 // Freccia rossa verso il basso
};

// Inizializzazione dell’indicatore
int OnInit() {
// Mappare i buffer dei segnali a colori specifici
IndicatorBuffers(2);
SetIndexBuffer(0, BuySignalBuffer);
SetIndexBuffer(1, SellSignalBuffer);
SetIndexArrow(0, UP_ARROW);
SetIndexArrow(1, DOWN_ARROW);

SetIndexStyle(0, DRAW_ARROW, 0, 2, clrLime); // Freccia verde per buy
SetIndexStyle(1, DRAW_ARROW, 0, 2, clrRed); // Freccia rossa per sell

ArraySetAsSeries(BuySignalBuffer, true);
ArraySetAsSeries(SellSignalBuffer, true);

return(INIT_SUCCEEDED);
}

// Funzione chiamata ad ogni tick
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
// Begin calculation from enough bars for the bands and moving averages.
int bars_required = MathMax(BollingerPeriod, EmaPeriod);
int start = prev_calculated > bars_required ? prev_calculated - 1 : bars_required;

for (int i = start; i < rates_total; i++) {
double currentEma = iMA(NULL, 0, EmaPeriod, 0, MODE_EMA, PRICE_CLOSE, i+1);
double previousEma = iMA(NULL, 0, EmaPeriod, 0, MODE_EMA, PRICE_CLOSE, i + 3);
double middleBand = iBands(NULL, 0, BollingerPeriod, BollingerDeviations, 0, PRICE_CLOSE, MODE_MAIN, i);

// Acquiring MACD current and signal values indirectly
double MACD = iMACD(NULL, 0, MacdFastEmaPeriod, MacdSlowEmaPeriod, MacdSignalSmoothing, PRICE_CLOSE, MODE_MAIN, i);
double MACDSignal = iMACD(NULL, 0, MacdFastEmaPeriod, MacdSlowEmaPeriod, MacdSignalSmoothing, PRICE_CLOSE, MODE_SIGNAL, i);

double RsiValue = iRSI(NULL, 0, RsiPeriod, PRICE_CLOSE, i);

// Buy condition
if (currentEma > middleBand && previousEma < middleBand && MACD > MACDSignal && RsiValue > RsiLowerLevel && RsiValue < RsiUpperLevel) {
BuySignalBuffer[i] = low[i] - 4 * _Point;
} else {
BuySignalBuffer[i] = EMPTY_VALUE;
}

// Sell condition
if (currentEma < middleBand && previousEma > middleBand && MACD < MACDSignal && RsiValue > RsiLowerLevel && RsiValue < RsiUpperLevel) {
SellSignalBuffer[i] = high[i] + 4 * _Point;
} else {
SellSignalBuffer[i] = EMPTY_VALUE;
}
}

return(rates_total);
}

funziona! ma invece di mettere una sola freccia, ne mette anche 3 consecutive. da cosa è dovuto? Una soluzione comune è creare una logica che metta una freccia solo quando il segnale si attiva per la prima volta, piuttosto che su ogni barra dove le condizioni sono vere