Author: Copyright � 2008, MetaQuotes Software Corp.
KG MA 1.3b

This script is a multi-timeframe technical analysis tool designed to help traders visualize market trends across different scales simultaneously. Instead of forcing you to switch between various charts (like moving from a 15-minute chart to a Monthly chart), it calculates and displays the trend for several specific timeframes all on a single screen.

Core Functionality

The tool identifies and plots Moving Averages (MA) for eight distinct timeframes:

  • Long-Term: Monthly, Weekly, and Daily.
  • Medium-Term: 8-Hour, 4-Hour, and 1-Hour.
  • Short-Term: 30-Minute and 15-Minute.

How the Logic Works

The script operates through three main layers of logic:

1. Dynamic Calculation The tool automatically detects which chart timeframe you are currently viewing and adjusts its internal math accordingly. It calculates the "weight" needed for each of the eight timeframes to ensure that a Monthly average remains a monthly average, even if you are looking at a 1-minute or a 5-minute price chart.

2. Visual Plotting On your trading chart, the script draws colored lines representing these different averages. Each timeframe is assigned a specific color (e.g., Crimson for Monthly, Green for Daily, Lime for 15-Minute), allowing you to see at a glance how high-level trends interact with short-term price action.

3. Automated Trend Signage In addition to the lines, the script provides a "Status Dashboard" in the corner of your screen. For every timeframe it tracks, it generates a visual symbol and color code based on the direction of the Moving Average:

  • Upward Trend: Shown with a specific icon and Lime/Green color, indicating the price is moving higher over that period.
  • Downward Trend: Shown with a specific icon and Red color, indicating the price is moving lower over that period.
  • Sideways Market: Shown with a Yellow color, indicating that there is little to no movement (the average is flat).

Summary for the User

Essentially, this script acts as a "trend overview" panel. It allows you to see the "big picture" (Monthly and Weekly trends) and the "immediate picture" (15-minute trends) in one spot. By looking at the dashboard of icons and colored lines, you can quickly determine if the market is aligned across all timeframes or if a short-term move is contradicting the long-term trend.

Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
12 Views
1 Downloads
0 Favorites
KG MA 1.3b
//+------------------------------------------------------------------+
//|                                                 KG MA V 1.3b.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link      "http://www.forexindo.com/forum/showthread.php?t=95&page=9"

#property indicator_chart_window
#property indicator_buffers 8

