Announcement

Collapse
No announcement yet.

Partner 728x90

Collapse

add an audible alert to the indicator (PIDOsc1)

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    add an audible alert to the indicator (PIDOsc1)

    Good day, I am alert trying to add a sound alert to the indicator (PIDOsc1) The Pivot Detector Oscillator, Simplified, ported to nt8 by NinjaTrader_Paul
    I would like the alert to sound just when the indicator draws the bullish or bearish arrow,
    I would be very grateful if you can help me please

    #2
    Hello Miguelcuello16,

    Thank you for your post.

    You would need to modify the code here and you could use PlaySound() to play the sound of your choosing:

    Code:
    if (CrossAbove(Oscillator, 0, 1))
    {
    // Draws an up arrow as a buy signal five ticks below the low of the current bar
    Draw.ArrowUp(this, "Oversold" + CurrentBar, false, 0, Low[0] - 5 * TickSize, Brushes.CornflowerBlue);
    // Plays the default Alert1 sound that comes packaged with NinjaTrader
    PlaySound(NinjaTrader.Core.Globals.InstallDir + @" \sounds\Alert1.wav");
    }
    
    // This CrossBelow checks for an overbought condition.
    else if (CrossBelow(Oscillator, 100, 1))
    {
    // Draws a down arrow as a sell signal five ticks above the high of the current bar
    Draw.ArrowDown(this, "Overbought" + CurrentBar, false, 0, High[0] + 5 * TickSize, Brushes.Orange);
    // Plays the default Alert1 sound that comes packaged with NinjaTrader
    PlaySound(NinjaTrader.Core.Globals.InstallDir + @" \sounds\Alert1.wav");
    }


    Please let us know if we may be of further assistance to you.

    Comment


      #3
      Thanks for your help, and prompt response.

      I managed to compile the code but it still does not emit the sound alert when the arrows appear, I enclose the code, maybe it has something wrong

      Code:
      #region Using declarations
      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.ComponentModel.DataAnnotations;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      using System.Windows;
      using System.Windows.Input;
      using System.Windows.Media;
      using System.Xml.Serialization;
      using NinjaTrader.Cbi;
      using NinjaTrader.Gui;
      using NinjaTrader.Gui.Chart;
      using NinjaTrader.Gui.SuperDom;
      using NinjaTrader.Gui.Tools;
      using NinjaTrader.Data;
      using NinjaTrader.NinjaScript;
      using NinjaTrader.Core.FloatingPoint;
      using NinjaTrader.NinjaScript.DrawingTools;
      #endregion
      
      //This namespace holds Indicators in this folder and is required. Do not change it.
      namespace NinjaTrader.NinjaScript.Indicators
      {
      public class PID_ALERT : Indicator
      {
      private double myValue;
      private RSI myRSI;
      private SMA mySMA;
      
      protected override void OnStateChange()
      {
      if (State == State.SetDefaults)
      {
      Description = @"Pivot Detector Oscillator - A re-scaled version of RSI. Featured in Trader's Tips Sept 2009.";
      Name = "PID_ALERT";
      Calculate = Calculate.OnBarClose;
      IsOverlay = false;
      DisplayInDataBox = true;
      DrawOnPricePanel = true;
      DrawHorizontalGridLines = true;
      DrawVerticalGridLines = true;
      PaintPriceMarkers = true;
      ScaleJustification = NinjaTrader.Gui.Chart.ScaleJustification.Right;
      //Disable this property if your indicator requires custom values that cumulate with each new market data event.
      //See Help Guide for additional information.
      IsSuspendedWhileInactive = true;
      Period = 14;
      Smooth = 1;
      AddPlot(Brushes.RoyalBlue, "Oscillator");
      AddLine(new Stroke (Brushes.ForestGreen, DashStyleHelper.Dash, 2, 100), 0, "Zero");
      AddLine(new Stroke(Brushes.Red, DashStyleHelper.Dash, 2, 100), 100, "HundreLine");
      }
      else if (State == State.Configure)
      {
      myRSI = RSI(Period, Smooth);
      mySMA = SMA(200);
      }
      }
      
      protected override void OnBarUpdate()
      {
      //We need to make sure we have enough data
      if (CurrentBar < Period)
      return;
      
      /* If the close is above a 200 period Simple Moving Average (SMA), we are "bullish" according to the article.
      The scaling part of this indicator is decided by the relation of the close to the 200 period simple moving average.
      When the close drops below the 200 SMA, we are now "bearish". */
      if (Close[0] > mySMA[0])
      {
      myValue = (myRSI[0] - 35) / (85 - 35) * 100;
      }
      // The close is below the 200 SMA
      else
      {
      myValue = (myRSI[0] - 20) / (70 - 20) * 100;
      }
      
      // Plot the new, rescaled value
      Oscillator[0] = myValue;
      
      /* The two signals generated by this indicator come when the PIDosc crosses 0 from below or 100 from above.
      This CrossAbove checks for an oversold condition. */
      if (CrossAbove(Oscillator, 0, 1))
      {
      // Draws an up arrow as a buy signal five ticks below the low of the current bar
      Draw.ArrowUp(this, "Oversold" + CurrentBar, false, 0, Low[0] - 5 * TickSize, Brushes.CornflowerBlue);
      // Plays the default Alert1 sound that comes packaged with NinjaTrader
      PlaySound(NinjaTrader.Core.Globals.InstallDir + @" \sounds\Alert1.wav");
      }
      
      // This CrossBelow checks for an overbought condition.
      else if (CrossBelow(Oscillator, 100, 1))
      {
      // Draws a down arrow as a sell signal five ticks above the high of the current bar
      Draw.ArrowDown(this, "Overbought" + CurrentBar, false, 0, High[0] + 5 * TickSize, Brushes.Orange);
      // Plays the default Alert1 sound that comes packaged with NinjaTrader
      PlaySound(NinjaTrader.Core.Globals.InstallDir + @" \sounds\Alert1.wav");
      }
      }
      
      #region Properties
      [NinjaScriptProperty]
      [Range(1, int.MaxValue)]
      [Display(Name="Period", Order=1, GroupName="Parameters")]
      public int Period
      { get; set; }
      
      [NinjaScriptProperty]
      [Range(1, int.MaxValue)]
      [Display(Name="Smooth", Order=2, GroupName="Parameters")]
      public int Smooth
      { get; set; }
      
      [Browsable(false)]
      [XmlIgnore]
      public Series<double> Oscillator
      {
      get { return Values[0]; }
      }
      
      
      #endregion
      
      }
      }
      
      #region NinjaScript generated code. Neither change nor remove.
      
      namespace NinjaTrader.NinjaScript.Indicators
      {
      public partial class Indicator : NinjaTrader.Gui.NinjaScript.IndicatorRenderBase
      {
      private PID_ALERT[] cachePID_ALERT;
      public PID_ALERT PID_ALERT(int period, int smooth)
      {
      return PID_ALERT(Input, period, smooth);
      }
      
      public PID_ALERT PID_ALERT(ISeries<double> input, int period, int smooth)
      {
      if (cachePID_ALERT != null)
      for (int idx = 0; idx < cachePID_ALERT.Length; idx++)
      if (cachePID_ALERT[idx] != null && cachePID_ALERT[idx].Period == period && cachePID_ALERT[idx].Smooth == smooth && cachePID_ALERT[idx].EqualsInput(input))
      return cachePID_ALERT[idx];
      return CacheIndicator<PID_ALERT>(new PID_ALERT(){ Period = period, Smooth = smooth }, input, ref cachePID_ALERT);
      }
      }
      }
      
      namespace NinjaTrader.NinjaScript.MarketAnalyzerColumns
      {
      public partial class MarketAnalyzerColumn : MarketAnalyzerColumnBase
      {
      public Indicators.PID_ALERT PID_ALERT(int period, int smooth)
      {
      return indicator.PID_ALERT(Input, period, smooth);
      }
      
      public Indicators.PID_ALERT PID_ALERT(ISeries<double> input , int period, int smooth)
      {
      return indicator.PID_ALERT(input, period, smooth);
      }
      }
      }
      
      namespace NinjaTrader.NinjaScript.Strategies
      {
      public partial class Strategy : NinjaTrader.Gui.NinjaScript.StrategyRenderBase
      {
      public Indicators.PID_ALERT PID_ALERT(int period, int smooth)
      {
      return indicator.PID_ALERT(Input, period, smooth);
      }
      
      public Indicators.PID_ALERT PID_ALERT(ISeries<double> input , int period, int smooth)
      {
      return indicator.PID_ALERT(input, period, smooth);
      }
      }
      }
      
      #endregion

      Comment


        #4
        Hello Miguelcuello16,

        Thank you for your reply.

        Looks like there's a minor typo in the alert line. Try the following:

        PlaySound(NinjaTrader.Core.Globals.InstallDir + @"sounds\Alert1.wav");

        Please let us know if we may be of further assistance to you.

        Comment


          #5
          Hello NinjaTrader_Kate
          thank you very much, now it works perfectly

          Comment

          Latest Posts

          Collapse

          Topics Statistics Last Post
          Started by Geovanny Suaza, 02-11-2026, 06:32 PM
          0 responses
          563 views
          0 likes
          Last Post Geovanny Suaza  
          Started by Geovanny Suaza, 02-11-2026, 05:51 PM
          0 responses
          329 views
          1 like
          Last Post Geovanny Suaza  
          Started by Mindset, 02-09-2026, 11:44 AM
          0 responses
          101 views
          0 likes
          Last Post Mindset
          by Mindset
           
          Started by Geovanny Suaza, 02-02-2026, 12:30 PM
          0 responses
          547 views
          1 like
          Last Post Geovanny Suaza  
          Started by RFrosty, 01-28-2026, 06:49 PM
          0 responses
          547 views
          1 like
          Last Post RFrosty
          by RFrosty
           
          Working...
          X