DT-RSI-Sig_v1

Download script
Author: klot
DT-RSI-Sig_v1

This tool is designed to analyze market momentum and identify specific entry points for trading by monitoring the Relative Strength Index (RSI). Rather than just showing a standard line, it filters the price action to find "peaks" and "valleys" in momentum to signal potential trend reversals.

Core Logic and Mechanics

1. Momentum Tracking The script constantly monitors the RSI—a common technical indicator used to measure the speed and change of price movements. It specifically looks for changes in the direction of this momentum (inflection points). When the momentum stops rising and begins to fall, or vice versa, the script identifies these as significant structural points.

2. Identification of Key Levels The logic performs a sophisticated scan of recent price history to find two specific types of peaks:

  • Upward Momentum Peaks: The script searches for instances where the momentum rises above a specific threshold (60) and then begins to decline.
  • Downward Momentum Valleys: It similarly looks for instances where momentum drops below a certain level (40) and starts to bottom out.

3. Filtering and Validation To ensure accuracy, the script does not trigger on every minor fluctuation. It applies a "validation" phase where it checks if these identified peaks or valleys are broken by opposing moves. For example, if a potential upward peak is invalidated by a significant downward move in the meantime, the tool discards that signal to avoid "false positives."

4. Dynamic Signal Generation Once valid peaks and valleys are confirmed, the script calculates the mathematical trajectory of the momentum. It then looks for specific "trigger" conditions:

  • Sell Signals: Triggered when the momentum is in the upper half of its range but shows a specific cross-under behavior relative to its recent peak.
  • Buy Signals: Triggered when the momentum is in the lower half of its range but shows a specific cross-over behavior relative to its recent valley.

Visual Output

The script provides clear visual feedback on your trading chart:

  • Trend Lines: It automatically draws physical trend lines (Blue for Buy zones, Red for Sell zones) connecting the identified peaks and valleys. This helps you visualize the "highs" and "lows" of the current momentum cycle.
  • Arrows: It uses directional arrows to highlight the exact points where the mathematical conditions for a Buy or Sell entry are met.

In summary, this tool acts as a filter that ignores market noise to highlight significant momentum shifts, drawing lines on your chart to show you where the "peaks" and "valleys" are occurring while providing specific alerts for potential turnarounds.

Indicators Used
Relative strength index
Miscellaneous
Implements a curve of type %1
17 Views
0 Downloads
0 Favorites
DT-RSI-Sig_v1
//+------------------------------------------------------------------+
//|                                                   DT-RSI-Sig.mq4 |
//+------------------------------------------------------------------+
#property copyright "klot" 
#property link      "klot@mail.ru"

#property indicator_separate_window
#property indicator_minimum 20
#property indicator_maximum 80
#property indicator_buffers 5
#property indicator_color1 Aqua
#property indicator_color2 Red
#property indicator_color3 Blue
#property indicator_color4 Red
#property indicator_color5 Blue
//---- input parameters
extern int       PeriodRSI=14;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
double ExtMapBuffer5[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,242);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexArrow(2,241);
   SetIndexBuffer(2,ExtMapBuffer3);
   SetIndexEmptyValue(2,0.0);
   SetIndexStyle(3,DRAW_ARROW);
   SetIndexArrow(3,159);
   SetIndexBuffer(3,ExtMapBuffer4);
   SetIndexEmptyValue(3,0.0);
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexArrow(4,159);
   SetIndexBuffer(4,ExtMapBuffer5);
   SetIndexEmptyValue(4,0.0);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
      ObjectsDeleteAll(1, OBJ_TREND); 
   	ObjectsRedraw();
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    k,limit,pos1,pos2,pos3,pos4;
   int    counted_bars=IndicatorCounted();
   double rsi1,rsi2,rsi3,vol1,vol2,vol3,vol4;
