ichi
Download scriptThis script is designed to render a comprehensive technical analysis tool known as the Ichimoku Cloud (Kinko Hyo) onto a trading chart. Its primary purpose is to provide traders with a visual representation of momentum, support/resistance levels, and trend direction by calculating several moving averages and price boundaries simultaneously.
Core Components and Visual Logic
The script calculates five distinct elements that work together to give a complete picture of market behavior:
- Short-term and Medium-term Momentum (Tenkan Sen & Kijun Sen): These act as the "fast" and "slow" moving averages of the system. The script identifies these by finding the highest high and lowest low over specific timeframes (9 and 26 periods, respectively) and calculating the midpoint. They help traders see the immediate direction of the price.
- The Cloud Framework (Senkou Span A & B): These two lines combine to create the "Kumo" or Cloud. Span A is derived from the average of the Tenkan and Kijun lines, while Span B is calculated based on a much longer timeframe (52 periods). When plotted together, they create a shaded area that acts as a dynamic zone for support and resistance.
- The Lagging Price Check (Chinkou Span): This component takes the closing price and shifts it backward on the chart. It allows traders to compare current price action against past price levels to confirm trend strength.
Automated Alert System
Beyond just drawing lines on a screen, the script actively monitors these calculations in real-time to notify the user of significant market shifts. It is programmed to trigger an alert under three specific conditions:
- Momentum Shifts: It detects when the fast moving average (Tenkan Sen) crosses over or under the medium moving average (Kijun Sen), which often signals a change in immediate trend direction.
- Price Breaks: It monitors the current market price relative to the Kijun Sen line, alerting the user if the price breaks through this significant medium-term support or resistance level.
- Trend Confirmations: It watches for instances where the Chinkou Span (the lagging price) crosses over the current price, providing a signal that the overall trend may be shifting in either direction.
By combining these visual clouds with automated alerts, the script serves as a comprehensive dashboard, filtering out market noise to highlight key transition points for the trader.
//+------------------------------------------------------------------+
//| Ichimoku.mq4 |
//| Copyright © 2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net/"
#property indicator_chart_window
#property indicator_buffers 7
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 SandyBrown
#property indicator_color4 Thistle
#property indicator_color5 Lime
#property indicator_color6 SandyBrown
#property indicator_color7 Thistle
//---- input parameters
extern int Tenkan=9;
extern int Kijun=26;
extern int Senkou=52;
//---- buffers
double Tenkan_Buffer[];
double Kijun_Buffer[];
double SpanA_Buffer[];
double SpanB_Buffer[];
double Chinkou_Buffer[];
double SpanA2_Buffer[];
double SpanB2_Buffer[];
//----
int a_begin;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,Tenkan_Buffer);
SetIndexDrawBegin(0,Tenkan-1);
SetIndexLabel(0,"Tenkan Sen");
//----
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,Kijun_Buffer);
SetIndexDrawBegin(1,Kijun-1);
SetIndexLabel(1,"Kijun Sen");
//----
a_begin=Kijun; if(a_begin<Tenkan) a_begin=Tenkan;
SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_DOT);
SetIndexBuffer(2,SpanA_Buffer);
SetIndexDrawBegin(2,Kijun+a_begin-1);
SetIndexShift(2,Kijun);
SetIndexLabel(2,NULL);
SetIndexStyle(5,DRAW_LINE,STYLE_DOT);
SetIndexBuffer(5,SpanA2_Buffer);
SetIndexDrawBegin(5,Kijun+a_begin-1);
SetIndexShift(5,Kijun);
SetIndexLabel(5,"Senkou Span A");
//----
SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_DOT);
SetIndexBuffer(3,SpanB_Buffer);
SetIndexDrawBegin(3,Kijun+Senkou-1);
SetIndexShift(3,Kijun);
SetIndexLabel(3,NULL);
SetIndexStyle(6,DRAW_LINE,STYLE_DOT);
SetIndexBuffer(6,SpanB2_Buffer);
SetIndexDrawBegin(6,Kijun+Senkou-1);
SetIndexShift(6,Kijun);
SetIndexLabel(6,"Senkou Span B");
//----
SetIndexStyle(4,DRAW_LINE);
SetIndexBuffer(4,Chinkou_Buffer);
SetIndexShift(4,-Kijun);
SetIndexLabel(4,"Chinkou Span");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Ichimoku Kinko Hyo |
//+------------------------------------------------------------------+
int start()
{
int i,k;
int counted_bars=IndicatorCounted();
double high,low,price;
//----
if(Bars<=Tenkan || Bars<=Kijun || Bars<=Senkou) return(0);
//---- initial zero
if(counted_bars<1)
{
for(i=1;i<=Tenkan;i++) Tenkan_Buffer[Bars-i]=0;
for(i=1;i<=Kijun;i++) Kijun_Buffer[Bars-i]=0;
for(i=1;i<=a_begin;i++) { SpanA_Buffer[Bars-i]=0; SpanA2_Buffer[Bars-i]=0; }
for(i=1;i<=Senkou;i++) { SpanB_Buffer[Bars-i]=0; SpanB2_Buffer[Bars-i]=0; }
}
//---- Tenkan Sen
i=Bars-Tenkan;
if(counted_bars>Tenkan) i=Bars-counted_bars-1;
while(i>=0)
{
high=High[i]; low=Low[i]; k=i-1+Tenkan;
while(k>=i)
{
price=High[k];
if(high<price) high=price;
price=Low[k];
if(low>price) low=price;
k--;
}
Tenkan_Buffer[i]=(high+low)/2;
i--;
}
//---- Kijun Sen
i=Bars-Kijun;
if(counted_bars>Kijun) i=Bars-counted_bars-1;
while(i>=0)
{
high=High[i]; low=Low[i]; k=i-1+Kijun;
while(k>=i)
{
price=High[k];
if(high<price) high=price;
price=Low[k];
if(low>price) low=price;
k--;
}
Kijun_Buffer[i]=(high+low)/2;
i--;
}
//---- Senkou Span A
i=Bars-a_begin+1;
if(counted_bars>a_begin-1) i=Bars-counted_bars-1;
while(i>=0)
{
price=(Kijun_Buffer[i]+Tenkan_Buffer[i])/2;
SpanA_Buffer[i]=price;
SpanA2_Buffer[i]=price;
i--;
}
//---- Senkou Span B
i=Bars-Senkou;
if(counted_bars>Senkou) i=Bars-counted_bars-1;
while(i>=0)
{
high=High[i]; low=Low[i]; k=i-1+Senkou;
while(k>=i)
{
price=High[k];
if(high<price) high=price;
price=Low[k];
if(low>price) low=price;
k--;
}
price=(high+low)/2;
SpanB_Buffer[i]=price;
SpanB2_Buffer[i]=price;
i--;
}
//---- Chinkou Span
i=Bars-1;
if(counted_bars>1) i=Bars-counted_bars-1;
while(i>=0) { Chinkou_Buffer[i]=Close[i]; i--; }
//----
//----ALERTS
//---- TS cross KS
if (Tenkan_Buffer[0] > Kijun_Buffer[0] && Tenkan_Buffer[-1] < Kijun_Buffer[-1])
{ //crossed upwards
Alert ("TS crossed KS upwards on+ "+Symbol());}
if (Tenkan_Buffer[0] < Kijun_Buffer[0] && Tenkan_Buffer[-1] > Kijun_Buffer[-1])
{ //crossed downwards
Alert ("TS crossed KS downwards on+ "+Symbol());}
//---- Kijun Sen Cross
if (Bid > Kijun_Buffer[0] && Close[-1] < Kijun_Buffer[-1])
{ //price crossed upwards
Alert ("price crossed KS upwards on+ "+Symbol());}
if (Bid < Kijun_Buffer[0] && Close[-1] > Kijun_Buffer[-1])
{ //crossed downwards
Alert ("price crossed KS downwards on+ "+Symbol());}
//---- Kumo Breakout or Senkou Span A/B Cross
//---- Chinkou Span Cross
if (Chinkou_Buffer[0] > Bid && Chinkou_Buffer[-1] < Close[-1])
{ //chinkou crossed the price upwards
Alert ("chinkou span crossed KS upwards on+ "+Symbol());}
if (Chinkou_Buffer[0] < Bid && Chinkou_Buffer[-1] > Close[-1])
{ //chinkou crossed the price downwards
Alert ("chinkou span crossed KS downwards on+ "+Symbol());}
return(0);
}
//+------------------------------------------------------------------+
Comments