extern int Corner=1;
extern int MA_Mode=MODE_SMA;
extern color MA_Month_Color=Crimson;
extern color MA_Week_Color=MediumBlue;
extern color MA_Day_Color=Green;
extern color MA_8H_Color=Orange;
extern color MA_4H_Color=OrangeRed;
extern color MA_1H_Color=DeepSkyBlue;
extern color MA_30M_Color=White;
extern color MA_15M_Color=Lime;
//---- buffers
double MAMonth[];
double MAWeek[];
double MA24H[];
double MA8H[];
double MA4H[];
double MA1H[];
double MA30M[];
double MA15M[];
int    PerMonth;
int    PerWeek;
int    Per24H;
int    Per8H;
int    Per4H;
int    Per1H;
int    Per30M;
int    Per15M;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE,0,2,MA_Month_Color);
   SetIndexBuffer(0,MAMonth);
   SetIndexLabel(0,"MA Month");
   SetIndexStyle(1,DRAW_LINE,0,2,MA_Week_Color);
   SetIndexBuffer(1,MAWeek);
   SetIndexLabel(1,"MA Week");
   SetIndexStyle(2,DRAW_LINE,0,2,MA_Day_Color);
   SetIndexBuffer(2,MA24H);
   SetIndexLabel(2,"MA Day");
   SetIndexStyle(3,DRAW_LINE,0,2,MA_8H_Color);
   SetIndexBuffer(3,MA8H);
   SetIndexLabel(3,"MA 8H");
   SetIndexStyle(4,DRAW_LINE,0,2,MA_4H_Color);
   SetIndexBuffer(4,MA4H);
   SetIndexLabel(4,"MA 4H");
   SetIndexStyle(5,DRAW_LINE,0,2,MA_1H_Color);
   SetIndexBuffer(5,MA1H);
   SetIndexLabel(5,"MA 1H");
   SetIndexStyle(6,DRAW_LINE,0,2,MA_30M_Color);
   SetIndexBuffer(6,MA30M);
   SetIndexLabel(6,"MA 30M");
   SetIndexStyle(7,DRAW_LINE,0,2,MA_15M_Color);
   SetIndexBuffer(7,MA15M);
   SetIndexLabel(7,"MA 15M");
   
   string label1 = "KG MA Month";
   ObjectDelete(label1);
   ObjectCreate( label1, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label1,"Monthly MA",8, "Arial Bold", MA_Month_Color);
   ObjectSet( label1, OBJPROP_CORNER, Corner );
   ObjectSet( label1, OBJPROP_XDISTANCE, 3 );
   ObjectSet( label1, OBJPROP_YDISTANCE, 10 );
   
   string label2 = "KG MA Week";
   ObjectDelete(label2);
   ObjectCreate( label2, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label2,"Weekly MA",8, "Arial Bold", MA_Week_Color);
   ObjectSet( label2, OBJPROP_CORNER, Corner );
   ObjectSet( label2, OBJPROP_XDISTANCE, 3 );
   ObjectSet( label2, OBJPROP_YDISTANCE, 20 );
   
   string label3 = "KG MA Day";
   ObjectDelete(label3);
   ObjectCreate( label3, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label3,"Daily MA",8, "Arial Bold", MA_Day_Color);
   ObjectSet( label3, OBJPROP_CORNER, Corner );
   ObjectSet( label3, OBJPROP_XDISTANCE, 3 );
   ObjectSet( label3, OBJPROP_YDISTANCE, 30 );
   
   string label4 = "KG MA 8H";
   ObjectDelete(label4);
   ObjectCreate( label4, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label4,"8H MA",8, "Arial Bold", MA_8H_Color);
   ObjectSet( label4, OBJPROP_CORNER, Corner );
   ObjectSet( label4, OBJPROP_XDISTANCE, 3 );
   ObjectSet( label4, OBJPROP_YDISTANCE, 40 );
   
   string label5 = "KG MA 4H";
   ObjectDelete(label5);
   ObjectCreate( label5, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label5,"4H MA",8, "Arial Bold", MA_4H_Color);
   ObjectSet( label5, OBJPROP_CORNER, Corner );
   ObjectSet( label5, OBJPROP_XDISTANCE, 3 );
   ObjectSet( label5, OBJPROP_YDISTANCE, 50 );
   
   string label6 = "KG MA 1H";
   ObjectDelete(label6);
   ObjectCreate( label6, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label6,"1H MA",8, "Arial Bold", MA_1H_Color);
   ObjectSet( label6, OBJPROP_CORNER, Corner );
   ObjectSet( label6, OBJPROP_XDISTANCE, 3 );
   ObjectSet( label6, OBJPROP_YDISTANCE, 60 );

   string label7 = "KG MA 30M";
   ObjectDelete(label7);
   ObjectCreate( label7, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label7,"30M MA",8, "Arial Bold", MA_30M_Color);
   ObjectSet( label7, OBJPROP_CORNER, Corner );
   ObjectSet( label7, OBJPROP_XDISTANCE, 3 );
   ObjectSet( label7, OBJPROP_YDISTANCE, 70 );
   
   string label8 = "KG MA 15M";
   ObjectDelete(label8);
   ObjectCreate( label8, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label8,"15M MA",8, "Arial Bold", MA_15M_Color);
   ObjectSet( label8, OBJPROP_CORNER, Corner );
   ObjectSet( label8, OBJPROP_XDISTANCE, 3 );
   ObjectSet( label8, OBJPROP_YDISTANCE, 80 );

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   for(int i = ObjectsTotal() - 1; i >= 0; i--)
     {
       string label = ObjectName(i);
       if(StringSubstr(label, 0, 5) != "KG MA")
           continue;
       ObjectDelete(label);   
     }   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