//---- 
if (counted_bars<0) return(-1); 
    
   if (counted_bars>0) counted_bars--; 
    
   limit=Bars-counted_bars; 
    
   for (int i=0; i<limit; i++) 
      { 
         ExtMapBuffer1[i]=iRSI(NULL,0,PeriodRSI,PRICE_CLOSE,i);
   
         rsi1=iRSI(NULL,0,PeriodRSI,PRICE_CLOSE,i+1);
         rsi2=iRSI(NULL,0,PeriodRSI,PRICE_CLOSE,i+2);
         rsi3=iRSI(NULL,0,PeriodRSI,PRICE_CLOSE,i+3);
   
         if  (rsi1<rsi2 && rsi2>rsi3) ExtMapBuffer5[i+2]=rsi2; //A?????êà. RSI ïîâî?à÷èâà?? â?èç
         if  (rsi1>rsi2 && rsi2<rsi3) ExtMapBuffer4[i+2]=rsi2; //?î?û?êî. RSI ïîâî?à÷èâà?? ââ???
      }
      //------ Iîè?ê â??????ê ------
   k=0;
   for (i=0; i<500; i++)
      {
         if (ExtMapBuffer5[i]>40 && k==0) { vol1=ExtMapBuffer5[i]; pos1=i; k++;}
         if (ExtMapBuffer5[i]>60 && ExtMapBuffer5[i]>vol1 && k!=0) { vol2=ExtMapBuffer5[i]; pos2=i; k++;}
         if (k>1) break;
      }
   // ??ëè ???ü ?è?è??? ?è?? 40, ?î ëè?è? ?????à ?? ???îè?, ?.ê. ?÷è?à?? ÷?î ?àï?àâë??è? ?????à èç???èëî?ü
   for (i=0; i<pos2; i++)
   {
   if ( ExtMapBuffer4[i]!=0 && ExtMapBuffer4[i]<40) {vol1=0; vol2=0;} 
   }   
      //----- Iîè?ê ?î?û??ê ------
    k=0;
   for (i=0; i<500; i++)
      {
         if (ExtMapBuffer4[i]<60 && ExtMapBuffer4[i]!=0 && k==0) { vol3=ExtMapBuffer4[i]; pos3=i; k++;}
         if (ExtMapBuffer4[i]!=0 && ExtMapBuffer4[i]<40 && ExtMapBuffer4[i]<vol3 && k!=0) { vol4=ExtMapBuffer4[i]; pos4=i; k++;}
         if (k>1) break;
      }
   // ??ëè ???ü ?àê?è??? ?îëü?? 60, ?î??à ëè?è? ?????à ?? ???îè?, ?.ê. ?÷è?à?? ÷?î ?àï?àâë??è? ?????à èç???èëî?ü
   for (i=0; i<pos4; i++)
   {
   if ( ExtMapBuffer5[i]!=0 && ExtMapBuffer5[i]>60) {vol3=0; vol4=0;}
   }
      
    // ---- ?è??àëû ?ë? â?î?îâ Buy è Sell
         rsi1=iRSI(NULL,0,PeriodRSI,PRICE_CLOSE,1);
         rsi2=iRSI(NULL,0,PeriodRSI,PRICE_CLOSE,2);
        
      //------------
      double volDW,volDW1,volDW2,volUP,volUP1,volUP2;
      if (vol3!=0 && vol4!=0)
      {
      volDW=vol3+((pos3)*(vol3-vol4)/(pos4-pos3));
      volDW1=vol3+((pos3-1)*(vol3-vol4)/(pos4-pos3));
      volDW2=vol3+((pos3-2)*(vol3-vol4)/(pos4-pos3));
      }      
      if (volDW!=0 && rsi2>50 && rsi1<volDW1 && rsi2>volDW2 ) ExtMapBuffer2[0]=volDW; // ?è??àë Sell
      //------------
      //------------
      if (vol1!=0 && vol2!=0) 
		{
		volUP=vol1+(pos1*(vol1-vol2)/(pos2-pos1));
		volUP1=vol1+((pos1-1)*(vol1-vol2)/(pos2-pos1));
		volUP2=vol1+((pos1-2)*(vol1-vol2)/(pos2-pos1));
		}
		if (volUP!=0 && rsi2<50 && rsi2>40 && rsi1>volUP1 && rsi2<volUP2 ) ExtMapBuffer3[0]=volUP; // ?è??àë Buy
		//------------
	/*
    Comment(" vol1 = ",vol1, "  pos1 = ",pos1,"\n",
           " vol2 = ",vol2, "  pos2 = ",pos2,"\n",
           " vol3 = ",vol3, "  pos3 = ",pos3,"\n",
           " vol4 = ",vol4, "  pos4 = ",pos4,"\n",
           "   VOLDW = ", volDW,"\n",
           "   VOLUP = ", volUP, "\n") ; 
    */     
      ObjectsDeleteAll(1, OBJ_TREND); 
      ObjectsRedraw();
      if (vol3!=0 && vol4!=0 )
      {
      ObjectCreate("Sell",OBJ_TREND,1,Time[pos4],vol4,Time[pos3],vol3); 
		ObjectSet("Sell",OBJPROP_COLOR,Red); 
		ObjectSet("Sell",OBJPROP_WIDTH,2); 
		ObjectSet("Sell",OBJPROP_STYLE,STYLE_SOLID);
		}
		if (vol1!=0 && vol2!=0 ) 
		{
		ObjectCreate("Buy",OBJ_TREND,1,Time[pos2],vol2,Time[pos1],vol1); 
		ObjectSet("Buy",OBJPROP_COLOR,Blue); 
		ObjectSet("Buy",OBJPROP_WIDTH,2); 
		ObjectSet("Buy",OBJPROP_STYLE,STYLE_SOLID);
		}
	
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments