GG-RiverFlow

Download script
Author: Copyright � 2009, GGekko
GG-RiverFlow

Overview

The GG-RiverFlow script is a multi-timeframe analytical tool designed to provide a high-level visual summary of market trends. Instead of forcing you to switch between different charts to see what is happening at various time intervals (e.g., 1 minute vs. 1 day), this tool aggregates that data into a single, easy-to-read dashboard directly on your main trading screen.

Core Logic and Functionality

The script operates by performing three primary actions: multi-timeframe scanning, trend calculation, and visual reporting.

1. Multi-Timeframe Scanning

The tool simultaneously monitors several different timeframes (ranging from very short durations like 1 minute to longer ones like the Daily chart). For each of these timeframes, it looks at a series of different "Moving Averages." These are mathematical averages used to smooth out price action and identify the underlying direction of the market.

2. Trend Identification

For every timeframe being monitored, the script compares two specific moving average values:

  • Current Value: The immediate trend.
  • Shifted Value: A value from slightly further back in time.

By comparing these two points, the logic determines the "flow" of the market:

  • Upward Flow: If the current average is higher than the shifted average, it indicates positive momentum.
  • Downward Flow: If the current average is lower than the shifted average, it indicates negative momentum.
  • Neutral/Flat Flow: If the values are identical, it indicates a period of consolidation or no clear movement.

3. Visual Dashboard Display

The results of these calculations are displayed as a clean grid on your chart. Rather than showing complex numbers or lines, the script uses a color-coded system to tell you the "status" of the market at a glance:

  • Green/Yellow-Green: Indicates an upward trend.
  • Red/Tomato: Indicates a downward trend.
  • Gold: Indicates a flat or neutral market state.

Summary for the Trader

Think of this tool as a "weather map" for the markets. Instead of looking at individual streets to see if it's raining, you are looking at a dashboard that tells you the conditions across various regions (timeframes) simultaneously. It allows you to quickly see if the "river" of price action is flowing in the same direction across all timeframes or if there are conflicting movements, helping you make more informed decisions based on the broader market context.

Indicators Used
Moving average indicator
5 Views
0 Downloads
0 Favorites
GG-RiverFlow
//+------------------------------------------------------------------+
//|                                                 GG-RiverFlow.mq4 |
//|                                         Copyright © 2009, GGekko |
//|                                         http://www.fx-ggekko.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, GGekko"
#property link      "http://www.fx-ggekko.com"

#property indicator_chart_window

extern string   ___IndicatorSetup___   = ">>> Indicator Setup:<<<";
extern string   Help_for_TFNumbers     = "Maximum: 7";
extern int      TFNumbers              = 7; // max 7
extern int      MA_Shift               = 1;
extern string   ___DisplaySetup___     = ">>> Display Setup:<<<";
extern color    UpColor                = YellowGreen;
extern color    DownColor              = Tomato;
extern color    FlatColor              = Gold;
extern color    TextColor              = CadetBlue;
extern string   Help_for_Corner        = "LeftTop:0, RightTop:1, Not used:2,3!";
extern int      Corner                 = 0;
extern int      PosX                   = 0;
extern int      PosY                   = 0;
extern int      Unique_Id              = 52725;  

int tframe[]={1,5,15,30,60,240,1440};
string tf[]={"1","5","15","30","H1","H4","D1"};
int ma_period[]={2,3,5,8,13,21,34,55,89,144};

string ind[10];
double ma0_1[],ma0_2[];
double ma1_1[],ma1_2[];
double ma2_1[],ma2_2[];
double ma3_1[],ma3_2[];
double ma4_1[],ma4_2[];
double ma5_1[],ma5_2[];
double ma6_1[],ma6_2[];
double ma7_1[],ma7_2[];
double ma8_1[],ma8_2[];
double ma9_1[],ma9_2[];

