rvmGann_sv2

Download script
Author: Copyright � 2005, MetaQuotes Software Corp.
rvmGann_sv2

This script is designed as a technical analysis tool for trading platforms. Its primary purpose is to identify and visualize market trends by tracking the relationship between price "highs" and "lows" over a specific period.

Instead of simply looking at moving averages or raw price movement, the logic operates on a structural basis, focusing on how price peaks and valleys evolve relative to one another. Here is a breakdown of the underlying logic:

Core Tracking Mechanism

The script monitors the historical data of price bars to identify two specific types of movements:

  • Highs: It identifies when a candle's high exceeds the previous candle's high.
  • Lows: It identifies when a candle's low falls below the previous candle's low.

It maintains internal counters for these highs and lows. A key part of the logic is "filtering"—it intentionally ignores "internal" bars (bars that do not create a new high or a new low) to ensure the analysis remains focused on significant structural changes in price.

Trend Detection Logic

The script uses a user-defined threshold (the GSv_tend parameter) to determine when a trend is established. The logic functions as follows:

  1. Upward Trend Identification: If the counter for "lows" reaches the specified threshold, the script recognizes a potential shift in momentum. It then looks for new high points; if a price peak is higher than the previous one tracked by the tool, it updates the visual "high" point.
  2. Downward Trend Identification: Conversely, if the counter for "highs" reaches the threshold, the script identifies a downward trend. It then monitors for new low points; if a price valley is lower than the previous one recorded, it updates the visual "low" point.

Visual Representation

The script communicates these findings to the user through two distinct visual styles:

  • Trend Lines: It draws solid lines to represent the current trend direction (Up or Down).
  • Dawn Trend (Dots): It uses a dotted line to indicate the transition or "dawn" of a new trend, marking the specific price point where the shift in market structure was confirmed.

Dynamic Updates

The script is designed to be reactive. It distinguishes between historical data and real-time data. In real-time mode, it specifically watches for "limit" prices (where the candle closes exactly at its high or low) to refine the accuracy of the trend points being drawn on the chart.

In summary, this tool filters out market noise by focusing on structural peaks and valleys, only triggering trend changes when price movement satisfies a specific count of consecutive new highs or lows.

Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
15 Views
0 Downloads
0 Favorites
rvmGann_sv2
//+------------------------------------------------------------------+
//|                                                  rvmGann_sv2.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                      rvm_fam íà fromru òî÷êà êîì |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "rvm_fam íà fromru òî÷êà êîì"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 DodgerBlue
#property indicator_color2 DodgerBlue
//---- input parameters
extern int       GSv_tend=2;
//---- buffers
double GSv_sl[];
double GSv_Up[];
bool initfl,draw_up,draw_dn;
bool curH,curL;
int sH,sL,lb,lhi,lli,fpoint,spoint;
int idFile;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_SECTION,STYLE_DOT);
   SetIndexStyle(1,DRAW_LINE,STYLE_SOLID);
   SetIndexBuffer(0,GSv_sl);
   SetIndexBuffer(1,GSv_Up);
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
   SetIndexLabel(0,"Dawn trend");
   SetIndexLabel(1,"Up trend");

   //FileDelete("GSv.txt");
   //idFile=FileOpen("GSv.txt",FILE_WRITE);
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted();
   int cb,ai,i,limit,index;
//---- 
   if( initfl!=1 )
   {
      myInit();
      if( initfl!=1 )
      {
         Alert("Ñáîé èíèöèàëèçàöèè èíäèêàòîðà!");
         return(-1);
      }
   }
   index=Bars-1;
   if( counted_bars>=0 )
   {
      if( index-counted_bars<=0 )
      {
         limit=0;
      }
      else
      {
         limit=index-counted_bars;
         if( limit>index-GSv_tend )
         {
            limit=index-GSv_tend;
         }
      }
   }
   else
   {
      Alert("Ñáîé ðàñ÷åòà èíäèêàòîðà!");
      return(-1);
   }