//----
   int ActivePer=Period();
   PerMonth=28800/ActivePer;
   PerWeek=7200/ActivePer;
   Per24H=1440/ActivePer;
   Per8H=480/ActivePer;
   Per4H=240/ActivePer;
   Per1H=60/ActivePer;
   Per30M=30/ActivePer;
   Per15M=15/ActivePer;
   int limit=Bars-counted_bars;
   if(counted_bars>0) limit++;
   for(int i=0; i<limit; i++)
   { 
      MAMonth[i]=iMA(NULL,0,PerMonth,0,MA_Mode,PRICE_WEIGHTED,i);
      MAWeek[i]=iMA(NULL,0,PerWeek,0,MA_Mode,PRICE_WEIGHTED,i);
      MA24H[i]=iMA(NULL,0,Per24H,0,MA_Mode,PRICE_WEIGHTED,i);
      MA8H[i]=iMA(NULL,0,Per8H,0,MA_Mode,PRICE_WEIGHTED,i);
      MA4H[i]=iMA(NULL,0,Per4H,0,MA_Mode,PRICE_WEIGHTED,i);
      MA1H[i]=iMA(NULL,0,Per1H,0,MA_Mode,PRICE_WEIGHTED,i);
      MA30M[i]=iMA(NULL,0,Per30M,0,MA_Mode,PRICE_WEIGHTED,i);
      MA15M[i]=iMA(NULL,0,Per15M,0,MA_Mode,PRICE_WEIGHTED,i);
   }
   
   string Sign;
   double MAOpen=iMA(NULL,0,PerMonth,0,MA_Mode,PRICE_WEIGHTED,1);
   double MAClose=iMA(NULL,0,PerMonth,0,MA_Mode,PRICE_WEIGHTED,0);
   color Col;
   
   if (MAOpen==MAClose) { Sign="ó"; Col=Yellow; } //Sideway
   else 
      if (MAOpen < MAClose) { Sign="ñ"; Col=Lime; } //Trend Up
      else { Sign="ò"; Col=Red; } //Trend Down
   string sign1 = "KG MA Month Sign";
   ObjectDelete(sign1);
   ObjectCreate(sign1, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(sign1, Sign ,10, "Wingdings", Col);
   ObjectSet(sign1, OBJPROP_CORNER, Corner );
   ObjectSet(sign1, OBJPROP_XDISTANCE, 63 );
   ObjectSet(sign1, OBJPROP_YDISTANCE, 10 );
   
   MAOpen=iMA(NULL,0,PerWeek,0,MA_Mode,PRICE_WEIGHTED,1);
   MAClose=iMA(NULL,0,PerWeek,0,MA_Mode,PRICE_WEIGHTED,0);
   if (MAOpen==MAClose) { Sign="ó"; Col=Yellow; } //Sideway
   else 
      if (MAOpen < MAClose) { Sign="ñ"; Col=Lime; } //Trend Up
      else { Sign="ò"; Col=Red; } //Trend Down
   string sign2 = "KG MA Week Sign";
   ObjectDelete(sign2);
   ObjectCreate(sign2, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(sign2, Sign ,10, "Wingdings", Col);
   ObjectSet(sign2, OBJPROP_CORNER, Corner );
   ObjectSet(sign2, OBJPROP_XDISTANCE, 63 );
   ObjectSet(sign2, OBJPROP_YDISTANCE, 20 );

   MAOpen=iMA(NULL,0,Per24H,0,MA_Mode,PRICE_WEIGHTED,1);
   MAClose=iMA(NULL,0,Per24H,0,MA_Mode,PRICE_WEIGHTED,0);
   if (MAOpen==MAClose) { Sign="ó"; Col=Yellow; } //Sideway
   else 
      if (MAOpen < MAClose) { Sign="ñ"; Col=Lime; } //Trend Up
      else { Sign="ò"; Col=Red; } //Trend Down
   string sign3 = "KG MA Day Sign";
   ObjectDelete(sign3);
   ObjectCreate(sign3, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(sign3, Sign ,10, "Wingdings", Col);
   ObjectSet(sign3, OBJPROP_CORNER, Corner );
   ObjectSet(sign3, OBJPROP_XDISTANCE, 63 );
   ObjectSet(sign3, OBJPROP_YDISTANCE, 30 );

   MAOpen=iMA(NULL,0,Per8H,0,MA_Mode,PRICE_WEIGHTED,1);
   MAClose=iMA(NULL,0,Per8H,0,MA_Mode,PRICE_WEIGHTED,0);
   if (MAOpen==MAClose) { Sign="ó"; Col=Yellow; } //Sideway
   else 
      if (MAOpen < MAClose) { Sign="ñ"; Col=Lime; } //Trend Up
      else { Sign="ò"; Col=Red; } //Trend Down
   string sign4 = "KG MA 8H Sign";
   ObjectDelete(sign4);
   ObjectCreate(sign4, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(sign4, Sign ,10, "Wingdings", Col);
   ObjectSet(sign4, OBJPROP_CORNER, Corner );
   ObjectSet(sign4, OBJPROP_XDISTANCE, 63 );
   ObjectSet(sign4, OBJPROP_YDISTANCE, 40 );
   
   MAOpen=iMA(NULL,0,Per4H,0,MA_Mode,PRICE_WEIGHTED,1);
   MAClose=iMA(NULL,0,Per4H,0,MA_Mode,PRICE_WEIGHTED,0);
   if (MAOpen==MAClose) { Sign="ó"; Col=Yellow; } //Sideway
   else 
      if (MAOpen < MAClose) { Sign="ñ"; Col=Lime; } //Trend Up
      else { Sign="ò"; Col=Red; } //Trend Down
   string sign5 = "KG MA 4H Sign";
   ObjectDelete(sign5);
   ObjectCreate(sign5, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(sign5, Sign ,10, "Wingdings", Col);
   ObjectSet(sign5, OBJPROP_CORNER, Corner );
   ObjectSet(sign5, OBJPROP_XDISTANCE, 63 );
   ObjectSet(sign5, OBJPROP_YDISTANCE, 50 );

   MAOpen=iMA(NULL,0,Per1H,0,MA_Mode,PRICE_WEIGHTED,1);
   MAClose=iMA(NULL,0,Per1H,0,MA_Mode,PRICE_WEIGHTED,0);
   if (MAOpen==MAClose) { Sign="ó"; Col=Yellow; } //Sideway
   else 
      if (MAOpen < MAClose) { Sign="ñ"; Col=Lime; } //Trend Up
      else { Sign="ò"; Col=Red; } //Trend Down
   string sign6 = "KG MA 1H Sign";
   ObjectDelete(sign6);
   ObjectCreate(sign6, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(sign6, Sign ,10, "Wingdings", Col);
   ObjectSet(sign6, OBJPROP_CORNER, Corner );
   ObjectSet(sign6, OBJPROP_XDISTANCE, 63 );
   ObjectSet(sign6, OBJPROP_YDISTANCE, 60 );

   MAOpen=iMA(NULL,0,Per30M,0,MA_Mode,PRICE_WEIGHTED,1);
   MAClose=iMA(NULL,0,Per30M,0,MA_Mode,PRICE_WEIGHTED,0);
   if (MAOpen==MAClose) { Sign="ó"; Col=Yellow; } //Sideway
   else 
      if (MAOpen < MAClose) { Sign="ñ"; Col=Lime; } //Trend Up
      else { Sign="ò"; Col=Red; } //Trend Down
   string sign7 = "KG MA 30M Sign";
   ObjectDelete(sign7);
   ObjectCreate(sign7, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(sign7, Sign ,10, "Wingdings", Col);
   ObjectSet(sign7, OBJPROP_CORNER, Corner );
   ObjectSet(sign7, OBJPROP_XDISTANCE, 63 );
   ObjectSet(sign7, OBJPROP_YDISTANCE, 70 );
   
   MAOpen=iMA(NULL,0,Per15M,0,MA_Mode,PRICE_WEIGHTED,1);
   MAClose=iMA(NULL,0,Per15M,0,MA_Mode,PRICE_WEIGHTED,0);
   if (MAOpen==MAClose) { Sign="ó"; Col=Yellow; } //Sideway
   else 
      if (MAOpen < MAClose) { Sign="ñ"; Col=Lime; } //Trend Up
      else { Sign="ò"; Col=Red; } //Trend Down
   string sign8 = "KG MA 15M Sign";
   ObjectDelete(sign8);
   ObjectCreate(sign8, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(sign8, Sign ,10, "Wingdings", Col);
   ObjectSet(sign8, OBJPROP_CORNER, Corner );
   ObjectSet(sign8, OBJPROP_XDISTANCE, 63 );
   ObjectSet(sign8, OBJPROP_YDISTANCE, 80 );
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments