Awesome_Oscillator_Divergence

Author: Copyright � 2013, Mehrdad Shiri

The code snippet you've provided is a portion of an Expert Advisor (EA) for MetaTrader platforms, written in MQL5. This EA seems to be designed for executing buy and sell alerts based on specific trading conditions. Here's a breakdown of the key components:

Key Components

  1. Buy and Sell Conditions:

    • The EA checks certain conditions to trigger either a BUY_ALARM or SELL_ALARM. These functions execute various actions like playing sounds, sending alerts, emails, and notifications.
  2. Signals for Trading Actions:

    • Functions BUY_ALARM() and SELL_ALARM() are responsible for executing the buy/sell alerts.
    • They include options to play sound (On_Play_Sound), send an alert (On_Alert), send an email (On_Email), or push notifications (On_Push) when the conditions are met.
  3. Divergence Detection:

    • The functions IsIndicatorPeak() and IsIndicatorTrough() determine if a certain point in the indicator is a peak or trough, which might be part of the logic for deciding buy/sell signals.
    • There's also trend line drawing functionality (DrawIndicatorTrendLine and DrawPriceTrendLine) that could visualize these peaks/troughs on charts.
  4. Alerting and Notifications:

    • The EA sends detailed information in alerts, emails, or notifications, including symbol details, period, ask/bid prices, and current time.

Usage

  • Configuration: Before running the EA, you need to configure settings like On_Play_Sound, On_Alert, etc., according to your preference.
  • Execution: The EA runs on a MetaTrader platform (like MT5) where it monitors market conditions based on its logic and triggers buy/sell signals.

Considerations

  • Testing: Always test the EA in a demo environment before using it with real funds to ensure it behaves as expected.
  • Customization: Depending on your trading strategy, you might need to adjust or extend the logic for peak/trough detection and alert conditions.

This is a simplified explanation, and depending on how complete the code snippet is, there might be additional parts not covered here. Make sure to review the entire EA script for any specific logic or configurations required.

Price Data Components
Indicators Used
Bill Williams Awesome oscillator
Miscellaneous
It plays sound alertsIt issuies visual alerts to the screenIt sends emails
1 Views
0 Downloads
0 Favorites
Awesome_Oscillator_Divergence
//+------------------------------------------------------------------+
//|                                Awesome Oscillator Divergence.mq5 |
//|                                  Copyright © 2013, Mehrdad Shiri |
//|                                      E-mail: m100shiri@yahoo.com |
//+------------------------------------------------------------------+
//---- author of the indicator
#property copyright "Copyright © 2013, Mehrdad Shiri"
//---- link to the website of the author
#property link "m100shiri@yahoo.com"
//---- indicator version number
#property version   "1.00"
#property description "Awesome Oscillator Divergence"

//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 10
#property indicator_plots   5
//------------------------------------------------------------------------------------------ Awesome_Oscillator
#property indicator_label1  "AO"
#property indicator_type1   DRAW_COLOR_HISTOGRAM  // DRAW_COLOR_LINE   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrDarkGreen,clrDarkRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//
double Ext_AO_Buffer[];
double ExtColor_AO_Buffer[];
int   AO_handle;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#property indicator_label2  "AO_BUY_Divergence_Regular"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
#property indicator_label3  "AO_SELL_Divergence_Regular"
#property indicator_type3   DRAW_ARROW
#property indicator_color3  clrRed
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//
double   AO_BUY_Divergence_Regular_Buffer[],AO_SELL_Divergence_Regular_Buffer[];
uchar    AO_BUY_Divergence_Regular_Code=233;
uchar    AO_SELL_Divergence_Regular_Code=234;
//
int    AO_BUY_Divergence_Regular_Shift=10;
int    AO_SELL_Divergence_Regular_Shift=10;
//+++++++
#property indicator_label4  "AO_BUY_Divergence_Hidden"
#property indicator_type4   DRAW_ARROW
#property indicator_color4  clrAqua
#property indicator_style4  STYLE_SOLID
#property indicator_width4  1
#property indicator_label5  "AO_SELL_Divergence_Hidden"
#property indicator_type5   DRAW_ARROW
#property indicator_color5  clrOrange
#property indicator_style5  STYLE_SOLID
#property indicator_width5  1
//
double   AO_BUY_Divergence_Hidden_Buffer[],AO_SELL_Divergence_Hidden_Buffer[];
uchar    AO_BUY_Divergence_Hidden_Code=241;
uchar    AO_SELL_Divergence_Hidden_Code=242;
//
int    AO_BUY_Divergence_Hidden_Shift=-10;
int    AO_SELL_Divergence_Hidden_Shift=-10;

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//--- bars minimum for calculation
#define DATA_LIMIT 37

