Sonic_Ind_v1.0

Author: Copyright � 2008, DGC & Sonic
Sonic_Ind_v1.0

The OzFX_D1_Ind_v1.0 script is a specialized technical analysis tool designed to identify market trends and potential trading opportunities by combining multiple mathematical indicators into a single visual display. Instead of relying on just one piece of data, it cross-references several different market metrics to produce more reliable signals.

The logic operates through four primary components:

1. Core Signal Processing

The script evaluates two distinct types of "Regular" and "AES" signals to help traders decide the direction of a move:

  • OzFX Regular Signals: These are generated by looking for a specific "confluence" (agreement) between three different data points:
    • Momentum: It checks if the current movement is gaining strength compared to the previous bar.
    • Stochastic Oscillators: It ensures the market is trading in a specific range (above or below a 50% midpoint).
    • Laguerre-ACS1: This is a specialized custom indicator used to verify that the price action aligns with specific volatility and trend requirements.
  • OzFX AES Signals: This component provides an alternative signal logic. It focuses on the relationship between different "Stochastic" lines (the main line versus the signal line) and how they interact with the current momentum.

2. Trend Filtering Mechanisms

To help filter out "fake" signals or noise, the script includes two optional layers of verification:

  • SMA Filter: This looks at the Simple Moving Average (SMA). If the current price is above the long-term average (e.g., a 200-period window), it suggests an upward bias; if it is below, it suggests a downward bias.
  • RSI Filter: This measures the "Relative Strength Index" to determine if the market is overbought or oversold. It specifically checks if the strength of the price movement is above or below the 50-level midpoint.

3. Visual Output

The tool translates these complex calculations into a visual format on your trading platform:

  • Histograms: Used to show the "Regular" and "AES" signals clearly as bars, making it easy to see when the script confirms a buy or sell direction.
  • Lines: The SMA and RSI filters are plotted as lines, allowing you to see the "background" trend of the market at a glance.

Summary for the User

In plain terms, this script acts as a multi-layered sieve. It watches the market constantly and only "lights up" a signal when several conditions—momentum, relative strength, and moving averages—all agree with one another simultaneously. This is intended to help traders avoid entering trades during choppy markets where individual indicators might give conflicting information.

Indicators Used
Bill Williams Accelerator/Decelerator oscillatorStochastic oscillatorBill Williams Awesome oscillatorMoving average indicatorRelative strength index
Miscellaneous
Implements a curve of type %1It opens Message Boxes to the userIt plays sound alertsIt sends emails
16 Views
0 Downloads
0 Favorites
Sonic_Ind_v1.0
//+------------------------------------------------------------------+
//|                                             OzFX_D1_Ind_v1.0.mq4 |
//|                                            Copyright © 2008, DGC |
//|                                          http://www.ozfx.com.au/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, DGC & Sonic"
#property link      "http://www.ozfx.com.au/"

#include <WinUser32.mqh>

#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Brown
#property indicator_width1 2
#property indicator_color2 DodgerBlue
#property indicator_width2 2
#property indicator_color3 Red
#property indicator_width3 2
#property indicator_color4 White
#property indicator_width4 1
#property indicator_style4 2
#property indicator_level1 0
#property indicator_minimum -1.2
#property indicator_maximum 1.2

extern string SEP1 = "----SIGNAL CONTROLS----";
extern bool Show_Sonic_Signals = true;
extern bool Show_AES_Signals = false;
extern string SEP2 = "----FILTER CONTROLS----";
extern bool Show_SMA_Filter = true;
extern int SMA_Filter_Period = 200;
extern bool Show_RSI_Filter = false;
extern int RSI_Filter_Period = 45;
/*extern string SEP3 = "----ALERT CONTROLS----";
extern bool Popup_Alerts_On = false;
extern bool Audio_Alerts_On = false;
extern bool EMail_Alerts_On = false;
extern int Alert_Signal = 0;
extern bool Alert_SMA_Filtered = false;
extern bool Alert_RSI_Filtered = false;
*/
double OzFX_Regular[];
double OzFX_AES[];
double Filter_SMA[];
double Filter_RSI[];

int iLastRegular;
double dLastAES;
int k;

bool bAlertSounded;

int init()
{
   SetIndexStyle(0, DRAW_HISTOGRAM);
   SetIndexBuffer(0, OzFX_Regular);
   SetIndexStyle(1, DRAW_HISTOGRAM);
   SetIndexBuffer(1, OzFX_AES);
   SetIndexStyle(2, DRAW_LINE);
   SetIndexBuffer(2, Filter_SMA);
   SetIndexStyle(3, DRAW_LINE);
   SetIndexBuffer(3, Filter_RSI);
   iLastRegular = 0;
   dLastAES = 0;
   bAlertSounded = false;
   return(0);
}

