ASCTrend_v3

Download script
ASCTrend_v3

This technical indicator is designed to identify potential trend reversals and market turning points by analyzing price volatility and momentum. Instead of relying on simple moving averages, the script evaluates the relationship between current price action and historical price movement to filter out "noise" and highlight significant shifts.

Core Logic Overview

The script operates through three primary stages of analysis:

1. Volatility and Range Assessment The tool first calculates the average trading range over a short period of time (the difference between the high and low prices). This establishes a baseline for "normal" market activity. It then looks for specific price "breaks"—significant movements that are significantly larger than this average range—to determine if the market is experiencing a genuine surge or just minor fluctuation.

2. Momentum Calculation Once the volatility is established, the script utilizes a momentum-based calculation (similar to a Williams %R oscillator) to measure how far the current price has moved relative to its recent boundaries. It uses a dynamic sensitivity setting—controlled by a "Risk" factor—to adjust how aggressively it reacts to these price movements.

3. Signal Generation (Arrows) The final step is the generation of visual signals on your chart:

  • Buy Signals: If the momentum drops below a specific threshold and then shows signs of a sharp upward break against the prevailing trend, an arrow appears above the price.
  • Sell Signals: Conversely, if momentum rises above a high threshold and shows a sharp downward break against the trend, an arrow appears below the price.

Key Features for the User

  • Dynamic Adaptation: The script looks backward through a set number of bars (defaulting to 300) to ensure that signals are based on relevant recent history rather than outdated data.
  • Risk Sensitivity: By adjusting the "RISK" input, users can make the indicator more or less sensitive. A higher risk value will require larger price movements to trigger a signal, potentially filtering out more false leads but requiring stronger trends to activate.
  • Visual Clarity: The logic is designed to output distinct visual markers (arrows) directly on the chart window, allowing for quick identification of entries and exits without cluttering the workspace with complex lines or values.
Indicators Used
Larry William percent range indicator
Miscellaneous
Implements a curve of type %1
14 Views
0 Downloads
0 Favorites
ASCTrend_v3
/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//| ASCTrend1sig_noSound.mq4 
//| Ramdass - Conversion only
//+------------------------------------------------------------------+

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Magenta
#property indicator_color2 Aqua

//---- input parameters
extern int RISK=3;
extern int CountBars=300;

//---- buffers
double val1[];
double val2[];


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicator line
   IndicatorBuffers(2);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,234);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,233);
   SetIndexBuffer(0,val1);
   SetIndexBuffer(1,val2);

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| ASCTrend1sig                                                     |
//+------------------------------------------------------------------+
int start()
  {
   if (CountBars>=1000) CountBars=950;
   SetIndexDrawBegin(0,Bars-CountBars+11+1);
   SetIndexDrawBegin(1,Bars-CountBars+11+1);
   int i,shift,counted_bars=IndicatorCounted();
   int Counter,i1,value10,value11;
   double value1,x1,x2;
   double value2,value3;
   double TrueCount,Range,AvgRange,MRO1,MRO2;
   double Table_value2[1000];
   
   value10=3+RISK*2;
   x1=67+RISK;
   x2=33-RISK;
   value11=value10;
//----
   if(Bars<=11+1) return(0);
//---- initial zero
   if(counted_bars<11+1)
   {
      for(i=1;i<=0;i++) val1[CountBars-i]=0.0;
      for(i=1;i<=0;i++) val2[CountBars-i]=0.0;
   }
//----
   shift=CountBars-11-1;
   while(shift>=0)
     {
     
   Counter=shift;
	Range=0.0;
	AvgRange=0.0;
	for (Counter=shift; Counter<=shift+9; Counter++) AvgRange=AvgRange+MathAbs(High[Counter]-Low[Counter]);
		
	Range=AvgRange/10;
	Counter=shift;
	TrueCount=0;
	while (Counter<shift+9 && TrueCount<1)
		{if (MathAbs(Open[Counter]-Close[Counter+1])>=Range*2.0) TrueCount=TrueCount+1;
		Counter=Counter+1;
		}
	if (TrueCount>=1) {MRO1=Counter;} else {MRO1=-1;}
	Counter=shift;
	TrueCount=0;
	while (Counter<shift+6 && TrueCount<1)
		{if (MathAbs(Close[Counter+3]-Close[Counter])>=Range*4.6) TrueCount=TrueCount+1;
		Counter=Counter+1;
		}
	if (TrueCount>=1) {MRO2=Counter;} else {MRO2=-1;}
	if (MRO1>-1) {value11=3;} else {value11=value10;}
	if (MRO2>-1) {value11=4;} else {value11=value10;}
	value2=100-MathAbs(iWPR(NULL,0,value11,shift)); // PercentR(value11=9)
	Table_value2[shift]=value2;
	val1[shift]=0;
	val2[shift]=0;
	value3=0;
	if (value2<x2)
		{i1=1;
		while (Table_value2[shift+i1]>=x2 && Table_value2[shift+i1]<=x1){i1++;}
		if (Table_value2[shift+i1]>x1) 
			{
			value3=High[shift]+Range*0.5;
			val1[shift]=value3;
			} 
		}
	if (value2>x1)
		{i1=1;
		while (Table_value2[shift+i1]>=x2 && Table_value2[shift+i1]<=x1){i1++;}
		if (Table_value2[shift+i1]<x2) 
			{
			value3=Low[shift]-Range*0.5;
			val2[shift]=value3;
			}
		}
      
      shift--;
     }

   return(0);
  }
//+------------------------------------------------------------------+


  
 


Comments