double   Zero_Value=0.0;
string short_name;
int TOTAL_BAR;
int count_bar_above=0;
int count_bar_down=0;
int LastTrough_bar=0;
int LastPeak_bar=0;
int ALL_LastPeak_bar[200];
int ALL_LastTrough_bar[200];
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+-----------------------------------+
//|  INDICATOR INPUT PARAMETERS       |
//+-----------------------------------+
input double Deviation_percent=0.05;
//+-----------------------------------+
enum WHEN_DRAW_LINE
  {
   yes,
   no
  };
input WHEN_DRAW_LINE Indicator_Trend_Line_Allowed_across_through_the_histogram_body=no;
//+-----------------------------------+
input uint Numberof_Alerts_Maximum_Iterations=2;
uint counterBUY=0;
uint counterSELL=0;
double Ask,Bid;
string text,sAsk,sBid,sPeriod;
datetime SignalTime;
datetime LastSignalTime;
double SIGNAL_ALARM_BUY_Divergence_Regular_Buffer[];
double SIGNAL_ALARM_BUY_Divergence_Hidden_Buffer[];
double SIGNAL_ALARM_SELL_Divergence_Regular_Buffer[];
double SIGNAL_ALARM_SELL_Divergence_Hidden_Buffer[];
//+-----------------------------------+
//----
input bool On_Push = true;                        //allow to send push-messages
input bool On_Email = true;                       //allow to send e-mail messages
input bool On_Alert= true;                        //allow to put alert
input bool On_Play_Sound = true;                  //allow to put sound signal
input string NameFileSound="alert.wav";          //name of the file with sound
input string  CommentSirName="Divergence on Awesome Oscillator: ";  //the first part of the allert comment
//+-----------------------------------+
bool foreground;
//+------------------------------------------------------------------+
void OnInit()
  {
//------------------------------------------------------------------------------------------ Awesome_Oscillator
   SetIndexBuffer(0,Ext_AO_Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtColor_AO_Buffer,INDICATOR_COLOR_INDEX);
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,DATA_LIMIT);
   AO_handle=iAO(NULL,0);
   ArraySetAsSeries(Ext_AO_Buffer,true);
   ArraySetAsSeries(ExtColor_AO_Buffer,true);
//+++++++
   SetIndexBuffer(2,AO_BUY_Divergence_Regular_Buffer,INDICATOR_DATA);
   SetIndexBuffer(3,AO_SELL_Divergence_Regular_Buffer,INDICATOR_DATA);
   ArraySetAsSeries(AO_BUY_Divergence_Regular_Buffer,true);
   ArraySetAsSeries(AO_SELL_Divergence_Regular_Buffer,true);
   PlotIndexSetInteger(1,PLOT_ARROW,AO_BUY_Divergence_Regular_Code);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,Zero_Value);
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,AO_BUY_Divergence_Regular_Shift);
   PlotIndexSetInteger(2,PLOT_ARROW,AO_SELL_Divergence_Regular_Code);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,Zero_Value);
   PlotIndexSetInteger(2,PLOT_ARROW_SHIFT,-AO_SELL_Divergence_Regular_Shift);
