super_signals_v3

Download script
Author: alterations by Mark Tomlinson
super_signals_v3

Overview

This script is designed as a visual trading assistant for MetaTrader. Its primary purpose is to scan historical price data to identify significant "peaks" (highs) and "valleys" (lows) in the market. By pinpointing these specific price points, it generates visual signals on your chart to help you identify potential areas of trend exhaustion or reversal.

How the Logic Works

The script operates by constantly monitoring the price action using two different scales of observation: a short-term range and a long-term range.

1. Identifying Price Extremes The tool looks back at a specific number of candles (defined by user settings) to find the highest high and the lowest low within those periods.

  • Longer Horizon: It identifies major price turning points across a wider window to detect broader market shifts.
  • Shorter Horizon: It identifies more immediate price fluctuations to capture smaller, quicker movements.

2. Visual Signaling When the script detects that a candle is at a new peak or valley within these defined ranges, it places an arrow on your chart. These arrows are categorized into different "strengths":

  • Primary Signals: Based on the larger timeframe, these represent more significant market peaks and valleys.
  • Secondary Signals: Based on the smaller timeframe, these represent minor fluctuations or potential entry/exit points for smaller moves.

3. Dynamic Volatility Adjustment To ensure that the signals are placed at a reasonable distance from the price (and aren't overlapping with the candles), the script calculates the "Average True Range." This means the distance of the arrows from the price adjusts automatically based on how volatile the market is at that specific moment—placing signals further away during high volatility and closer during calm periods.

Alert System

The script includes a smart notification system to keep you informed without being repetitive. It monitors the most recent signals and can be configured to notify you via three methods:

  • Pop-up Alerts: On-screen messages indicating whether a "Strong Buy," "Sell," or "Minor Signal" has occurred.
  • Email Notifications: Sending the signal details directly to your registered email.
  • Audio Alerts: Playing a sound file when a new signal appears.

The system is designed to filter out repetitive noise, ensuring that it only notifies you once per candle for each unique signal type.

Indicators Used
Indicator of the average true range
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screenIt sends emailsIt plays sound alerts
14 Views
0 Downloads
0 Favorites
super_signals_v3
//+------------------------------------------------------------------+
//|                                             super-signals_v2.mq4 |
//|                Copyright © 2006, Nick Bilak, beluck[AT]gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Nick Bilak"
#property copyright "alterations by Mark Tomlinson"
#property link      "http://www.forex-tsd.com/"

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Yellow
#property indicator_color2 Lime
#property indicator_color3 Red
#property indicator_color4 Aqua
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 1
#property indicator_width4 1

//input properties

extern int  dist2           = 21;
extern int  dist1           = 14;
extern bool alertsOn        = false;
extern bool alertsOnCurrent = true;
extern bool alertsMessage   = true;
extern bool alertsSound     = false;
extern bool alertsEmail     = false;

double b1[];
double b2[];
double b3[];
double b4[];


int init()
{
   SetIndexBuffer(0,b1);
   SetIndexBuffer(1,b2);
   SetIndexBuffer(2,b3);
   SetIndexBuffer(3,b4);
   SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,334);
   SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,333);
   SetIndexStyle(2,DRAW_ARROW); SetIndexArrow(1,233);
   SetIndexStyle(3,DRAW_ARROW); SetIndexArrow(0,234);
   return(0);
}
int start()
{
   int counted_bars=IndicatorCounted();
   int i,limit,hhb,llb,hhb1,llb1;

   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
           limit=Bars-counted_bars;
           limit=MathMax(limit,dist1);
           limit=MathMax(limit,dist2);

   //
   //
   //
   //
   //

   for (i=limit;i>=0;i--)
      {
         hhb1 = Highest(NULL,0,MODE_HIGH,dist1,i-dist1/2);
         llb1 = Lowest(NULL,0,MODE_LOW,dist1,i-dist1/2);
         hhb  = Highest(NULL,0,MODE_HIGH,dist2,i-dist2/2);
         llb  = Lowest(NULL,0,MODE_LOW,dist2,i-dist2/2);

            b1[i] = EMPTY_VALUE;
            b2[i] = EMPTY_VALUE;
            b3[i] = EMPTY_VALUE;
            b4[i] = EMPTY_VALUE;
      
         double tr = iATR(NULL,0,50,i);
         if (i==hhb)  b1[i]=High[hhb] +tr;
         if (i==llb)  b2[i]=Low[llb]  -tr;
         if (i==hhb1) b3[i]=High[hhb1]+tr/2;
         if (i==llb1) b4[i]=Low[llb1] -tr/2;
      }
      
   //
   //
   //
   //
   //
   
   if (alertsOn)
      {
         int forBar = 1;
            if (alertsOnCurrent) forBar = 0;
            if (b1[forBar] != EMPTY_VALUE && b3[forBar] != EMPTY_VALUE) doAlert("strong sell");
            if (b1[forBar] != EMPTY_VALUE && b3[forBar] == EMPTY_VALUE) doAlert("sell");
            if (b1[forBar] == EMPTY_VALUE && b3[forBar] != EMPTY_VALUE) doAlert("minor sell or exit buy");
            if (b2[forBar] != EMPTY_VALUE && b4[forBar] != EMPTY_VALUE) doAlert("strong buy");
            if (b2[forBar] != EMPTY_VALUE && b4[forBar] == EMPTY_VALUE) doAlert("buy");
            if (b2[forBar] == EMPTY_VALUE && b4[forBar] != EMPTY_VALUE) doAlert("minor buy or exit sell");
      }
  return(0);
}

//
//
//
//
//

void doAlert(string doWhat)
{
   static string   previousAlert="nothing";
   static datetime previousTime;
   string message;
   
      if (previousAlert != doWhat || previousTime != Time[0]) {
          previousAlert  = doWhat;
          previousTime   = Time[0];

          //
          //
          //
          //
          //

          message =  StringConcatenate(Symbol()," at ",TimeToStr(TimeLocal(),TIME_SECONDS)," Super signal : ",doWhat);
             if (alertsMessage) Alert(message);
             if (alertsEmail)   SendMail(StringConcatenate(Symbol(),"Super signal "),message);
             if (alertsSound)   PlaySound("alert2.wav");
      }
}

Comments