int start()
{
   for (k = Bars - 205; k >= 0; k --)
   {

/*---------------------*/            
/*  OZFX REGULAR CODE  */
/*---------------------*/
      OzFX_Regular[k] = 0;
      if (iAC(Symbol(), 0, k) > 0 &&
          iAC(Symbol(), 0, k) > iAC(Symbol(), 0, k + 1) &&
          iStochastic(Symbol(), 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, k) > 50 &&
          iCustom(NULL, 0, "Laguerre-ACS1", 0.6, 1000, 2, 0, k)> 0.1)
      {
         if (iLastRegular != 1) OzFX_Regular[k] = 1;
         iLastRegular = 1;
      }   
      
      if (iAC(Symbol(), 0, k) < 0 &&
          iAC(Symbol(), 0, k) < iAC(Symbol(), 0, k + 1) &&
          iStochastic(Symbol(), 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, k) < 50 &&
          iCustom(NULL, 0, "Laguerre-ACS1", 0.6, 1000, 2, 0, k)< 0.9)
      {
         if (iLastRegular != -1) OzFX_Regular[k] = -1;
         iLastRegular = -1;
      }   
      if (Show_Sonic_Signals == false) OzFX_Regular[k] = 0.0;
      
/*-----------------*/            
/*  OZFX AES CODE  */
/*-----------------*/
      OzFX_AES[k] = 0;
      if (/*iAC(Symbol(), 0, k) > 0 &&*/
          iAC(Symbol(), 0, k) > iAC(Symbol(), 0, k + 1) &&
          iStochastic(Symbol(), 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, k)
          > iStochastic(Symbol(), 0, 5, 3, 3, MODE_SMA, 0, MODE_SIGNAL, k) /*&&
          iStochastic(Symbol(), 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, k + 1)
          < iStochastic(Symbol(), 0, 5, 3, 3, MODE_SMA, 0, MODE_SIGNAL, k + 1) &&
          iAO(Symbol(), 0, k) > iAO(Symbol(), 0, k + 1)*/)
      {
         if (dLastAES != 0.7) OzFX_AES[k] = 0.7;
         dLastAES = 0.7;
      }   
      
      if (/*iAC(Symbol(), 0, k) < 0 &&*/
          iAC(Symbol(), 0, k) < iAC(Symbol(), 0, k + 1) &&
          iStochastic(Symbol(), 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, k)
          < iStochastic(Symbol(), 0, 5, 3, 3, MODE_SMA, 0, MODE_SIGNAL, k) /*&&
          iStochastic(Symbol(), 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, k + 1)
          > iStochastic(Symbol(), 0, 5, 3, 3, MODE_SMA, 0, MODE_SIGNAL, k + 1) &&
          iAO(Symbol(), 0, k) < iAO(Symbol(), 0, k + 1)*/)
      {
         if (dLastAES != -0.7) OzFX_AES[k] = -0.7;
         dLastAES = -0.7;
      }   
      if (Show_AES_Signals == false) OzFX_AES[k] = 0.0;
/*-------------------*/            
/*  SMA FILTER CODE  */
/*-------------------*/            
      Filter_SMA[k] = 0;
      if (Close[k] > iMA(Symbol(), 0, SMA_Filter_Period, 0, MODE_SMA, PRICE_CLOSE, k))
         Filter_SMA[k] = 1;
      if (Close[k] <= iMA(Symbol(), 0, SMA_Filter_Period, 0, MODE_SMA, PRICE_CLOSE, k))
         Filter_SMA[k] = -1;
      if (Show_SMA_Filter == false) Filter_SMA[k] = EMPTY_VALUE;

/*-------------------*/            
/*  RSI FILTER CODE  */
/*-------------------*/            
      Filter_RSI[k] = 0;
      if (50 > iRSI(Symbol(), 0, RSI_Filter_Period, PRICE_CLOSE, k))
         Filter_RSI[k] = -1;
      if (50 <= iRSI(Symbol(), 0, RSI_Filter_Period, PRICE_CLOSE, k))
         Filter_RSI[k] = 1;
      if (Show_RSI_Filter == false) Filter_RSI[k] = EMPTY_VALUE;
   }

/*--------------*/            
/*  ALERT CODE  */
/*--------------*/   
/*
   if ((Alert_SMA_Filtered == false ||
      (Alert_SMA_Filtered == true && OzFX_Regular[0] == Filter_SMA[0]))
      &&
      (Alert_RSI_Filtered == false ||
      (Alert_RSI_Filtered == true && MathCeil(OzFX_AES[0]) == Filter_SMA[0])))
   {
      switch (Alert_Signal)
      {
         case 0:
            if (OzFX_Regular[0] != 0 && bAlertSounded == false)
            {
               if (Popup_Alerts_On == true)
                  MessageBox("alert", "Trade Alert!!", MB_OK);
               if (Audio_Alerts_On == true)
                  PlaySound("Alert.wav");
               if (EMail_Alerts_On == true)
                  SendMail("Trade Alert!!", "alert");
               bAlertSounded = true;
            }
            else bAlertSounded = false;
            break;
         case 1:
            if (OzFX_Regular[0] != 0 && bAlertSounded == false)
            {
               if (Popup_Alerts_On == true)
                  MessageBox("alert", "Trade Alert!!", MB_OK);
               if (Audio_Alerts_On == true)
                  PlaySound("Alert.wav");
               if (EMail_Alerts_On == true)
                  SendMail("Trade Alert!!", "alert");
               bAlertSounded = true;
            }
            else bAlertSounded = false;
            break;
      }
   }         
*/
   return(0);
}

Comments