//+++
   SetIndexBuffer(4,AO_BUY_Divergence_Hidden_Buffer,INDICATOR_DATA);
   SetIndexBuffer(5,AO_SELL_Divergence_Hidden_Buffer,INDICATOR_DATA);
   ArraySetAsSeries(AO_BUY_Divergence_Hidden_Buffer,true);
   ArraySetAsSeries(AO_SELL_Divergence_Hidden_Buffer,true);
   PlotIndexSetInteger(3,PLOT_ARROW,AO_BUY_Divergence_Hidden_Code);
   PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,Zero_Value);
   PlotIndexSetInteger(3,PLOT_ARROW_SHIFT,AO_BUY_Divergence_Hidden_Shift);
   PlotIndexSetInteger(4,PLOT_ARROW,AO_SELL_Divergence_Hidden_Code);
   PlotIndexSetDouble(4,PLOT_EMPTY_VALUE,Zero_Value);
   PlotIndexSetInteger(4,PLOT_ARROW_SHIFT,-AO_SELL_Divergence_Hidden_Shift);
//+-----------------------------------+
   SetIndexBuffer(6,SIGNAL_ALARM_BUY_Divergence_Regular_Buffer,INDICATOR_DATA);
   ArraySetAsSeries(SIGNAL_ALARM_BUY_Divergence_Regular_Buffer,true);
   SetIndexBuffer(7,SIGNAL_ALARM_BUY_Divergence_Hidden_Buffer,INDICATOR_DATA);
   ArraySetAsSeries(SIGNAL_ALARM_BUY_Divergence_Hidden_Buffer,true);
   SetIndexBuffer(8,SIGNAL_ALARM_SELL_Divergence_Regular_Buffer,INDICATOR_DATA);
   ArraySetAsSeries(SIGNAL_ALARM_SELL_Divergence_Regular_Buffer,true);
   SetIndexBuffer(9,SIGNAL_ALARM_SELL_Divergence_Hidden_Buffer,INDICATOR_DATA);
   ArraySetAsSeries(SIGNAL_ALARM_SELL_Divergence_Hidden_Buffer,true);

   foreground=ChartGetInteger(0,CHART_FOREGROUND);
   ChartSetInteger(0,CHART_FOREGROUND,false);

   short_name="AO_Divergence";
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- initialization done
  }