double IndVal[10][7];


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- 
   if(Corner==0)
   {
   for(int w=0;w<TFNumbers;w++)
      {
         ObjectCreate(Unique_Id+tf[w],OBJ_LABEL,0,0,0,0,0);
         ObjectSet(Unique_Id+tf[w],OBJPROP_CORNER,Corner);
         ObjectSet(Unique_Id+tf[w],OBJPROP_XDISTANCE,w*17+PosX+19);
         ObjectSet(Unique_Id+tf[w],OBJPROP_YDISTANCE,PosY+20);
         ObjectSetText(Unique_Id+tf[w],tf[w],8,"Tahoma",TextColor);
      } 

   for(int x=0;x<7;x++) // 
   for(w=0;w<10;w++)
      {
         ObjectCreate(Unique_Id+"Ind"+x+w,OBJ_LABEL,0,0,0,0,0);
         ObjectSet(Unique_Id+"Ind"+x+w,OBJPROP_CORNER,Corner);
         ObjectSet(Unique_Id+"Ind"+x+w,OBJPROP_XDISTANCE,x*17+PosX+15);
         ObjectSet(Unique_Id+"Ind"+x+w,OBJPROP_YDISTANCE,w*6+PosY);
         ObjectSetText(Unique_Id+"Ind"+x+w,"-",42,"Arial",TextColor);
      }
   }
   
   if(Corner==1)
   {
   for(w=0;w<TFNumbers;w++)
      {
         ObjectCreate(Unique_Id+tf[TFNumbers-1-w],OBJ_LABEL,0,0,0,0,0);
         ObjectSet(Unique_Id+tf[TFNumbers-1-w],OBJPROP_CORNER,Corner);
         ObjectSet(Unique_Id+tf[TFNumbers-1-w],OBJPROP_XDISTANCE,w*17+PosX+19);
         ObjectSet(Unique_Id+tf[TFNumbers-1-w],OBJPROP_YDISTANCE,PosY+20);
         ObjectSetText(Unique_Id+tf[TFNumbers-1-w],tf[TFNumbers-1-w],8,"Tahoma",TextColor);
      } 

   for(x=0;x<7;x++) // 
   for(w=0;w<10;w++)
      {
         ObjectCreate(Unique_Id+"Ind"+(TFNumbers-1-x)+w,OBJ_LABEL,0,0,0,0,0);
         ObjectSet(Unique_Id+"Ind"+(TFNumbers-1-x)+w,OBJPROP_CORNER,Corner);
         ObjectSet(Unique_Id+"Ind"+(TFNumbers-1-x)+w,OBJPROP_XDISTANCE,x*17+PosX+15);
         ObjectSet(Unique_Id+"Ind"+(TFNumbers-1-x)+w,OBJPROP_YDISTANCE,w*6+PosY);
         ObjectSetText(Unique_Id+"Ind"+(TFNumbers-1-x)+w,"-",42,"Arial",TextColor);
      }
   }
   
   if(Corner==0 || Corner==1)
   {
   ObjectCreate(Unique_Id+"LineTop0",OBJ_LABEL,0,0,0,0,0);
   ObjectSet(Unique_Id+"LineTop0",OBJPROP_CORNER,Corner);
   ObjectSet(Unique_Id+"LineTop0",OBJPROP_XDISTANCE,PosX+13);
   ObjectSet(Unique_Id+"LineTop0",OBJPROP_YDISTANCE,PosY+12);
   ObjectSetText(Unique_Id+"LineTop0","          ----------------          ",8,"Tahoma",TextColor);
   
   ObjectCreate(Unique_Id+"LineTop",OBJ_LABEL,0,0,0,0,0);
   ObjectSet(Unique_Id+"LineTop",OBJPROP_CORNER,Corner);
   ObjectSet(Unique_Id+"LineTop",OBJPROP_XDISTANCE,PosX+13);
   ObjectSet(Unique_Id+"LineTop",OBJPROP_YDISTANCE,PosY+14);
   ObjectSetText(Unique_Id+"LineTop","-------------------------------",8,"Tahoma",TextColor);
   
   ObjectCreate(Unique_Id+"LineHigh",OBJ_LABEL,0,0,0,0,0);
   ObjectSet(Unique_Id+"LineHigh",OBJPROP_CORNER,Corner);
   ObjectSet(Unique_Id+"LineHigh",OBJPROP_XDISTANCE,PosX+13);
   ObjectSet(Unique_Id+"LineHigh",OBJPROP_YDISTANCE,PosY+26);
   ObjectSetText(Unique_Id+"LineHigh","-------------------------------",8,"Tahoma",TextColor);
      
   ObjectCreate(Unique_Id+"LineLow",OBJ_LABEL,0,0,0,0,0);
   ObjectSet(Unique_Id+"LineLow",OBJPROP_CORNER,Corner);
   ObjectSet(Unique_Id+"LineLow",OBJPROP_XDISTANCE,PosX+13);
   ObjectSet(Unique_Id+"LineLow",OBJPROP_YDISTANCE,PosY+90);
   ObjectSetText(Unique_Id+"LineLow","-------------------------------",8,"Tahoma",TextColor);
   
   ObjectCreate(Unique_Id+"IndName",OBJ_LABEL,0,0,0,0,0);
   ObjectSet(Unique_Id+"IndName",OBJPROP_CORNER,Corner);
   ObjectSet(Unique_Id+"IndName",OBJPROP_XDISTANCE,PosX+43);
   ObjectSet(Unique_Id+"IndName",OBJPROP_YDISTANCE,PosY+6);
   ObjectSetText(Unique_Id+"IndName","GG-RiverFlow",8,"Tahoma",TextColor);
   
   ObjectCreate(Unique_Id+"Copyright",OBJ_LABEL,0,0,0,0,0);
   ObjectSet(Unique_Id+"Copyright",OBJPROP_CORNER,Corner);
   ObjectSet(Unique_Id+"Copyright",OBJPROP_XDISTANCE,PosX+28);
   ObjectSet(Unique_Id+"Copyright",OBJPROP_YDISTANCE,PosY+96);
   ObjectSetText(Unique_Id+"Copyright","www.fx-ggekko.com",8,"Tahoma",TextColor);
   }
                            
   ArrayResize(ma0_1,TFNumbers);ArrayResize(ma0_2,TFNumbers);
   ArrayResize(ma1_1,TFNumbers);ArrayResize(ma1_2,TFNumbers);
   ArrayResize(ma2_1,TFNumbers);ArrayResize(ma2_2,TFNumbers);
   ArrayResize(ma3_1,TFNumbers);ArrayResize(ma3_2,TFNumbers);
   ArrayResize(ma4_1,TFNumbers);ArrayResize(ma4_2,TFNumbers);
   ArrayResize(ma5_1,TFNumbers);ArrayResize(ma5_2,TFNumbers);
   ArrayResize(ma6_1,TFNumbers);ArrayResize(ma6_2,TFNumbers);
   ArrayResize(ma7_1,TFNumbers);ArrayResize(ma7_2,TFNumbers);
   ArrayResize(ma8_1,TFNumbers);ArrayResize(ma8_2,TFNumbers);
   ArrayResize(ma9_1,TFNumbers);ArrayResize(ma9_2,TFNumbers);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   for(int w=0;w<TFNumbers;w++)
      {
         ObjectDelete(Unique_Id+tf[w]);
      }   
         
   for(int x=0;x<TFNumbers;x++)
   for(w=0;w<10;w++)
      {
         ObjectDelete(Unique_Id+"Ind"+x+w);
      }
   
   ObjectDelete(Unique_Id+"LineTop0");   
   ObjectDelete(Unique_Id+"LineTop");
   ObjectDelete(Unique_Id+"LineHigh");
   ObjectDelete(Unique_Id+"LineLow");
   ObjectDelete(Unique_Id+"IndName");
   ObjectDelete(Unique_Id+"Copyright");
   
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   
   
   for(int x=0;x<TFNumbers;x++)
   {
      ma0_1[x]=iMA(NULL,tframe[x],ma_period[0],0,MODE_EMA,PRICE_CLOSE,0);
      ma0_2[x]=iMA(NULL,tframe[x],ma_period[0],MA_Shift,MODE_EMA,PRICE_CLOSE,0);
      ma1_1[x]=iMA(NULL,tframe[x],ma_period[1],0,MODE_EMA,PRICE_CLOSE,0);
      ma1_2[x]=iMA(NULL,tframe[x],ma_period[1],MA_Shift,MODE_EMA,PRICE_CLOSE,0);
      ma2_1[x]=iMA(NULL,tframe[x],ma_period[2],0,MODE_EMA,PRICE_CLOSE,0);
      ma2_2[x]=iMA(NULL,tframe[x],ma_period[2],MA_Shift,MODE_EMA,PRICE_CLOSE,0);
      ma3_1[x]=iMA(NULL,tframe[x],ma_period[3],0,MODE_EMA,PRICE_CLOSE,0);
      ma3_2[x]=iMA(NULL,tframe[x],ma_period[3],MA_Shift,MODE_EMA,PRICE_CLOSE,0);
      ma4_1[x]=iMA(NULL,tframe[x],ma_period[4],0,MODE_EMA,PRICE_CLOSE,0);
      ma4_2[x]=iMA(NULL,tframe[x],ma_period[4],MA_Shift,MODE_EMA,PRICE_CLOSE,0);
      ma5_1[x]=iMA(NULL,tframe[x],ma_period[5],0,MODE_EMA,PRICE_CLOSE,0);
      ma5_2[x]=iMA(NULL,tframe[x],ma_period[5],MA_Shift,MODE_EMA,PRICE_CLOSE,0);
      ma6_1[x]=iMA(NULL,tframe[x],ma_period[6],0,MODE_EMA,PRICE_CLOSE,0);
      ma6_2[x]=iMA(NULL,tframe[x],ma_period[6],MA_Shift,MODE_EMA,PRICE_CLOSE,0);
      ma7_1[x]=iMA(NULL,tframe[x],ma_period[7],0,MODE_EMA,PRICE_CLOSE,0);
      ma7_2[x]=iMA(NULL,tframe[x],ma_period[7],MA_Shift,MODE_EMA,PRICE_CLOSE,0);
      ma8_1[x]=iMA(NULL,tframe[x],ma_period[8],0,MODE_EMA,PRICE_CLOSE,0);
      ma8_2[x]=iMA(NULL,tframe[x],ma_period[8],MA_Shift,MODE_EMA,PRICE_CLOSE,0);
      ma9_1[x]=iMA(NULL,tframe[x],ma_period[9],0,MODE_EMA,PRICE_CLOSE,0);
      ma9_2[x]=iMA(NULL,tframe[x],ma_period[9],MA_Shift,MODE_EMA,PRICE_CLOSE,0);
    }  
      
      
    for(x=0;x<TFNumbers;x++)
    {  
      if(ma0_1[x]>ma0_2[x]) IndVal[0][x]=1;
      else if(ma0_1[x]<ma0_2[x]) IndVal[0][x]=-1;
      else IndVal[0][x]=0;
      
      if(ma1_1[x]>ma1_2[x]) IndVal[1][x]=1;
      else if(ma1_1[x]<ma1_2[x]) IndVal[1][x]=-1;
      else IndVal[1][x]=0;
      
      if(ma2_1[x]>ma2_2[x]) IndVal[2][x]=1;
      else if(ma2_1[x]<ma2_2[x]) IndVal[2][x]=-1;
      else IndVal[2][x]=0;
      
      if(ma3_1[x]>ma3_2[x]) IndVal[3][x]=1;
      else if(ma3_1[x]<ma3_2[x]) IndVal[3][x]=-1;
      else IndVal[3][x]=0;
      
      if(ma4_1[x]>ma4_2[x]) IndVal[4][x]=1;
      else if(ma4_1[x]<ma4_2[x]) IndVal[4][x]=-1;
      else IndVal[4][x]=0;
      
      if(ma5_1[x]>ma5_2[x]) IndVal[5][x]=1;
      else if(ma5_1[x]<ma5_2[x]) IndVal[5][x]=-1;
      else IndVal[5][x]=0;
      
      if(ma6_1[x]>ma6_2[x]) IndVal[6][x]=1;
      else if(ma6_1[x]<ma6_2[x]) IndVal[6][x]=-1;
      else IndVal[6][x]=0;
      
      if(ma7_1[x]>ma7_2[x]) IndVal[7][x]=1;
      else if(ma7_1[x]<ma7_2[x]) IndVal[7][x]=-1;
      else IndVal[7][x]=0;
      
      if(ma8_1[x]>ma8_2[x]) IndVal[8][x]=1;
      else if(ma8_1[x]<ma8_2[x]) IndVal[8][x]=-1;
      else IndVal[8][x]=0;
      
      if(ma9_1[x]>ma9_2[x]) IndVal[9][x]=1;
      else if(ma9_1[x]<ma9_2[x]) IndVal[9][x]=-1;
      else IndVal[9][x]=0;
    }
      
      for(int y=0;y<10;y++)
      for(int z=0;z<TFNumbers;z++)
      {
         if(IndVal[y][z]==-1) ObjectSetText(Unique_Id+"Ind"+z+y,"-",42,"Arial",DownColor);
         if(IndVal[y][z]==0) ObjectSetText(Unique_Id+"Ind"+z+y,"-",42,"Arial",FlatColor);
         if(IndVal[y][z]==1) ObjectSetText(Unique_Id+"Ind"+z+y,"-",42,"Arial",UpColor);
         
      } 
   
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments