Depende de cómo se activa su alerta, pero un par de formas comunes de enfrentar este problema son: 1. Verificar el cambio de estado. Utilice una variable estática para recordar si la ejecución anterior a través de OnCalculate ()OnTimer () dio como resultado una alerta. Si lo hizo, no vuelvas a alertar. Si no lo hizo, y esta vez ha resultado en una alerta, entonces reproduzca el sonido. Código insertado bool estático OldState = false; bool NewState = (Cerrar # 91; 1 # 93; gt; Cerrar # 91; 2 # 93;/cambie por su lógica si (! OldState NewState) {PlaySound (Alert.wav); } OldState = NewState; 2. Agregue un retraso de tiempo entre alertas Recuerde cuándo se activó por última vez la alerta, agregue un retraso de tiempo a esto (en segundos) y luego verifique que TimeCurrent () sea mayor que este tiempo antes de volver a reproducir la alerta. Código insertado static datetime LastAlert = 0; if (Cerrar # 91; 1 # 93; gt; Cerrar # 91; 2 # 93; TimeCurrent () gt; LastAlert 300)/Cambiar su lógica {PlaySound (Alert.wav); LastAlert = TimeCurrent (); } O bien, puede usar una combinación de ambos (cuando el precio baila alrededor del umbral de su alerta). O bien, simplemente verifique una vez por barra. Espero que ayude