KI_signals_v2

Download script
Author: Kalenzo
KI_signals_v2

This indicator is designed to help traders identify potential momentum shifts and trend reversals by analyzing the relationship between price averages. It functions by creating a multi-layered calculation that filters out market "noise" to highlight specific entry signals.

Core Logic and Calculations

The tool operates using three primary layers of data:

  1. Momentum Calculation (The Histogram): The script first compares two different Exponential Moving Averages (EMAs). By subtracting a longer-term average from a shorter-term average, it calculates a "Histogram" value. This value represents the immediate strength and direction of the price movement.
  2. Trend Smoothing (Moving Average of the Histogram): To ensure the signals aren't triggered by tiny, insignificant fluctuations, the script then applies a third moving average to that Histogram. This creates a smoothed trend line that tells us if the underlying momentum is truly shifting or just flickering.
  3. Signal Generation: The final visual cues on your chart are produced when these smoothed values cross specific thresholds (moving from negative to positive or vice versa).

Visual Signals and Features

Depending on your settings, the indicator provides three different types of visual feedback:

  • Primary Directional Signals: These appear when the smoothed momentum trend crosses the zero line. An "UP Signal" is triggered when the trend moves into positive territory, while a "DN Signal" appears when it drops below zero. These are intended to show major shifts in the market's direction.
  • High/Low Points (Optional): When enabled, the script looks for specific patterns in the Histogram where it reaches a local peak or valley. This helps identify potential exhaustion points in a move, marking out "highs" and "lows" based on the momentum's shape.
  • Momentum Crosses (Optional): This is a more sensitive layer that marks every time the raw Histogram crosses over its own smoothed average. This can be used to identify faster, shorter-term changes in price behavior before they become major trends.

Summary for the Trader

In plain terms, this script acts as a "momentum filter." Instead of just looking at the price going up or down, it looks at the velocity of that movement. It smooths out that velocity so that you only see signals when the momentum changes direction significantly enough to be considered a reliable trend shift.

Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
11 Views
0 Downloads
0 Favorites
KI_signals_v2

//+------------------------------------------------------------------+
//|                                                KI_signals_v1.mq4 |
//|                                                          Kalenzo |
//|                                      bartlomiej.gorski@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Kalenzo"
#property link      "bartlomiej.gorski@gmail.com"

#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 SteelBlue
#property indicator_color2 Orange
#property indicator_color3 DodgerBlue
#property indicator_color4 Magenta
#property indicator_color5 Blue
#property indicator_color6 Red

#property indicator_level1 0

extern int Length1 = 3;
extern int Length2 = 10;
extern int Length3 = 16;
 bool showHL = false; 
 bool showCrosses = false;

double Histo[];
double MaHisto[];

double up[];
double dn[]; 

double high[];
double valley[];

double cUp[];
double cDn[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- additional buffers are used for counting
   IndicatorBuffers(8);

   SetIndexStyle(0,DRAW_ARROW,EMPTY,0);
   SetIndexStyle(1,DRAW_ARROW,EMPTY,0);

   SetIndexStyle(2,DRAW_ARROW,EMPTY,1);
   SetIndexStyle(3,DRAW_ARROW,EMPTY,1);
   
   SetIndexStyle(4,DRAW_ARROW,EMPTY,0);
   SetIndexStyle(5,DRAW_ARROW,EMPTY,0);
   
   SetIndexArrow(0,217);
   SetIndexArrow(1,218);

   SetIndexArrow(2,233);
   SetIndexArrow(3,234);

   SetIndexArrow(4,108);
   SetIndexArrow(5,108);
   
   IndicatorDigits(6);
   
   SetIndexBuffer(0,high);
   SetIndexBuffer(1,valley);

   SetIndexBuffer(2,up);
   SetIndexBuffer(3,dn);

   SetIndexBuffer(4,cUp);
   SetIndexBuffer(5,cDn);
   
   SetIndexBuffer(6,Histo);
   SetIndexBuffer(7,MaHisto);
   
   IndicatorShortName("KI signals v1");
   
   SetIndexLabel(2,"UP SIGNAL");
   SetIndexLabel(3,"DN SIGNAL");
   
   
   
   return(0);
  }
//+------------------------------------------------------------------+
//| SignalIndicator                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) counted_bars=0;
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//----
      
   for(int i = 0 ;i <= limit ;i++)Histo[i] = iMA(Symbol(),0,Length1,0,MODE_EMA,PRICE_CLOSE,i) - iMA(Symbol(),0,Length2,0,MODE_EMA,PRICE_CLOSE,i);      
   
   for(int j = 0 ;j <= limit ;j++)MaHisto[j] = iMAOnArray(Histo,0,Length3,0,MODE_EMA,j);
   
   for(int m = 0 ;m <= limit ;m++)
   {
      if(MaHisto[m+1] <= 0 && MaHisto[m]>0)
      {
         up[m] = Open[m]-(5*Point);
      }
      
      if(MaHisto[m+1] >= 0 && MaHisto[m]<0)
      {
         dn[m] = Open[m]+(5*Point);
      }
   
   
      if(showHL)
      {   
         if(Histo[m]<= 0 && Histo[m+2]<= Histo[m+1] && Histo[m+1]>Histo[m])
         {
            high[m+1] = High[m+1]+(2*Point);
         }
      
         if(Histo[m]>= 0 && Histo[m+2]>= Histo[m+1] && Histo[m+1]<Histo[m])
         {
            valley[m+1] = Low[m+1]+(2*Point);
         }
      }  
      
      if(showCrosses)
      {
         if(Histo[m+1] <= MaHisto[m+1] && Histo[m] > MaHisto[m])
         {
            cUp[m] = Open[m];
         }
      
         if(Histo[m+1] >= MaHisto[m+1] && Histo[m] < MaHisto[m])
         {
            cDn[m] = Open[m];
         }
      }      
      
      
   }
//----
 return(0);
  }
//+------------------------------------------------------------------+

Comments