//+------------------------------------------------------------------+
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     &TickVolume[],
                const long     &Volume[],
                const int      &Spread[])
  {

   ArraySetAsSeries(Time,true);
   ArraySetAsSeries(High,true);
   ArraySetAsSeries(Low,true);
   TOTAL_BAR=rates_total;
//------------------------------------------------------------------------------------------ Awesome_Oscillator
   int copy_AO=CopyBuffer(AO_handle,0,0,rates_total,Ext_AO_Buffer);
   int copy_AO_Color=CopyBuffer(AO_handle,1,0,rates_total,ExtColor_AO_Buffer);
//----------------------------------- 

   for(int j=ObjectsTotal(0)-1;j>=0;j--)
     {
      if(StringFind(ObjectName(0,j),"AO_Indicator_Divergence")!=-1 || 
         StringFind(ObjectName(0,j),"AO_Price_Divergence")!=-1)
         if(!ObjectDelete(0,ObjectName(0,j)))
            Print("Error in deleting object (",GetLastError(),")");
     }

   for(int ad=0; ad<rates_total; ad++)
     {
      AO_BUY_Divergence_Regular_Buffer[ad]=Zero_Value;
      AO_SELL_Divergence_Regular_Buffer[ad]=Zero_Value;
      AO_BUY_Divergence_Hidden_Buffer[ad]=Zero_Value;
      AO_SELL_Divergence_Hidden_Buffer[ad]=Zero_Value;
     }
//----------------------------------------------------------------------//
   MqlDateTime tm;
   TimeToStruct(TimeCurrent(),tm);
   text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
   Ask=Close[0];
   Bid=Close[0]+Spread[0];
   sAsk=DoubleToString(Ask,_Digits);
   sBid=DoubleToString(Bid,_Digits);
   sPeriod=EnumToString(ChartPeriod());
   if(rates_total!=prev_calculated) {counterBUY=0;counterSELL=0;}

   for(int bar=rates_total-10; bar>0; bar--)
     {

      //----
      int draw_TrendLine=1;

      //---- 
      Indicator_count_bar_above(bar);
      if(Indicator_count_bar_above(bar)!=0)
        {
         IsIndicatorPeak(count_bar_above,bar);
         GetIndicatorLastPeak(count_bar_above,bar);
         LastPeak_bar=GetIndicatorLastPeak(count_bar_above,bar);
         GetIndicatorALL_LastPeak_bar(count_bar_above,bar);
        }
      if(IsIndicatorPeak(count_bar_above,bar)==true && GetIndicatorLastPeak(count_bar_above,bar)>=3)
        {
         for(int l=1;l<200;l++)
           {
            if(l>=2 && ALL_LastPeak_bar[l]==0 && ALL_LastPeak_bar[l-1]>=0) break;
            if(High[bar]>=High[ALL_LastPeak_bar[l]] && 
               Ext_AO_Buffer[bar]<Ext_AO_Buffer[ALL_LastPeak_bar[l]])
              {
               //+++  Indicator lines must going across through the indicators/histogram body ?    yes/no
               if(Indicator_Trend_Line_Allowed_across_through_the_histogram_body==no)
                 {
                  int BAR_body_check=Bars(Symbol(),Period(),Time[ALL_LastPeak_bar[l]],Time[bar])-1;
                  double SLOPE=(Ext_AO_Buffer[bar]-Ext_AO_Buffer[ALL_LastPeak_bar[l]])/(BAR_body_check);
                  for(int d=1; d<=BAR_body_check; d++)
                    {
                     double VALUE_body_line=Ext_AO_Buffer[ALL_LastPeak_bar[l]]+SLOPE*d;
                     if(Time[ALL_LastPeak_bar[l]-d]>=Time[bar]) break;
                     if(Ext_AO_Buffer[ALL_LastPeak_bar[l]-d]>(VALUE_body_line*(1.0+Deviation_percent)))
                       {
                        draw_TrendLine=0;
                        break;
                       }
                    }
                 }
               if(draw_TrendLine==1)
                 {
                  DrawIndicatorTrendLine(bar,Time[bar],Time[ALL_LastPeak_bar[l]],
                                         Ext_AO_Buffer[bar],Ext_AO_Buffer[ALL_LastPeak_bar[l]],Red,STYLE_SOLID);
                  DrawPriceTrendLine(bar,Time[bar],Time[ALL_LastPeak_bar[l]],
                                     High[bar],High[ALL_LastPeak_bar[l]],Red,STYLE_SOLID);
                  AO_SELL_Divergence_Regular_Buffer[bar]=Ext_AO_Buffer[bar];

                 }
              }
            //--- 
            if(Low[bar]<=Low[ALL_LastPeak_bar[l]] && 
               Ext_AO_Buffer[bar]>Ext_AO_Buffer[ALL_LastPeak_bar[l]])
              {
               //+++  Indicator lines must going across through the indicators/histogram body ?    yes/no
               if(Indicator_Trend_Line_Allowed_across_through_the_histogram_body==no)
                 {
                  int BAR_body_check=Bars(Symbol(),Period(),Time[ALL_LastPeak_bar[l]],Time[bar])-1;
                  double SLOPE=(Ext_AO_Buffer[bar]-Ext_AO_Buffer[ALL_LastPeak_bar[l]])/(BAR_body_check);
                  for(int d=1; d<=BAR_body_check; d++)
                    {
                     double VALUE_body_line=Ext_AO_Buffer[ALL_LastPeak_bar[l]]+SLOPE*d;
                     if(Time[ALL_LastPeak_bar[l]-d]>=Time[bar]) break;
                     if(Ext_AO_Buffer[ALL_LastPeak_bar[l]-d]>(VALUE_body_line*(1.0+Deviation_percent)))
                       {
                        draw_TrendLine=0;
                        break;
                       }
                    }
                 }
               if(draw_TrendLine==1)
                 {
                  DrawIndicatorTrendLine(bar,Time[bar],Time[ALL_LastPeak_bar[l]],
                                         Ext_AO_Buffer[bar],Ext_AO_Buffer[ALL_LastPeak_bar[l]],Aqua,STYLE_DOT);
                  DrawPriceTrendLine(bar,Time[bar],Time[ALL_LastPeak_bar[l]],
                                     Low[bar],Low[ALL_LastPeak_bar[l]],Aqua,STYLE_DOT);

                  AO_BUY_Divergence_Hidden_Buffer[bar]=Ext_AO_Buffer[bar];

                 }
              }
           }
        }
      //-----------------------------------
      Indicator_count_bar_down(bar);
      if(Indicator_count_bar_down(bar)!=0)
        {
         IsIndicatorTrough(count_bar_down,bar);
         GetIndicatorLastTrough(count_bar_down,bar);
         LastTrough_bar=GetIndicatorLastTrough(count_bar_down,bar);
         GetIndicatorALL_LastTrough_bar(count_bar_down,bar);
        }
      if(IsIndicatorTrough(count_bar_down,bar)==true && GetIndicatorLastTrough(count_bar_down,bar)>=3)
        {
         for(int l=1;l<200;l++)
           {
            if(l>=2 && ALL_LastTrough_bar[l]==0 && ALL_LastTrough_bar[l-1]>=0) break;

            if(Low[bar]<=Low[ALL_LastTrough_bar[l]] && 
               Ext_AO_Buffer[bar]>Ext_AO_Buffer[ALL_LastTrough_bar[l]])
              {
               //+++  Indicator lines must going across through the indicators/histogram body ?    yes/no
               if(Indicator_Trend_Line_Allowed_across_through_the_histogram_body==no)
                 {
                  int BAR_body_check=Bars(Symbol(),Period(),Time[ALL_LastTrough_bar[l]],Time[bar])-1;
                  double SLOPE=(Ext_AO_Buffer[bar]-Ext_AO_Buffer[ALL_LastTrough_bar[l]])/(BAR_body_check);
                  for(int d=1; d<=BAR_body_check; d++)
                    {
                     double VALUE_body_line=Ext_AO_Buffer[ALL_LastTrough_bar[l]]+SLOPE*d;
                     if(Time[ALL_LastTrough_bar[l]-d]>=Time[bar]) break;
                     if(Ext_AO_Buffer[ALL_LastTrough_bar[l]-d]<(VALUE_body_line*(1.0+Deviation_percent)))
                       {
                        draw_TrendLine=0;
                        break;
                       }
                    }
                 }
               if(draw_TrendLine==1)
                 {
                  DrawIndicatorTrendLine(bar,Time[bar],Time[ALL_LastTrough_bar[l]],
                                         Ext_AO_Buffer[bar],Ext_AO_Buffer[ALL_LastTrough_bar[l]],Blue,STYLE_SOLID);
                  DrawPriceTrendLine(bar,Time[bar],Time[ALL_LastTrough_bar[l]],
                                     Low[bar],Low[ALL_LastTrough_bar[l]],Blue,STYLE_SOLID);

                  AO_BUY_Divergence_Regular_Buffer[bar]=Ext_AO_Buffer[bar];

                 }
              }
            //---  
            if(Low[bar]>=Low[ALL_LastTrough_bar[l]] && 
               Ext_AO_Buffer[bar]<Ext_AO_Buffer[ALL_LastTrough_bar[l]])
              {
               //+++  Indicator lines must going across through the indicators/histogram body ?    yes/no
               if(Indicator_Trend_Line_Allowed_across_through_the_histogram_body==no)
                 {
                  int BAR_body_check=Bars(Symbol(),Period(),Time[ALL_LastTrough_bar[l]],Time[bar])-1;
                  double SLOPE=(Ext_AO_Buffer[bar]-Ext_AO_Buffer[ALL_LastTrough_bar[l]])/(BAR_body_check);
                  for(int d=1; d<=BAR_body_check; d++)
                    {
                     double VALUE_body_line=Ext_AO_Buffer[ALL_LastTrough_bar[l]]+SLOPE*d;
                     if(Time[ALL_LastTrough_bar[l]-d]>=Time[bar]) break;
                     if(Ext_AO_Buffer[ALL_LastTrough_bar[l]-d]<(VALUE_body_line*(1.0+Deviation_percent)))
                       {
                        draw_TrendLine=0;
                        break;
                       }
                    }
                 }
               if(draw_TrendLine==1)
                 {
                  DrawIndicatorTrendLine(bar,Time[bar],Time[ALL_LastTrough_bar[l]],
                                         Ext_AO_Buffer[bar],Ext_AO_Buffer[ALL_LastTrough_bar[l]],Orange,STYLE_DOT);
                  DrawPriceTrendLine(bar,Time[bar],Time[ALL_LastTrough_bar[l]],
                                     Low[bar],Low[ALL_LastTrough_bar[l]],Orange,STYLE_DOT);

                  AO_SELL_Divergence_Hidden_Buffer[bar]=Ext_AO_Buffer[bar];

                 }
              }
           }
        }
     }
//----------------------------------------------------------------------------------------------------------//

   for(int i=0; i<rates_total; i++)
     {
      if(AO_BUY_Divergence_Regular_Buffer[i]!=Zero_Value) SIGNAL_ALARM_BUY_Divergence_Regular_Buffer[i]=1;
      else SIGNAL_ALARM_BUY_Divergence_Regular_Buffer[i]=0;
      if(AO_BUY_Divergence_Hidden_Buffer[i]!=Zero_Value) SIGNAL_ALARM_BUY_Divergence_Hidden_Buffer[i]=1;
      else SIGNAL_ALARM_BUY_Divergence_Hidden_Buffer[i]=0;
      if(AO_SELL_Divergence_Regular_Buffer[i]!=Zero_Value) SIGNAL_ALARM_SELL_Divergence_Regular_Buffer[i]=1;
      else SIGNAL_ALARM_SELL_Divergence_Regular_Buffer[i]=0;
      if(AO_SELL_Divergence_Hidden_Buffer[i]!=Zero_Value) SIGNAL_ALARM_SELL_Divergence_Hidden_Buffer[i]=1;
      else SIGNAL_ALARM_SELL_Divergence_Hidden_Buffer[i]=0;
     }

   if(counterBUY<Numberof_Alerts_Maximum_Iterations)
     {
      if(SIGNAL_ALARM_BUY_Divergence_Regular_Buffer[1]==1 || SIGNAL_ALARM_BUY_Divergence_Hidden_Buffer[1]==1)
        {BUY_ALARM();counterBUY++;}
     }

   if(counterSELL<Numberof_Alerts_Maximum_Iterations)
     {
      if(SIGNAL_ALARM_SELL_Divergence_Regular_Buffer[1]==1 || SIGNAL_ALARM_SELL_Divergence_Hidden_Buffer[1]==1)
        {SELL_ALARM();counterSELL++;}
     }

//----------------------------------------------------------------------------------------------------------// 

   Comment(""

           );

//--- done
   return(rates_total);
  }