//FileWrite(idFile,"  Bars="+Bars+" index="+index+" limit="+limit+" counted_bars="+counted_bars);
//-------------------->> íà÷àëî öèêëà ïî áàðàì -------------------------------
for( cb=limit;cb>=0;cb-- )
{
   ai=index-cb;
//-------------------->> äåéñòâèÿ ïðèçâîäèìûå åñëè ïîÿâèëñÿ íîâûé áàð --------
if( lb!=ai )
{
   //FileWrite(idFile,"**Íîâûé áàð, ai="+ai+" "+TimeToStr(Time[cb]));
   lb=ai;
   //åñëè ïðåäûäóùèé áàð âíóòðåíèèé - îáíóëÿåì ñ÷åò÷èêè
   if( High[cb+1]<=High[cb+2] && Low[cb+1]>=Low[cb+2] )
   {
      sH=0;
      sL=0;
      //FileWrite(idFile,"  Ïðåäûäóùèé áàð âíóòðåííèé, ñ÷åò÷èêè îáíóëåíû "+sH+"  "+sL);
   }
   else
   {
      //åñëè ïðåäûäóùèé òîëüêî ìàêñèìóì
      if( High[cb+1]>High[cb+2] && Low[cb+1]>=Low[cb+2] )
      {
         sL=0;
         //FileWrite(idFile,"  Ïðåäûäóùèé-òîëüêî ìàêñèìóì, ñ÷åò÷èê ìèíèìóìîâ îáíóëåí "+sL);
      }
      else
      {
         //åñëè ïðåäûäóùèé òîëüêî ìèíèìóì
         if( High[cb+1]<=High[cb+2] && Low[cb+1]<Low[cb+2] )
         {
            sH=0;
            //FileWrite(idFile,"  Ïðåäûäóùèé-òîëüêî ìèíèìóì, ñ÷åò÷èê ìàêñèìóìîâ îáíóëåí "+sH);
         }
      }
   }
   //åñëè èíäèêàòîð ðèñîâàëñÿ ââåðõ
   if( draw_up==1 )
   {
      //FileWrite(idFile,"  èíäèêàòîð ðèñîâàëñÿ ââåðõ");
      //åñëè ñ÷åò÷èê ìèíèìóìîâ äîñòèã íóæíîãî çíà÷åíèÿ
      if( sL==GSv_tend )
      {
         //FileWrite(idFile,"  ñ÷åò÷èê ìèíèìóìîâ äîñòèã íóæíîãî çíà÷åíèÿ");
         // è ïîñëåäíèé ìèíèìóì èëè ñ÷åò÷èê ìàêñèìóìîâ íå èìååò íóæíîãî çíà÷åíèÿ
         if( curL==1 || sH!=GSv_tend )
         {
            draw_up=0;
            draw_dn=1;
            fpoint=spoint;
            spoint=ai-1;
            //FileWrite(idFile,"  ïîñëåäíèì áûë ìèíèìóì, draw_up="+draw_up+" draw_dn="+draw_dn+" fpoint="+fpoint+" spoint="+spoint+" èëè ñ÷åò÷èê ìàêñèìóìîâ íå èìååò íóæíîãî çíà÷åíèÿ");
         }
      }
      else
      {
         //èíà÷å åñëè ñ÷åò÷èê ìèíèìóìîâ íå äîñòèã íóæíîãî çíà÷åíèÿ
         //åñëè íà ïðåäûäóùåé ñâå÷êå áûë ìàêñèìóì è îí âûøå ïðåäûäóùåãî îòðèñîâàííîãî
         if( High[cb+1]>High[cb+2] && High[cb+1]>High[index-spoint] )
         {
            spoint=ai-1;
            //FileWrite(idFile,"  ìàêñèìóì íà ïðåä.ñâå÷êå âûøå ïðåäûäóùåãî îòðèñîâàííîãî, ìåíÿåì spoint="+spoint);
         }
      }
   }
   else
   {
      //èíà÷å åñëè èíäèêàòîð ðèñîâàëñÿ âíèç
      if( draw_dn==1 )
      {
         //FileWrite(idFile,"  èíäèêàòîð ðèñîâàëñÿ âíèç");
         //åñëè ñ÷åò÷èê ìàêñèìóìîâ äîñòèã íóæíîãî çíà÷åíèÿ
         if( sH==GSv_tend )
         {
            //FileWrite(idFile,"  ñ÷åò÷èê ìàêñèìóìîâ äîñòèã íóæíîãî çíà÷åíèÿ");
            //è ïîñëåäíèé - ìàêñèìóì èëè ñ÷åò÷èê ìèíèìóìîâ íå èìååò íóæíîãî çíà÷åíèÿ
            if( curH==1 || sL!=GSv_tend )
            {
               draw_up=1;
               draw_dn=0;
               fpoint=spoint;
               spoint=ai-1;
               //FileWrite(idFile,"  ïîñëåäíèì áûë ìàêñèìóì, draw_up="+draw_up+" draw_dn="+draw_dn+" fpoint="+fpoint+" spoint="+spoint+" èëè ñ÷åò÷èê ìèíèìóìîâ íå èìååò íóæíîãî çíà÷åíèÿ");
            }
         }
         else
         {
            //èíà÷å åñëè ñ÷åò÷èê ìàêñèìóìîâ íå äîñòèã íóæíîãî çíà÷åíèÿ
            //åñëè íà ïðåäûäóùåé ñâå÷êå áûë ìèíèìóì è îí íèæå ïðåäûäóùåãî îòðèñîâàííîãî
            if( Low[cb+1]<Low[cb+2] && Low[cb+1]<Low[index-spoint] )
            {
               spoint=ai-1;
               //FileWrite(idFile,"  ìèíèìóì íà ïðåä.ñâå÷êå íèæå ïðåäûäóùåãî îòðèñîâàííîãî, ìåíÿåì spoint="+spoint);
            }
         }
      }
   }
   //FileWrite(idFile,"  íîâàÿ ñâå÷à, îáíóëÿåì íàëè÷èå ìàêñèìóìà, ìèíèìóìà");
   curH=0;
   curL=0;
}
//--------------------<< êîíåö äåéñòâèé ïðèçâîäèìûå åñëè ïîÿâèëñÿ íîâûé áàð --
//åñëè òåêóùèé áàð "âíóòðåííèé" ïåðåõîäèì ê ñëåäóþùåìó öèêëó
if( High[cb]<=High[cb+1] && Low[cb]>=Low[cb+1] )
{
   //FileWrite(idFile,"  áàð âíóòðåííèé, ïåðåõîäèì ê ñëåäóþùåé ñâå÷å");
   continue;
}
//-------------------->> âûÿñíåíèå òåêóùåãî ñîñòîÿíèÿ áàðà -------------------
//åñëè ýòî èñòîðèÿ
if( cb!=0 || counted_bars==0 )
{
   //FileWrite(idFile,"  ïî èñòîðèè...");
   if( High[cb]>High[cb+1] )
   {
      if( sH<GSv_tend ) sH++;
      curH=1;
      //FileWrite(idFile,"  ñ÷åò÷èê ìàêñèìóìîâ óâåëè÷åí, ïîñëåäíèé ìàêñèìóì "+sH);
   }
   if( Low[cb]<Low[cb+1] )
   {
      if( sH<GSv_tend ) sL++;
      curL=1;
      //FileWrite(idFile,"  ñ÷åò÷èê ìèíèìóìîâ óâåëè÷åí, ïîñëåäíèé ìèíèìóì "+sL);
   }
   if( curH==curL && curH==1 )
   {
      if( Close[cb]>=(High[cb]+Low[cb])/2 )
      {
         curL=0;
         //FileWrite(idFile,"  âíåøíèé áàð, óòî÷íåíèå, ïîñëåäíèé ìàêñèìóì");
      }
      else
      {
         curH=0;
         //FileWrite(idFile,"  âíåøíèé áàð, óòî÷íåíèå, ïîñëåäíèé ìèíèìóì");
      }
   }
}
else
{
   //FileWrite(idFile,"  ðåàë-òàéì...");
   if( Close[cb]==High[cb] )
   {
      if( sH<GSv_tend && lhi!=ai )
      {
         lhi=ai;
         sH++;
      }
      curH=1;
      curL=0;
      //FileWrite(idFile,"  ïîñëåäíèé ìàêñèìóì");
   }
   else
   {
      if( Close[cb]==Low[cb] )
      {
         if( sL<GSv_tend && lli!=ai )
         {
            lli=ai;
            sL++;
         }
         curH=0;
         curL=1;
         //FileWrite(idFile,"  ïîñëåäíèé ìèíèìóì");
      }
   }
}
//--------------------<< êîíåö âûÿñíåíèÿ òåêóùåãî ñîñòîÿíèÿ áàðà -------------
//FileWrite(idFile,"  îòðèñîâêà èíäèêàòîðà...");
//åñëè èíäèêàòîð óæå ðèñóåòñÿ
if( draw_up!=draw_dn )
{
   //FileWrite(idFile,"  èíäèêàòîð óæå ðèñóåòñÿ "+draw_up+"  "+draw_dn);
   //åñëè èíäèêàòîð îòðèñîâûâàåòñÿ ââåðõ
   if( draw_dn!=1 )
   {
      //åñëè ñ÷åò÷èê ìèíèìóìîâ äîñòèã íóæíîãî çíà÷åíèÿ è ïîñëåäíèé ìèíèìóì èëè ñ÷åò÷èê ìàêñèìóìîâ íå èìååò íóæíîãî çíà÷åíèÿ
      if( (sL==GSv_tend && curL==1) || (sL==GSv_tend && sH!=GSv_tend) )
      {
         //FileWrite(idFile,"  ñ÷åò÷èê ìèíèìóìîâ äîñòèã íóæíîãî çíà÷åíèÿ è ïîñëåäíèé ìèíèìóì èëè ñ÷åò÷èê ìàêñèìóìîâ íå èìååò íóæíîãî çíà÷åíèÿ");
         GSv_sl[cb]=Low[cb];
      }
      else
      {
         //åñëè ïîñëåäíèé ìàêñèìóì âûøå ïîñëåäíåãî îòðèñîâàííîãî
         if( High[cb]>High[index-spoint] )
         {
            GSv_sl[cb]=High[cb];
            for( i=cb+1;i<index-fpoint;i++ )
            {
               GSv_sl[i]=0;
            }
         }
      }
   }
   else
   {
      //èíà÷å åñëè îòðèñîâûâàåòñÿ âíèç
      //åñëè ñ÷åò÷èê ìàêñèìóìîâ äîñòèã íóæíîãî çíà÷åíèÿ è ìàêñèìóì ïîñëåäíèé èëè ñ÷åò÷èê ìèíèìóìîâ íå èìååò íóæíîãî çíà÷åíèÿ
      if( (sH==GSv_tend && curH==1) || (sH==GSv_tend && sL!=GSv_tend) )
      {
         //FileWrite(idFile,"  ñ÷åò÷èê ìàêñèìóìîâ äîñòèã íóæíîãî çíà÷åíèÿ è ïîñëåäíèé ìàêñèìóì èëè ñ÷åò÷èê ìèíèìóìîâ íå èìååò íóæíîãî çíà÷åíèÿ");
         GSv_sl[cb]=High[cb];
      }
      else
      {
         //åñëè ïîñëåäíèé ìèíèìóì íèæå ïîñëåäíåãî îòðèñîâàííîãî
         if( Low[cb]<Low[index-spoint] )
         {
            GSv_sl[cb]=Low[cb];
            for( i=cb+1;i<index-fpoint;i++ )
            {
               GSv_sl[i]=0;
            }
         }
      }
   }
}
else
{
   //FileWrite(idFile,"  èíäèêàòîð ïîêà íå îòðèñîâûâàëñÿ "+draw_up+"  "+draw_dn);
   //èíà÷å åñëè èíäèêàòîð åùå íå ðèñóåòñÿ
   //åñëè ñ÷åò÷èê ìàêñèìóìîâ äîñòèã íóæíîãî çíà÷åíèÿ
   if( sH==GSv_tend )
   {
      //FileWrite(idFile,"  ñ÷åò÷èê ìàêñèìóìîâ äîñòèã íóæíîãî çíà÷åíèÿ");
      if( sL!=GSv_tend || curH==1 )
      {
         //FileWrite(idFile,"  ïîñëåäíèé ìàêñèìóì èëè ñ÷åò÷èê ìèíèìóìîâ ìåíüøå íóæíîãî");
         GSv_sl[index-fpoint]=Low[index-fpoint];
         GSv_sl[cb]=High[cb];
         draw_up=1;
         draw_dn=0;
         //FileWrite(idFile,"  íà÷àëüíàÿ òî÷êà "+fpoint+" "+GSv_sl[index-fpoint]+" êîíå÷íàÿ òî÷êà "+ai+" "+GSv_sl[cb]);
      }
   }
   //åñëè ñ÷åò÷èê ìèíèìóìîâ äîñòèã íóæíîãî çíà÷åíèÿ
   if( sL==GSv_tend )
   {
      //FileWrite(idFile,"  ñ÷åò÷èê ìèíèìóìîâ äîñòèã íóæíîãî çíà÷åíèÿ");
      if( sH!=GSv_tend || curL==1 )
      {
         //FileWrite(idFile,"  ïîñëåäíèé ìèíèìóì èëè ñ÷åò÷èê ìàêñèìóìîâ ìåíüøå íóæíîãî");
         GSv_sl[index-fpoint]=High[index-fpoint];
         GSv_sl[cb]=Low[cb];
         draw_up=0;
         draw_dn=1;
         //FileWrite(idFile,"  íà÷àëüíàÿ òî÷êà "+fpoint+" "+GSv_sl[index-fpoint]+" êîíå÷íàÿ òî÷êà "+ai+" "+GSv_sl[cb]);
      }
   }
}
//--------------------<< êîíåö öèêëà ïî áàðàì --------------------------------
}
   return(0);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   //FileClose(idFile);
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Ôóíêöèÿ íà÷àëüíîé èíèöèàëèçàöèè èíäèêàòîðà                       |
//+------------------------------------------------------------------+
int myInit()
  {
//---- 
   //åñëè íåäîñòàòî÷íî äàííûõ
   if( Bars<GSv_tend+1 )
   {
      Alert("Íåäîñòàòî÷íî äàííûõ íà ãðàôèêå!");
      return(-1);
   }
   if( GSv_tend<1 )
   {
      Alert("Íåâåðíûé ïàðàìåòð èíäèêàòîðà!");
      return(-1);
   }
   if( High[Bars-2]>High[Bars-1] ) sH++;
   if( Low[Bars-2]<Low[Bars-1] ) sL++;
   initfl=1;
   //FileWrite(idFile,TimeToStr(CurTime())+" èíäèêàòîð èíèöèàëèçèðîâàí");
   //FileWrite(idFile,"  áàðîâ íà ãðàôèêå = "+Bars+", âðåìÿ ïåðâîãî áàðà = "+TimeToStr(Time[Bars-1]));
   //FileWrite(idFile,"  ñ÷åò÷èê ìàêñèìóìîâ = "+sH+", ñ÷åò÷èê ìèíèìóìîâ = "+sL);
//----
   return(0);
  }
//+------------------------------------------------------------------+


Comments