TrendContinuation_v4

Download script
Author: Copyright � 2004, MetaQuotes Software Corp.
TrendContinuation_v4

This script is designed to analyze and visualize market trends by identifying momentum patterns in price movements. It focuses on "Trend Continuation," which helps traders understand how strongly a current price move is supported by historical data and previous price action.

Core Logic and Methodology

The script operates by breaking down the market's behavior into three distinct layers of analysis:

1. Price Movement Detection The logic begins by looking at the individual movement between each consecutive price bar. It categorizes these movements into two groups:

  • Positive Movement: When the current closing price is higher than the previous one.
  • Negative Movement: When the current closing price is lower than the previous one.

The script calculates the exact "distance" (the change in price) for each move and keeps a running total of these movements to establish a baseline for both upward and downward trends.

2. Trend Contrast Analysis A key feature of this logic is how it handles opposing forces. Instead of looking at price moves in isolation, it subtracts the cumulative strength of the opposite trend from the current trend. For example:

  • It takes the sum of recent positive moves and subtracts the accumulated negative weight from a specific window of time.
  • This creates a "net" momentum value that reveals whether the current trend is gaining dominance or if it is being weakened by opposing pressure.

3. Smoothing and Mathematical Filtering To ensure the data is useful for human observation and isn't "noisy," the script applies several layers of mathematical processing:

  • Time Windowing: It looks at a specific period (defined by user settings) to calculate these trends, ensuring that only relevant, recent history influences the result.
  • Weighted Smoothing: The script uses a specialized weighting system (similar to moving averages) to transition the data smoothly from one bar to the next. This prevents erratic jumps in the visual lines.
  • Polynomial Filtering: Finally, it applies a complex mathematical formula (a polynomial calculation) to the smoothed data. This is intended to refine the curve, highlighting the underlying "flow" of the market while filtering out minor fluctuations that might distract a trader from the primary trend.

Visual Output

The script generates two separate lines on a sub-window:

  • Trend Line 1 (Blue): Represents the refined momentum of the positive price movements.
  • Trend Line 2 (Red): Represents the refined momentum of the negative price movements.

By comparing these two lines, a user can visually identify when a trend is accelerating, decelerating, or when the market momentum is shifting from one direction to another.

Miscellaneous
Implements a curve of type %1
8 Views
0 Downloads
0 Favorites
TrendContinuation_v4
//+------------------------------------------------------------------+
//|                              Trend continuation factor 2 mt4 .mq4|
//|                                                                  |
//|                                                                  |
//|                                  Conversion only Doc Gaines      |
//|                                  dr_richard_gaines@yahoo.com     |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright " Copyright © 2004, MetaQuotes Software Corp."
#property link      " http://www.metaquotes.net/"
//----
#property indicator_separate_window
#property indicator_color1 Blue
#property indicator_buffers 2
#property indicator_color2 Red
#include <stdlib.mqh>
//+------------------------------------------------------------------+
//| External variables                                               |
//+------------------------------------------------------------------+
extern double n=20;
extern double CountBars=5000;
extern double t3_period=5;
extern double b=0.618;
//+------------------------------------------------------------------+
//| Special Convertion Functions                                     |
//+------------------------------------------------------------------+
int LastTradeTime;
int shift;
double ExtHistoBuffer[];
double ExtHistoBuffer2[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SetLoopCount(int loops)
  {
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SetIndexValue(int shift, double value)
  {
   ExtHistoBuffer[shift]=value;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SetIndexValue2(int shift, double value)
  {
   ExtHistoBuffer2[shift]=value;
  }
//+------------------------------------------------------------------+
//| End                                                              |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Initialization                                                   |
//+------------------------------------------------------------------+
int init()
  {
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID);
   SetIndexBuffer(0, ExtHistoBuffer);
   SetIndexStyle(1, DRAW_LINE, STYLE_SOLID);
   SetIndexBuffer(1, ExtHistoBuffer2);
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
//+------------------------------------------------------------------+
//| Local variables                                                  |
//+------------------------------------------------------------------+
   //double shift = 0;
   int cnt=0;
   double k_n=0;
   double k_p=0;
   int shiftt=0;
   double ch_p=0;
   double ch_n=0;
   double cff_p=0;
   double cff_n=0;
   double AccountedBars=0;
   double CF_p[5001];
   double CF_n[5001];
   double Change_p[5001];
   double Change_n[5001];
   double t3=0;
   double t32=0;
   double A1=0;
   double A2=0;
   double b2=0;
   double b3=0;
   double c1=0;
   double c2=0;
   double c3=0;
   double c4=0;
   double e1=0;
   double e2=0;
   double e3=0;
   double e4=0;
   double e5=0;
   double e6=0;
   double n1=0;
   double w1=0;
   double w2=0;
   double e12=0;
   double e22=0;
   double e32=0;
   double e42=0;
   double e52=0;
   double e62=0;
//----
   b2=b*b;
   b3=b2*b;
   c1=-b3;
   c2=(3*(b2+b3));
   c3=-3*(2*b2+b+b3);
   c4=(1+3*b+b3+3*b2);
   n1=t3_period;
   if(n1<1)n1=1;
   n1=1 + 0.5*(n1-1);
   w1=2/(n1 + 1);
   w2=1 - w1;
   SetLoopCount(0);
   // loop from first bar to current bar (with shift=0)
   if(AccountedBars==0)AccountedBars=Bars-CountBars;
     for(cnt =AccountedBars;cnt <=Bars-1 ;cnt ++)
     {
      shift=Bars - 1 - cnt;
        {
         if(Close[shift] > Close[shift+1])
           { Change_p[shift]=Close[shift]- Close[shift+1];
            CF_p[shift]= Change_p[shift] + CF_p[shift+1];
            Change_n[shift]=0;
            CF_n[shift]= 0;
           }
         else
           { Change_p[shift]=0;
            CF_p[shift]=0;
            Change_n[shift] =Close[shift+1]- Close[shift];
            CF_n[shift]=Change_n[shift]+ CF_n[shift+1];
           }
        }
        for(shiftt=shift+n;shiftt>=shift ;shiftt--)
        {
         ch_p=Change_p[shiftt] +ch_p;
         ch_n=Change_n[shiftt]+ch_n ;
         cff_p= CF_p[shiftt]+cff_p;
         cff_n= CF_n[shiftt]+cff_n;
        }
      k_p=ch_p-cff_n;
      k_n=ch_n-cff_p;
      A1=k_p;
      e1=w1*A1 + w2*e1;
      e2=w1*e1 + w2*e2;
      e3=w1*e2 + w2*e3;
      e4=w1*e3 + w2*e4;
      e5=w1*e4 + w2*e5;
      e6=w1*e5 + w2*e6;
      t3=c1*e6 + c2*e5 + c3*e4 + c4*e3;
      SetIndexValue(shift,t3);
      A2=k_n;
      e12=w1*A2 + w2*e12;
      e22=w1*e12 + w2*e22;
      e32=w1*e22 + w2*e32;
      e42=w1*e32 + w2*e42;
      e52=w1*e42 + w2*e52;
      e62=w1*e52 + w2*e62;
      t32=c1*e62 + c2*e52 + c3*e42 + c4*e32;
      SetIndexValue2(shift,t32);
      AccountedBars=AccountedBars+1;
      ch_p=0;
      ch_n=0;
      cff_p=0;
      cff_n=0;
     }
   return(0);
  }
//+------------------------------------------------------------------+

Comments