//----------------------------------------------------------------------------------------------------------//
void OnDeinit(const int reason)
  {
   Comment("");

   for(int j=ObjectsTotal(0)-1;j>=0;j--)
     {
      if(StringFind(ObjectName(0,j),"AO_Indicator_Divergence")!=-1 || 
         StringFind(ObjectName(0,j),"AO_Price_Divergence")!=-1)
         if(!ObjectDelete(0,ObjectName(0,j)))
            Print("Error in deleting object (",GetLastError(),")");
     }
   ChartRedraw();
   ChartSetInteger(0,CHART_FOREGROUND,foreground);
  }
//----------------------------------------------------------------------------------------------------------//
//+------------------------------------------------------------------+
//| Check domain_above Awesome_Oscillator bar                        |
//+------------------------------------------------------------------+
int Indicator_count_bar_above(int bar)
  {
   count_bar_above=0;
   for(int j=bar; j<TOTAL_BAR-10; j++)
     {
      if(Ext_AO_Buffer[j]>=0.0)
        {
         if(Ext_AO_Buffer[j]>=0.0 && Ext_AO_Buffer[j+1]<=0.0)
           {
            count_bar_above=j+1;
            break;
           }
        }
      else break;
     }
   return(count_bar_above);
  }
//----------------------------------------------------------------------------------------------------------//   
//+------------------------------------------------------------------+
//| Check domain_down Awesome_Oscillator bar                         |
//+------------------------------------------------------------------+
int Indicator_count_bar_down(int bar)
  {
   count_bar_down=0;
   for(int j=bar; j<TOTAL_BAR-10; j++)
     {
      if(Ext_AO_Buffer[j]<=0.0)
        {
         if(Ext_AO_Buffer[j]<=0.0 && Ext_AO_Buffer[j+1]>=0.0)
           {
            count_bar_down=j+1;
            break;
           }
        }
      else break;
     }
   return(count_bar_down);
  }
//----------------------------------------------------------------------------------------------------------//   
//+------------------------------------------------------------------+
//| Get Awesome_Oscillator last Peak                                 |
//+------------------------------------------------------------------+
int GetIndicatorLastPeak(int count_bar,int bar)
  {
   int LastPeak=0;
   if(count_bar<6) return(LastPeak);
   for(int j=bar+3; j<=count_bar-2; j++)
     {
      if(Ext_AO_Buffer[j]>=Ext_AO_Buffer[j+1]&& Ext_AO_Buffer[j]>Ext_AO_Buffer[j+2]&&
         Ext_AO_Buffer[j]>=Ext_AO_Buffer[j-1]&& Ext_AO_Buffer[j]>Ext_AO_Buffer[j-2])
        {
         LastPeak=j;
         break;
        }
     }
   return(LastPeak);
  }
//----------------------------------------------------------------------------------------------------------//   
int GetIndicatorALL_LastPeak_bar(int count_bar,int bar)
  {
   for(int i=0;i<200; i++) ALL_LastPeak_bar[i]=0;
   ALL_LastPeak_bar[0]=bar;
   int ii=1;
   for(int j=bar+3; j<=count_bar-2; j++)
     {
      ALL_LastPeak_bar[ii]=GetIndicatorLastPeak(count_bar,ALL_LastPeak_bar[ii-1]);
      if(ii>1 && ALL_LastPeak_bar[ii]==0 && ALL_LastPeak_bar[ii-1]>=0) break;
      ii++;
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| Get Awesome_Oscillator last Trough                               |
//+------------------------------------------------------------------+
int GetIndicatorLastTrough(int count_bar,int bar)
  {
   int LastTrough=0;
   if(count_bar<6) return(LastTrough);
   for(int j=bar+3; j<=count_bar-2; j++)
     {
      if(Ext_AO_Buffer[j]<=Ext_AO_Buffer[j+1]&& Ext_AO_Buffer[j]<Ext_AO_Buffer[j+2]&&
         Ext_AO_Buffer[j]<=Ext_AO_Buffer[j-1]&& Ext_AO_Buffer[j]<Ext_AO_Buffer[j-2])
        {
         LastTrough=j;
         break;
        }
     }
   return(LastTrough);
  }
//----------------------------------------------------------------------------------------------------------//
int GetIndicatorALL_LastTrough_bar(int count_bar,int bar)
  {
   for(int i=0;i<200; i++) ALL_LastTrough_bar[i]=0;
   ALL_LastTrough_bar[0]=bar;
   int ii=1;
   for(int j=bar+3; j<=count_bar-2; j++)
     {
      ALL_LastTrough_bar[ii]=GetIndicatorLastTrough(count_bar,ALL_LastTrough_bar[ii-1]);
      if(ii>1 && ALL_LastTrough_bar[ii]==0 && ALL_LastTrough_bar[ii-1]>=0) break;
      ii++;
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| Is Awesome_Oscillator Peak                                       |
//+------------------------------------------------------------------+
bool IsIndicatorPeak(int Peak,int bar)
  {
   if(Peak<4) return(false);
   if(Ext_AO_Buffer[bar]>=Ext_AO_Buffer[bar+1] && Ext_AO_Buffer[bar]>Ext_AO_Buffer[bar+2] && 
      Ext_AO_Buffer[bar]>Ext_AO_Buffer[bar-1]) return(true);
   return(false);
  }
//----------------------------------------------------------------------------------------------------------// 
//+------------------------------------------------------------------+
//| Is Awesome_Oscillator Trough                                     |
//+------------------------------------------------------------------+
bool IsIndicatorTrough(int Trough,int bar)
  {
   if(Trough<4) return(false);
   if(Ext_AO_Buffer[bar]<=Ext_AO_Buffer[bar+1] && Ext_AO_Buffer[bar]<Ext_AO_Buffer[bar+2] && 
      Ext_AO_Buffer[bar]<Ext_AO_Buffer[bar-1]) return(true);
   return(false);
  }
//----------------------------------------------------------------------------------------------------------//
//+------------------------------------------------------------------+
//| Function for drawing a trend line in the indicator window        |
//+------------------------------------------------------------------+
void DrawIndicatorTrendLine(int bar,datetime x1,datetime x2,double y1,double y2,color lineColor,int style)
  {
   int indicatorWindow=ChartWindowFind(0,short_name);
   if(indicatorWindow<0) return;
   string label="AO_Indicator_Divergence"+IntegerToString(bar)+TimeToString(x2);
   if(ObjectFind(0,label)==-1)
     {
      ObjectCreate(0,label,OBJ_TREND,indicatorWindow,x1,y1,x2,y2);
      ObjectSetInteger(0,label,OBJPROP_COLOR,lineColor);
      ObjectSetInteger(0,label,OBJPROP_STYLE,style);
      ObjectSetInteger(0,label,OBJPROP_WIDTH,0);
      ObjectSetInteger(0,label,OBJPROP_RAY,0);
      ObjectSetInteger(0,label,OBJPROP_BACK,false);
     }
   else
     {
      ObjectMove(0,label,0,x1,y1);
      ObjectMove(0,label,1,x2,y2);
     }
  }
//----------------------------------------------------------------------------------------------------------//
//+------------------------------------------------------------------+
//| Function for drawing a trend line in a price chart window        |
//+------------------------------------------------------------------+
void DrawPriceTrendLine(int bar,datetime x1,datetime x2,double y1,double y2,color lineColor,int style)
  {
   string label="AO_Price_Divergence"+IntegerToString(bar)+TimeToString(x2);
   if(ObjectFind(0,label)==-1)
     {
      ObjectCreate(0,label,OBJ_TREND,0,x1,y1,x2,y2);
      ObjectSetInteger(0,label,OBJPROP_COLOR,lineColor);
      ObjectSetInteger(0,label,OBJPROP_STYLE,style);
      ObjectSetInteger(0,label,OBJPROP_WIDTH,0);
      ObjectSetInteger(0,label,OBJPROP_RAY,0);
      ObjectSetInteger(0,label,OBJPROP_BACK,false);
     }
   else
     {
      ObjectMove(0,label,0,x1,y1);
      ObjectMove(0,label,1,x2,y2);
     }
  }
//----------------------------------------------------------------------------------------------------------//
//********************************************************************************************************************
void BUY_ALARM()
  {
   if(On_Play_Sound) PlaySound(NameFileSound);
   if(On_Alert) Alert("BUY # ",Symbol(),"\n Period=",sPeriod,"\n Ask=",sAsk,"\n Bid=",sBid,"\n currtime=",text);
   if(On_Email) SendMail("BUY #",Symbol()+" Period="+sPeriod+", Ask="+sAsk+", Bid="+sBid+", currtime="+text);
   if(On_Push) SendNotification("BUY #"+Symbol()+" Period="+sPeriod+", Ask="+sAsk+", Bid="+sBid+", currtime="+text);
  }
//+------------------------------------------------------------------+
void SELL_ALARM()
  {
   if(On_Play_Sound) PlaySound(NameFileSound);
   if(On_Alert) Alert("SELL # ",Symbol(),"\n Period=",sPeriod,"\n Ask=",sAsk,"\n Bid=",sBid,"\n currtime=",text);
   if(On_Email) SendMail("SELL #",Symbol()+" Period="+sPeriod+", Ask="+sAsk+", Bid="+sBid+", currtime="+text);
   if(On_Push) SendNotification("SELL #"+Symbol()+" Period="+sPeriod+", Ask="+sAsk+", Bid="+sBid+", currtime="+text);
  }
//********************************************************************************************************************

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---